Текущий архив: 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.46 MB
Время: 0.011 c