Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
3 / 3 / 2
Регистрация: 29.06.2012
Сообщений: 118
1

Как сделать фильтрацию по edit?

06.03.2014, 14:05. Просмотров 1139. Ответов 8
Метки нет (Все метки)


Здравствуйте дорогие форумчане.
Прошу Вас помочь создать фильтрацию по Edit. На форумах есть примеры, но у меня по ним выходит ошибка:
Код
 - First chance exception at $752BC6E3. Exception class EOleException with message 'Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом'. Process Project1.exe (3892)
Thread Start: Thread ID: 6116. Process Project1.exe (3892)
вот код полностью
cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
 switch (PageControl1->ActivePage->TabIndex)
{
case 0:
 {
 
  comboadditem1();
  break;}
case 1:
 {
 
  comboadditem2();
  break;}
case 2:
 {
 
  comboadditem3();
  break;}
  }
}
 
 
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form1->Close();
}
void __fastcall TForm1::DataSource1DataChange(TObject *Sender, TField *Field)
{
    ADOQuery1->Close();
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Text = "SELECT COUNT(*) AS RTY FROM BaseTable WHERE Type = 800";
    ADOQuery1->Open();
    int a=  ADOQuery1->FieldByName("RTY")->AsInteger;
    Edit1->Text=a;
 
    ADOQuery1->Close();
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Text = "SELECT COUNT(*) AS YTR FROM BaseTable WHERE Type = 450";
    ADOQuery1->Open();
    int b=  ADOQuery1->FieldByName("YTR")->AsInteger;
    Edit2->Text=b;
 
 
 
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::PageControl1Change(TObject *Sender)
{
switch (PageControl1->ActivePage->TabIndex)
{
case 0:
 {
  ADOTable1->Active=false;
  ADOTable1->TableName = "basetable";
  ADOTable1->Active=true;
  comboadditem1();
  break;}
case 1:
 {
  ADOTable1->Active=false;
  ADOTable1->TableName = "bts_ip_1x";
  ADOTable1->Active=true;
  comboadditem2();
  break;}
case 2:
 {
  ADOTable1->Active=false;
  ADOTable1->TableName = "bts_ev_do";
  ADOTable1->Active=true;
  comboadditem3();
  break;}
  }
}
 
//---------------------------------------------------------------------------
void __fastcall TForm1::comboadditem1()
{
    //ComboBox1->Text = "Выберите поле...";
    ComboBox1->Items->Clear();
    ComboBox1->Items->Add("ID");
    ComboBox1->Items->Add("Name BTS");
    ComboBox1->Items->Add("Model");
    ComboBox1->Items->Add("Type");
    ComboBox1->Items->Add("RUT/GUT");
    ComboBox1->Items->Add("E1 1x");
    ComboBox1->Items->Add("E1 EV-DO");
}
 
void __fastcall TForm1::comboadditem2()
{
    //ComboBox1->Text = "Выберите поле...";
    ComboBox1->Items->Clear();
    ComboBox1->Items->Add("ID");
    ComboBox1->Items->Add("Name BTS");
    ComboBox1->Items->Add("Type");
    ComboBox1->Items->Add("Subrack №");
    ComboBox1->Items->Add("MP_GROUP");
    ComboBox1->Items->Add("E1/T1_Sequnce");
    ComboBox1->Items->Add("BCIM_IP");
    ComboBox1->Items->Add("BTS_Signaling_IP_Address");
    ComboBox1->Items->Add("BTS_O&M_IP_Address");
}
 
void __fastcall TForm1::comboadditem3()
{
    //ComboBox1->Text = "Выберите поле...";
    ComboBox1->Items->Clear();
    ComboBox1->Items->Add("ID");
    ComboBox1->Items->Add("Name BTS");
    ComboBox1->Items->Add("Type");
    ComboBox1->Items->Add("Subrack №");
    ComboBox1->Items->Add("Slot №");
    ComboBox1->Items->Add("MP_GROUP");
    ComboBox1->Items->Add("E1/T1_Sequnce");
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TLocateOptions loCaseInsensitive;
loCaseInsensitive.Clear();
ADOTable1->Locate(ComboBox1->Text,Edit3->Text,loCaseInsensitive);
/*ADOTable1->Filtered=false;
ADOTable1->Filter=Edit3->Text;
ADOTable1->Filtered=true;
  */
}
//---------------------------------------------------------------------------
 
 
 
 
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Edit4Change(TObject *Sender)
{
ADOTable1->Filtered=false;
ADOTable1->Filter="Name BTS = ' "+Edit4->Text+"'";
ADOTable1->Filtered=true;
}
//---------------------------------------------------------------------------




Добавлено через 28 минут
Ещё делал фильтрацию по запросу, спасибо Sasha.
C++
1
2
3
4
5
6
7
8
9
10
11
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Text="Select * from BaseTable WHERE  Model LIKE '"+Edit4->Text+"'";
ADOQuery1->Open();
 
и такой
 
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("Select * from basetable WHERE  Model LIKE '"+Edit4->Text+"'");
ADOQuery1->Open();
Ничего не происходит.
Хотелось чтобы фильтрация была полностью по всей таблице, не только по одному столбцу. Извините если вопрос непонятен, целый день сижу над ним голова кругом идет.

Поиск работает, но мне надо чтобы при поиске или фильтрации, отображалось только то, что мне нужно.

Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
9
10
11
if(!Edit4->Text.IsEmpty())
{
 ADOTable1->Filtered = false;
 ADOTable1->Filter = "[Name BTS] LIKE '"+Edit4->Text+"%'";
 ADOTable1->Filtered = true;
}
else
{
   ADOTable1->Filtered = false;
   ADOTable1->Filter = "";
   ADOTable1->Filtered = true;
Вот это работает. Спасибо ещё раз Sasha.
А как сделать - чтобы поиск был по всем полям?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.03.2014, 14:05
Ответы с готовыми решениями:

Как сделать через два edit фильтрацию на DbGrid?
У меня есть Форм там есть два edita в одну надо писать Откуда выезжаешь, а во втором куда...

Как сделать фильтрацию в таблицы
Всем привет. У меня есть база в аксесе, DBRgid, Edit и Button. Как мне сделать фильтрацию данных по...

Как сделать фильтрацию по тв-параметрам
Есть сайт banknauk.ru На главной фильтры по tv - параметрам: price, lesson, typeofwork в виде...

Как сделать фильтрацию массива?
Есть код, в нём несколько имён, и при вводе определённого имени к примеру chris высвечивается окно...

8
Модератор
3872 / 2846 / 544
Регистрация: 21.01.2011
Сообщений: 12,340
06.03.2014, 14:51 2
Для каждой колонки пишется свое условие
1
4948 / 2412 / 531
Регистрация: 05.06.2008
Сообщений: 7,515
Записей в блоге: 3
06.03.2014, 14:55 3
Цитата Сообщение от RustamCTE Посмотреть сообщение
А как сделать - чтобы поиск был по всем полям?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if((!Edit1->Text.IsEmpty())&&(!Edit2->Text.IsEmpty()))
{
 ADOTable1->Filtered = false;
 ADOTable1->Filter = "Dep = " + QuotedStr(Edit1->Text)+ " AND Fam = "+QuotedStr(Edit2->Text);
 ADOTable1->Filtered = true;
}
else
{
   ADOTable1->Filtered = false;
   ADOTable1->Filter = "";
   ADOTable1->Filtered = true;
}
1
3 / 3 / 2
Регистрация: 29.06.2012
Сообщений: 118
06.03.2014, 15:12  [ТС] 4
Grossmeister,
пустая таблица становится.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
if(!Edit4->Text.IsEmpty())
{
 ADOTable1->Filtered = false;
 ADOTable1->Filter ="[Name BTS] LIKE '"+Edit4->Text+"%'";
 ADOTable1->Filter ="[Model] LIKE '"+Edit4->Text+"%'";
 ADOTable1->Filtered = true;
}
else
{
   ADOTable1->Filtered = false;
   ADOTable1->Filter = "";
   ADOTable1->Filtered = true;
}
Sasha, у меня один Edit. И по Вашему коду ошибка у меня
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
if(!Edit4->Text.IsEmpty())
{
 ADOTable1->Filtered = false;
 ADOTable1->Filter =// "[Name BTS] LIKE '"+Edit4->Text+"%'";
    "Name BTS = " + QuotedStr(Edit4->Text)+ " AND Model = "+QuotedStr(Edit4->Text) ;
 ADOTable1->Filtered = true;
}
else
{
   ADOTable1->Filtered = false;
   ADOTable1->Filter = "";
   ADOTable1->Filtered = true;
}
Это из-за того, что одинаковый Edit??
Необходимо с одним Edit, сделать фильтрацию по всей таблице.
И ещё сложность, у меня несколько таблиц, на разных PageControl. Если выставить в запрос одно поле из одной таблице, то выходит ошибка при переключении PageControl когда в другой таблице НЕТ такого поля.
0
4948 / 2412 / 531
Регистрация: 05.06.2008
Сообщений: 7,515
Записей в блоге: 3
06.03.2014, 15:19 5
А как ты будешь определять по какому полю будешь производить фильтрацию одним Editом?
1
3 / 3 / 2
Регистрация: 29.06.2012
Сообщений: 118
06.03.2014, 15:27  [ТС] 6
Ввести значение в Edit, например
1) Модель - ввожу 3606
или
2) Название - ввожу название
А программа сама будет искать, по всем полям. Или я неправильно мыслю?

