Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/72: Рейтинг темы: голосов - 72, средняя оценка - 4.58
0 / 0 / 0
Регистрация: 27.03.2010
Сообщений: 39

Поиск по нескольким полям

08.04.2010, 12:31. Показов 13777. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Подскажите пожалуйста, как организовать поиск по нескольким полям. Причем может вводится 1-ое значение , а второе например будет пустое, в 3-ьем тоже будет запись какая-нибудь. Реально такое сделать подскажите пожалуйста!!!!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.04.2010, 12:31
Ответы с готовыми решениями:

Поиск по нескольким полям
авм Добавлено через 6 минут Если не ввести временной интервал отказывается искать в БД Кто поможет разобраться? вот код : ...

Поиск по нескольким полям
что то я делаю не так... если делаю так: ADOQuery1.SQL.Clear; AdoQuery1.Sql.Add('SELECT * FROM База WHERE Наименование LIKE :nam or...

Поиск по нескольким полям методом Locate
Как сделать чтоб поиск происходил в нескольких полях procedure TForm2.Button3Click(Sender: TObject); begin if not...

34
 Аватар для NemiroFFyo
70 / 70 / 3
Регистрация: 29.09.2009
Сообщений: 530
12.04.2010, 14:24
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DenProx Посмотреть сообщение
выборка по полю с датой:
Delphi
1
ADOQuery1.SQL.Add('WHERE Data LIKE ''' + Edit4.Text+'''');
а не хороним ли мы синтаксис SQL? как нащет -
Delphi
1
ADOQuery1.SQL.Add('WHERE Data = #Day/Mouth/Year#');
?
1
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
12.04.2010, 14:37
NemiroFFyo, а как мы ее будем вводить? как он узнает по какой дате нужно сделать выборку? )
0
 Аватар для NemiroFFyo
70 / 70 / 3
Регистрация: 29.09.2009
Сообщений: 530
12.04.2010, 14:44
Цитата Сообщение от DenProx Посмотреть сообщение
а как мы ее будем вводить?
в каком плане как?))) да как угодно... просто из вашего кода дату нада вводить в едит с соблюдением решеток и слешек))(как это требует SQL) Личто я юзаю сторонний компонент-колендарь. Он наглядно показывает весь месяц и дату отдаёт раздельно(Отдельно день, месяц время раздельно по минутам часам и т.д.) и следовательно удобно формировать в последующем на основе этих данных запрос, и не танцевать с бубном.
1
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
12.04.2010, 15:00
NemiroFFyo, ну впринципе согласен)))
1
0 / 0 / 0
Регистрация: 27.03.2010
Сообщений: 39
13.04.2010, 08:13  [ТС]
Спасибо, спасибо и много раз спасибо!!!! Буду творить))))))

Добавлено через 14 часов 12 минут
Попробовала я сделать..ошибки не какой программа не выдает, НО значения тоже не ищет. ессли два текстовых значения программа идет..если одна из них дата, то ищет только по дате. Вот код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery1.Active := False;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT *');
ADOQuery1.SQL.Add('FROM PO');
if (Length(Edit1.Text) > 0) or
   (Length(Edit2.Text) > 0) then
     begin
 ADOQuery1.SQL.Add('WHERE naimenovanie LIKE' + #39 + Edit1.Text + '%' + #39+'and');
       ADOQuery1.SQL.Add(' Data_pokup LIKE ''' + Edit2.Text+'''');
       ADOQuery1.Active := True;
     end
   else
     begin
       ADOQuery1.Active := True;
       ADOQuery1.First;
     end;
end;
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
13.04.2010, 10:46
Albinusha, чесно сказать соместить у меня самого не получилось, по этому как вариант могу предложить искать по отдельности.
1
 Аватар для NemiroFFyo
70 / 70 / 3
Регистрация: 29.09.2009
Сообщений: 530
13.04.2010, 12:05
Albinusha, ну я же об этом примерно и говорил))) вод код... там все 100% ищет как угодно. правда он из билдера но думаю это не важно паскольку вам принцип нужен
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
void __fastcall TForm3::sButton1Click(TObject *Sender)
{
AnsiString str;
str="select * from table_users where id<>0 ";
 
if (sCheckBox1->Checked)
{
if (sEdit1->Text!="")
str=str+"and user_fio='"+sEdit1->Text+"' ";
}
 
 
if (sCheckBox2->Checked)
{
if (sEdit2->Text!="")
str=str+"and user_group="+sEdit2->Text+" ";
}
 
 
if (sCheckBox3->Checked)
{
if (sEdit3->Text!="")
str=str+"and test_name='"+sEdit3->Text+"' ";
}
 
 
if (sCheckBox4->Checked)
{
if (sEdit4->Text!="")
str=str+"and user_otmet="+sEdit4->Text+" ";
}
 
 
if (sCheckBox5->Checked)
{
if (sEdit5->Text!="")
str=str+"and user_time="+sEdit5->Text+" ";
}
 
 
if (sCheckBox6->Checked)  // вот тут делаем выборку за период но можно переделать и для одной даты
str=str+"and user_date between #"+sMonthCalendar1->Day+"/"+sMonthCalendar1->Month+"/"+
sMonthCalendar1->Year+"# and #"+sMonthCalendar2->Day+"/"+sMonthCalendar2->Month+"/"+
sMonthCalendar2->Year+"#";
 
 
 
ADOQuery1->Active=False;
ADOQuery1->SQL->Clear();
Edit8->Text=str;
ADOQuery1->SQL->Add(Edit8->Text);
ADOQuery1->Active=True;
}
2
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
14.04.2010, 13:41
NemiroFFyo, сейчас не смогу проверить, завтра попробую)) если Albinusha не сможет разобраться, я на делфи выложу готовый пример...)

Добавлено через 23 часа 3 минуты
Albinusha, вам еще требуется пример? или уже разобрались?
1
0 / 0 / 0
Регистрация: 27.03.2010
Сообщений: 39
14.04.2010, 15:43  [ТС]
Посмотрела на пример на C++, или что то не правильно сделала, так как не изучала данную программу. В общем не получается((((
0
1866 / 1186 / 192
Регистрация: 27.03.2009
Сообщений: 4,603
14.04.2010, 15:59
запрос на поиск по 2 полям? а если так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ADOQuery1.Active := False;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT *');
ADOQuery1.SQL.Add('FROM PO where ');
if (Length(Edit1.Text) > 0)  and
   (Length(Edit2.Text) > 0) then
     begin
 ADOQuery1.SQL.Add('WHERE naimenovanie LIKE "%' + + Edit1.Text + '%" and');
       ADOQuery1.SQL.Add(' Data_pokup LIKE "%' + Edit2.Text+'%"');
       ADOQuery1.Active := True;
     end
   else
     begin
       ADOQuery1.Active := True;
       ADOQuery1.First;
     end;
только в случае с датой, лучше всего использовать как в примере
Delphi
1
2
3
adoquery1.SQL.Add('where a.data>=:data1 and a.data<=:data2 ');
adoquery1.Parameters.ParamByName('data1').Value:=dateedit1.Text;
adoquery1.Parameters.ParamByName('data2').Value:=dateedit2.Text;
2
16.04.2010, 07:18

Не по теме:

Albinusha, если нужна будет прграмма, в качестве примера, напишите в аську... времени просто нет сейчас...

1
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 6
20.07.2010, 10:10
Вообще-то возможно. Весь вопрос как программно составить параметры того же Locate-а. Можно тупым перебором, но это приемлемо, когда мало полей, например 2-а.

Когда полей больше, то лучше действовать путем конструирования параметров Locate-а!!!

Недавно решалась задача: есть таблица, в ней: Фамилия, Имя, Отчество, ИНН, ОГРН и др. сведения. Требуется осуществить поиск по тем данным, которые введены в 5 Edit-ов (но не обязательно введены все значения).

Решение: анализируем заполнено ли поле по длине его строкового значения и конструируем запрос Locate-а. Вот так это выглядит на Delphi:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  Var A: Variant;
      i:integer;
      KF : String;
begin
  i:=0;
  KF:=''; //Переменная KeyField - ключевые поля, по которым будет производиться поиск
  if length(FORM1.Edit1.Text)>0 then
    begin
    if i=0 then KF:='Fam' else
    KF:=KF+';'+'Fam';
    i:=i+1;
    end;
  if length(FORM1.Edit2.Text)>0 then
    begin
    if i=0 then KF:='Im' else
    KF:=KF+';'+'Im';
    i:=i+1;
    end;
  if length(FORM1.Edit3.Text)>0 then
    begin
    if i=0 then KF:='Ot' else
    KF:=KF+';'+'Ot';
    i:=i+1;
    end;
  if length(FORM1.Edit4.Text)>0 then
    begin
    if i=0 then KF:='Inn' else
    KF:=KF+';'+'Inn';
    i:=i+1;
    end;
  if length(FORM1.Edit5.Text)>0 then
    begin
    if i=0 then KF:='ogrn' else
    KF:=KF+';'+'ogrn';
    i:=i+1;
    end;
 
if i>0 then //Заполняем значения имеющихся полей для поиска
begin
  A := VarArrayCreate([0, i-1], varVariant);
  i:=0;
  if length(FORM1.Edit1.Text)>0 then
    begin
    A[i]:=FORM1.Edit1.Text;
    i:=i+1;
    end;
  if length(FORM1.Edit2.Text)>0 then
    begin
    A[i]:=FORM1.Edit2.Text;
    i:=i+1;
    end;
  if length(FORM1.Edit3.Text)>0 then
    begin
    A[i]:=FORM1.Edit3.Text;
    i:=i+1;
    end;
  if length(FORM1.Edit4.Text)>0 then
    begin
    A[i]:=FORM1.Edit4.Text;
    i:=i+1;
    end;
  if length(FORM1.Edit5.Text)>0 then
    begin
    A[i]:=FORM1.Edit5.Text;
    i:=i+1;
    end;
 
If not Dm.FORM1.Locate(KF,A,[loCaseInsensitive, loPartialKey]) then
showMessage('Совпадений не найдено');
end else showMessage('Не введено значений для поиска');
end;
Вот как-то так))))
0
0 / 0 / 0
Регистрация: 16.02.2015
Сообщений: 17
05.03.2015, 00:40
Цитата Сообщение от DenProx Посмотреть сообщение
Albinusha, не знаю, нужно вам еще или нет, ну раз сделал, выкладываю свой вариант:
не подскажете как переделать ваш пример, что бы фильтровало когда разные типы полей, ибо если я делаю фильтр по числовым полям, то работает, а если включаю текстовое, сразу все перестает работать.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
05.03.2015, 02:21
Тебе ответов на свой вопрос Фильтрация грида ADOQuery1.Filtered мало?
0
0 / 0 / 0
Регистрация: 16.02.2015
Сообщений: 17
05.03.2015, 17:01
мне нужно сделать фильтрацию по нескольким полям одновременно, в моей теме никто толком не смог мне показать как это сделать, нашел ваш пример, он мне подходит,только если разные типы полей, то работать не хочет, вот я у вас и спрашиваю как его можно переделать

Добавлено через 7 часов 18 минут
Как сделать что бы с текстовым полем тоже работало?
Delphi
1
ADOQuery1.SQL.Add('[Додаткова інформація] LIKE' + #39 + Edit11.Text + '%' + #39 +' AND ');
поле Додаткова інформація текстового типа, и с ним не работает, если же его удалить, то все работает отлично.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
procedure TForm1.Button3Click(Sender: TObject);
begin
ADOQuery2.Active := False;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('SELECT *');
ADOQuery2.SQL.Add('FROM [Сг техніка]');
if (Length(Edit6.Text) > 0) or
   (Length(Edit7.Text) > 0) or
   (Length(Edit8.Text) > 0) or
   (Length(Edit9.Text) > 0) or
   (Length(Edit10.Text) > 0) or
   (Length(Edit11.Text) > 0) or
   (Length(Edit12.Text) > 0)then
     begin
       ADOQuery2.SQL.Add('WHERE [Трактори-всього] LIKE' + #39 + Edit6.Text + '%' + #39 +' AND ');
       ADOQuery2.SQL.Add(' [Вантажні автомобілі] LIKE' + #39 + Edit8.Text + '%' + #39 +' AND ');
       ADOQuery2.SQL.Add(' [Комбайни-всього] LIKE' + #39 + Edit9.Text + '%' + #39 +' AND ');
       ADOQuery2.SQL.Add(' [зернозбиральні комбайни] LIKE' + #39 + Edit10.Text + '%' + #39 +' AND ');
                                      ADOQuery1.SQL.Add('[Додаткова інформація] LIKE' + #39 + Edit11.Text + '%' + #39 +' AND ');[/COLOR]
       ADOQuery2.SQL.Add(' [Код] LIKE' + #39 + Edit12.Text + '%' + #39 +' AND ');
       ADOQuery2.SQL.Add(' [міні-трактори (садово-городні) та мотоблоки] LIKE' + #39 + Edit7.Text + '%' + #39);
       ADOQuery2.Active := True;
     end
   else
     begin
       ADOQuery2.Active := True;
       ADOQuery2.First;
     end;
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.03.2015, 17:01
Помогаю со студенческими работами здесь

Поиск в таблице по нескольким полям одновременно
Уважаемые гуру делфи! Помогите с поиском в таблице по нескольким полям одновременно. Если у кого-то есть желание помочь, ответьте, обрисую...

Поиск по нескольким полям в Базе Данных
Здаствуйте, хотел бы попросить выложить пример, с поиском по нескольким атрибутам в Базе Данных. Желательно что-бы там был осуществлён...

Одновременный поиск по нескольким полям в таблице
Помогите сделать одновременный поиск по нескольким полям в таблице. Вот программа.

Поиск по нескольким полям с фиксированным полем
Собственно есть комбобокс, в нем несколько позиций забито, помогите реализовать поиск фиксированный, если выбрали из бокса какую-нибудь...

Фильтр по нескольким полям
Привет всем. Использую OracleDataSet - Zayavka. Пишу &quot;последовательный&quot; фильтр, (когда-то был такой вопрос, но на Acces, и там работало...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru