как я могу заставить свое окно поиска переходить от одного ключевого слова к другому, не проверяя каждую строку базы данных?

У меня есть этот код, работающий для окна поиска моего приложения, к сожалению, когда он ищет или фильтрует, он проверяет каждую строку в базе данных, а затем, когда искомое слово найдено, он отображает его на tlabels,

procedure Tspcb.dccolbtnClick(Sender: TObject);
begin
  zdctable.First;
  while not zdctable.EOF do
  begin
     if (zdctable.FieldByName('Collector').AsString = dcedit.Text)
     then begin
        cn.Caption := zdctable.FieldByName('Client_Name').AsString;
        col.Caption := zdctable.FieldByName('Collector').AsString;
        pay.Caption := zdctable.FieldByName('Daily_Payment').AsString;
        date.Caption := zdctable.FieldByName('Date').AsString;
        ddate.Caption := zdctable.FieldByName('Due_Date').AsString;
        id.Caption := zdctable.FieldByName('ID').AsString;
        la.Caption := zdctable.FieldByName('Loan').AsString;
        tc.Caption := zdctable.FieldByName('Total_Collectibles').AsString;
     end;

     ShowMessage('click ok for next profile');
     zdctable.Next;
  end;
end;

что я хочу сделать, так это проверить строки, в которых есть искомое слово, а не искать каждую строку в базе данных.

Мне нужна помощь в анализе этого кода, я всего лишь новичок, который учится использовать Delphi 7 и программировать.

благодарю вас


person Chunk Chunk    schedule 11.04.2013    source источник
comment
Вы не задаете конкретный вопрос, а просите кого-то сделать то, что вы должны делать, то есть проанализировать, как работает этот код, и изменить его, чтобы он работал так, как вы хотите. Такого рода вопросы слишком локализованы для чрезмерно широкой аудитории StackOverflow.   -  person jachguate    schedule 11.04.2013
comment
Начните с извлечения zdctable.First. Вы возвращаетесь к началу набора данных каждый раз, когда нажимаете кнопку, что, естественно, не позволит вам увидеть какие-либо другие строки, кроме первого совпадения. Нажмите кнопку->Перейти к первому ряду->Найти первое совпадение->Нажмите кнопку->Перейти к первому ряду->Найти первое совпадение->Нажмите кнопку... Затем см. справку о TDataSet.FindFirst и TDataSet.FindNext, чтобы полностью удалить цикл.   -  person Ken White    schedule 11.04.2013
comment
извините, если мой вопрос показался локализованным, и я прошу, чтобы меня накормили. я просто новичок и не знаком с терминами, которые нужно использовать при обращении за помощью, но я не хочу, чтобы меня кормили с ложечки, достаточно просто руководства, потому что этот код - лучшее, что я могу сделать с помощью друга. спасибо @KenWhite спасибо, добрый сэр, за ответ, я рассмотрю этот вопрос. извините, если мои вопросы всегда казались, что я задаю здесь кормление с ложки   -  person Chunk Chunk    schedule 11.04.2013
comment
Вы используете Delphi 7. Он поставляется с демонстрационным приложением (к сожалению, все еще основанным на BDE, но работает) под названием MastApp. Вы должны найти его в папке Demos (не помню, где это было на D7, но вы должны найти его в меню «Пуск»). Глядя на то, что он делает и как он это делает, он должен дать вам хорошие отправные точки. Кроме того, вы можете поискать учебник по Delphi в Google. :-)   -  person Ken White    schedule 11.04.2013
comment
прочитал руководство по delphi на сайте about.com, и кто-то там помог мне создать этот код (благодаря его руководству), но проблема в том, что я не знаю, где я должен отредактировать код, чтобы он искал следующую ближайшую запись к тексту в tedit. К сожалению, я не могу найти учебник даже в меню «Пуск». но в любом случае большое спасибо, сэр, я буду много читать о советах, которые вы мне дали.   -  person Chunk Chunk    schedule 11.04.2013
comment
Вы смотрели на docwiki.embarcadero.com/Libraries/XE3/ ru/ собственность?   -  person Gerry Coll    schedule 13.04.2013


Ответы (1)


Проблема в основном с линией

if (zdctable.FieldByName('Collector').AsString = dcedit.Text)

Здесь вы ищете равенство, поэтому вы никогда не сможете сопоставить частичные строки. Я предлагаю вам изменить свой запрос (например, zdctable), чтобы он выглядел примерно так:

select * from zdctable
where collector like :p1

Тогда ваша программа будет

zdctable.params[0].asstring:= '%' + dcedit.text + '%';
zdctable.open;

Если ваша таблица связана с сеткой через источник данных, то будут отображаться все совпадающие записи; не нужно будет извлекать каждое поле и отображать его в другой метке. Если вы хотите показывать в навигаторе по одной записи за раз, превратите свои метки в компоненты dbtext, которые связаны с набором данных; если эти компоненты настроены правильно, то каждое поле в вашем наборе данных будет отображаться в другом компоненте dbText.

Другая возможность заключается в использовании метода «найти». Если я преобразую ваше утверждение, чтобы использовать «найти», то вы написали эквивалент

zdctable.locate ('collector', dcedit.text, [])

Чтобы найти частичные совпадения, вам нужно написать

zdctable.locate ('collector', dcedit.text, [loPartialKey])
person No'am Newman    schedule 12.04.2013
comment
'%' + dcedit.text + '%' это похоже на упрощенный синтаксис квази-SQL в Microsoft Access. В SQL это должно быть похоже на '%' || :dcedit || '%' - person Arioch 'The; 12.04.2013
comment
Насчет обеих колонок согласен - рано утром написал ответ. Я пересмотрел свой ответ. - person No'am Newman; 12.04.2013
comment
@No'amNewman, спасибо за пост, проверю это. - person Chunk Chunk; 12.04.2013
comment
@No'amNewman - я отменил свой голос против - person Gerry Coll; 13.04.2013