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

Вниз

Поиск по БД при помощи ADODataSet1.Locate   Найти похожие ветки 

 
Анархист ©   (2006-01-23 04:00) [0]

Доброго времени суток, увожаемые мастера, я написал софтень, Телефонный справочник, БД которого находится на ЭсКуЭль серваке, поиск по базе работает, всё норм, но есть трабла...в справочнике встречаются одинаковые фамилии, сотрудников работающих в разных отделах, а поиск находит ТОЛЬКО ПЕРВОГО удовлетворяющего условию, так вот трабла и вопрос заключаются в том как остальных найти? Или сортировку сделать...Заранее благодарю


 
sniknik ©   (2006-01-23 08:22) [1]

найти следующего - поиск по выражению фильтра FindFirst, FindNext, ...
сделать сортировку - Sort,  работает при открытии рекордсета в локальном курсоре

+ можно еще и отдел включить в условие локейта для более конкрентного поиска


 
Vemer ©   (2006-01-23 08:36) [2]

LocateNext?


 
sniknik ©   (2006-01-23 08:47) [3]

> LocateNext?
а вот этого в ADO компонентах нет. (это чтото с IB связано, вроде бы)


 
msguns ©   (2006-01-23 09:15) [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;


 
Анархист ©   (2006-01-23 10:12) [5]

soNext,soLast Дельфя говорит, что таких идентификаторов нет, т.е. она их не знает и TSearchOption тоже... :)


 
msguns ©   (2006-01-23 11:22) [6]

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

;)


 
Анархист ©   (2006-01-24 03:46) [7]

msguns

Не работает, писанины дохрена, толку 0, у меня поиск идёт из другой формы при помощи процедуры Form1.ADODataSet1.Locate("Фамилия",Edit1.Text,[]); т.е. фамилия вводится в Едит т.ч. твоя функция тут не работает...тут надо наверно SQL запросом воспользоваться, но я в SQL толком не шарю...ща в скриптах пороюсь, можт что найду... :)


 
Анархист ©   (2006-01-24 05:05) [8]

" select Column_Name from DB_Name where like "%text%" " Подскажите пожалуйста, как мне этот запрос описать, если вместо параметра text должно быть слово из компонента Edit1.Text?


 
ASoft   (2006-01-24 08:15) [9]

Серьезные люди серьезно ответили в [4], но чем-то вас не устроил этот код -
пошли по пути наименьшего сопротивления, а каменюки на каждом шагу..
К примеру, приведенный кусок select Column_Name from DB_Name where like "%text%" вряд ли будет работать, поскольку where ? like...
Подставить Edit1.text: "select Column_Name from DB_Name where [..?..] like %"+Edit1.text+"%".
Но что в итоге вы получите? Все найденные фамилии, содержащие буквы параметра, а это вам надо? :)


 
Анархист ©   (2006-02-06 08:38) [10]

Мне надо, чтобы находились все фамилии соответствующие запросу т.е. если в базе 3 фамилии Сердюков к примеру да? То все три и должен выдть,но не ИМЕННО САМИ фамилии, а выделить строки с данными по этому человеку, в принципе у меня сейчас программа так и работает, только находит первое совпадение, а надо, чтоб либо все сразу показывала, либо так сказать "степ бай степ" по нажатию кнопки, нажал -->нашла, нажал-->перешла,снова перешла тип того :)


 
ZeroDivide ©   (2006-02-06 09:27) [11]

Тебе уже ответили и как сделать отбор:
"select Column_Name from DB_Name where Column_Name like %"""+Edit1.text+"""%";
и как сделать поиск. [4]


 
ZeroDivide ©   (2006-02-06 09:28) [12]

"select Column_Name from DB_Name where Column_Name like ""%"+Edit1.text+"%""";



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

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

Наверх




Память: 0.5 MB
Время: 0.056 c
15-1138260290
Чародей
2006-01-26 10:24
2006.02.26
Такты


6-1132339269
Jimmy
2005-11-18 21:41
2006.02.26
Игра под модем


4-1133908355
Volf_555
2005-12-07 01:32
2006.02.26
Как получить строковое значение функции CreateGUID()?


15-1139334353
Loginov Dmitry
2006-02-07 20:45
2006.02.26
GroupBox + XPManifest + DLL = ...


15-1139283950
Логин
2006-02-07 06:45
2006.02.26
FastReport 3.20