Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
2 / 2 / 0
Регистрация: 12.05.2011
Сообщений: 36
1

Фильтрация в DBGrid

02.01.2013, 22:54. Показов 3408. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем добрый день! Помогите разобраться с фильтрацией данных в таблице БД. Есть ComboBox, в котором содержаться ключевые для фильтрации значения. Вот код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TMain.ComboBox5Select(Sender: TObject);    //фильтр
var x, y:string;
begin
with dm.Telefon do
begin
DM.Telefon.First;
x:=combobox5.Text;
while not(EOF) do
begin
 if (dm.TelefonModel.Value=x)
 then
 y:=IntToStr(dm.TelefonIDTelefon.Value);
 DM.Telefon.Next;
 end;
end;
dm.Telefon.Filter := 'ID Telefon = '+QuotedStr(y)+'';
dm.Telefon.Filtered := true;
end;
Возникает ошибка, которая во вложении. Спасибо!
Изображения
 
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.01.2013, 22:54
Ответы с готовыми решениями:

Фильтрация в DBGrid
Необходимо осуществить фильтрацию базы данных в DBGrid. Для этого нужно в 3 Edit-а ввести данные...

DBGrid Фильтрация
Имееться такая вот база данных ToolBar1: TToolBar; Edit1: TEdit; DataSource1:...

Фильтрация в DBGrid
Уважаемые посетители форума,подскажите пожалуйста,как можно осуществить фильтрацию полей из...

Фильтрация в DbGrid
Программа Dephi7. Имеется База Данных созданная в Acces с двумя строками: 1)Когда (Дата/Время)...

17
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
02.01.2013, 23:07 2
mpd, А что конкретно должно фильтроваться? Модели телефона, выбираемые из списка?
0
2 / 2 / 0
Регистрация: 12.05.2011
Сообщений: 36
02.01.2013, 23:18  [ТС] 3
Цитата Сообщение от droider Посмотреть сообщение
mpd, А что конкретно должно фильтроваться? Модели телефона, выбираемые из списка?
Да, должны фильтроваться Модели телефонов.
0
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
02.01.2013, 23:55 4
Я уже видел подобный код на форуме тут Фильтрация с combobox. Фильтрацию можно реализовать намного проще. В указанной теме я об этом писал. Только для книг.
В Вашем случае принцип тот же
Delphi
1
2
3
4
5
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
AdoTable1.filter:='phone model = '+QuotedStr(Combobox1.text); //фильтруем записи по моделям телефонов
AdoTable1.Filtered :=true;
end;
Добавлено через 1 минуту
В DBGrid никакой фильтрации не происходит. Он только отображает набор данных. Это на заметку.
0
2 / 2 / 0
Регистрация: 12.05.2011
Сообщений: 36
03.01.2013, 00:04  [ТС] 5
Все ровно выбрасывает ошибку.
Delphi
1
2
3
4
5
6
procedure TMain.ComboBox5Select(Sender: TObject);    
//var x, y:string;
begin
dm.Telefon.filter:='Model = '+QuotedStr(Combobox5.text);
dm.Telefon.Filtered :=true;
end;
Миниатюры
Фильтрация в DBGrid  
Изображения
 
0
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
03.01.2013, 00:11 6
Измените обработчик события списка на OnChange. Полагаю, что в коде осталось еще что-то лишнее, помимо этого.
Вы случайно не AdoQuery используете?
0
2 / 2 / 0
Регистрация: 12.05.2011
Сообщений: 36
03.01.2013, 00:17  [ТС] 7
Вообще Query не использую. Сейчас попробую изменить обработчик

