Форум: "Начинающим";
Текущий архив: 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.48 MB
Время: 0.004 c