Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 18.05.2016
Сообщений: 11
1

Запрос с параметрами на определённую дату

18.05.2016, 12:07. Показов 3652. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, возникла такая ситуация: есть запрос конструкции
SQL
1
2
3
4
SELECT  id,name, 
(YEAR('01.01.2016')-YEAR(rdat))*12-(MONTH('01.01.2016')-MONTH(rdat)) AS vozrast
FROM table1
WHERE srok1<='01.01.2016' AND srok2>='01.01.2016
Результат соответственно,таблица с именем , ид , и возрастом, поле rdat дата рождения берётся из подзапроса и нареканий не вызывает,я упростил запрос чтобы передать суть,
Далее небольшая программа на Делфи, задача её: выполнить вышеуказанный запрос и сохранить результат в ексель, запрос выполняется на указанную в программе дату я использую tdatetimepicker для этого
, значения srok1 и srok2 вместо 01.01.2016 берутся из таймпикера здесь тоже все выполняется корректно,
Delphi
1
adoquery1.Parameters.ParamByName('data').Value:=datetimepicker1.DateTime;
Вопрос : Как мне параметр 'data' передать в строку запроса где считается возраст
Т.е. сделать что то типа (Year('data')-year(rdat))*12-(month('data')-month(rdat)) и возможно ли это вообще?
Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.05.2016, 12:07
Ответы с готовыми решениями:

Запрос c параметрами
Нужно выполнить авторизацию. в запросе подсчитывается сколько записей, соответствуют условию, что...

Запрос с параметрами?
Здравствуйте. Скажите правильно ли я написал запрос с параметрами? select * from mounth, vedtbl...

Запрос с параметрами
ADOQuery1.SQL.Add('SELECT * FROM Организации Order By :2 asc');...

Запрос с несколькими параметрами
Дико извиняюсь,если мой вопрос повторит массу,уже заданных ранее, но без вашей помощи я...

21
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
18.05.2016, 12:13 2
Цитата Сообщение от niks762 Посмотреть сообщение
возможно ли это вообще?
конечно возможно

параметры в query обозначаются как :[имя параметра]
0
0 / 0 / 0
Регистрация: 18.05.2016
Сообщений: 11
18.05.2016, 12:20  [ТС] 3
Я пробовал через двоеточие, но ни один вариант не работает, неправильно определён объект parameter пишет, условия после Where в запросе таким образом работают но моя строка с year стоит в select
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
18.05.2016, 12:23 4
покажи код
0
0 / 0 / 0
Регистрация: 18.05.2016
Сообщений: 11
18.05.2016, 12:46  [ТС] 5
SQL
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
SELECT POL,VOZRAST/12 AS VOZRAST ,COUNT(*) AS CHISLENNOST
FROM
(SELECT
POL
,RDAT
,(YEAR(??????????)-YEAR(RDAT))*12-(MONTH(????????)-MONTH(RDAT))AS VOZRAST
FROM
(SELECT A,B,NPERS,POL,RDAT,RA,KAT,NP,DPW,PW, U_TR,U_GO1,U_GO2,V_TR,V_GO1,V_GO2,VPL.MANRAZDEL.RAZDEL,VOZRAST/12 AS VOZRAST
 
FROM
(SELECT DISTINCT A,MAX(B) AS B ,NPERS,POL,RDAT,RA,KAT,NP,DPW,PW,U_TR,U_GO1,U_GO2,V_TR,V_GO1,V_GO2,
(YEAR(????????)-YEAR(RDAT))*12-(MONTH(???????)-MONTH(RDAT))AS VOZRAST
FROM
(SELECT
 A
,VPL.PO.NPERS
,VPL.PO.POL
,VPL.PO.RDAT
,VPL.PO.RA
,VPL.POPEN.KAT
,VPL.POPEN.NP
,VPL.POPEN.DPW
,VPL.POPEN.PW
,B
,VPL.POPEN.U_TR
,VPL.POPEN.U_GO1
,VPL.POPEN.U_GO2
,VPL.POPEN.V_TR
,VPL.POPEN.V_GO1
,VPL.POPEN.V_GO2
FROM
(SELECT DISTINCT
 VPL.MANRAZDEL.ID AS A
 ,VPL.MANRAZDEL.SROKS AS B
   ,VPL.MANRAZDEL.RAZDEL AS C
FROM
VPL.MANRAZDEL
WHERE VPL.MANRAZDEL.SROKS<=:rdata AND VPL.MANRAZDEL.VIDV=1)
INNER JOIN  VPL.PO ON A=VPL.PO.ID INNER JOIN VPL.POPEN ON A=VPL.POPEN.ID) AS AL1
 
WHERE (NP<>'ПРЕ' AND NP<>'СНЯ')OR(NP='ПРЕ' AND DPW>:rdata)OR(NP='СНЯ' AND DPW>:rdata)
GROUP BY A,NPERS,POL,RDAT,RA,KAT,NP,DPW,PW,U_TR,U_GO1,U_GO2,V_TR,V_GO1,V_GO2) LEFT JOIN VPL.MANRAZDEL ON A=VPL.MANRAZDEL.ID AND B=VPL.MANRAZDEL.SROKS
WHERE VPL.MANRAZDEL.VIDV=1  ) )
GROUP BY POL,VOZRAST/12
Вот код из кваери Вместо знаков вопроса параметр rdata который из таймпикера
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
18.05.2016, 12:50 6
ты видимо что-то не понимаешь
показываешь мне sql запрос без кода которым ты его выполняешь

нужен код всей процедуры. и скопируй его сначала в блокнот, потом сюда
0
0 / 0 / 0
Регистрация: 18.05.2016
Сообщений: 11
18.05.2016, 12:53  [ТС] 7
Delphi
1
2
3
4
5
procedure TForm3.Button1Click(Sender: TObject);
begin
adoquery1.close;
adoquery1.Parameters.ParamByName('RDATA').Value:=datetimepicker1.DateTime;
adoquery1.open;
Код на кнопку в программе, повторюсь работает все до тех пор пока в аргументах функций year и month стоят либо даты либо имя столбца из подзапроса, как Применить параметр ума не дам
Я новичек во всем этом, очень новичек.
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
18.05.2016, 12:56 8
Цитата Сообщение от niks762 Посмотреть сообщение
повторюсь работает все до тех пор пока в аргументах функций year и month стоят либо даты либо имя столбца из подзапроса, как Применить параметр ума не дам
вот это я не понял
переведи
0
0 / 0 / 0
Регистрация: 18.05.2016
Сообщений: 11
18.05.2016, 13:33  [ТС] 9
Ок,вот смотри,
SQL
1
SELECT POL ,RDAT ,(YEAR(??????????)-YEAR(RDAT))*12-(MONTH(????????)-MONTH(RDAT))AS VOZRAST
это
Кусок запроса который я привел выше, который лежит в у меня в query, если вместо знаков вопроса поставить дату вручную например '01.01.2016' то запрос работает как нужно ,меня интересует как мне вместо знаков вопроса поставить параметр rdata который принимает значения из date timepicker1
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
18.05.2016, 13:35 10
а ты проверил - то ли ты берешь из DateTIMEPicker?

Добавлено через 23 секунды
посмотри что у тебя находится в datetimepicker1.DateTime
0
0 / 0 / 0
Регистрация: 18.05.2016
Сообщений: 11
18.05.2016, 13:46  [ТС] 11
Все правильно kind-dtkDate, формат short плюс у меня параметр из пикера применяется к нескольким условиям запроса, если бы там что то не то было запрос не работал бы
К тому же изначально у меня вместо пикера стоял tedit в программе дата вручную вводилась, и результаты были те же.
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
18.05.2016, 13:49 12
Delphi
1
2
3
query.sql.text:='SELECT POL ,RDAT ,(YEAR(:p)-YEAR(RDAT))*12-(MONTH(:p1)-MONTH(RDAT))AS VOZRAST';
query.param.parambyname('p').value:=Date(datetimepicker.datetime);
query.param.parambyname('p1').value:=Date(datetimepicker.datetime);
1
0 / 0 / 0
Регистрация: 18.05.2016
Сообщений: 11
18.05.2016, 17:08  [ТС] 13
Delphi
1
2
3
query.param.parambyname('p').value:=Date(datetimepicker.datetime); 
 
query.param.parambyname('p1').value:=Date(datetimepicker.datetime);
На такой код выдаёт ошибку : too many actual parameters когда компилится,
Но тем не менее верное направление я уловил параметров нужно несколько было,спасибо,
А дальше больше, вылетает ошибка sql0245n с текстом The invocation of routine YEAR is ambiguous. The argument in position 1 does not have a best fit. Не знаешь что это?
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
18.05.2016, 17:34 14
с запросом намудрил
используй временные таблицы
0
0 / 0 / 0
Регистрация: 18.05.2016
Сообщений: 11
19.05.2016, 15:13  [ТС] 15
Ну ок, не будем брать мой большой запрос возьмём элементарно:
SQL
1
SELECT  pole1,pole2, YEAR('01.01.1990') FROM T1
На выходе имеем таблицу вида pole1 pole2 1990
pole1 pole2 1990
....... ........ ......... И т.д.
Далее берём тот же запрос
SQL
1
SELECT  pole1,pole2, YEAR(:p) FROM T1
.
Но в место даты используем параметр р описанный выше и капец! Как ни крути как ни верти вылетает ошибка скуль , sql0245n. Может быть нужен какойнить особый синтаксис в запросе ? Какие нибудь двойные кавычки?
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
19.05.2016, 15:14 16
покажи весь код, а не только запросы
0
0 / 0 / 0
Регистрация: 18.05.2016
Сообщений: 11
19.05.2016, 16:20  [ТС] 17
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
unit Unit3;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ADODB, DB, Grids, DBGrids, ComCtrls, ShellApi,excelxp,comobj;
 
type
  TForm3 = class(TForm)
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    Button1: TButton;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    DateTimePicker1: TDateTimePicker;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form3: TForm3;
 
implementation
 
{$R *.dfm}
 
procedure TForm3.Button1Click(Sender: TObject);
begin
adoquery1.close;
adoquery1.Parameters.ParamByName('p').Value:=datetimepicker1.Date;
adoquery1.open;
 
 
 
end;
 
 
procedure TForm3.Button2Click(Sender: TObject);
begin
shellexecute(self.handle,'explore','D:\delfi',nil,nil,SW_SHOW); //открыть папку с результатом, пока не используется
end;
 
procedure TForm3.Button3Click(Sender: TObject);    //открывает результат в ёксель
var
ExcelApp : variant;
row :integer;
col:integer;
begin
dbgrid1.DataSource.DataSet.First;
 
ExcelApp:=CreateOLEObject('Excel.Application'); // создает объект
ExcelApp.WorkBooks.add; //новый док
ExcelApp.visible:=true;  // показывает док
 
ExcelApp.WorkBooks[1].WorkSheets[1].Name := 'results'; // ИМЯ ЛИСТУ 1
 
for col :=0 to DBGrid1.Columns.Count-1 do
ExcelApp.WorkBooks[1].WorkSheets[1].cells[6,col+2].value:=dbgrid1.fields[col].displaylabel;
 
for row :=1 to DBGrid1.DataSource.DataSet.RecordCount-1 do
begin
for col :=0 to DBGrid1.Columns.Count-1 do
begin
ExcelApp.WorkBooks[1].WorkSheets[1].cells[row+7,col+2].value:=dbgrid1.DataSource.DataSet.Fields[col].AsString;
ExcelApp.WorkBooks[1].WorkSheets[1].cells[row+7,1]:=row+1;
end;
DBGrid1.DataSource.DataSet.Next;
end;
 
ExcelApp.WorkBooks[1].WorkSheets[1].cells[1,1]:='№пп/Дата';
ExcelApp.WorkBooks[1].WorkSheets[1].cells[1,2]:=datetostr(now);
 
ExcelApp.WorkBooks[1].WorkSheets[1].visible:=true;
ExcelApp.WorkBooks[1].WorkSheets[2].visible:=false;
ExcelApp.WorkBooks[1].WorkSheets[3].visible:=false;
end;
 
 
end.
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
19.05.2016, 16:26 18
Delphi
1
2
3
adoquery1.close;
adoquery1.Parameters.ParamByName('p').Value:=DateToSTR(datetimepicker1.Date);
adoquery1.open;
и, возможно, нужно будет дату в кавычки обернуть
0
0 / 0 / 0
Регистрация: 18.05.2016
Сообщений: 11
19.05.2016, 16:36  [ТС] 19
Пробовал, и с квычками и без и с двойными тоже не проканало, ошибка все та же
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
19.05.2016, 16:38 20
тогда делай так

Не по теме:

самый секрет покажу
никому не говори



Delphi
1
query.sqlt.text:='SELECT  pole1,pole2, '+quotedSTR(Yearof(datetimepicker1.Date))+' FROM T1'
0
19.05.2016, 16:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2016, 16:38
Помогаю со студенческими работами здесь

SQL запрос с параметрами в Delphi
Добрый вечер, помогите, пожалуйста! Пыталась разобраться с запросами с параметрами, но что-то не...

SQL запрос в delphi с параметрами (simpledataset)
У меня выполнение этого выдает системную ошибку: Form1.SimpleDataSet1.DataSet.Close;...

SQL запрос с 2 мя параметрами DBLookupComboBox в Delphi
Скажу сразу не хватило терпения посмотреть все результаты поиска... У меня такая проблема. Имеются...

SQL запрос с 2-мя параметрами через Edit
Имеется рабочий SQL запрос с 2-мя параметрами в ADOQuery1 SELECT * FROM продажа WHERE data...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru