Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.07.12;
Скачать: CL | DM;

Вниз

Организация поиска "Далее"   Найти похожие ветки 

 
Den1111   (2009-05-20 12:23) [0]

Помогите пожалуйста оптимизировать функцию поиска. Вообщем реализую поиск по БД. Необходимо найти первое совпадение, после нажимая кнопку "найти далее" ищем следующее совпадение и т.д.
Есть такой код:
procedure TForm1.Button1Click(Sender: TObject);
var FoundRec:boolean;
begin
 FoundRec:=False;
 ButSearchNext.Enabled:=False;
 ADOTable1.First;
 while not ADOTable1.Eof do begin
   if AnsiLowerCase(ADOTable1.FieldValues["pr"]) = AnsiLowerCase(Edit1.Text) then
     begin
       FoundRec:=True;
       ButSearchNext.Enabled:=True;
       break;
     end;
   ADOTable1.Next;
 end;
 if not FoundRec then begin
   ADOTable1.First;
   ShowMessage(Edit1.Text+"не найден");
 end;
end;

procedure TForm1.butSearchNextClick(Sender: TObject);
begin
 ADOTable1.Next;
 while not ADOTable1.Eof do begin
   if AnsiLowerCase(ADOTable1.FieldValues["pr"]) = AnsiLowerCase(Edit1.Text) then
     break;
   ADOTable1.Next;
   if ADOTable1.Eof then ADOTable1.First;
 end;
end;


Вообщем код работает, но в поле Edit необходимо вводить полное значение, т.е. если ищем по полю ФИО, то и значение должно быть "Иванов Иван Иванович". Иначе ошибка. Как можно сделать чтобы искалось с начала строки, т.е. значение "Иванов" и находили бы всех Ивановых, а еще бы лучше организовать поиск любого вхождение в строке :)
Вопрос ламерский понимаю, но чего-то затык сегодня ((


 
Den1111   (2009-05-20 12:24) [1]

По клику на Button1 ищем первую запись удовлетворяющую условию, по кнопке butSearchNext - Далее


 
Ega23 ©   (2009-05-20 12:30) [2]

Недели 2-3 назад обсуждалось, поищи либо в "Начинающим" либо в "Базы", про Locate.

Теперь общие замечания по коду.

1. Не пренебрегай такой штукой, как
DataSet.DisableControls;
try
 ... Работаем с НД
finally
 DataSet.EnableControls;
end;


Данная конструкция ускоряет обход НД на порядок (а то и больше). Даже если к нему никакий DataSource не привязано.

2.
while not ADOTable1.Eof do begin
  if AnsiLowerCase(ADOTable1.FieldValues["pr"]) = AnsiLowerCase(Edit1.Text) then
    begin
Зачем каждый такт цикла вычисляешь AnsiLowerCase(Edit1.Text)? Он же не меняется. Объяви
var
 s : string;
begin
 s := AnsiLowerCase(Edit1.Text);
 while not ADOTable1.Eof do begin
   if AnsiLowerCase(ADOTable1.FieldValues["pr"])=ss then
    ....


3. Что-то мне подсказывает, что если не будет найдено ни одного вхождения, то данный код

while not ADOTable1.Eof do begin
  if AnsiLowerCase(ADOTable1.FieldValues["pr"]) = AnsiLowerCase(Edit1.Text) then
    break;
  ADOTable1.Next;
  if ADOTable1.Eof then ADOTable1.First;
end;

уйдёт в бесконечный цикл.


 
Юрий Зотов ©   (2009-05-20 12:33) [3]

Вместо

if AnsiLowerCase(ADOTable1.FieldValues["pr"]) = AnsiLowerCase(Edit1.Text) then

используем

if Pos(AnsiLowerCase(Edit1.Text), AnsiLowerCase(ADOTable1.FieldValues["pr"])) then


 
sniknik ©   (2009-05-20 12:47) [4]

по теме
http://delphimaster.net/view/2-1241152560/
и для общего развития про ADOTable
http://delphimaster.net/view/2-1241152560/


 
Den1111   (2009-05-20 12:57) [5]

Спасибо всем!


 
Den1111   (2009-05-20 15:28) [6]

Вообщем все получилось, почти :) Дело в том что при поиске если попадается пустая строка (а такое бывает, это справочник телефонов, у некоторых пользователей телефона нет, но допустим есть факс, а факс в другом столбце) то я тут же получаю ошибку "Could not convert variant of type (Null) into type (String)". Как можно ее обойти?

Код такой:

procedure TForm1.Button1Click(Sender: TObject);

begin

 FoundRec:=False;
 ButSearchNext.Enabled:=False;
 ADOTable1.First;

 while not ADOTable1.Eof do begin

if Pos(AnsiLowerCase(Edit1.Text), AnsiLowerCase(ADOTable1.FieldValues["name"])) > 0 then
     begin
       FoundRec:=True;
       Button1.Caption := "найти далее";
       break;
     end;

   ADOTable1.Next;
 end;
 if not FoundRec then begin
   ADOTable1.First;
   ShowMessage(Edit1.Text+"не найдено");
 end;

end;

procedure TForm1.butSearchNextClick(Sender: TObject);
begin
 ADOTable1.Next;
 while not ADOTable1.Eof do begin

if Pos(AnsiLowerCase(Edit1.Text), AnsiLowerCase(ADOTable1.FieldValues["name"])) > 0 then
     break;
   ADOTable1.Next;
  if ADOTable1.Eof then begin
  ADOTable1.First;
  ShowMessage(Edit1.Text+" не найдено");
  end;
 end;
end;


Отдельное спасибо >> Юрий Зотов ©   (20.05.09 12:33) [3]  :))


 
Anatoly Podgoretsky ©   (2009-05-20 16:33) [7]

TField.IsNull


 
Ega23 ©   (2009-05-20 16:36) [8]


> Как можно ее обойти?


var
 fld : TStringField;
begin
 .....
 while not ADOTable1.Eof do
 begin
   fld := ADOTable1.FieldByName("name");
   if fld.IsNull then Continue;
   if Pos(s, AnsiLowerCase(fld.AsString)) > 0 then  
  ......    
 


Ну и советам ты не внял, как я вижу. А зря.


 
sniknik ©   (2009-05-20 16:50) [9]

> А зря.
а пофигу. только плохо, что после И.Ш. будет такого защищать, что его увольнять нельзя... :(


 
Tornado   (2009-05-20 18:01) [10]


> Ega23 ©   (20.05.09 16:36) [8]

Да нет, советам я как раз внял! Этот код я привожу из тестовой программки, для отладки поиска, а потом уже перенесу в основную! И там конечно же сделаю все как надо. СПАСИБО огромное мастера!


 
Tornado   (2009-05-20 18:02) [11]

PS пишу из под другого ника


 
sniknik ©   (2009-05-20 18:14) [12]

> Да нет, советам я как раз внял!
почему тогда код не выкинул а продолжаешь отлаживать и компонент стремный оставил?


 
Den1111   (2009-05-21 08:09) [13]


> sniknik ©   (20.05.09 18:14) [12]

Мне было важно понять сам принцип работы такого поиска, в основной программе уже сделал как положено. Еще раз спасибо. Ttable не использую, только DataSet (в основной проге)


 
Ega23 ©   (2009-05-21 10:20) [14]


> PS пишу из под другого ника


Вообще-то это запрещено правилами форума. Запрещается, пункт 5.


> Еще раз спасибо. Ttable не использую, только DataSet (в
> основной проге)


А что, TTable это не TDataSet?   :)))


 
Den1111   (2009-05-21 11:31) [15]


> Ega23 ©   (21.05.09 10:20) [14]

По поводу правил знаю, исправлюсь :)

Ладно придираться то :) Я использую TADODataSet


 
Ega23 ©   (2009-05-21 11:38) [16]


> Я использую TADODataSet


Одобряю.  :)



Страницы: 1 вся ветка

Текущий архив: 2009.07.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.011 c
2-1242992535
LSDxLove
2009-05-22 15:42
2009.07.12
программа чтения характеристик и просмотра графических bmp файлов


4-1212458021
kroenen
2008-06-03 05:53
2009.07.12
Народ если кто в теме помогите плз найти хэндл АдресБара в Опере


2-1242899868
Int23
2009-05-21 13:57
2009.07.12
Как скопировать содержимая TBitmap в Pointer


15-1242218440
Медвежонок Пятачок
2009-05-13 16:40
2009.07.12
забороть HTTP протокол


3-1220962765
Николай 2
2008-09-09 16:19
2009.07.12
ненадёжность связи и TpFIBDatabase.Execute