Главная страница
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.054 c
3-1142349686
GERDA
2006-03-14 18:21
2006.05.07
ORA 9.2 BLOB->CLOB


2-1145427557
lamot
2006-04-19 10:19
2006.05.07
DBEdit


3-1142597471
Гость1111
2006-03-17 15:11
2006.05.07
Работа с Метаданными в ORacle


8-1134149328
Dark Lord
2005-12-09 20:28
2006.05.07
Гитарный тюнер на Дельфи


2-1145304765
qazwsx
2006-04-18 00:12
2006.05.07
Чёт не получается у мну нормально с мускулом работать...