Добавлено через 3 минуты
Delphi
1
2
3
4
5
procedure TMain.ComboBox4Change(Sender: TObject);
begin
dm.Telefon.filter:='Model = '+QuotedStr(Combobox5.text); //ôèëüòðóåì çàïèñè ïî ìîäåëÿì òåëåôîíîâ
dm.Telefon.Filtered :=true;
end;
В таком случае вообще ничего не происходит когда меняю значение в ComboBox'e
0
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
03.01.2013, 07:38 8
У вас обработчик для другого Combobox'а прописан! Код работает и еще давно проверен.
0
2 / 2 / 0
Регистрация: 12.05.2011
Сообщений: 36
03.01.2013, 21:02  [ТС] 9
Все равно не могу разобраться, вот код Unita 1. В чем проблема?
Delphi
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, Menus, StdCtrls, Buttons,
  Grids, DBGrids, ExtCtrls, ComCtrls, DBCtrls, DB;
 
type
  TMain = class(TForm)
    MainMenu1: TMainMenu;
    Panel1: TPanel;
    PageControl: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    DBGrid1: TDBGrid;
    BitBtn1: TBitBtn;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    DBGrid2: TDBGrid;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    DBGrid3: TDBGrid;
    DBGrid4: TDBGrid;
    Edit1: TEdit;
    Button1: TButton;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    ComboBox4: TComboBox;
    ComboBox3: TComboBox;
    Label1: TLabel;
    Label2: TLabel;
    ComboBox5: TComboBox;
    DBNavigator1: TDBNavigator;
    Button3: TButton;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    procedure N5Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure PageControlChange(Sender: TObject);
    procedure ComboBox2Change(Sender: TObject);
    procedure ComboBox3Change(Sender: TObject);
    procedure ComboBox4Change(Sender: TObject);
    procedure ComboBox5Change(Sender: TObject);
    procedure ComboBox5Select(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Main: TMain;
 
implementation
 
{$R *.dfm}
 
uses Unit2, Unit3, Unit4, Unit5, Unit6;
 
 
procedure TMain.Button1Click(Sender: TObject); //поиск
begin
 
if PageControl.ActivePage = TabSheet1 then
if dm.Telefon.Locate ('Model', Edit1.Text, [loCaseInsensitive, loPartialKey]) then DBGrid1.SetFocus;
 
if PageControl.ActivePage = TabSheet2 then
if dm.Prodavec.Locate ('FIO', Edit1.Text, [loCaseInsensitive, loPartialKey]) then DBGrid2.SetFocus;
 
if PageControl.ActivePage = TabSheet3 then
if dm.Klient.Locate ('FIO', Edit1.Text, [loCaseInsensitive, loPartialKey]) then DBGrid3.SetFocus;
 
end;
 
procedure TMain.ComboBox1Change(Sender: TObject);     // сортировка
begin
   begin
    if ComboBox1.ItemIndex=0 then
      dm.Telefon.IndexFieldNames:='ID Telefon';
    if ComboBox1.ItemIndex=1 then
      dm.Telefon.IndexFieldNames:='Model';
    if ComboBox1.ItemIndex=2 then
      dm.Telefon.IndexFieldNames:='Cena';
    if ComboBox1.ItemIndex=3 then
      dm.Telefon.IndexFieldNames:='Kol-vo';
   end;
end;
 
procedure TMain.ComboBox2Change(Sender: TObject);
begin
 begin
    if ComboBox2.ItemIndex=0 then
      dm.Prodavec.IndexFieldNames:='ID prodavec';
    if ComboBox2.ItemIndex=1 then
      dm.Prodavec.IndexFieldNames:='FIO';
   end;
end;
 
procedure TMain.ComboBox3Change(Sender: TObject);
begin
 begin
    if ComboBox3.ItemIndex=0 then
      dm.Klient.IndexFieldNames:='ID klienta';
    if ComboBox3.ItemIndex=1 then
      dm.Klient.IndexFieldNames:='FIO';
    if ComboBox3.ItemIndex=1 then
      dm.Klient.IndexFieldNames:='Nomer telefona';
   end;
end;
 
procedure TMain.ComboBox5Change(Sender: TObject);
begin
dm.Telefon.filter:='Model = '+QuotedStr(Combobox5.text); //фильтруем записи по моделям телефонов
dm.Telefon.Filtered :=true;
end;
 
procedure TMain.ComboBox4Change(Sender: TObject);
begin
  begin
    if ComboBox4.ItemIndex=0 then
      dm.Zakaz.IndexFieldNames:='ID zakaz';
    if ComboBox4.ItemIndex=1 then
      dm.Zakaz.IndexFieldNames:='ID prodavec';
    if ComboBox4.ItemIndex=2 then
      dm.Zakaz.IndexFieldNames:='ID klient';
    if ComboBox4.ItemIndex=3 then
      dm.Zakaz.IndexFieldNames:='ID telefon';
    if ComboBox4.ItemIndex=3 then
      dm.Zakaz.IndexFieldNames:='Data';
    if ComboBox4.ItemIndex=3 then
      dm.Zakaz.IndexFieldNames:='Kol-vo';
  end;
end;
 
procedure TMain.ComboBox5Select(Sender: TObject);    //фильтр
//var x, y:string;
begin
 
{with dm.Telefon do
begin
DM.Telefon.First;
x:=combobox5.Text;
while not(EOF) do
begin
 if (dm.TelefonModel.Value=x)
 then
 y:=IntToStr(dm.TelefonIDTelefon.Value);
 DM.Telefon.Next;
 end;
end;
dm.Telefon.Filter := 'ID Telefon = '+QuotedStr(y)+'';
dm.Telefon.Filtered := true;  }
end;
 
procedure TMain.FormActivate(Sender: TObject);
begin
PageControl.ActivePage := TabSheet1;
ComboBox1.Visible:=true;
 ComboBox2.Visible:=false;
  ComboBox3.Visible:=false;
   ComboBox4.Visible:=false;
DBNavigator1.DataSource:=DM.Datasource3;
end;
 
procedure TMain.N5Click(Sender: TObject);
begin
 Close;
end;
 
procedure TMain.PageControlChange(Sender: TObject);
begin
if PageControl.ActivePage = TabSheet1 then
begin
ComboBox1.Visible:=true;
 ComboBox2.Visible:=false;
  ComboBox3.Visible:=false;
   ComboBox4.Visible:=false;
DBNavigator1.DataSource:=DM.Datasource3;
Button3.Caption:='Добавить Телефон';
 
end;
 
if PageControl.ActivePage = TabSheet2 then
begin
ComboBox2.Visible:=true;
 ComboBox1.Visible:=false;
  ComboBox3.Visible:=false;
   ComboBox4.Visible:=false;
DBNavigator1.DataSource:=DM.Datasource2;
Button3.Caption:='Добавить Продавца';
end;
 
if PageControl.ActivePage = TabSheet3 then
begin
ComboBox3.Visible:=true;
 ComboBox2.Visible:=false;
  ComboBox1.Visible:=false;
   ComboBox4.Visible:=false;
DBNavigator1.DataSource:=DM.Datasource1;
Button3.Caption:='Добавить Клиента';
end;
 
if PageControl.ActivePage = TabSheet4 then
begin
ComboBox4.Visible:=true;
 ComboBox2.Visible:=false;
  ComboBox3.Visible:=false;
   ComboBox1.Visible:=false;
DBNavigator1.DataSource:=DM.Datasource4;
Button3.Caption:='Добавить Заказ';
end;
end;
 
procedure TMain.Button3Click(Sender: TObject);
begin
if PageControl.ActivePage = TabSheet1 then
begin
 Form3.Show;
end;
if PageControl.ActivePage = TabSheet2 then
begin
 Form4.Show;
end;
if PageControl.ActivePage = TabSheet3 then
begin
 Form5.Show;
end;
if PageControl.ActivePage = TabSheet4 then
begin
 Form6.Show;
end;
 
end;
 
procedure TMain.N7Click(Sender: TObject);
begin
 PageControl.ActivePageIndex:=0;
 Button3.Click;
end;
 
procedure TMain.N8Click(Sender: TObject);
begin
 PageControl.ActivePageIndex:=1;
 Button3.Click;
end;
 
procedure TMain.N9Click(Sender: TObject);
begin
 PageControl.ActivePageIndex:=2;
 Button3.Click;
end;
 
procedure TMain.N10Click(Sender: TObject);
begin
 PageControl.ActivePageIndex:=3;
 Button3.Click;
end;
 
end.
0
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
03.01.2013, 21:17 10
Вместо этого
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TMain.ComboBox5Select(Sender: TObject);    //фильтр
//var x, y:string;
begin
 
{with dm.Telefon do
begin
DM.Telefon.First;
x:=combobox5.Text;
while not(EOF) do
begin
 if (dm.TelefonModel.Value=x)
 then
 y:=IntToStr(dm.TelefonIDTelefon.Value);
 DM.Telefon.Next;
 end;
end;
dm.Telefon.Filter := 'ID Telefon = '+QuotedStr(y)+'';
dm.Telefon.Filtered := true;  }
end;
должно быть

Delphi
1
2
3
4
5
procedure TMain.ComboBox5Change(Sender: TObject);
begin
dm.Telefon.filter:='Model = '+QuotedStr(Combobox5.text); 
dm.Telefon.Filtered :=true;
end;
Добавлено через 6 минут
У Вас компонент AdoTable называется Telefon и помещен на DataModule (dm)?
0
2 / 2 / 0
Регистрация: 12.05.2011
Сообщений: 36
03.01.2013, 21:27  [ТС] 11
У меня TIBTable помещен на DM и называется Telefon.
Вот ошибка:
Миниатюры
Фильтрация в DBGrid  
0
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
03.01.2013, 21:49 12
Неизвестное поле 'Model'..
0
2 / 2 / 0
Регистрация: 12.05.2011
Сообщений: 36
03.01.2013, 22:01  [ТС] 13
Когда написано
Delphi
1
dm.Telefon.filter:='Model = '+QuotedStr(Combobox5.text);
выбрасывает ошибку что неизвестное поле Model.
Если (без =)
Delphi
1
dm.Telefon.filter:='Model'+QuotedStr(Combobox5.text);
то выбрасывет не известное поле Nokia (т.е. выбранное в ComboBoxe значение)
Model - это столбец в таблице Telefon
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
03.01.2013, 22:17 14
Цитата Сообщение от mpd Посмотреть сообщение
Model - это столбец в таблице Telefon
В таблице-то поле "Model" может и существует, а в наборе данных, формируемом объектом IBTable, его нет. Или, как вариант, во фразу "Model" при наборе вкралась кириллица.
0
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
03.01.2013, 22:21 15
Цитата Сообщение от mpd Посмотреть сообщение
Когда написано
Код Delphi
1
dm.Telefon.filter:='Model = '+QuotedStr(Combobox5.text);
без '=' фильтр и не сработает
0
2 / 2 / 0
Регистрация: 12.05.2011
Сообщений: 36
03.01.2013, 22:31  [ТС] 16
В чем может быть причина, кирилица не проникла, проверил.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
03.01.2013, 22:37 17
Цитата Сообщение от mpd Посмотреть сообщение
кирилица не проникла, проверил
Тогда причина одна см. пост #12
0
2 / 2 / 0
Регистрация: 12.05.2011
Сообщений: 36
03.01.2013, 22:40  [ТС] 18
Вот изображение с моей таблицей и DM
Миниатюры
Фильтрация в DBGrid  
0
03.01.2013, 22:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.01.2013, 22:40
Помогаю со студенческими работами здесь

Фильтрация dbgrid
Доброе время суток! Искал решение своей проблемы,но видимо плохо. Требуется провести фильтрацию...

Фильтрация в DBGrid
Нужно отфильтровывать запись по столбцам выбирая критерий фильтра из RadioButton (3 шт). Нажимая на...

Фильтрация DBGrid
Добрый день! Господа, подскажите, как сделать фильтрацию нескольких столбцов? Фильтрацию делаю...

Фильтрация данных в DBGrid
Здравствуйте.Нуждаюсь в помощи. Имеется БД Access которая связана с Delphi при помощи ADOTable1 ....


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru