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

Вниз

Последовательный переход к записи   Найти похожие ветки 

 
DDDeN   (2005-06-30 11:41) [0]

У меня простая база на основе драйвера STANDARD. Там одна табличка - Cars.db. В табличке 6 полей. Необходимо организовать поиск по базе (не фильтр!) по критерию и полю указанному пользователем. Н-р, при нажатии на кнопку ищется первая запись, при нажатии еще раз (можно и на другую, типа "Далее") ищется следующая запись, удовлетворяющая критерию, опять же, указанного пользователем. Я пробовал методом Locate(...), но он находит первую запись от начала набора данных, а дальше не могу его "пнуть"...
Заранее спасибо!


 
Johnmen ©   (2005-06-30 11:43) [1]

А ты руками пройди по набору данных, применяя свой критерий к каждой записи...:)


 
DDDeN   (2005-06-30 11:46) [2]

Я пробовал так проходить, а он проскакивает все записа

while not Table1.Eof do begin
if Locate(Edit1.Text, Edit2.Text, [liCaseInsensitive, loParityKey) then Exit;
end;


 
Johnmen ©   (2005-06-30 11:52) [3]

Ну да, ты же не руками критерий применяешь, а Локейтом :)


 
DDDeN   (2005-06-30 11:58) [4]

а как проверить критерий и если он совпадает с пользовательским остановится на записи этой?


 
Digitman ©   (2005-06-30 11:59) [5]


> DDDeN   (30.06.05 11:46) [2]


var bkmrk: TBookmark;
..

Found := False;
bkmrk := Table1.GetBookmark;
try  
 while not Table1.Eof do
   begin
     if проверка_на_соответствие_записи_заданному_критерию then
       begin
         Found := True;
         break;
       end;
     Table1.Next;
   end;
finally
 if not Found then
   Table1.GotoBookmark(bkmrk);
end;


 
Johnmen ©   (2005-06-30 12:03) [6]


> Digitman ©   (30.06.05 11:59) [5]


так поинтересней :)
while (not Table1.Eof) and (not Found) do


 
Digitman ©   (2005-06-30 12:06) [7]


> Johnmen ©   (30.06.05 12:03) [6]


не спорю)


 
Sergey13 ©   (2005-06-30 12:09) [8]

Если это для кнопки "Далее", то Table1.Next надо перед IF наверное ставить. Иначе с текущей записи не сойдет.


 
DDDeN   (2005-06-30 12:53) [9]

а как к полю обратится?

Table1.Field.AsString("FIO"); ?


 
Sergey13 ©   (2005-06-30 12:54) [10]

FieldByName


 
DDDeN   (2005-06-30 13:48) [11]

if Table1.FiledByName("FIO") = "Иванов" then break;


 
Digitman ©   (2005-06-30 13:53) [12]

if Table1.FiledByName("FIO").Value = "Иванов" then break;


 
Johnmen ©   (2005-06-30 14:25) [13]

>Digitman ©   (30.06.05 13:53) [12]

Что-то ты, Серёга, сегодня не в духе :)
Так писать не надо, а то можно поймать ексепшн.


 
Digitman ©   (2005-06-30 14:30) [14]


> Johnmen ©   (30.06.05 14:25) [13]


а ты, Женя, сегодня тоже что-то не в тот огород камни бросаешь) ..

нет бы вразумить автора, что объектное св-во не м.б. несравнимо с текстовым значением)) .. вроде бы Value у TField не по дифолту)

а насчет ловли ексепшна - эт уже отдельная басня)


 
Digitman ©   (2005-06-30 14:32) [15]


> не м.б. несравнимо


эт я удачно загнул))

следует читать как "не м.б. сравнимо"


 
msguns ©   (2005-06-30 14:33) [16]

function TdmFonds.DB_SearchRecordInField(Grid: TDBGrid; SO: TSearchOption; RaiseErr: boolean = false): boolean;
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;
 DS.DisableControls;
 DS.Tag := 1;
 bm := DS.GetBookmark;
 val := Grid.SelectedField.Value;
 if SO=soFirst then
   begin
    if DS.Locate(Grid.SelectedField.FieldName,Grid.SelectedField.Value,[]) then
      begin
       bm := DS.GetBookmark;
       result := true;
      end;
   end
 else
   if SO 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 SO=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);
 if not result and RaiseErr then ShowMessage("Образец не найден");
end;


 
Johnmen ©   (2005-06-30 14:36) [17]

>Digitman ©   (30.06.05 14:30) [14]

Да я так, слегка :) Интересно же пообщаться со знающими людьми.
А автор твоих умных слов не поймёт, ИМХО. Ибо основ ещё не освоил. Поэтому же и вразумлять - неэффективно...


 
Digitman ©   (2005-06-30 14:39) [18]


> Johnmen ©   (30.06.05 14:36) [17]


> Да я так, слегка


ничего себе "слегка" !)... еле увернуться успел)))


> Интересно же пообщаться со знающими людьми


"А я еще на гармошке играть умею ! ... И вышивать крестиком !" (с) ..))


> вразумлять - неэффективно


но .. надо, Жень,надо) ..



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

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

Наверх




Память: 0.51 MB
Время: 0.031 c
8-1107000935
Atomic
2005-01-29 15:15
2005.08.07
JPG TO BMP


14-1121400496
БарЛог
2005-07-15 08:08
2005.08.07
Заработок в интернет. Пробывали?


4-1118234926
bckfvjd
2005-06-08 16:48
2005.08.07
Нажатие на кнопку


1-1121940084
vers
2005-07-21 14:01
2005.08.07
Выполнение до отображения главной формы приложения


14-1121328888
Juice
2005-07-14 12:14
2005.08.07
Перевод исходников C++ <--> Delphi