1 (edited by adiziktdy 2024-05-15 10:07:51)

Topic: [РЕШЕНО] Передача параметра даты из Memo в SQL-запрос

Здравствуйте.
Поле Memo состоит из нескольких условий, которые передаются в запрос. Когда нет параметра даты, всё работает ОК. С датой - ошибка. Появляются непонятные символы слэш \

В чем может быть причина? Подскажите, пожалуйста.

vedom_view.Memo1.Text:= ' id_year='+IntToStr(idYear)+ ' AND DATE_FORMAT(dEk,"%d.%m.%Y")="'+DateToStr(vedom_view.DateTimePicker1.Date)+'"';
Post's attachments

Attachment icon Image1.jpg 321.27 kb, 15 downloads since 2024-05-15 

Yana

Re: [РЕШЕНО] Передача параметра даты из Memo в SQL-запрос

Это не непонятные символы.

Так экранируются символы которые могут быть распознаны как служебные.
Опишите(покажите) как вы передаете условие в запрос.

Re: [РЕШЕНО] Передача параметра даты из Memo в SQL-запрос

При смене даты процедура

procedure vedom_view_DateTimePicker1_OnChange (Sender: TObject);
begin
 if vedom_view.ComboBox4.dbItemID <> - 1 then
 uslovie:= ' id_year='+IntToStr(idYear)+ ' AND id_typeEk='+IntToStr(vedom_view.ComboBox4.dbItemID)+ ' AND DATE_FORMAT(`dEk`,"%d.%m.%Y"'+')="'+DateToStr(vedom_view.DateTimePicker1.Date)+'"'
 else
 uslovie:= ' `id_year`='+IntToStr(idYear)+ ' AND DATE_FORMAT(`dEk`,"%d.%m.%Y"'+')="'+DateToStr(vedom_view.DateTimePicker1.Date)+'"';
 vedom_view.Memo1.Text:=uslovie;
 vedom_view.Button19.Click;
end;

Далее по кнопке Button19 SQL-запрос
https://i.postimg.cc/SstcP9MG/Image2.jpg

Ошибка
https://i.postimg.cc/jSQPbmf2/Image5.jpg

Показать запрос
https://i.postimg.cc/1tTNBZkC/Image6.jpg

Yana

Re: [РЕШЕНО] Передача параметра даты из Memo в SQL-запрос

Как выход из положения вы можете пойти путем через скрипт.
С Button19 убираете SQL запрос.
В событии

procedure vedom_view_DateTimePicker1_OnChange (Sender: TObject);
begin
 if vedom_view.ComboBox4.dbItemID <> - 1 then
 uslovie:= ' id_year='+IntToStr(idYear)+ ' AND id_typeEk='+IntToStr(vedom_view.ComboBox4.dbItemID)+ ' AND DATE_FORMAT(`dEk`,"%d.%m.%Y"'+')="'+DateToStr(vedom_view.DateTimePicker1.Date)+'"'
 else
 uslovie:= ' `id_year`='+IntToStr(idYear)+ ' AND DATE_FORMAT(`dEk`,"%d.%m.%Y"'+')="'+DateToStr(vedom_view.DateTimePicker1.Date)+'"';
 vedom_view.Memo1.Text:=uslovie;
// vedom_view.Button19.Click;

vedom_view.TableGrid1.dbSQL := 'ВАШ ЗАПРОС' + uslovie ;
vedom_view.TableGrid1.dbSQLExecute;

end;

Re: [РЕШЕНО] Передача параметра даты из Memo в SQL-запрос

sparrow wrote:

Как выход из положения вы можете пойти путем через скрипт.

Спасибо большое! Получилось.

Yana

6 (edited by sparrow 2024-05-15 10:47:48)

Re: [РЕШЕНО] Передача параметра даты из Memo в SQL-запрос

Давайте вернемся назад
А скажите какая нужда отправлять в мемо а оттуда в SQL запрос?
Смотрите это ваше условие;

 if vedom_view.ComboBox4.dbItemID <> - 1 then
 uslovie:= ' id_year='+IntToStr(idYear)+ ' AND id_typeEk='+IntToStr(vedom_view.ComboBox4.dbItemID)+ ' AND DATE_FORMAT(`dEk`,"%d.%m.%Y"'+')="'+DateToStr(vedom_view.DateTimePicker1.Date)+'"'
 else
 uslovie:= ' `id_year`='+IntToStr(idYear)+ ' AND DATE_FORMAT(`dEk`,"%d.%m.%Y"'+')="'+DateToStr(vedom_view.DateTimePicker1.Date)+'"';

ОПТИМИЗИРУЕМ и Переписываем:

WHERE `id_year`= {EditY} AND `dEk`=Date({DateTimePicker1}) AND
     CASE WHEN {ComboBox4}<>-1 THEN id_typeEk={ComboBox4} ELSE 1 END

Вставляем это ВМЕСТО WHERE в старой версии в кнопку "SQL запрос"

Вместо Мемо1 создаем Edit  с именем 'EditY' куда помещаем переменную idYear.
Убираем проверку условия в событии.


Мог ошибиться с синтаксисом Надеюсь идея понятна.

Re: [РЕШЕНО] Передача параметра даты из Memo в SQL-запрос

sparrow wrote:

Давайте вернемся назад
А скажите какая нужда отправлять в мемо а оттуда в SQL запрос?

Потому что нужно было передавать изменяющееся условие в кнопку SQL-запроса. И не всегда DateTimePicker1 и/или  ComboBox4 участвовал/-и в запросе. А так условие было гибким. Memo (Edit кстати я тоже пробовала - эффект был тем же. Ошибка) позволял отрабатывать разные условия вывода в таблицу. Говорю же, без даты всё отлично работает. А момент передачи даты в запрос из Memo сопровождается спецсимволами, которые MySQL не интерпретирует как корректные.

Ваше же предложение прописать всё в процедуре решило проблему.

Yana

8 (edited by sparrow 2024-05-15 12:23:51)

Re: [РЕШЕНО] Передача параметра даты из Memo в SQL-запрос

Понятно
Я подумал о том что возможно вы вносите изменения в запрос вручную.


Что касается даты. Дату лучше приводить к виду в котором она хранится в MYSQL.
Это даст возможность корректных сравнений больше/меньше и выборки по равно.


Если компонент не учавствует в поиске его всегда можно проанализировать и в запросе CASE WHEN ваш компонент = -1 THEN 1 ELSE ваш компонент END

Re: [РЕШЕНО] Передача параметра даты из Memo в SQL-запрос

sparrow wrote:

Дату лучше приводить к виду в котором она хранится в MYSQL.

Я пыталась.

Если компонент не учавствует в поиске его всегда можно проанализировать и в запросе CASE WHEN ваше компонент = -1 THEN 1 ELSE ваше компонент END

Над этим нужно подумать smile

Yana