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

Вниз

Найти следующую запись?   Найти похожие ветки 

 
Shlomo ©   (2006-03-13 15:09) [0]

Здравствуйте!
Я уже пробовал искать здесь, что-нибудь на эту тему, но так и не смог найти. Допустим с помощью ADOQuery1 (подключаясь к SQLServer-у) я ищу в таблице в одном поле название города, города могут повторяться, с помощью метода Locate я нахожу первый город, но сразу за ним мне нужно найти в таблице и следующий такой же город. Как мне это сделать? То есть, мне нужен своеобразный Search Again, Find Next Record.

Помогите, пожалуйста.


 
Reindeer Moss Eater ©   (2006-03-13 15:13) [1]

while AdoQuery1.Locate(...) and (not AdoQuery1.Eof) do AdoQuery1.Next;


 
Vlad ©   (2006-03-13 15:36) [2]


> Reindeer Moss Eater ©   (13.03.06 15:13) [1]


вечный цикл? :-)


 
Ega23 ©   (2006-03-13 16:45) [3]


> while AdoQuery1.Locate(...) and (not AdoQuery1.Eof) do AdoQuery1.
> Next;


Не поможет. Locate не от текущей позиции курсора ищет, а от начала.
По сабжу: или более точные условия для Locate указывай, по двум полям, к примеру, или вообще откажись от Locate, используй Next и сравнение.


 
msguns ©   (2006-03-13 17:11) [4]

type
 TSearchOption = (soFirst,soLast,soNext,soPrior);
 ...  

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;


Это код столько раз сюда кидал, что он уже весь в дырках ;)


 
ANB ©   (2006-03-14 02:19) [5]


> Shlomo ©   (13.03.06 15:09)

Глупейший вопрос - зачем пересылать на клиента все записи, чтобы потом искать по набору данных локэйтом ? Не проще сразу выбрать только нужные записи запросом ?


 
Shlomo ©   (2006-03-14 06:44) [6]

msguns,

Большое Спасибо! :)

То, что надо!



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

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

Наверх




Память: 0.48 MB
Время: 0.052 c
2-1145195628
Замок
2006-04-16 17:53
2006.05.07
как програмно расшарить папку


15-1145053611
Gero
2006-04-15 02:26
2006.05.07
Закон


15-1144825283
tsa
2006-04-12 11:01
2006.05.07
12 апреля День Космонавтики! Ура!


3-1142406478
Stanislav
2006-03-15 10:07
2006.05.07
Сохранение *.udl файла


3-1142415011
AlexeyMir
2006-03-15 12:30
2006.05.07
Как выделить права добавленному пользователю на все таблицы в IB?