Конференция "Начинающим" » Фильтрация по дате [D7, MS Access]
 
  • lirikus (18.07.10 22:05) [0]
    Здравствуйте. Имеется таблица. Необходимо вывести записи принадлежащие выбранному временному периоду. Пробовал делать следующим образом:

    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". Поэтому пришлось перейти на строковый тип, что привело меня в тупик...

    Очень прошу вашей помощи. Заранее, спасибо.
  • sniknik © (18.07.10 22:13) [1]
    для начала избавиться от ADOTable, перестать использовать фильтры вместо выборок, перейти на ADODataSet, потихоньку изучать sql, и да, использовать параметры...

    в общем сначала начни все делать правильно, помощь потом. т.к. помогать кому то бредокодить - себя не уважать.
  • Юрий Зотов © (18.07.10 23:17) [2]

    > lirikus   (18.07.10 22:05)  

    select * from table where date betweeen (:date1, :date2);
    И чудо произойдет само собой.
  • Anatoly Podgoretsky © (18.07.10 23:37) [3]
    И не путай представление в фильтре, никакого строгого сравнения не происходит.
  • lirikus (19.07.10 00:05) [4]

    > 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;

  • Юрий Зотов © (19.07.10 00:14) [5]
    1. Вот это как понимать:
    StrToDate(DateTimePicker1.Date)

    2. Не надо никаких переводов даты в строку. Используйте параметры.
  • Плохиш © (19.07.10 00:17) [6]

    > lirikus   (19.07.10 00:05) [4]

    Мда, не в состоянии даже скопировать. Может всё-таки деятельность сменить?
  • sniknik © (19.07.10 00:34) [7]
    > Может всё-таки деятельность сменить?
    на что? даже дворнику требуется интеллект. по аналогии, покажут за какой конец метлы браться, а он ее перевернет, и будет говорить - не работает.
  • lirikus (19.07.10 00:36) [8]

    >
    > 2. Не надо никаких переводов даты в строку. Используйте
    > параметры.


    Подскажите, пожалуйста, как это будет выглядеть для моего конкретного случая.
  • sniknik © (19.07.10 00:40) [9]
    http://www.google.ru/search?hl=ru&newwindow=1&client=firefox&hs=0Jb&rls=org.mozilla:ru:official&&sa=X &ei=nGZDTOKIDIyCOOPQ9I0N&ved=0CBUQvwUoAQ&q=ADODataSet+sql+%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B+%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80&spell=1
  • lirikus (19.07.10 00:44) [10]

    > sniknik ©   (19.07.10 00:34) [7]
    >
    > > Может всё-таки деятельность сменить?
    > на что? даже дворнику требуется интеллект. по аналогии,
    > покажут за какой конец метлы браться, а он ее перевернет,
    >  и будет говорить - не работает.


    Все когда-то были новичками... Остроумие здесь неуместно. Все, кто действительно способен помочь, откликнулись, остальным остается лишь стебаться...
  • Германн © (19.07.10 01:57) [11]

    > Все когда-то были новичками...

    Да. Но переросли новичков только те, кто читал "учебники", а не просил
    > Подскажите, пожалуйста, как это будет выглядеть для моего конкретного случая.
  • Юрий Зотов © (19.07.10 03:02) [12]
    > lirikus   (19.07.10 00:36) [8]

    В строке запроса, там, где должно стоять значение даты1, вместо перевода даты в строку пишем:
    :date1
    (именно так, с двоеточием впереди).

    А перед выполнением запроса присваиваем:
    ParamByName('date1').Value := DateTimePicker1.Date;

    Аналогично с date2.

    См. справку по свойству Params и классу TParam.
  • Германн © (19.07.10 03:21) [13]

    > Юрий Зотов ©   (19.07.10 03:02) [12]

    Имхо сей совет не поможет автору.
    В [9] ему дали ответы через поиск в гугле. Вполне достаточные для понимания. Ну или хотя бы для того, что б попробовать на своём проекте.
    Опять "ты не умничай, ты код давай".
    Может я и не прав. Посмотрим что будет дальше.

    P.S. Может лицею на Королевстве стоит завести ещё одну тему? По поводу "грамотного написания запросов"?
  • Юрий Зотов © (19.07.10 03:29) [14]

    > Германн ©   (19.07.10 03:21) [13]
    > лицею на Королевстве стоит завести ещё одну тему

    Так напиши на досуге, какие проблемы? Много времени не займет. А польза, судя по количеству таких вопросов, будет для многих.
  • Германн © (19.07.10 03:42) [15]

    > Так напиши на досуге, какие проблемы? Много времени не займет.
    >  А польза, судя по количеству таких вопросов, будет для
    > многих.

    Это не ко мне. Вот sniknik такую тему бы потянул. Знаю по собственному опыту. Все его советы помогали мне. И не только мне.
  • бумбум (19.07.10 08:21) [16]

    >
    > 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;
  • Anatoly Podgoretsky © (19.07.10 08:49) [17]
    > lirikus  (19.07.2010 00:05:04)  [4]

    Какой умный и StrToDate и DateToStr одновременно, наверно что бы не
    приставали.
  • sniknik © (19.07.10 09:38) [18]
    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;
  • бумбум (19.07.10 09:58) [19]
    Если твой 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:59) [20]
    З.Ы. У меня скоро женидьба пока я добрый :о)
  • Anatoly Podgoretsky © (19.07.10 10:02) [21]

    > бумбум   (19.07.10 09:58) [19]

    А нафига ему пример из БДЕ?
  • бумбум (19.07.10 10:13) [22]

    > А нафига ему пример из БДЕ?


    Я как то не понял что это у него за FndQuerry
    Да и если автор не может до тукатся как в инспекторе объекта устанавливать параметры то это ему здорово поможет
  • бумбум (19.07.10 10:14) [23]
    Я тож с тупил, только додумался посмотреть
    [D7, MS Access]
  • Плохиш © (19.07.10 10:39) [24]

    > DataModule2.FndQuerry.SQL.Clear;
    > DataModule2.FndQuerry.Close;
    > DataModule2.FndQuerry.SQL.Add('Select * from Prodaja WHERE
    > Data BETWEEN :Data1 and :Data2;');
    >

    Я бы убил.
  • lirikus (19.07.10 13:07) [25]
    Спасибо всем откликнувшимся. Дико извиняюсь, что испытываю ваше терпение. Но на запрос выдается ошибка "Несоответствие типов данных в условиях отбора". Какой тип должен быть у поля "дата" в 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 - для меня, вообще, новое понятие. Можете называть меня ламером (наверное, так оно есть), но не уверен, что это добавит вам чести.
  • Dennis I. Komarov © (19.07.10 13:12) [26]

    > Под рукой "Библия Делфи" Фленова. (Т.е. все-таки учебник
    > я почитал прежде, чем обратиться к вам. Единственное, не
    > знаю, правильную ли литературу выбрал, но до этого по его
    > примерам все получалось)

    "Зина, в печку ее..."
  • Anatoly Podgoretsky © (19.07.10 13:14) [27]

    > Какой тип должен быть у поля "дата" в Access?

    DateTime
  • Anatoly Podgoretsky © (19.07.10 13:17) [28]

    > Под рукой "Библия Делфи" Фленова. (Т.е. все-таки учебник
    > я почитал прежде, чем обратиться к вам. Единственное, не
    > знаю, правильную ли литературу выбрал, но до этого по его
    > примерам все получалось)  И вот как раз там он использует
    > и ADOQuerry, и внесение запроса по частям, и русские названия
    > таблиц. Пытался делать по аналогии. С разработкой баз данных
    > сталкиваюсь впервые. SQL - для меня, вообще, новое понятие.
    >  Можете называть меня ламером (наверное, так оно есть),
    > но не уверен, что это добавит вам чести.

    В печку.
    AdoQuery - в печку
    запрос по частям - в печку
    русские названия - если правильно используешь, то можно
    За честь не беспокойся, по крайней мере мы не беспокоимся, если надо будет, то назовем.
  • Anatoly Podgoretsky © (19.07.10 13:19) [29]

    > русские названия - если правильно используешь, то можно

    А ты используешь неправильно, поэтому тоже в печку.
  • lirikus (19.07.10 13:24) [30]

    > 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 - в печку
    > запрос по частям - в печку
    > русские названия - если правильно используешь, то можно


    учту на будущее
  • И. Павел © (19.07.10 13:28) [31]
    А почему в [25] в "Select..." одно русское слово "Дата" отображается нормально, а то слово, которое после from - каракулями? Там что, три разных языка?
  • Юрий Зотов © (19.07.10 13:35) [32]
    > lirikus   (19.07.10 13:24) [30]

    with DataModule2.FndQuerry.Parameters do
    begin
     ParamByName('date1').AsDate := DateTimePicker1.Date;
     ParamByName('date2').AsDate := DateTimePicker2.Date;
    end;


    Часто приводимые на форумах примеры - это всего лишь подсказки. Их не следует понимать буквально.

    А вот фразы типа "См. справку по разделу такому-то" следует понимать как раз буквально. И справку надо действительно смотреть.
  • sniknik © (19.07.10 14:09) [33]
    Юрий Зотов ©   (19.07.10 13:35) [32]
    неправильно, говорили же уже, нужен datatime или готовсь к проблемам
    т.е.
    with DataModule2.FndQuerry.Parameters do
    begin
     ParamByName('date1').AsDateTime := DateTimePicker1.DateTime;
     ParamByName('date2').AsDateTime := DateTimePicker2.DateTime;
    end;

  • Anatoly Podgoretsky © (19.07.10 14:11) [34]
    > sniknik  (19.07.2010 14:09:33)  [33]

    ParamByName('date1').AsDateTime -> ParamByName('date1').Value
  • sniknik © (19.07.10 14:15) [35]
    > Anatoly Podgoretsky ©   (19.07.10 14:11) [34]
    а, ну да, "ступил". у нас тут уже дикая смесь BDE с ADO...
  • lirikus (19.07.10 14:34) [36]
    Всем ОГРОМНЕЙШЕЕ СПАСИБО за помощь! В особенности 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.: Не судите строго, я только учусь  =)
  • lirikus (19.07.10 14:35) [37]
    Удалено модератором
  • Юрий Зотов © (19.07.10 23:08) [38]
    Вот и радость у человека...

    Знакомо, проходили.

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

    Правда, подобный кайф все равно испытываешь, когда за ту же пару бессонных суток решишь сложную задачу. А уж если решишь ее еще и красиво, то полный кайф.

    Но задачи такие попадаются очень редко, все больше рутина...
    :-(
  • sniknik © (20.07.10 00:58) [39]
    > Вот и радость у человека...
    а ошибки так и не исправил... только то на что "нарвался", до остального дела нет. радуется.
  • Германн © (20.07.10 02:04) [40]

    > а ошибки так и не исправил... только то на что "нарвался",
    >  до остального дела нет. радуется.

    Студент кулинарного техникума радуется, что наконец-то скинул зачет по ненавистному ему предмету "Программирование".
    Может хоть кулинар из него получится грамотный?
    :)
 
Конференция "Начинающим" » Фильтрация по дате [D7, MS Access]
Есть новые Нет новых   [134433   +24][b:0.001][p:0.005]