Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.07.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.004 c
15-1241688579
ford
2009-05-07 13:29
2009.07.12
что быстрее


15-1241808946
TUser
2009-05-08 22:55
2009.07.12
Играем в ассемблер


15-1242145925
voldemar
2009-05-12 20:32
2009.07.12
Компиляция программы из Delphi 2009 под win98


2-1242810369
И. Павел
2009-05-20 13:06
2009.07.12
Как создать письмо, содержащее несколько строк?


15-1242105705
vajo
2009-05-12 09:21
2009.07.12
Антенна "Логос-91"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский