Представьте, что Вы имеете большую таблицу и Вы должны дать возможность поиска конечному пользователю, а трафик сети - проблема.
В этом случае мы можем использовать TComboBox, чтобы определить в каком столбце искать и TEdit, чтобы определить критерии поиска.
Структура таблицы:
|CODE|NAME|LOCATION|GENDER|
Необходимо:
- Форма
- TQuery по имени MyQuery
- TDBGrid или другое управление, TDataSource, DataModule и т.д.
- TEditBox по имени edtSelect
- TComboBox по имени cbSelect
- TBitButton по имени bbtnSelect (чтобы выполнить запрос)
- Некоторые глобальные переменные
SString --> string
RecordRetrieved --> integer
StatusBar (необязательно)
Свойства:
SQL = Select CODE, NAME, LOCATION, TYPE from
MYTABLE MYTABLE
where CODE like :SearchString
Active = false
Parameters --> SearchString --> ftString
Как было сказано выше, cbSelect укажет на искомый столбец.
В инструкции SQL столбец расположени после WHERE.
Пункты в cbSelect:
- CODE
- NAME
- LOCATION
- GENDER
События
В создании формы:
procedure TForm1.FormCreate(Sender: TObject);
begin
inherited;
SString :='%%';
cbSelect.ItemIndex := 0;
end;
Напечатайте в критериях поиска в TEditBox:
procedure TForm1.edtSelectChange(Sender: TObject);
begin
inherited;
SString := '%' + edtSelect.Text + '%';
end;
Выполнение запроса:
procedure TForm1.bbtnSelectClick(Sender: TObject);
begin
inherited;
with Myquery do
begin
close;
SQL.Clear;
SQL.Add('SELECT CODE, NAME, LOCATION, TYPE');
SQL.Add('FROM MYTABLE MYTABLE');
case cbSelect.ItemIndex of
0: begin
SQL.Add('WHERE CODE LIKE :SearchString');
ParamByName('SearchString').AsString := SString;
end;
1: begin
SQL.Add('WHERE NAME LIKE :SearchString');
ParamByName('SearchString').AsString := SString;
end;
2: begin
SQL.Add('WHERE LOCATION LIKE :SearchString');
ParamByName('SearchString').AsString := SString;
end;
3: begin
SString := 'M';
edtSelect.Text:= 'M';
SQL.Add('WHERE GENDER = "M"');
end;
4: begin
SString := 'F';
edtSelect.Text:= 'F';
SQL.Add('WHERE GENDER = "F"');
end;
End; {case}
SQL.Add('ORDER BY CODE, GENDER');
open;
end; { with }
RecordsRetrieved := MyQuery.RecordCount;
sbStatusBar.Panels[2].text:= IntToStr(RecordsRetrieved) + ' Records';
//Обновить строку состояния
end;
|