Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
 Аватар для edsjeka
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386

Сделать параметрический запрос

21.05.2016, 19:42. Показов 3509. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такой запрос:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
DataModule1.SQLQuery1.SQL.Text:='SELECT everydayrep.ID, everydayrep.IDCartridga, everydayrep.DateRabot, everydayrep.Tehnika_Rabota, everydayrep.Kolich,'+
' everydayrep.ZakZaed, everydayrep.ProdZaed, everydayrep.ZakVsego, everydayrep.ProdVsego, everydayrep.RaznicaSed,'+
' everydayrep.RaznicaVsego, everydayrep.uchetvzp, everydayrep.DocVist, sprpredpr.NamePredpr, sprklientov.NameKlient, sprmasterov.Master, everydayrep.Komments,'+
' sprtipopl.tipopl, sprmestrabot.mestorabot, sprindexov.indeks, everydayrep.Articul'+
' FROM everydayrep'+
' LEFT JOIN sprpredpr ON everydayrep.IDPredpr = sprpredpr.IDPredpr'+
' INNER JOIN sprklientov ON everydayrep.IDKlienta = sprklientov.IDKlienta'+
' INNER JOIN sprmasterov ON everydayrep.IDMastera = sprmasterov.IDMastera'+
' LEFT JOIN sprtipopl ON everydayrep.IDTipOpl = sprtipopl.IDTipOpl'+
' INNER JOIN sprmestrabot ON everydayrep.IDMestarabot = sprmestrabot.IDMestarabot'+
' INNER JOIN sprindexov ON everydayrep.IDIndexa = sprindexov.IDIndexa'+
' WHERE DATE(everydayrep.DateRabot) BETWEEN "'+ds+'" AND "'+DS1+'"'+
' ORDER BY everydayrep.DateRabot ASC';
Нужно добавить возможность выборки по полям: sprklientov.NameKlient, sprmasterov.Master, чтобы была возможность выбирать по этим полям с условиями И и ИЛИ
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.05.2016, 19:42
Ответы с готовыми решениями:

Как сделать параметрический запрос в Delphi
Вот у меня есть параметрический запрос, но нужно сделать диалоговое окно для ввода значения, по результатам которого будет сформирована...

Запрос в Delphi, параметрический запрос, обновление строки
Продолжение темы Запрос на обновление строки в таблице Вот запрос на добавление записи из одной таблицы в другую. 2 таблицы tovar и...

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

55
 Аватар для edsjeka
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
25.05.2016, 19:55  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от krapotkin Посмотреть сообщение
а где код?
Спасибо. Сегодня уже не могу. Завтра буду продолжать, попробую все-таки сам, если не получится, выложу код.

Добавлено через 21 час 45 минут
Цитата Сообщение от krapotkin Посмотреть сообщение
а где код?
Все то же самое, такой запрос:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
DataModule1.SQLQuery1.SQL.Text:='SELECT everydayrep.ID, everydayrep.IDCartridga, everydayrep.DateRabot, everydayrep.Tehnika_Rabota, everydayrep.Kolich,'+
' everydayrep.ZakZaed, everydayrep.ProdZaed, everydayrep.ZakVsego, everydayrep.ProdVsego, everydayrep.RaznicaSed,'+
' everydayrep.RaznicaVsego, everydayrep.uchetvzp, everydayrep.DocVist, sprpredpr.NamePredpr, sprklientov.NameKlient, sprmasterov.Master, everydayrep.Komments,'+
' sprtipopl.tipopl, sprmestrabot.mestorabot, sprindexov.indeks, everydayrep.Articul'+
' FROM everydayrep'+
' LEFT JOIN sprpredpr ON everydayrep.IDPredpr = sprpredpr.IDPredpr'+
' INNER JOIN sprklientov ON everydayrep.IDKlienta = sprklientov.IDKlienta'+
' INNER JOIN sprmasterov ON everydayrep.IDMastera = sprmasterov.IDMastera'+
' LEFT JOIN sprtipopl ON everydayrep.IDTipOpl = sprtipopl.IDTipOpl'+
' INNER JOIN sprmestrabot ON everydayrep.IDMestarabot = sprmestrabot.IDMestarabot'+
' INNER JOIN sprindexov ON everydayrep.IDIndexa = sprindexov.IDIndexa'+
' WHERE DATE(everydayrep.DateRabot) BETWEEN "'+ds+'" AND "'+DS1+'"'+
' ORDER BY everydayrep.DateRabot ASC';
И к нему нужно приделать условия:
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
procedure TForm1.MakeSqlRequest();
var
  s:string;
  p1,p2,p3:string;
