Главная страница
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.043 c
2-1138553720
SergV
2006-01-29 19:55
2006.02.19
Измирение темпиратуры чипсетов в Delphi


15-1138734071
Цукор5
2006-01-31 22:01
2006.02.19
MAC


4-1133690898
Surik
2005-12-04 13:08
2006.02.19
EnumResourceTypes постоянно возвращает ошибку


3-1135066290
Ярослав
2005-12-20 11:11
2006.02.19
Сложить две поля типа TIME в FB


15-1138625615
ArtemESC
2006-01-30 15:53
2006.02.19
Получают ли что-то модераторы?