Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2010, 18:48   #1
Kuraj
Пользователь
 
Регистрация: 04.01.2010
Сообщений: 20
По умолчанию Проблема с фильтрацией

Здравствуйте есть код
Код:
procedure TForm1.btn1Click(Sender: TObject);
var i,Found,k : Integer;
          c : TComponent;
begin
  qry1.Close;
  k:=0;
  qry1.SQL.Add('select * from otkaz where îì_ðîâä=:0 and ãîä=:1 and îòêàçíîé=:2 and äàòà=:3'+
  ' and êâàëèô=:4 and îòêàç=:5 and èñïîëíèë=:6 and óòâåðäèë=:7 and ñîâåðøåíî=:8 and âðåìÿ=:9 and àäðåñ=:10 and ìåñòî=:11'+
  ' and ïðåäì=:12 and ôàáóëà=:13 and çàÿâèòåëü=:14 and àäðåñ_çàÿâèò=:15 and ïðîêóðàòóðà_íàïðàâ=:16'+
  ' and ïîëó÷åíî=:17 and ðåøåíèå=:18 and äàòà_ðåøåíèÿ=:19 and íîìåð_äîê=:20 and äàòà_äîê=:21 and êâàëèô_=:22'+
  ' and íàïðàâëåí=:23 and îñîáîòì=:24 and ââîä_îïåðàòîð=:25 and êîððåêò_îïåðàòîð=:26');
  //ShowMessage(IntToStr(qry1.Parameters.Count));
  for i:=1 to Form1.ComponentCount-1 do
    begin
      c:=Form1.FindComponent(Form1.Components[i].Name);
      Found := Pos('edt', c.Name);
      IF Found > (0) then
       if (((c as TEdit).Text='') or ((c as TEdit).Text='*')) then
        begin
           (c as TEdit).Text:='*';
           qry1.Parameters[k].Value := '*';
           Inc(k);
        end else
         begin
           qry1.Parameters[k].Value:=(c as TEdit).Text;
           Inc(k);
         end;
    end;
  qry1.Active:=True;
end;
Есть форма в котором много полей и по ним должен ввестись вестись поиск...
Проблема в том что получается так если не чего не введено то ставится звездочка и по идее он должен искать все значения а он ищет только звездочку.. Как можно это исправить? Есть ли какойнить специальный символ?

ps сори за проблеммы с кодировкой если исправлю отредактирую

Последний раз редактировалось Kuraj; 24.06.2010 в 18:55.
Kuraj вне форума Ответить с цитированием
Старый 25.06.2010, 14:40   #2
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

В запросах для строковых значений используйте не = а Like
vovk вне форума Ответить с цитированием
Старый 25.06.2010, 21:35   #3
Kuraj
Пользователь
 
Регистрация: 04.01.2010
Сообщений: 20
По умолчанию

Не нашел ответа что в параметрах можно поставить что бы выбиралось все пришлось делать через жопу.... типа такой фильтрации на каждый ввод

Код:
qry1.Close;                                     // a:=<>''
qry1.SQL.Clear;
x:=0;
sql_s:='select * from otkaz where';
if edt1.text<>''  then
  begin
    sql_s:=sql_s+' ом_ровд='+chr(39)+edt1.text+chr(39);
    x:=1;
  end;


if (edt2.text<>'') and (x=1) then
  begin
    sql_s:=sql_s+' and год='+chr(39)+edt2.text+chr(39);
  end;
if (edt2.text<>'') and (x=0) then
  begin
      sql_s:=sql_s+' год='+chr(39)+edt2.text+chr(39);
      x:=1;
  end;

if (edt3.text<>'') and (x=1) then
  begin
    sql_s:=sql_s+' and отказной='+chr(39)+edt3.text+chr(39);
  end;
if (edt3.text<>'') and (x=0) then
  begin
    sql_s:=sql_s+' отказной='+chr(39)+edt3.text+chr(39);
    x:=1;
  end;



qry1.SQL.Add(sql_s)   ;
 qry1.Active:=True;
Kuraj вне форума Ответить с цитированием
Старый 26.06.2010, 08:45   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну и нормальное решение!
Генерация запроса "на лету"

Единственное. я бы рекомендовал чуть другой подход.
Можно обойтись без переменной X
сделать это можно двумя способами.
1) можно написать так:
Код:
sql_s:='select * from otkaz where 1 = 1';

if edt1.text<>''  then 
  sql_s:= sql_s + ' and  ом_ровд='+QuotedStr(edt1.text);

if (edt2.text<>'') then
  sql_s:=sql_s+' and год='+QuotedStr(edt2.text);
 
// ... ещё куча проверок Edt (чекбоксов и т.д.)

....

либо, второй подход (если не нравится в запросе 1=1)
Код:
sql_s:='select * from otkaz ';
WhereSQL := '';

if edt1.text<>''  then begin
   if WhereSQL<>'' then WhereSQL := WhereSQL + ' and ';
   WhereSQL := WhereSQL + 'ом_ровд='+QuotedStr(edt1.text);
end;

if (edt2.text<>'') then begin
    if WhereSQL<>'' then WhereSQL := WhereSQL + ' and ';
    WhereSQL :=  WhereSQL +'год='+QuotedStr(edt2.text);
end;

// ... ещё куча проверок Edt (чекбоксов и т.д.)

{завершение - формируем строчку запроса}
if WhereSQL<>'' then
  sql_s := sql_s + ' where ' + WhereSQL;

p.s. я чаще пользуюсь вторым подходом, хотя первый короче... Так что - выбирайте, что Вам больше нравится!

Да. Ещё. Длина одной строки в запросе SQL (Query / AdoQuery ) не может быть более 255 символов. Если у Вас много эдитов, тогда строчку формируйте и записывайте сразу в SQL каждое условие через SQL.Add(...AND очередное условие );

Последний раз редактировалось Serge_Bliznykov; 26.06.2010 в 08:49.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.06.2010, 17:32   #5
rumil
Пользователь
 
Регистрация: 25.08.2008
Сообщений: 10
По умолчанию

Дблукап
Код:
filtr_str:='';

//использовать населенный пункт
if (place_CheckBox.Checked)  AND (place_DBLookupComboBox.KeyValue<>null)
  then  filtr_str:= 'id_place='''+inttostr(place_DBLookupComboBox.KeyValue);

 //использовать сектор
if (sektor_CheckBox.Checked) AND (sektor_DBLookupComboBox.KeyValue<>null) then
   begin
    if filtr_str<>'' then
      filtr_str:=filtr_str+ ''' AND id_sektor='''+inttostr(sektor_DBLookupComboBox.KeyValue)
    else
      filtr_str:='id_sektor='''+inttostr(sektor_DBLookupComboBox.KeyValue);
   end;

 //использовать пол
if (gender_CheckBox.Checked) AND (gender_DBLookupComboBox.KeyValue<>null) then
   begin
    if filtr_str<>'' then
      filtr_str:=filtr_str+ ''' AND gender='''+inttostr(gender_DBLookupComboBox.KeyValue)
    else
      filtr_str:='gender='''+inttostr(gender_DBLookupComboBox.KeyValue);
   end;

 //использовать профессию
if (prof_CheckBox.Checked) AND (prof_DBLookupComboBox.KeyValue<>null) then
   begin
    if filtr_str<>'' then
      filtr_str:=filtr_str+ ''' AND id_prof='''+inttostr(prof_DBLookupComboBox.KeyValue)
    else
      filtr_str:='id_prof='''+inttostr(prof_DBLookupComboBox.KeyValue);
   end;

 //использовать национальности
if (national_CheckBox.Checked) AND (national_DBLookupComboBox.KeyValue<>null) then
   begin
    if filtr_str<>'' then
      filtr_str:=filtr_str+ ''' AND id_national='''+inttostr(national_DBLookupComboBox.KeyValue)
    else
      filtr_str:='id_national='''+inttostr(national_DBLookupComboBox.KeyValue);
   end;

if filtr_str='' then exit;
// если есть фильтр добавляем ключевое  слова
if filtr_str<>'' then filtr_str:= ' WHERE '+ filtr_str+'''';

// выводим точто получилось
basic_table.SQL.Text:=  'SELECT * FROM doz_basic'+filtr_str ;

basic_table.Execute;
В случае с эдитами

Код:
filtr_str:='';

 //использовать фамилию
if edit1.Text<>'' then
      filtr_str:='lastname LIKE (''%'+edit1.Text+'%'')';

    //использовать имя
if edit2.Text<>'' then
   begin
    if filtr_str<>'' then
      filtr_str:=filtr_str+ ''' AND firstname LIKE (''%'+edit2.Text+'%'')'
    else
      filtr_str:='firstname LIKE (''%'+edit2.Text+'%'')';
   end;
   
if filtr_str='' then exit;

// если есть фильтр добавляем ключевое  слова
if filtr_str<>'' then filtr_str:= ' WHERE '+ filtr_str+'';

// выводим точто получилось
basic_table.SQL.Text:=  'SELECT * FROM doz_basic'+filtr_str ;
basic_table.Execute;

Последний раз редактировалось rumil; 29.06.2010 в 17:34.
rumil вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Жесть с фильтрацией grafgrial БД в Delphi 4 11.06.2010 09:27
ACCESS 07. Запрос . Бъюсь с фильтрацией данных. agavrila Помощь студентам 9 18.08.2009 20:50
Помогите с фильтрацией vr-frost БД в Delphi 4 29.04.2009 12:50
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37
Пролемы с фильтрацией 1234 БД в Delphi 1 24.07.2008 11:28