Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2015, 15:58   #1
le7o
Форумчанин
 
Регистрация: 19.05.2011
Сообщений: 116
По умолчанию Правильное применение параметров в Query Delphi

Используется FireDAC.

Код:
SELECT
cl.id, 
cl.date_time,
cl.in_number,
cl.full_name,
CONCAT(e.fname,' ',e.sname,' ',e.mname) as empName,
ca.catalog_min_name,
su.subdivision_min_name,
se.service_min_name,
cl.is_ok,
cl.call_forward,
cl.description, 
cl.emp_id
FROM
calllog cl
left join employees e on cl.emp_id=e.id 
left join catalog ca on cl.catalog_id=ca.id
left join subdivision su on cl.subdivision_id=su.id
left join service se on cl.service_id=se.id
WHERE 1=1 AND
cl.emp_id = :p_empID AND 
(cl.date_time BETWEEN :p_begin AND :p_end)
ORDER BY cl.date_time DESC
Есть такой запрос, и на форме есть ComboBox, где выбирается "p_empID", но при загрузке формы мне необходимо отобразить все записи, а при условии, что пользователь указал "p_empID" - отобразить соответствующие записи...

Ни как не могу сообразить как не учитывать параметр p_empID изначально при открытии Query?


P.s.: знаю что можно сделать по другому: на форме заново сформировать запрос и уже по if then else нужных компонентов добавлять или не добавлять параметры и в случае необходимости заново перезаписывать Query.sql, но может есть способ как обойтись без перезаписи?
le7o вне форума Ответить с цитированием
Старый 26.12.2015, 16:19   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Так, например. Ну или другую константу, которая однозначно не может быть идентификатором. Имей в виду, любой OR в условии замедляет выполнение
Код:
WHERE (0=:p_empID OR cl.emp_id = :p_empID) AND 
(cl.date_time BETWEEN :p_begin AND :p_end)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.12.2015, 16:36   #3
le7o
Форумчанин
 
Регистрация: 19.05.2011
Сообщений: 116
По умолчанию

Достаточно интересный способ, сравню время выполнения запроса, может замедлит настолько что проще переписать Query)))

Цитата:
Сообщение от Аватар Посмотреть сообщение
Так, например. Ну или другую константу, которая однозначно не может быть идентификатором. Имей в виду, любой OR в условии замедляет выполнение
Код:
WHERE (0=:p_empID OR cl.emp_id = :p_empID) AND 
(cl.date_time BETWEEN :p_begin AND :p_end)
le7o вне форума Ответить с цитированием
Старый 26.12.2015, 16:48   #4
le7o
Форумчанин
 
Регистрация: 19.05.2011
Сообщений: 116
По умолчанию

0,0016 сек и 0,0002 для запроса без OR для 550 записей
думаю для отображения в моем случае больше и ни когда не потребуется и даже это количество ни когда не понадобится...

Аватар, спасибо.
le7o вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Правильное применение stdin. (по Си) zaira001002 Общие вопросы C/C++ 5 11.07.2015 00:33
Правильное применение методов формы Shouldercannon Общие вопросы Delphi 5 15.10.2013 13:35
условный оператор, правильное применение к заданию my_sappho_story Помощь студентам 13 01.12.2010 12:44
сохранение и применение параметров.... Vladya Помощь студентам 5 24.01.2010 04:49
Правильное закрытие приложения в Delphi 7 Alex Cones Общие вопросы Delphi 5 18.04.2009 22:06