Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Динамический отбор по дате в базе данных   Найти похожие ветки 

 
Виктор   (2010-05-12 09:45) [0]

При параметрическом запросе:
procedure TForm3.Button1Click(Sender: TObject);
begin
Query1.Close;
Query1.ParamByName("prm1").AsDate:=StrToDate(DateEdit1.Text);
Query1.ParamByName("prm2").AsDate:=StrToDate(DateEdit2.Text);
Query1.Open;

end;
всё работает отлично!

при попытке динамического отбора по дате в выражении:
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add("Select*");
Query1.SQL.Add("From Istorii_full.DB");
Query1.SQL.Add("WHERE Дата1:=StrToDate like """+ (Edit3.Text + "%"""));
Query1.Open;
возникает ошибка. Подскажите, пожалуйста, где ошибка.


 
Медвежонок Пятачок ©   (2010-05-12 10:02) [1]

парадокс и бде ничего не знают про StrToDate


 
Медвежонок Пятачок ©   (2010-05-12 10:03) [2]

и про ":=" тоже ничего не знают


 
Anatoly Podgoretsky ©   (2010-05-12 10:09) [3]

> Виктор  (12.05.2010 09:45:00)  [0]

Ты где такой синтаксис выкопал, какое еще :=


 
Виктор   (2010-05-12 10:37) [4]

даже если так:
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add("Select*");
Query1.SQL.Add("From Istorii_full.DB");
Query1.SQL.Add("WHERE Дата1 like """+ (Edit3.Text + "%"""));
Query1.Open;
возникает ошибка. Понятно, что Дата1 надо перевести в строковый параметр, но как это сделать в динамическом запросе?


 
Dennis I. Komarov ©   (2010-05-12 10:42) [5]

DateToStr...


 
Виктор   (2010-05-12 11:04) [6]

ни
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add("Select*");
Query1.SQL.Add("From Istorii_full.DB");
Query1.SQL.Add("WHERE Дата1.DateToStr like """+ (Edit3.Text + "%"""));
Query1.Open;
ни
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add("Select*");
Query1.SQL.Add("From Istorii_full.DB");
Query1.SQL.Add("Дата1.DateToStr (DateEdit3.Text)");
Query1.Open;
не работает???


 
Dennis I. Komarov ©   (2010-05-12 11:13) [7]

Правда???

TDataSet(Any).Text:=(... from tablename where anyfield = """ + DateToStr(AnyDate) + """...


 
Sergey13 ©   (2010-05-12 11:25) [8]

> [0] Виктор   (12.05.10 09:45)
> При параметрическом запросе:
> всё работает отлично!

Тогда какой смысл от него отказываться?


 
Плохиш ©   (2010-05-12 11:25) [9]


> Query1.SQL.Add("WHERE Дата1.DateToStr like """+ (Edit3.Text
> + "%"""));
>


> Query1.SQL.Add("Дата1.DateToStr (DateEdit3.Text)");
>

Спасибо, повеселил.


 
Anatoly Podgoretsky ©   (2010-05-12 11:40) [10]


> Виктор   (12.05.10 10:37) [4]

Какой смысл в like? в данном случае?


 
Виктор   (2010-05-12 21:57) [11]

Есть на форме Edit1, Edit2 Edit3 и т.д. для динамических запросов по разным параметрам, например по ФИО, улице, страховому полису и т.д. Если поле имеет строковый параметр, то проблем никаких не возникает (или использовать параметрический запрос как написано выше). Но для быстроты работы, в конце рабочего дня, подводя итог сделанному, я набираю цифры сегодняшней даты (к примеру: 12.05) и всё отбирается. Не сложно, конечно и с параметрическим запросом по дате, но это у меня на отдельной форме с DateEdit1 и DateEdit2, а хотелось бы все иметь на одной форме (и поиск, и запросы на выборку данных, и вывод информации на печать).


 
Плохиш ©   (2010-05-12 23:17) [12]


> но это у меня на отдельной форме с DateEdit1 и DateEdit2,
>  а хотелось бы все иметь на одной форме

Злобный насяльника запретил?


 
Sergey13 ©   (2010-05-13 10:06) [13]

> [11] Виктор   (12.05.10 21:57)
> Но для быстроты работы, в конце рабочего дня, подводя итог сделанному, я набираю цифры сегодняшней даты

Зачитался! Какой слог! Прямо пестня! 8-)

Но про что пестня - я, увы, не понял. 8-(


 
ixen ©   (2010-05-13 11:08) [14]


> Query1.SQL.Add("From Istorii_full.DB");
тут мне кажется нужно писать имя таблицы, а не имя файла таблицы, по крайней мере в фаерберде так..

> Query1.SQL.Add("WHERE Дата1.DateToStr like """+ (Edit3.Text
> + "%"""));

попробуй так:
Query1.SQL.Add("WHERE pole_name containing "+ quotedstr(Edit3.Text));


 
Anatoly Podgoretsky ©   (2010-05-13 11:55) [15]

> Sergey13  (13.05.2010 10:06:13)  [13]

А нафига их набирать то, при наличии компьютера?


 
Виктор   (2010-05-13 16:03) [16]

Query1.SQL.Add("WHERE Дата1 containing "+ quotedstr(Edit3.Text)); - не получается.
Хорошо, я успокоился, пусть будет так как было, т.е. на отдельной форме:

Query1.Close;
Query1.ParamByName("prm1").AsDate:=StrToDate(DateEdit1.Text);
Query1.ParamByName("prm2").AsDate:=StrToDate(DateEdit2.Text);
Query1.Open;

Видимо не судьба мне решить проблему. Спасибо за участие всем.


 
Sergey13 ©   (2010-05-13 16:20) [17]

> [16] Виктор   (13.05.10 16:03)

Запрос может содержать примерно такие конструкции
where
(:par1 is null or Data=:par1)
and (:par2 is null or FIO=:par2)
and (:par3 is null or Polis=:par3)

т.е. управляя "нуловостью" параметра запрос работает с разными полями


 
Виктор   (2010-05-13 17:50) [18]

Разместил на форме 3 DateEdit1 (соответственно: DateEdit1, DateEdit2, DateEdit3), Query1, DataSource1, Button1.
Пишу для Query1.SQL
Select*
From Istorii.DB
Where (:prm1 is null or Дата1=: prm1)
and (:prm2 is null or Дата2=: prm2)
and (:prm3 is null or Дата3=: prm3)
Для Button1
Query1.Close;
Query1.ParamByName("prm1").AsDate:=StrToDate(DateEdit1.Text);
Query1.ParamByName("prm2").AsDate:=StrToDate(DateEdit2.Text);
Query1.ParamByName("prm3").AsDate:=StrToDate(DateEdit3.Text);
Query1.Open;
Не работает – ошибка
Project Data.exe raised exception class EConvertError with message”..’is not a valid date’


 
Sergey13 ©   (2010-05-13 17:54) [19]

> [18] Виктор   (13.05.10 17:50)

Ну так неправильная дата. Что есть DateEdit1?


 
Омлет ©   (2010-05-13 19:46) [20]

Даже в D5 есть TDateTimePicker. Зачем вручную вводить?


 
Виктор   (2010-05-13 21:11) [21]

Всё правильно, в RxLibrary есть очень симпатичные компоненты, в том числе и DateEdit1 в виде календарика, так что вводим дату по науке, а как говорит Аркадий Райкин: "Включаешь-не работает!"
А дата у меня правильная - ввожу исходя имеющихся в базе данных.


 
Омлет ©   (2010-05-13 21:21) [22]

В справке по StrToDate все написано. Строка с датой должна соответствовать формату, заданному в переменной ShortDateFormat, и использовать правильный DateSeparator.


 
Омлет ©   (2010-05-13 21:25) [23]

У меня RxLibrary нет, но, подозреваю, что у TDateEdit есть свойство Date или DateTime типа TDateTime.


 
Виктор   (2010-05-13 21:31) [24]

У меня рабочий вариант для Query1.SQL:
Select*
From Istorii.DB
Where Дата1 >= :prm1 and Дата1 <= :prm2
далее для Button1:
Query1.Close;
Query1.ParamByName("prm1").AsDate:=StrToDate(DateEdit1.Text);
Query1.ParamByName("prm2").AsDate:=StrToDate(DateEdit2.Text);
Query1.Open;
и все работает!!!
Добавил строку
Query1.ParamByName("prm3").AsDate:=StrToDate(DateEdit3.Text);
и поля Дата, Дата2 с тем же форматом и как говорит Папанов: "Шеф всё пропало"


 
Омлет ©   (2010-05-13 21:42) [25]

"У тебя ошибка в программе." (с) АП

Если "is not a valid date", то что-то не так с DateEdit3, мне отсюда не виидно. Проверь формат ввода.
И, еще раз повторяю, должно быть свойство Date у DateEdit. Если есть, то не нужен StrToDate:

Query1.ParamByName("prm3").AsDate := DateEdit3.Date;


 
Омлет ©   (2010-05-13 21:47) [26]

"Удаленная пошаговая отладка ваших исходников нашими лучшими телепатами."


 
Виктор   (2010-05-13 22:03) [27]

У всех DateEdit1, DateEdit2, DateEdit3 в свойствах стоит Date.
Но даже в моем выражении в проекте (без компиляции):
From Istorii.DB
Where Дата1 >= :prm1 and Дата1 <= :prm2
перевожу Query1.Active в True - не ругается, а в выражении
Select*
From Istorii.DB
Where (:prm1 is null or Дата1=: prm1)
and (:prm2 is null or Дата2=: prm2)
and (:prm3 is null or Дата3=: prm3)
при попытке перевести Query1.Active в True - пишет:
Invalid use of KeyWord
Token: prm1
and
Line Number: 3
Значит имеется ошибка в выражении, а именно в строке 3:
Where (:prm1 is null or Дата1=: prm1) и т.д.


 
Плохиш ©   (2010-05-14 01:11) [28]


> Виктор   (13.05.10 22:03) [27]

Рекомендую читать пост 23 до полного просветления.


 
Омлет ©   (2010-05-14 01:13) [29]

Вот такое условие я понимаю
WHERE ((column_name IS NULL) or (column_name = "2010-05-14"))

А это - Where (:prm1 is null or Дата1=: prm1) - это что-то странное. С парадоксом я не знаком, извините.


 
Германн ©   (2010-05-14 01:26) [30]


> Омлет ©   (13.05.10 21:25) [23]
>
> У меня RxLibrary нет, но, подозреваю, что у TDateEdit есть
> свойство Date или DateTime типа TDateTime.
>

У меня RxLibrary есть. И свойство Date там действительно есть! Да и как ему там не быть. RxLibrary писали очень грамотные программисты.
Ну а автору следует внимательнее читать ответы. Кроме уже упомянутого [23] ещё и [25].
Ну и заодно автору стоит понять суть параметров и суть их применения.


 
Sergey13 ©   (2010-05-14 08:49) [31]

> [27] Виктор   (13.05.10 22:03)

Бывает такое. Попробуй разделить параметры на "флаговые" и собственно параметры для сравнения. Типа такого

Where (:prF1 is null or Дата1=: prM1)

Возможно так же "мешает" проверка на нулл, можно переделать так

Where (:prF1 =0 or Дата1=: prM1)


 
Anatoly Podgoretsky ©   (2010-05-14 08:58) [32]

> Омлет  (14.05.2010 01:13:29)  [29]

Синтаксис не позволяет использовать что либо кроме column_reference, а
интерпритатор не позволяет параметры в качестве column_reference, он не
может "откомпилировать" неизвестное на момент "компиляции". И даже если это
вдруг как то заработает, то это из-за ошибки.


 
Виктор   (2010-05-14 10:24) [33]


> "Удаленная пошаговая отладка ваших исходников нашими лучшими
> телепатами."

Видимо потерпела вместе со мной фиаско.
И динамический запрос по дате, и параметрические запросы, рассмотренные выше, являются тупиковой ветвью в "возможностях Delphi" и в моих соответственно.


 
Виктор   (2010-05-14 11:19) [34]

Вопрос для "начинающих" не решен!


 
Sergey13 ©   (2010-05-14 11:29) [35]

> [27] Виктор   (13.05.10 22:03)
> and (:prm3 is null or Дата3=: prm3)

вот еще
Дата3=: prm3
пробел после : он и в программе есть?


 
Sergey13 ©   (2010-05-14 11:31) [36]

> [34] Виктор   (14.05.10 11:19)

Что ж ты его не решаешь?


 
Anatoly Podgoretsky ©   (2010-05-14 12:56) [37]

> Виктор  (14.05.2010 10:24:33)  [33]

Динамический, параметрический запрос никак не является тупиковой ветвью, а
вот твоей это точно.


 
Anatoly Podgoretsky ©   (2010-05-14 12:59) [38]


> Вопрос для "начинающих" не решен!

Ты не начинающий, тебе до него еще расти нужно.


 
Виктор   (2010-05-14 22:53) [39]


> Динамический, параметрический запрос никак не является тупиковой
> ветвью, а
> вот твоей это точно.

Анатолий, видимо, когда хочет узнать хоть что-то о своем заболевании - 6 лет штудирует медицинскую литературу, затем проходит курсы усовершенствования, а уж потом идет к врачу?
Я перевёл всю страничку форума с языка программирования на язык медицинский и понял, что пациенту не выжить, он уже умер.



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.071 c
2-1266403680
Незнайка на Луне
2010-02-17 13:48
2010.08.27
База данных по научным статьям


15-1273696195
Юрий
2010-05-13 00:29
2010.08.27
С днем рождения ! 13 мая 2010 четверг


2-1267000689
AlexAA
2010-02-24 11:38
2010.08.27
Событие "AfterOpen" в TDBGrid


8-1204201324
ERT
2008-02-28 15:22
2010.08.27
PrintScreen


15-1264632229
Германн
2010-01-28 01:43
2010.08.27
RDTSC и её использование в VB 2008 Express Edition