Или хотя бы с использованием тогда ComboBox2 для полей, а для значения Edit.
Какой вариант, с точки Вашего многолетнего опыта лучше?
И пример, пожалуйста для второго варианта
0
4948 / 2412 / 531
Регистрация: 05.06.2008
Сообщений: 7,515
Записей в блоге: 3
06.03.2014, 15:39 7
А если к примеру в одной таблице будет несколько значений в разных столбцах тогда выводить все строки с разными столбцами?
1
Модератор
3872 / 2846 / 544
Регистрация: 21.01.2011
Сообщений: 12,340
06.03.2014, 15:41 8
Цитата Сообщение от RustamCTE Посмотреть сообщение
Или я неправильно мыслю?
Неправильно. Для пользователя гораздо понятнее, когда он явно указывает, в какой колонке искать. Т.е. для каждой колонки надо задавать фильтр в своем поле (эдите). Если таких много, то оптимально, если поле поиска (фильтрации) будет находиться над/под соответ. колонки грида
1
3 / 3 / 2
Регистрация: 29.06.2012
Сообщений: 118
06.03.2014, 15:51  [ТС] 9
Sasha, да хотелось бы так.
Grossmeister, понял Вас.
Спасибо за советы. Нашел пример
http://h-l-l.ru/publ/28-1-0-220
Буду делать так. Через вторую форму.
Или проще, как советует Grossmeister, под каждым полем свой Edit со своим условием.
Мне нужно будет подумать, как при переключении PageControl - пример, который по ссылке, работал бы отдельно для каждой таблице. Или взять все поля и добавить в listbox)).
Спасибо огромное за ответы.
Если что придумаете, напишите. Буду очень очень рад.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.03.2014, 15:51

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Как сделать фильтрацию списка?
И снова здравствуйте! Помогите, пожалуйста, новичку)) У меня есть список фраз, нужно сделать...

Как сделать фильтрацию/поиск по бд ?
Имеется форма Wpf. На ней лежит DataGrid с именем grid1. В DataGrid выводится таблица из локальной...

Как сделать фильтрацию и сортировку в DataGridView?
Есть класс с несколькими свойствами, в основном string. List&lt;&gt; таких классов является DataSource в...

Как сделать фильтрацию по Базе данных?
как сделать фильтрацию по Базе данных в делфи 7


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.