Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск по БД при помощи ADODataSet1.Locate [D2k5]


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

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


ZeroDivide   (2006-02-06 09:28:00) [1]

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


ZeroDivide   (2006-02-06 09:27:00) [2]

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


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

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


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

Серьезные люди серьезно ответили в [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-01-24 05:05:00) [5]

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


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

msguns

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


msguns   (2006-01-23 11:22:00) [7]

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

;)


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

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


msguns   (2006-01-23 09:15:00) [9]

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;


sniknik   (2006-01-23 08:47:00) [10]

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


Vemer   (2006-01-23 08:36:00) [11]

LocateNext?


sniknik   (2006-01-23 08:22:00) [12]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо