Поиск в базе данных Paradox

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Yulinka
Сообщения: 10
Зарегистрирован: 25 окт 2006, 14:55

спасибки!
Yulinka
Сообщения: 10
Зарегистрирован: 25 окт 2006, 14:55

Сама я додумалась до решения без использования SQL.
Программа эта - справочник по операторам ТП. Есть список (DBGrid1) с названиями операторов (цикл с параметром, составной оператор и т.д.), и два компонента DBMemo - для размещения вида оператора (типа FOR.. TO ... DO и пр.) и его описания. Вся информация об операторах хранится в базе данных.
Блок поиска состоит из поля Edit1, для ввода искомого слова/текста, есть три radiobutton для выбора, в каком поле БД искать.
Поиск начинается после нажатия кнопки "Искать".

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
//запуск поиска
begin
//проверка, не пусто ли поле поиска
if length(edit1.text)=0 then showmessage('Поле поиска пусто!')
else
begin
//определение, какой из переключателей выбран и поиск в соответсвующем поле базы данных
if radiobutton1.checked=true then
 begin
//поиск по имени оператора в поле базы данных OperatorName
 if not Table1.Locate('OperatorName', Edit1.Text, [loPartialKey]) then
 ShowMessage('Извините, ничего не найдено!')
 else
 DBGrid1.SetFocus;
end;
if radiobutton2.checked=true then
//поиск по виду оператора в поле базы данных VidOperatora
 begin
 Table1.First;
//проверка описания на наличие слова
 while (pos(edit1.text, dbmemo2.Text)=0) and (table1.eof=false) do
  begin
//если не найдено
  Table1.Next;
  end;
//если конец таблицы и при этом ничего не найдено
if (pos(edit1.text, dbmemo2.Text)=0) and (table1.eof=true)then
 showmessage('Извините, ничего не найдено!');
if pos(edit1.text, dbmemo2.Text)<>0 then
//выделение найденного слова
 begin
 DBMemo2.SelStart:=(pos(edit1.text, dbmemo2.Text))-1;
 DBMemo2.SelLength:=length(edit1.Text);
 DBGrid1.SetFocus;
 end;
end;
if radiobutton3.checked=true then
//поиск в описании - в поле базы данных AboutOperator
begin
 Table1.First;
 //проверка описания на наличие слова
 while (pos(edit1.text, dbmemo1.Text)=0) and (table1.eof=false) do
  begin
  //если не найдено
  Table1.Next;
  end;
//если конец таблицы и при этом ничего не найдено
 if (pos(edit1.text, dbmemo1.Text)=0) and (table1.eof=true)then
 showmessage('Извините, ничего не найдено!');
//если найдено - выделение найденного слова
 if pos(edit1.text, dbmemo1.Text)<>0 then
 begin
  DBMemo1.SelStart:=pos(edit1.text, dbmemo1.Text)-1;
  DBMemo1.SelLength:=length(edit1.Text);
  DBGrid1.SetFocus;
 end;
end;
end;
//если не выбран ни один из переключателй - предупредить пользователя.
if (radiobutton1.checked=false) and (radiobutton2.checked=false)and (radiobutton3.checked=false) then
showmessage('Выберите, ГДЕ искать!');
end;
минус такого решения - находится только одно слово. Но, как думаете, имеет право на жизнь такой вот ход? Конечно, по сравнению с SQL нерационально ужасно, столько кода... :o ops:
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

SQL помог бы избежать перебора записей. Выделять всё равно пришлось бы ручками :)
Изображение
Ответить