Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поиск по нескольким полям ... / 11 сообщений из 11, страница 1 из 1
13.07.2003, 13:43
    #32206482
KeepeR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким полям ...
Столкнулся тут с проблеммой ... думаю она актуальна для многих.
Надо сгенерировать в Delphi SQL запрос, но это получается настолько громоздко что как то не решаюсь его написать

Поиск по четырем полям ... причем с выбором условия "и"-"или"....

Запрос получается такого типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure frmSearchh.SerachBtnClick(Sender: TObject);
var sql: string;
begin
   IBQuery.Close;
   if GroupButtonBox.ItemIndex =  "and"  then begin
      sql := 'SELECT field1, field2, field3, field4 FROM table1 WHERE field1 = :var1';
      if IBQuery.FieldByName('field2').Value <> null then begin
         sql := sql + ' AND field2 = :field2'
      end;
      if IBQuery.FieldByName('field3').Value <> null then begin
        sql := sql + ' AND field3 = :field3';
      end;
      (и т.д.) ........
      IBQuery.SQL.Text := sql;
      IBQuery.Open;
   end else if GroupButtonBox.ItemIndex =  "or"  then begin
      (и тут почти то же самое)............
   end;
;

Если представить что в поиске будет принимать минимум полей 50 то каких же размеров получится тогда код ...

Может кто с таким сталкивался ... как это можно решить, упростить это дело???
...
Рейтинг: 0 / 0
13.07.2003, 16:39
    #32206527
Алексей_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким полям ...
А может использовать что то в таком стиле:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
var
  s, razd : string;
  i : integer;
begin
  razd := '';
  s := 'SELECT * FROM table1 WHERE ';
  for i :=  0  to t1.FieldCount -  1  do
  begin
    if t1.Fields.FieldByNumber( 1 ).Value <> null then
    begin
      s := s+razd+' AND field' + inttostr(i) + ' = :field' + inttostr(i);
      if razd = '' then razd := 'AND';
    end;
  end;
end;
...
Рейтинг: 0 / 0
13.07.2003, 16:48
    #32206531
Алексей_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким полям ...
т.е.
FieldByNumber(1) -> FieldByNumber(i)
конечно.
Но идея должна быть понятной, так же можно имена полей если они не называются field1-100 брать из таблицы T1.Fields .FieldName
...
Рейтинг: 0 / 0
13.07.2003, 16:51
    #32206532
Алексей_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким полям ...
[scr]T1.Fields .FieldName[/scr]
Блин, режет этот форум [ i ] без пробелов, не первый раз уже наступаю на эти грабли, все никак не привыкну :(
...
Рейтинг: 0 / 0
13.07.2003, 16:57
    #32206534
KeepeR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким полям ...
Дело в том что у меня некоторые параметры являются подзапросами .. например:
Код: plaintext
1.
...AND GOODID = (SELECT GOODID FROM GOODS WHERE GOODNAME = :GOODNAME  
AND GOODID = Alias.GOODID)...
так что приходится делать каждое поле через if ... then ...
это еще полбеды ... все беда в том что если два поля заполнены то получается запрос
Код: plaintext
1.
...AND GOODID = (SELECT GOODID FROM GOODS WHERE GTID = :GTID  
AND GOODID = Alias.GOODID)...
Так что этот проклятый, чтоб он провалился GOODID зависит от того заполнено ли 2 поля, или только какое-то одно :(

Можно конечно это упростить добавив одно поле в таблицу в базе данных, но это не решит проблеммы ... с Edit работать - себе дороже, т.к. тут уже придется использовать динамически StringList .... А для DBEdit нужен IBQuery
причем в базе нет таблицы где поля бы совпадали с с полями которые нужны в этом IBQuery.... остается только создать в базе отдельную таблицу что то вроде GOODSEARCH, но для каждого поиска то не будешь создавать, накладно выходит .. :(
Так что проблемка та еще ....
...
Рейтинг: 0 / 0
13.07.2003, 16:58
    #32206537
Алексей_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким полям ...
Как вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
var
  s, razd : string;
  i : integer;
begin
  razd := '';
  s := 'SELECT * FROM table1 WHERE ';
  for i :=  0  to t1.FieldCount -  1  do
  begin
    if t1.Fields.FieldByNumber(i).Value <> null then
    begin
      s := s+razd+' AND '+T1.Fields[i].FieldName + ' = :Par_'+T1.Fields[i].FieldName;
      if razd = '' then razd := 'AND';
    end;
  end;
end;
...
Рейтинг: 0 / 0
13.07.2003, 17:02
    #32206538
Алексей_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким полям ...
Мой предыдущий вариант относился к простой таблице,а не к подзапросам, пока писал ответа еще не было.
После уточнения он конечно не подходит.
...
Рейтинг: 0 / 0
13.07.2003, 17:04
    #32206539
KeepeR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким полям ...
к простым таблицам я делал с dinamical array все замечательно проходило ...
а тут :(
...
Рейтинг: 0 / 0
14.07.2003, 14:30
    #32207216
Hammer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким полям ...
Ну а если попробовать так:
procedure frmSearchh.SerachBtnClick(Sender: TObject);
{}
function AddSqlStr( const Name, AndOr: String ): String;
begin
IBQuery.FieldByName( Name ).Value <> null then
Result := AndOr + ' Name = :Name '
else
Result := '';
end;
{}
var
sql: string;
i: Integer;
begin
IBQuery.Close;
sql := 'SELECT field1, field2, field3, field4 FROM table1 WHERE field1 = :var1';
for i := 1 to IBQuery.FieldCount - 1 do
begin
if GroupButtonBox.ItemIndex = "and" then
begin
sql := sql + AddSqlStr( IBQuery.Fields.Fileds .FieldName, 'AND' );
end
else begin
if GroupButtonBox.ItemIndex = "or" then
begin
sql := sql + AddSqlStr( IBQuery.Fields.Fileds.FieldName, 'OR' );
end;
end;
end;
IBQuery.Sql.Text := Sql;
IBQuery.Open;
end;

Ну а внутри ф-ции AddSqlStr сделать обработку на вложенные запросы.
...
Рейтинг: 0 / 0
14.07.2003, 19:16
    #32207621
KeepeR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким полям ...
2 Hammer

Идея конечно хорошая ...
но в том то и дело что вариантов множество ...но среда них ни один еще не подошел ... потому что проблема именно в этом подзапрое where fieldname = :fieldname
:fieldname = (Select .... ) - вот что будет постоянно разным ... :(
ну ничего ...я в принципе нашел выход из этой ситуации ... правда он подходит для не очень большого количества полей ...
Но все равно спасибо .... ты подал мне еще одну очень хорошую идею ....
...
Рейтинг: 0 / 0
15.07.2003, 15:03
    #32208462
Hammer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким полям ...
Да всегда пожалуйста
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поиск по нескольким полям ... / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]