Как выстроить запрос по части поля ввода ?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как выстроить запрос по части поля ввода ?

Сообщение Little_Roo » 05.04.2010 16:18:09

Есть макро-проблема - в предыдущей базе использовалась Дельфя7 в связке с библиотекой EhLib (той, что еще некоммерческой была)
Там в DBNAVIGATOR (правда, от TMS Software использовал AdvDBNavigator) - но не в этом суть - просто у этого навигатора была доп. кнопка - поиск
и на нее я навесил вот какую конструкцию -- при вводе фамилии (или ЧАСТИ ее, не взирая на первую букву - большая или маленькая) - я в школе работаю :) происходила локальная фильтровка.
Код: Выделить всё
procedure TForm1.N7Click(Sender: TObject); //  select FAM
var
    s,s1, fami: string;
begin
    fami:=InputBox('Поиск по фамилии',
                 'Укажите ее (или ее часть) и нажмите ОК',
                 '');
    if fami <> '' // если ввели фамилию
    then
      begin
         dm.IBDataSet1.Filtered := false;
         dm.IBDataSet1.Filtered := true;

         s := AnsiUpperCase(LeftStr(fami,1));
         s1 := AnsiLowerCase(MidStr(fami,2,30));
         dm.IBDataSet1.Filter := ' Fam = ''' + s + s1 +'*''';
         dm.IBDataSet1.RefreshFilters;
      end;
end;

Но - во фрипаскале вроде нет (поправьте) - MidStr ?
Изврат мой - новая кнопка - с данной процедурой НЕ работает напрочь...ну это понятно...

Кто поможет идеей, или лучше примером - базу нужно вработать вчера - весь цей на ней висит, а тут ЕГЭ :oops:

Да, в дельфях использовал триальный FibPlus, но начальство...сказала...тихо...и не злобно...что НУЖНО, НО БЕЗ лицензионных заморочек.
Вот и пытаюсь все перевести на СПО

Да, база на WinXP sp3
Firebird 2.1.3 zeos 7-devel (из svn) rxnew (из svn)
Lazarus 0.9.29 r24387 FPC 2.5.1 i386-win32-win32/win64
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 639
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: Как выстроить запрос по части поля ввода ?

Сообщение Vadim » 05.04.2010 17:28:27

Little_Roo
Так а что надо то? Найти любое вхождение подстроки в поле без учёта регистра?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Как выстроить запрос по части поля ввода ?

Сообщение Padre_Mortius » 05.04.2010 18:29:23

Ну так используйте фильтры или sql-запрос. По нажатию кнопки появляется ваш Inputquery в котором вводите искомое значение и при нажатии на кнопку "Ok" отрабатывает фильтр или sql-запрос. Только учитывайте, что лазарь использует кодировку UTF-8
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Как выстроить запрос по части поля ввода ?

Сообщение Little_Roo » 05.04.2010 19:13:43

Vadim писал(а):Little_Roo
Так а что надо то? Найти любое вхождение подстроки в поле без учёта регистра?

Нужно - при вводе

вас

отфильтрововались

Васечкин
Васильев
Вася
......
Про юникод...да...поддержу его убивцев, но только морально, косячить ТАК сразу ...не комильфо...ну не везде ж можно на линух переползти за пару дней и безболезненно (с учетом того, что ШКОЛЬНОМУ начальству это ни в какое место НЕ упирается)...............
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 639
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: Как выстроить запрос по части поля ввода ?

Сообщение Padre_Mortius » 05.04.2010 19:29:33

под руками был пример для sqlite. База в UTF-8. Переделать на Firebird в принципе не долго.
Код: Выделить всё
var
  s3db: TSqlite3Dataset;
  GetDBPath, aCondition: AnsiString;
  dbsrc: TDatabaseSource;
  SqliteDBGrid: TDbGrid;
begin
  if s3db.Active then s3db.Close;
  s3db.FileName := GetDBPath;
  ShortDateFormat := 'DD.MM.YYYY';
  s3db.TableName := 'tbl_CurrencyList';
  if UTF8Length(aCondition) = 0 then
    s3db.SQL := 'select * from tbl_CurrencyList' else
      s3db.SQL := 'select * from tbl_CurrencyList where ' + aCondition;
  s3db.Open;
  dbsrc.DataSet := s3db;
  SqliteDBGrid.DataSource := dbsrc;
end;


в aCondition прописывается условие (у меня используется фильтрация по нескольким полям с учетом полного ввода и частичного) типа
Код: Выделить всё
...where field = 123
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Как выстроить запрос по части поля ввода ?

Сообщение Little_Roo » 05.04.2010 21:35:42

Vadim писал(а):Little_Roo
Так а что надо то? Найти любое вхождение подстроки в поле без учёта регистра?

Нет, найти начальное вхождение...из поля ввода
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 639
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: Как выстроить запрос по части поля ввода ?

Сообщение dunin » 05.04.2010 22:18:06

Ну я примерно так делаю... Может подойдет. Копипащу кусок кода. Думаю разберетесь.
Код: Выделить всё
procedure TBookForm.ElocUserChange(Sender: TObject);
begin
...
      iUserData.DisableControls;
      iUserData.Filtered:= False;
      iUserData.Filtered:= True;
      iUserData.EnableControls;
...
end;   
...
procedure TBookForm.iUserDataFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
  Accept:= (pos(AnsiUpperCase(UTF8ToAnsi(trim(ElocUser.Text))),AnsiUpperCase(UTF8ToAnsi(iUserData.FieldByName('FIO').AsString))) > 0);
end;

Можно поставить pos(...) = 1, тогда будет начальное вхождение
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Как выстроить запрос по части поля ввода ?

Сообщение AbakAngelSoft » 06.04.2010 10:08:16

Little_Roo писал(а):о фрипаскале вроде нет (поправьте) - MidStr

MidStr и все прочие вкусности для строк находятся в StrUtils
Аватара пользователя
AbakAngelSoft
постоялец
 
Сообщения: 273
Зарегистрирован: 06.08.2008 19:28:26
Откуда: Краснодар


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46

Рейтинг@Mail.ru