begin
  s:='select * from cartridgi c where '+
    '(:p1 is null) or (:p1=c.nameKlient))'+
    'and (:p2 is null) or (:p2=c.Master))'+
    'and (:p3 is null) or (:p3=c.ModelCartridga))';
 
  if ComboBox1.ItemIndex>0 then
    p1:='p1='+AnsiQuotedStr(ComboBox1.Items[ComboBox1.ItemIndex],'''')
  else
    p1:='p1=NULL';
  if ComboBox2.ItemIndex>0 then
    p2:='p2='+AnsiQuotedStr(ComboBox2.Items[ComboBox2.ItemIndex],'''')
  else
    p2:='p2=NULL';
  if ComboBox3.ItemIndex>0 then
    p3:='p1='+AnsiQuotedStr(ComboBox3.Items[ComboBox3.ItemIndex],'''')
  else
    p3:='p3=NULL';
 
  Memo1.Lines.Text := s+#13#13;
  memo1.Lines.Add(p1);
  memo1.Lines.Add(p2);
  memo1.Lines.Add(p3);
end;
У меня к BETWEEN не получается даже просто добавить условие по одному комбобоксу, делаю так:
Delphi
1
' WHERE (DATE(cartridgi.DatePriema) BETWEEN ("'+ds+'") AND ("'+DS1+'")) AND (sprmodeleycartridgey.ModelCartridga="'+ComboBox16.Text+'")'+
не работает, да еще дальше в программе перестает работать RecordCount.
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
25.05.2016, 20:42
Цитата Сообщение от edsjeka Посмотреть сообщение
BETWEEN ("'+ds+'") AND ("'+DS1+'")
Delphi
1
'BETWEEN ('+QuotedStr(ds)+') AND ('+QuotedStr(DS1)+')'
Но лучше так не делать...
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
25.05.2016, 21:27
Цитата Сообщение от edsjeka Посмотреть сообщение
И к нему нужно приделать условия:
я вообще не вижу как связан первый запрос со вторым
какие условия и куда приделать?

если мы говорим о параметрическом! запросе
то текст составляется один раз
Delphi
1
q.sql.text:='....';
и потом только подставляются параметры
Delphi
1
2
3
4
q.CLose;
q.params.paramByName('aaa').asInteger:=5;
q.params.paramByName('bbb').asString:=edit1.text;
q.Open;
в вашем случае вы меняете сам текст SQL каждый раз
и использование переметров становится бессмысленным
1
 Аватар для edsjeka
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
27.05.2016, 16:22  [ТС]
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
DataModule1.SQLQuery1.Close;
         DataModule1.SQLQuery1.SQL.Text:='SELECT cartridgi.IDCartridga, cartridgi.DatePriema, sprmodeleycartridgey.ModelCartridga, sprindexov.Indeks,'+
         ' sprklientov.NameKlient, cartridgi.Articul, sprstatusov.Status, sprmanager.Manager, sprmanagervid.Managervid, sprmasterov.master, cartridgi.NumZayavki,'+
         ' cartridgi.komments, cartridgi.DateVidachi, sprmestrabot.mestorabot, cartridgi.daterabot, cartridgi.UchetVzp,'+
         ' cartridgi.DocVist, cartridgi.Nal_bn, sprpredpr.namepredpr, sprTipOpl.TipOpl'+
         ' FROM cartridgi'+
         ' INNER JOIN sprmodeleycartridgey ON cartridgi.IDModelCartridga = sprmodeleycartridgey.IDModelCartridga'+
         ' INNER JOIN sprindexov ON sprmodeleycartridgey.IDIndexa = sprindexov.IDIndexa'+
         ' INNER JOIN sprklientov ON cartridgi.IDKlienta = sprklientov.IDKlienta'+
         ' INNER JOIN sprstatusov ON cartridgi.IDstatusa = sprstatusov.IDStatusa'+
         ' INNER JOIN sprmanager ON cartridgi.IDManagerPrin = sprmanager.IDManager'+
         ' LEFT JOIN sprmanagervid ON cartridgi.IDManagervidal = sprmanagervid.IDManager'+
         ' LEFT JOIN sprmestrabot ON cartridgi.IDMestaRabot = sprmestrabot.IDMestaRabot'+
         ' LEFT JOIN sprmasterov ON cartridgi.IDMastera = sprmasterov.IDmastera'+
         ' LEFT JOIN sprpredpr ON cartridgi.IDPredpr = sprpredpr.IDPredpr'+
         ' LEFT JOIN sprtipopl ON cartridgi.IDTipOpl = sprTipOpl.IDTipOpl'+
         ' WHERE SprModeleyCartridgey.ModelCartridga=:p1'+                  //QuotedSTR(ComboBox16.text)+
         ' AND SprKlientov.NameKlient=:p2'+                          //QuotedSTR(ComboBox17.text);     //dinzapr ;
         ' ORDER BY cartridgi.DatePriema DESC';
 
         DataModule1.SQLQuery1.Params.ParamByName('p1').Value:=ComboBox16.text;
         DataModule1.SQLQuery1.Params.ParamByName('p2').Value:=ComboBox17.text;
 
         DataModule1.SQLQuery1.Active:=true;
Вот такой у меня запрос, не могу использовать параметры, когда прописываю условия напрямую в запросе без параметров, работает нормально, когда делаю так как в коде с параметрами - не работает. Никаких ошибок не вылетает, но выборка не происходит, ничего не выбирается, таблица остается пустая. Хотя все значения я отслеживаю, они правильные. Что я делаю не так?
0
5999 / 4574 / 1096
Регистрация: 29.08.2013
Сообщений: 28,254
Записей в блоге: 3
27.05.2016, 16:43
уберите 18 и 22 строку и попробуйте снова выполнить запрос
0
 Аватар для edsjeka
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
27.05.2016, 17:26  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
уберите 18 и 22 строку и попробуйте снова выполнить запрос
Да, так работает.
Кстати, я забыл сказать, что работает с параметрами только первое условие почему-то, когда беру только второе условие
Delphi
1
' AND SprKlientov.NameKlient=:p2'
, оно не работает, хоть я его первым поставлю, хоть единственным сделаю. Я думал, что в запросе что-то не так, но ведь без параметров все работает как надо.
0
5999 / 4574 / 1096
Регистрация: 29.08.2013
Сообщений: 28,254
Записей в блоге: 3
27.05.2016, 17:30
потому что текст нужно брать в кавычки

в запросе у вас получается
ФИО=Иванов
а надо
ФИО='Иванов'
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
27.05.2016, 17:30
патамушта INNER JOIN
1
 Аватар для edsjeka
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
27.05.2016, 17:33  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
потому что текст нужно брать в кавычки
Я уже пробовал и в кавычки брать и QuotedStr вставлять, ничего не меняется, а первое условие у меня тоже текст и работает.

Добавлено через 21 секунду
Цитата Сообщение от krapotkin Посмотреть сообщение
патамушта INNER JOIN
а што теперь делать?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
27.05.2016, 17:34
LEFT
1
 Аватар для edsjeka
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
27.05.2016, 17:37  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
LEFT
и все???
я уже 3 дня пытаюсь сделать этот динамический запрос, не могу понять в чем дело. Спасибо, буду пробовать.

PS. Так что везде делать LEFT, где могут быть запросы?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
27.05.2016, 18:23
не везде, но тут
1
 Аватар для edsjeka
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
27.05.2016, 19:54  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
не везде, но тут
Все равно не работает, я уже все джоины в запросе попробовал сделать LEFT, не помогает.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
27.05.2016, 20:06
значит возвращаемся к посту 25
и показываем результат запроса
данные, которые пришли...
1
 Аватар для edsjeka
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
27.05.2016, 20:18  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
данные, которые пришли...
Delphi
1
2
3
4
5
6
' WHERE SprModeleyCartridgey.ModelCartridga=:p1'+                  //QuotedSTR(ComboBox16.text)+
         ' AND SprKlientov.NameKlient=:p2'+                          //QuotedSTR(ComboBox17.text);
         ' ORDER BY cartridgi.DatePriema DESC';
 
         DataModule1.SQLQuery1.Params.ParamByName('p1').Value:=ComboBox16.text;
         DataModule1.SQLQuery1.Params.ParamByName('p2').Value:=ComboBox17.text;


Вот, что получается в результате запроса, пустая таблица, 0 строк.

Если убираю параметр p2 и условие по нему, то по первому условию, отбирает нормально. Но если второе условие ставлю на место первого, то тоже не работает. А если без параметров, просто в запрос вписываю комбобоксы, то работает по всем условиям нормально.
0
 Аватар для edsjeka
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
27.05.2016, 20:25  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
уберите 18 и 22 строку и попробуйте снова выполнить запрос
Цитата Сообщение от krapotkin Посмотреть сообщение
значит возвращаемся к посту 25
и показываем результат запроса
данные, которые пришли...
Вот приходят все данные, соответствующие запросу:
Миниатюры
Сделать параметрический запрос  
0
 Аватар для edsjeka
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
27.05.2016, 20:38  [ТС]
Я бы мог сделать и без параметров, но мне нужен именно динамический запрос, который будет использоваться во многих местах, который хочу создавать в процедуре, а не писать кучу кода в каждом запросе.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
27.05.2016, 20:48
теперь дописываем перед ORDER BY
' AND SprKlientov.NameKlient=''СПК'' '
и запускаем опять
1
 Аватар для edsjeka
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
27.05.2016, 20:53  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
теперь дописываем перед ORDER BY
' AND SprKlientov.NameKlient=''СПК'' '
и запускаем опять
Да, так работает:
Миниатюры
Сделать параметрический запрос  
0
 Аватар для edsjeka
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
27.05.2016, 20:55  [ТС]
Но если сейчас поставлю
Delphi
1
:p2
вместо "СПК", то не работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.05.2016, 20:55

Параметрический запрос
В общем так Скл запрос: SELECT B.* FROM Benzin B WHERE B.Mark= :B.Mark На кнопке весит вот такой код : With qry1 do ...

Параметрический запрос
Вопрос. Не получается сделать запрос, чтобы при вводе ФИО врача в одно поле и ФИО пациента в другое и нажать на кнопку Выполнить,...

Параметрический запрос
Само задание звучит так: "Создать параметрические запросы: - по таблице Автомобили запрашивается грузоподъемность; в выборке отражаются...

Параметрический запрос на фильтрацию
сабж. есть запрос datamodule1.sh.close; datamodule1.sh.SQL.Clear; datamodule1.sh.sql.Add('SELECT dim.*, client.*, partner.*,...

Заполнение комбобокса (параметрический запрос)
Пишу вот такой код: implementation uses unit2; {$R *.dfm} procedure TForm11.btn1Click(Sender: TObject); begin Form11.Close; ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru