-
Здравствуйте. Имеется таблица. Необходимо вывести записи принадлежащие выбранному временному периоду. Пробовал делать следующим образом:
DataModule2.ADOTable3.Filtered:=false; DataModule2.ADOTable3.Filter:='[Дата]>='+QuotedStr(DateToStr(DateTimePicker1.DateTime))+'
and [Дата]<='+QuotedStr(DateToStr(DateTimePicker2.DateTime))+'';
DataModule2.ADOTable3.Filtered:=true; В данном случае даты сравниваются как строки. Т.е. если сравнивать, к примеру, 18.07.2010 и 01.08.2010, то больше будет первая дата, что является ошибкой. Чтобы сравнивать как даты,пробовал в MS Access задать полю "дата" тип "дата/время ". При попытке записать значение даты с DateTimePicker выдавалась ошибка "WideString actual: TDateTime". Поэтому пришлось перейти на строковый тип, что привело меня в тупик... Очень прошу вашей помощи. Заранее, спасибо.
-
для начала избавиться от ADOTable, перестать использовать фильтры вместо выборок, перейти на ADODataSet, потихоньку изучать sql, и да, использовать параметры...
в общем сначала начни все делать правильно, помощь потом. т.к. помогать кому то бредокодить - себя не уважать.
-
> lirikus (18.07.10 22:05)
select * from table where date betweeen (:date1, :date2); И чудо произойдет само собой.
-
И не путай представление в фильтре, никакого строгого сравнения не происходит.
-
> select * from table where date betweeen (:date1, :date2); > > И чудо произойдет само собой.
Выдает следующую ошибку: Type mismatch for field 'Дата' , expecting: WideStringActual: DateTime.' DataModule2.FndQuerry.Active:=false;
DataModule2.FndQuerry.SQL.Clear;
DataModule2.FndQuerry.SQL.Add('SELECT *');
DataModule2.FndQuerry.SQL.Add('FROM çàÿâêè_îòð');
DataModule2.FndQuerry.SQL.Add('WHERE Дата BETWEEN '''+StrToDate(DateTimePicker1.Date)+''' and '''+DateToStr(DateTimePicker2.Date)+'''');
DataModule2.FndQuerry.Active:=true;
-
1. Вот это как понимать: StrToDate(DateTimePicker1.Date)
2. Не надо никаких переводов даты в строку. Используйте параметры.
-
> lirikus (19.07.10 00:05) [4]
Мда, не в состоянии даже скопировать. Может всё-таки деятельность сменить?
-
> Может всё-таки деятельность сменить? на что? даже дворнику требуется интеллект. по аналогии, покажут за какой конец метлы браться, а он ее перевернет, и будет говорить - не работает.
-
> > 2. Не надо никаких переводов даты в строку. Используйте > параметры.
Подскажите, пожалуйста, как это будет выглядеть для моего конкретного случая.
-
-
> sniknik © (19.07.10 00:34) [7] > > > Может всё-таки деятельность сменить? > на что? даже дворнику требуется интеллект. по аналогии, > покажут за какой конец метлы браться, а он ее перевернет, > и будет говорить - не работает.
Все когда-то были новичками... Остроумие здесь неуместно. Все, кто действительно способен помочь, откликнулись, остальным остается лишь стебаться...
-
> Все когда-то были новичками...
Да. Но переросли новичков только те, кто читал "учебники", а не просил > Подскажите, пожалуйста, как это будет выглядеть для моего конкретного случая.
-
> lirikus (19.07.10 00:36) [8]
В строке запроса, там, где должно стоять значение даты1, вместо перевода даты в строку пишем: :date1 (именно так, с двоеточием впереди).
А перед выполнением запроса присваиваем: ParamByName('date1').Value := DateTimePicker1.Date;
Аналогично с date2.
См. справку по свойству Params и классу TParam.
-
> Юрий Зотов © (19.07.10 03:02) [12]
Имхо сей совет не поможет автору. В [9] ему дали ответы через поиск в гугле. Вполне достаточные для понимания. Ну или хотя бы для того, что б попробовать на своём проекте. Опять "ты не умничай, ты код давай". Может я и не прав. Посмотрим что будет дальше.
P.S. Может лицею на Королевстве стоит завести ещё одну тему? По поводу "грамотного написания запросов"?
-
> Германн © (19.07.10 03:21) [13] > лицею на Королевстве стоит завести ещё одну тему
Так напиши на досуге, какие проблемы? Много времени не займет. А польза, судя по количеству таких вопросов, будет для многих.
-
> Так напиши на досуге, какие проблемы? Много времени не займет. > А польза, судя по количеству таких вопросов, будет для > многих.
Это не ко мне. Вот sniknik такую тему бы потянул. Знаю по собственному опыту. Все его советы помогали мне. И не только мне.
-
> > DataModule2.FndQuerry.Active:=false; > DataModule2.FndQuerry.SQL.Clear; > DataModule2.FndQuerry.SQL.Add('SELECT *'); > DataModule2.FndQuerry.SQL.Add('FROM çàÿâêè_îòð'); > DataModule2.FndQuerry.SQL.Add('WHERE Дата BETWEEN '''+StrToDate(DateTimePicker1. > Date)+''' and '''+DateToStr(DateTimePicker2.Date)+''''); > > DataModule2.FndQuerry.Active:=true;
DataModule2.FndQuerry.SQL.Clear; DataModule2.FndQuerry.Close; DataModule2.FndQuerry.SQL.Add('Select * from MyBase WHERE Data BETWEEN :Data1 and :Data2;'); DataModule2.FndQuerry.Parameters[0].Value:=DateTimePicker1.data; DataModule2.FndQuerry.Parameters[1].Value:=DateTimePicker1.data; DataModule2.FndQuerry.Open;
-
> lirikus (19.07.2010 00:05:04) [4]
Какой умный и StrToDate и DateToStr одновременно, наверно что бы не приставали.
-
lirikus (19.07.10 00:44) [10] > Все когда-то были новичками... то что ты новичек, а не ламер еще доказать нужно... а то что ты полностью проигнорировал написанное в [1], + якобы на основании конкретного(правильного!) примера в [2] "сделал" свою "лажу" в [4]... с моей точки зрения поставило тебя во вторую категорию.
> Остроумие здесь неуместно. очень даже уместно, ламеры по другому не реагируют. имхо.
Anatoly Podgoretsky © (19.07.10 08:49) [17] > наверно что бы не приставали. чтобы после сказать, это описка здесь, а в программе все правильно... но не работает.
вообще пример клевый, в 6 строчках насчитал 6 ошибок ... :) 1 привязка к DataModule2 2 использование ADOQuery 3 то что делает ADOQuery опасным на старых версиях - внесение запроса частями 4 русское название таблицы (+ без кавычек) 5 параметры 6 не скомпилится даже из-за "StrToDate и DateToStr"
а в [16] исправляя одно вносится другое... вот это вот ошибочно > DataModule2.FndQuerry.Parameters[0].Value:=DateTimePicker1.data; из-за .data;
-
Если твой FndQuerry обычный TQuery то: var
Par: TParams;
begin
Par:= TParams.Create;
Par.CreateParam(ftDate, 'Data1', ptInput);
Par.CreateParam(ftDate, 'Data2', ptInput);
Par[0].AsDate := DateTimePicker1.Date;
Par[1].AsDate := DateTimePicker2.Date;
DataModule2.FndQuerry.SQL.Clear;
DataModule2.FndQuerry.Close;
DataModule2.FndQuerry.SQL.Add('Select * from Prodaja WHERE Data BETWEEN :Data1 and :Data2;');
DataModule2.FndQuerry.Params:=Par;
DataModule2.FndQuerry.Open;
end;
-
З.Ы. У меня скоро женидьба пока я добрый :о)
-
> бумбум (19.07.10 09:58) [19]
А нафига ему пример из БДЕ?
-
> А нафига ему пример из БДЕ?
Я как то не понял что это у него за FndQuerry Да и если автор не может до тукатся как в инспекторе объекта устанавливать параметры то это ему здорово поможет
-
Я тож с тупил, только додумался посмотреть [D7, MS Access]
-
> DataModule2.FndQuerry.SQL.Clear; > DataModule2.FndQuerry.Close; > DataModule2.FndQuerry.SQL.Add('Select * from Prodaja WHERE > Data BETWEEN :Data1 and :Data2;'); >
Я бы убил.
-
Спасибо всем откликнувшимся. Дико извиняюсь, что испытываю ваше терпение. Но на запрос выдается ошибка "Несоответствие типов данных в условиях отбора". Какой тип должен быть у поля "дата" в Access? DataModule2.FndQuerry.SQL.Clear;
DataModule2.FndQuerry.Close;
DataModule2.FndQuerry.SQL.Add('Select * from Çàÿâêè_îòð WHERE Дата BETWEEN :Date1 and :Date2');
DataModule2.FndQuerry.Parameters.ParamByName('date1').Value:=DateTimePicker1.Dat e; DataModule2.FndQuerry.Parameters.ParamByName('date2').Value:=DateTimePicker2.Dat e;
DataModule2.FndQuerry.Open; > Германн © (19.07.10 01:57) [11]Да. Но переросли новичков > только те, кто читал "учебники", а не просил
> sniknik © (19.07.10 09:38) [18]1 привязка к DataModule2 > 2 использование ADOQuery > 3 то что делает ADOQuery опасным на старых версиях - внесение > запроса частями > 4 русское название таблицы (+ без кавычек) > 5 параметры
Под рукой "Библия Делфи" Фленова. (Т.е. все-таки учебник я почитал прежде, чем обратиться к вам. Единственное, не знаю, правильную ли литературу выбрал, но до этого по его примерам все получалось) И вот как раз там он использует и ADOQuerry, и внесение запроса по частям, и русские названия таблиц. Пытался делать по аналогии. С разработкой баз данных сталкиваюсь впервые. SQL - для меня, вообще, новое понятие. Можете называть меня ламером (наверное, так оно есть), но не уверен, что это добавит вам чести.
-
> Под рукой "Библия Делфи" Фленова. (Т.е. все-таки учебник > я почитал прежде, чем обратиться к вам. Единственное, не > знаю, правильную ли литературу выбрал, но до этого по его > примерам все получалось)
"Зина, в печку ее..."
-
> Какой тип должен быть у поля "дата" в Access?
DateTime
-
> Под рукой "Библия Делфи" Фленова. (Т.е. все-таки учебник > я почитал прежде, чем обратиться к вам. Единственное, не > знаю, правильную ли литературу выбрал, но до этого по его > примерам все получалось) И вот как раз там он использует > и ADOQuerry, и внесение запроса по частям, и русские названия > таблиц. Пытался делать по аналогии. С разработкой баз данных > сталкиваюсь впервые. SQL - для меня, вообще, новое понятие. > Можете называть меня ламером (наверное, так оно есть), > но не уверен, что это добавит вам чести.
В печку. AdoQuery - в печку запрос по частям - в печку русские названия - если правильно используешь, то можно За честь не беспокойся, по крайней мере мы не беспокоимся, если надо будет, то назовем.
-
> русские названия - если правильно используешь, то можно
А ты используешь неправильно, поэтому тоже в печку.
-
> Anatoly Podgoretsky © (19.07.10 13:14) [27] > DateTime
Так и есть. В чем тогда несоответствие?
> Dennis I. Komarov © (19.07.10 13:12) [26]"Зина, в печку > ее..."
> Anatoly Podgoretsky © (19.07.10 13:17) [28]В печку. > AdoQuery - в печку > запрос по частям - в печку > русские названия - если правильно используешь, то можно
учту на будущее
-
А почему в [25] в "Select..." одно русское слово "Дата" отображается нормально, а то слово, которое после from - каракулями? Там что, три разных языка?
-
> lirikus (19.07.10 13:24) [30]
with DataModule2.FndQuerry.Parameters do
begin
ParamByName('date1').AsDate := DateTimePicker1.Date;
ParamByName('date2').AsDate := DateTimePicker2.Date;
end;
Часто приводимые на форумах примеры - это всего лишь подсказки. Их не следует понимать буквально. А вот фразы типа "См. справку по разделу такому-то" следует понимать как раз буквально. И справку надо действительно смотреть.
-
Юрий Зотов © (19.07.10 13:35) [32]неправильно, говорили же уже, нужен datatime или готовсь к проблемам т.е. with DataModule2.FndQuerry.Parameters do
begin
ParamByName('date1').AsDateTime := DateTimePicker1.DateTime;
ParamByName('date2').AsDateTime := DateTimePicker2.DateTime;
end;
-
> sniknik (19.07.2010 14:09:33) [33]
ParamByName('date1').AsDateTime -> ParamByName('date1').Value
-
> Anatoly Podgoretsky © (19.07.10 14:11) [34] а, ну да, "ступил". у нас тут уже дикая смесь BDE с ADO...
-
Всем ОГРОМНЕЙШЕЕ СПАСИБО за помощь! В особенности sniknik и Юрию Зотову. Заработал вариант с DateTime. DataModule2.FndQuerry.SQL.Clear;
DataModule2.FndQuerry.Close;
DataModule2.FndQuerry.SQL.Add('Select * from Çàÿâêè_îòð WHERE Дата BETWEEN :Date1 and :Date2');
DataModule2.FndQuerry.Parameters.ParamByName('date1').Value:=DateTimePicker1.Dat eTime; DataModule2.FndQuerry.Parameters.ParamByName('date2').Value:=DateTimePicker2.Dat eTime;
DataModule2.FndQuerry.Open; (Вместо value asdate/asdatetime не подставлялось, ошибка Undeclared identifier: 'AsDate') P.S.: Не судите строго, я только учусь =)
-
Удалено модератором
-
Вот и радость у человека...
Знакомо, проходили.
Жаль, что я уже не могу испытывать восторгов типа "блин, какой я крутой, не спал всего лишь пару суток, но запрос, гад такой, все же заработал".
Правда, подобный кайф все равно испытываешь, когда за ту же пару бессонных суток решишь сложную задачу. А уж если решишь ее еще и красиво, то полный кайф.
Но задачи такие попадаются очень редко, все больше рутина... :-(
-
> Вот и радость у человека... а ошибки так и не исправил... только то на что "нарвался", до остального дела нет. радуется.
-
> а ошибки так и не исправил... только то на что "нарвался", > до остального дела нет. радуется.
Студент кулинарного техникума радуется, что наконец-то скинул зачет по ненавистному ему предмету "Программирование". Может хоть кулинар из него получится грамотный? :)
|