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

Вниз

Поле   Найти похожие ветки 

 
Shved ©   (2002-12-02 13:12) [0]

Имеется таблица. Формирую SQL, чтобы произошла выборка интервала времени, в таком виде:

FirstDay:=Edit1.Text;
SecondDay:=Edit2.Text;
Form1.Query.Close;
Form1.Query.SQL.Clear;
Form1.Query.SQL.Add("select *");
Form1.Query.SQL.Add("FROM "BDAuto.DB" Bdauto");
Form1.Query.SQL.Add("WHERE "DAY" BETWEEN "+FirstDay+" and "+SecondDay);
Form1.Query.Open;
Form1.DBGrid1.DataSource:=Form1.DataSource2;


FirstDay и SecondDay в виде ДД.ММ.ГГ (текст), но при запуске программы вылезает ошибка "Invalid use of keyword "02"" (это год).
Что я не так делаю?
И вообще, в Delphi можно поставить полю атрибут D или @. Оба имеют формат даты, но чем они различаются (только временем?) и почемуо в примерах Delphi используется только формат "@"?
Вобщем, какой формат посоветуете. господа профессионалы и какой формат запроса должен быть?


 
Max Zyuzin ©   (2002-12-02 13:20) [1]

Значения надо взять в кавычки... в твоем случае это выглядит так...
Form1.Query.SQL.Add("WHERE "DAY" BETWEEN """+FirstDay+""" and """+SecondDay+""");
Это все одинарные кавычки... но ИМХО лучше сделать так...

Form1.Query.Close;
Form1.Query.SQL.Clear;
Form1.Query.SQL.Add("select *");
Form1.Query.SQL.Add("FROM "BDAuto.DB" Bdauto");
Form1.Query.SQL.Add("WHERE "DAY" BETWEEN :FirstDay and :SecondDay");
try
Query.ParamByName("FirstDay").AsDate := StrToDate(FirstDay);
Query.ParamByName("SecondDay").AsDate := StrToDate(SecondDay);
except
/// Хреновая дата....
end;
Form1.Query.Open;




 
ЮЮ ©   (2002-12-02 13:21) [2]

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


 
Shved ©   (2002-12-02 14:15) [3]

Спасибо. А по поводу форматов "D" и "@" что скажете? Что лучше и почему?


 
Shved ©   (2002-12-02 14:32) [4]

А тот код, что вы предложили - не работает. Пишет, что неправильный формат даты. Какой формат должен быть, если атрибут поля "D", а формат записей в поле DD.MM.YY?


 
Max Zyuzin ©   (2002-12-02 14:34) [5]

Ну вообще то, формат должен быть такой как в системе...


 
Shved ©   (2002-12-02 14:40) [6]

Все равно не помогает. Присваивал переменным FirstDay и SecondDay разные значения: DD.MM.YY, DD.MM.YYYY, DD.MM. Ошибка всегда одна и та же. В системе стоит формат DD.MM.YY.
Может быть, есть другой способ выборки по дате? Если у кого есть - киньте кусок кода, пожалуйста. Ну а если нет, то хоть подсоветуйте...


 
Max Zyuzin ©   (2002-12-02 14:48) [7]

А где именно выдает ошибку???
Query.ParamByName("FirstDay").AsDate := StrToDate(FirstDay);
Здесь?


 
Shved ©   (2002-12-02 15:16) [8]

Ошибка в выполнении SQL (перескакивает на следующую процедуру). Пишет "Type mismatch in expression". Я так понимаю, что он не хочет переводить данные из Edit1 и Edit2 в формат даты. Я ввожу примерно так: "03.12.02" и "05.12.02". Формат такой же, как в системе, разделитель точками... Уже руки опускаются даже... Что это за беда такая?


 
Max Zyuzin ©   (2002-12-02 16:19) [9]

Давайте по порядку... пожалуйста привели полность текст запроса, которй хочешь выполнить... и типы полей.
А пробовал ли ты это дело выполнить просто в IBExpert?


 
Anatoly Podgoretsky ©   (2002-12-02 18:25) [10]

Max Zyuzin © (02.12.02 14:34)
Если для ИБ то это не так, ему будет наплевать на формат системы, для Парадокса другое дело


 
Max Zyuzin ©   (2002-12-02 18:37) [11]

Anatoly Podgoretsky © (02.12.02 18:25)
Ну вроде как в IB по умолчанию стоит DD.MM.YYYY ??


 
Anatoly Podgoretsky ©   (2002-12-02 18:42) [12]

Может быть, не знаю, но настройки то клиентского компьютера тут явно не причем, другое дело с параметрами.


 
Shved ©   (2002-12-02 19:17) [13]

Текст запроса я привел выше. FirstDay и SecondDay читаются из Edit1 и Edit2 соответственно. Запрос отправляется в TQuery, который привязан к DGrid.

Я вот еще посмотрел в SQL-editor"e автоматически изменяется строка запроса типа "02.12.02" на "12/02/2002". Отсюда, может быть формат даты и нужно писать какк-то так? Но опять же, ошибка...
Что вам еще нужно знать для точного ответа на мой вопрос?


 
Max Zyuzin ©   (2002-12-02 19:22) [14]

>Anatoly Podgoretsky © (02.12.02 18:42)
Хотя, с другой стороны - какая разница какой формат даты у IB??
Я ведь работу с датай заканчиваю на клиенте, где ее из текста преобразую в дату, а она уже везде одинаковая....

Совет Shved © - забудь про ввод даты в Edit и пользуйся DateTimePicker-ом... тогда все будет проще..., и НАМНОГО удобнее для пользователя....
Query.ParamByName("FirstDay").AsDateTime := DateTimePicker1.DateTime;


 
Max Zyuzin ©   (2002-12-02 19:25) [15]

>Shved © (02.12.02 19:17)
Так... давай определимся какая у нас СУБД... Ibase или Paradox?
А если у тебя автоматчески переводится, может попробовать вводить дату в таком же формате? Хотя лучше пользоваться DateTimePicker-ом


 
Shved ©   (2002-12-02 20:24) [16]

База Paradox. Delphi 5.
А ни у кого нет готового куска кода с выборкой по дате на Paradox? Буду очень признателен.


 
Max Zyuzin ©   (2002-12-02 21:58) [17]

>Shved © (02.12.02 20:24)
А ОС какая? Случаем не Win2k англ.?
Попробуй ради эксперимента сделать такую хрень...
Caption := DateToStr(Now);
И посмотри что получится... это у тебя и будет формат данных в системе... что что мне говорит, что будет что нить вроде 02/12/2002
С такой шуткой я уже сталкивался. Не смотря на то, что у тебя в панели управления написано что фомат через точки... Лечилось это установкой региональных сеттингов сначала в англ., а потом назад в русский.
А куска кода с собой нету :( только завтра... если не забуду :)


 
Shved ©   (2002-12-02 22:06) [18]

Ось там Win98. Но надо будет делать с учетом переноса в сеть, а в сети почти все компы под Win2000, так что все равно надо учесть.
Проверить сейчас не могу, т.к. все на работе, так что только завтра. А за код заранее спасибо.


 
Max Zyuzin ©   (2002-12-02 22:08) [19]

Тады одназначно попробуй DateTimePicker, он уже возвращяет значение типа TDateTime и не надо заморачивать голову... как преобразовать строку в дату...


 
LSW ©   (2002-12-03 08:57) [20]

Попробуй сделать рестуктуризацию таблицы и поле DAY измени на поле, к примеру DAY_1 и попробуй все выше сказанное.


 
DN ©   (2002-12-03 11:20) [21]

Можно попробовать и без SQL:
(поле в базе в формате DATA, для ввода используется MaskEdit)
...
if MaskEdit1.Enabled = True then
begin
if MaskEdit1.Text<>" . . " then
begin
Table1.IndexFieldNames:="DateNPA";
Table1.FindKey([StrToDate(MaskEdit1.Text)]);
end
else
if MaskEdit1.Text =" . . " then
ShowMessage("Отсутствуют данные для поиска.");
end;
...


Что-то вроде этого.


 
Mirolex   (2002-12-03 15:03) [22]

Для Paradox это известестная фигня при работе с датами.
Для начала, возьми любую программу, которая может выполнять SQL запросы (SQL Explorer из Delphi или Access хотя бы) и напиши этот запрос руками. И поиграй с форматами дат. Когда запрос заработает, тогда и думай как и какие параметры подставлять.

У меня сейчас нет времени, беге на работу, но можешь прислать мне email, а я посмотрю в исходниках (у меня точно есть такие запросы в старых программах).


 
Shved ©   (2002-12-03 15:40) [23]

Вобщем, бросил я этой ерундой маяться и использовал DateTimePicker. Однако, вопрос все-таки остается актуальным, раз он такой резонанс вызвал. Так что, все-таки интересно как сделать все "по-правильному".


 
Max Zyuzin ©   (2002-12-03 15:51) [24]

>Shved © (03.12.02 15:40)
Ты пробовал тот пример что я написал вчера???
Caption := DateToStr(Now);


 
ShuraGrp ©   (2002-12-03 16:12) [25]

Form1.Query.SQL.Add("WHERE "DAY" BETWEEN cast("""+:FirstDay+""" as Date) and cast("""+:SecondDay+""" as Date)");
или
WHERE "DAY" BETWEEN cast(:FirstDay as Date) and cast(:SecondDay as Date)


 
Shved ©   (2002-12-03 17:21) [26]

To Max Zyuzin
Пробовал. Не получилось :)

To ShuraGrp
Надо попробовать. Завтра скажу чего получилось.


 
Max Zyuzin ©   (2002-12-03 17:47) [27]

ЭЭЭэ а что не получилось :) ??



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

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

Наверх




Память: 0.53 MB
Время: 0.013 c
3-74585
Zn
2002-12-04 09:52
2002.12.23
Не работает SELECT ... INTO TABLE в ADOQuery


4-75028
bytebutcher
2002-11-06 23:51
2002.12.23
Как узнать частоту обновления для текущего видеорежима?


7-75000
saf
2002-10-17 18:51
2002.12.23
Принтер


14-74945
Marconi
2002-12-02 20:31
2002.12.23
а как? возможно юзеры задают слишком много вопросов!


14-74976
DanIQ
2002-11-30 07:30
2002.12.23
Scroll Lock