Конференция "Начинающим" » Динамический отбор по дате в базе данных [D5, Paradox]
 
  • Виктор (12.05.10 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;
    возникает ошибка. Подскажите, пожалуйста, где ошибка.
  • Медвежонок Пятачок © (12.05.10 10:02) [1]
    парадокс и бде ничего не знают про StrToDate
  • Медвежонок Пятачок © (12.05.10 10:03) [2]
    и про ":=" тоже ничего не знают
  • Anatoly Podgoretsky © (12.05.10 10:09) [3]
    > Виктор  (12.05.2010 09:45:00)  [0]

    Ты где такой синтаксис выкопал, какое еще :=
  • Виктор (12.05.10 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 © (12.05.10 10:42) [5]
    DateToStr...
  • Виктор (12.05.10 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 © (12.05.10 11:13) [7]
    Правда???

    TDataSet(Any).Text:=(... from tablename where anyfield = ''' + DateToStr(AnyDate) + '''...
  • Sergey13 © (12.05.10 11:25) [8]
    > [0] Виктор   (12.05.10 09:45)
    > При параметрическом запросе:
    > всё работает отлично!

    Тогда какой смысл от него отказываться?
  • Плохиш © (12.05.10 11:25) [9]

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


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

    Спасибо, повеселил.
  • Anatoly Podgoretsky © (12.05.10 11:40) [10]

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

    Какой смысл в like? в данном случае?
  • Виктор (12.05.10 21:57) [11]
    Есть на форме Edit1, Edit2 Edit3 и т.д. для динамических запросов по разным параметрам, например по ФИО, улице, страховому полису и т.д. Если поле имеет строковый параметр, то проблем никаких не возникает (или использовать параметрический запрос как написано выше). Но для быстроты работы, в конце рабочего дня, подводя итог сделанному, я набираю цифры сегодняшней даты (к примеру: 12.05) и всё отбирается. Не сложно, конечно и с параметрическим запросом по дате, но это у меня на отдельной форме с DateEdit1 и DateEdit2, а хотелось бы все иметь на одной форме (и поиск, и запросы на выборку данных, и вывод информации на печать).
  • Плохиш © (12.05.10 23:17) [12]

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

    Злобный насяльника запретил?
  • Sergey13 © (13.05.10 10:06) [13]
    > [11] Виктор   (12.05.10 21:57)
    > Но для быстроты работы, в конце рабочего дня, подводя итог сделанному, я набираю цифры сегодняшней даты

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

    Но про что пестня - я, увы, не понял. 8-(
  • ixen © (13.05.10 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 © (13.05.10 11:55) [15]
    > Sergey13  (13.05.2010 10:06:13)  [13]

    А нафига их набирать то, при наличии компьютера?
  • Виктор (13.05.10 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 © (13.05.10 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)


    т.е. управляя "нуловостью" параметра запрос работает с разными полями
  • Виктор (13.05.10 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 © (13.05.10 17:54) [19]
    > [18] Виктор   (13.05.10 17:50)

    Ну так неправильная дата. Что есть DateEdit1?
  • Омлет © (13.05.10 19:46) [20]
    Даже в D5 есть TDateTimePicker. Зачем вручную вводить?
  • Виктор (13.05.10 21:11) [21]
    Всё правильно, в RxLibrary есть очень симпатичные компоненты, в том числе и DateEdit1 в виде календарика, так что вводим дату по науке, а как говорит Аркадий Райкин: "Включаешь-не работает!"
    А дата у меня правильная - ввожу исходя имеющихся в базе данных.
  • Омлет © (13.05.10 21:21) [22]
    В справке по StrToDate все написано. Строка с датой должна соответствовать формату, заданному в переменной ShortDateFormat, и использовать правильный DateSeparator.
  • Омлет © (13.05.10 21:25) [23]
    У меня RxLibrary нет, но, подозреваю, что у TDateEdit есть свойство Date или DateTime типа TDateTime.
  • Виктор (13.05.10 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 с тем же форматом и как говорит Папанов: "Шеф всё пропало"
  • Омлет © (13.05.10 21:42) [25]
    "У тебя ошибка в программе." (с) АП

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

    Query1.ParamByName('prm3').AsDate := DateEdit3.Date;
  • Омлет © (13.05.10 21:47) [26]
    "Удаленная пошаговая отладка ваших исходников нашими лучшими телепатами."
  • Виктор (13.05.10 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) и т.д.
  • Плохиш © (14.05.10 01:11) [28]

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

    Рекомендую читать пост 23 до полного просветления.
  • Омлет © (14.05.10 01:13) [29]
    Вот такое условие я понимаю
    WHERE ((column_name IS NULL) or (column_name = '2010-05-14'))



    А это -
    Where (:prm1 is null or Дата1=: prm1)

    - это что-то странное. С парадоксом я не знаком, извините.
  • Германн © (14.05.10 01:26) [30]

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

    У меня RxLibrary есть. И свойство Date там действительно есть! Да и как ему там не быть. RxLibrary писали очень грамотные программисты.
    Ну а автору следует внимательнее читать ответы. Кроме уже упомянутого [23] ещё и [25].
    Ну и заодно автору стоит понять суть параметров и суть их применения.
  • Sergey13 © (14.05.10 08:49) [31]
    > [27] Виктор   (13.05.10 22:03)

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

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



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

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

  • Anatoly Podgoretsky © (14.05.10 08:58) [32]
    > Омлет  (14.05.2010 01:13:29)  [29]

    Синтаксис не позволяет использовать что либо кроме column_reference, а
    интерпритатор не позволяет параметры в качестве column_reference, он не
    может "откомпилировать" неизвестное на момент "компиляции". И даже если это
    вдруг как то заработает, то это из-за ошибки.
  • Виктор (14.05.10 10:24) [33]

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

    Видимо потерпела вместе со мной фиаско.
    И динамический запрос по дате, и параметрические запросы, рассмотренные выше, являются тупиковой ветвью в "возможностях Delphi" и в моих соответственно.
  • Виктор (14.05.10 11:19) [34]
    Вопрос для "начинающих" не решен!
  • Sergey13 © (14.05.10 11:29) [35]
    > [27] Виктор   (13.05.10 22:03)
    > and (:prm3 is null or Дата3=: prm3)

    вот еще
    Дата3=: prm3
    пробел после : он и в программе есть?
  • Sergey13 © (14.05.10 11:31) [36]
    > [34] Виктор   (14.05.10 11:19)

    Что ж ты его не решаешь?
  • Anatoly Podgoretsky © (14.05.10 12:56) [37]
    > Виктор  (14.05.2010 10:24:33)  [33]

    Динамический, параметрический запрос никак не является тупиковой ветвью, а
    вот твоей это точно.
  • Anatoly Podgoretsky © (14.05.10 12:59) [38]

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

    Ты не начинающий, тебе до него еще расти нужно.
  • Виктор (14.05.10 22:53) [39]

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

    Анатолий, видимо, когда хочет узнать хоть что-то о своем заболевании - 6 лет штудирует медицинскую литературу, затем проходит курсы усовершенствования, а уж потом идет к врачу?
    Я перевёл всю страничку форума с языка программирования на язык медицинский и понял, что пациенту не выжить, он уже умер.
 
Конференция "Начинающим" » Динамический отбор по дате в базе данных [D5, Paradox]
Есть новые Нет новых   [134433   +25][b:0][p:0.002]