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

Вниз

Такая вот проблемка...   Найти похожие ветки 

 
dera   (2006-01-31 19:17) [0]

Использую метод Table.Locate для поиска записи. Но когда запись находится, надо, чтоб поиск происходил дальше (курсор не перемещался на первую запись) по нажатию на батон. Но по нажатию на батон, вызывается этот же метод и поиск начинается сначала. Как продолжить поиск?


 
dera   (2006-01-31 19:50) [1]

Как пройтись в таблице по всем заданым записям? Например, надо найти в поле FAM значение "Иванов". Но программа должна найти первую запись и установить на ней курсор, по нажатию на батон, найти вторую запись, установить на ней курсор, по нажатию на батон - третью и т.д. - до последней записи.


 
Desdechado ©   (2006-01-31 21:07) [2]

на батоне

while not table.eof do
begin
 проверить условие "иванов", если да, то break
 next;
end;

locate, как в справке и написано, ищет первую подходящую запись, а не все подряд


 
dera   (2006-02-01 11:33) [3]

спасибо за ответ. А как при этом проверить частичное совпадение? Например, прийтись по всем записям, что начинаются на "ИВАН".


 
msguns ©   (2006-02-01 11:49) [4]

function DBServ_SearchRecordByField(Grid: TDBGrid; Option: TSearchOption; RaiseErr: boolean): boolean;
// Функция ищет запись в открытом НД, отображаемом в гриде по значению текущего поля
//  (колонки грида) в напрвлении, указанном Option
var
 bm: TBookMark;
 val: variant;
 DS: TDataSet;
begin
 result := false;
 if not Grid.Focused then exit;
 DS := Grid.DataSource.DataSet;
 if (DS=nil) or not DS.Active or (DS.RecordCount<2) then exit;
 Screen.Cursor := crHourGlass;
 DS.DisableControls;
 DS.Tag := 1;
 bm := DS.GetBookmark;
 val := Grid.SelectedField.Value;
 if Option=soFirst then
   begin
    if DS.Locate(Grid.SelectedField.FieldName,Grid.SelectedField.Value,[]) then
      begin bm := DS.GetBookmark; result := true; end;
   end
 else
   if Option in [soNext,soLast] then
     begin
      DS.Next;
      while not DS.Eof do
        begin
         if Grid.SelectedField.Value=val then
           begin
            result := true;
            bm := DS.GetBookmark;     // Запомнить последнюю найденную
            if Option=soNext then break;
           end;
         DS.Next;
        end;
     end
   else
     begin
      DS.Prior;
      while not DS.Bof do
        begin
         if Grid.SelectedField.Value=val then
           begin
            result := true;
            bm := DS.GetBookmark;     // Запомнить первую найденную
            break;
           end;
         DS.Prior;
        end;
     end;
 DS.Tag := 0; DS.EnableControls; DS.GotoBookmark(bm); DS.FreeBookmark(bm);
 Screen.Cursor := crDefault;
 if not result and RaiseErr then ShowMessage("Образец не найден");
end;


Для частичного совпадения вместо

  if Grid.SelectedField.Value=val then

кодировать :

1) Чтобы найти начинающееся на <образец>

  if Copy(Grid.SelectedField.Value,1,Lenght(val))=val then

2) Чтобы найти содержащее <образец> в любой части выражения

  if pos(val,Grid.SelectedField.Value)>0 then

Для того, чтобы игнорировать регистр, в 1) и 2) надо доп-но использовать функцию приведения AnsiUpper|LowerCase

Это для поиска первой или очередной (вперед или назад).

Для поиска всех, удовлетворяющих заданному условию, используют динамически созданные запросы (TXXQuery), результаты которых помещают в отдельные списки (TListVeiw,TStringList,..) и показывают пользователю, который может, щелкнув на любой отобранной записи, увидеть ее полный вид в основной решетке (прграмма по клику должна найти в осн.датасете запись, соотв-ю выьбранному элементу списка, обычно методом Locate(<UID>).

 В зависимости от полноты совпадения и учета регистра запрпос на выборку содержит соответствующие условия-функции языка SQL


 
dera   (2006-02-01 12:03) [5]

<msguns ©   (01.02.06 11:49) [4] >
Хотя не все пока и понятно, но большое спасибо, за ответ!



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

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

Наверх




Память: 0.48 MB
Время: 0.033 c
2-1138631840
13
2006-01-30 17:37
2006.02.19
Буфер данных


4-1133771960
rusgl
2005-12-05 11:39
2006.02.19
Как отличить нажатую физически на клавиатуре клавишу от эмуляции


1-1137873251
Volf_555
2006-01-21 22:54
2006.02.19
Как определить запускаемые задачи из C: WINDOWS Tasks ?


4-1133808278
solomon
2005-12-05 21:44
2006.02.19
Internet Explorer, фрейм и отлов нажатия кнопок в нем.


2-1138713343
Елизавета
2006-01-31 16:15
2006.02.19
Необходимо изменить содержимое файла. Как это сделать?