Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 SQL-запрос для формы поиска и обработка логических операторов  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 131
автор
Ганов Александр (перенесено отсюда)
как вариант использовать "+", который превратит отсутствующий параметр в "нулевую строку", в том случае если какой-то параметр запроса не был использован пользователем
разобрался с "+".


все ОК. можно хоть "стопицот" условий сделать. одного пока не пойму как сделать:

strSQL = "SELECT *" _
          & "FROM [Работы] " _
          & "WHERE " & "([Название] like '*" + [fldНазвание].Value + "*') AND " _
                              & "([ДатаЗапуска] >=" + IIf(IsNull([fldДатаЗапускаНачало].Value) = False, Format([fldДатаЗапускаНачало].Value, "General Number"), Null) & ") AND " _
                              & "([ДатаЗапуска] <=" + IIf(IsNull([fldДатаЗапускаКонец].Value) = False, Format([fldДатаЗапускаКонец].Value, "General Number"), Null) & ") AND " _
                              & "([ДатаСоздания] >=" + IIf(IsNull([fldДатаБазаНачало].Value) = False, Format([fldДатаБазаНачало].Value, "General Number"), Null) & ") AND " _
                              & "([ДатаСоздания] <=" + IIf(IsNull([fldДатаБазаКонец].Value) = False, Format([fldДатаБазаКонец].Value, "General Number"), Null) & ") AND"

Не могу понять одно как справиться с AND. если их внести под скобку в начале каждой строки начиная со второй строки Where, то если нет строки условия, то и AND не будет, но тогда если нет первого условия Where ([Название]), то строка Where начнется сразу с AND, что вызовет ошибку. В таком моем варианте все работает, но при отсутствии каждого условия остается AND, я их убрал после формирования строки циклом, но понимаю, что это корявое решение.
'обрезаем AND в конце строки
For i = 1 To 5
     If Right(strSQL, 4) = " AND" Then strSQL = Left(strSQL, Len(strSQL) - 4)
     If Right(strSQL, 5) = " AND " Then strSQL = Left(strSQL, Len(strSQL) - 5)
     If Right(strSQL, 6) = " AND )" Then strSQL = Left(strSQL, Len(strSQL) - 6)
Next i


Может быть у кого-то есть пример "правильной" реализации таких запросов. Заранее благодарствую
11 фев 19, 08:15    [21806045]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос для формы поиска и обработка логических операторов  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 3947
Ганов Александр
Не могу понять одно как справиться с AND. если их внести под скобку в начале каждой строки начиная со второй строки
делаешь свой построитель условий. Это не сильно сложно.
11 фев 19, 08:30    [21806052]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос для формы поиска и обработка логических операторов  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18462
Ганов Александр
Не могу понять одно как справиться с AND.

Стандартный подход - формируется строка запроса без условий в формате:

SELECT ...
FROM ...
WHERE 1=1

после чего динамически формируемые условия присоединяются к ней в формате

AND (...)

Т.е. итоговый запрос выглядит как

SELECT ...
FROM ...
WHERE 1=1 AND (...) AND (...) ...


И никаких геморроев с обрезкой концевого AND.
11 фев 19, 08:40    [21806055]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос для формы поиска и обработка логических операторов  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4403
Ганов Александр,


я предпочитаю так
s1 = "" 
s3="\#mm\/dd\/yyyy\#"

s2=[fldНазвание].Value & ""
if len(s2) then 
s1=s1 & " and  [Название] like '*" & s2  & "*'"   ''звездочки по потребности
endif

If IsNull([fldДатаЗапускаНачало].Value) = False then
s1=s1 & " and [ДатаЗапуска] >=" &  Format([fldДатаЗапускаНачало].Value, s3)" 
endif

If IsNull([fldДатаЗапускаКонец].Value) = False then
s1=s1 & " and [ДатаЗапуска] <=#" &  Format([fldДатаЗапускаКонец].Value, s3)" 
endif

If IsNull([fldДатаБазаНачало].Value) = False then
s1=s1 & " and [ДатаСоздания] >=#" &  Format([fldДатаБазаНачало].Value, s3)" 
endif

If IsNull([fldДатаБазаКонец].Value) = False then
s1=s1 & " and [ДатаСоздания] <=#" &  Format([fldДатаБазаКонец].Value, s3)" 
endif

if len(s1)=0 then
s2=""
else
s2=" where " & mid(s1,5)
endif
'' итоговая строка
s1=s1 & s2
11 фев 19, 09:08    [21806062]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос для формы поиска и обработка логических операторов  [new]
MrShin
Member

Откуда:
Сообщений: 1197
Можно еще проще:
WHERE True AND...
11 фев 19, 09:09    [21806063]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос для формы поиска и обработка логических операторов  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18462
MrShin, лишний символ...
11 фев 19, 09:24    [21806066]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос для формы поиска и обработка логических операторов  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 131
огромное всем спасибо. принцип понял. книжки книжками, а практические советы дорогого стоят Картинка с другого сайта.
11 фев 19, 09:56    [21806094]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос для формы поиска и обработка логических операторов  [new]
Кривцов Анатолий
Member

Откуда:
Сообщений: 179
"WHERE " & "([Название] like '*" + [fldНазвание].Value + "*') AND "

Здесь,благодаря символу "+" для конкатенации при пустом поле fldНазвание возвращается только "WHERE ", что и требовалось.
& "([ДатаЗапуска] >=" + IIf(IsNull([fldДатаЗапускаНачало].Value) = False, Format([fldДатаЗапускаНачало].Value, "General Number"), Null) & ") AND "
Здесь и в строках ниже при пустом поле возвращается ") AND ".
Если вам нравится баловаться символом "+", то тогда его надо указать и вместо "&", т.е.:
& "([ДатаЗапуска] >=" + IIf(IsNull([fldДатаЗапускаНачало].Value) = False, Format([fldДатаЗапускаНачало].Value, "General Number"), Null) + ") AND "
Тогда при пустом поле вернется Null, т.е. строка выпадает.
11 фев 19, 11:47    [21806201]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос для формы поиска и обработка логических операторов  [new]
__Michelle
Member

Откуда:
Сообщений: 3009
Akina
WHERE 1=1 AND...
MrShin
Можно еще проще:
WHERE True AND...
Akina
лишний символ...

Без лишних символов.
WHERE -1 AND.....
или даже так
WHERE 1 AND.....
(хотя всегда использую True)
11 фев 19, 12:04    [21806220]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос для формы поиска и обработка логических операторов  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 131
Кривцов Анатолий, спасибо за подсказку. единственное. при "+" в остальных строках в первой все равно останется 1шт AND, а так получается что модель работоспособна и по сути надо только в первой строчке резануть AND, либо добавлять его только в том случае если поле первого условия есть какое-либо продолжение. в общем и целом все понял. все предельно просто. Еще раз всем спасибо
11 фев 19, 12:09    [21806231]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос для формы поиска и обработка логических операторов  [new]
alecko
Member

Откуда: Башкирия
Сообщений: 427
Ганов Александр, обычно я делаю так
tt =vbnullstring, str =vbnullstring
for i=0 to x
str=str & tt & .fields(i)
'после первого вхождения в цикл в цикле присваиваю
tt=" AND " 
next
11 фев 19, 12:30    [21806265]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос для формы поиска и обработка логических операторов  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 131
alecko, спасибо. отличный вариант Картинка с другого сайта.
11 фев 19, 12:34    [21806271]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос для формы поиска и обработка логических операторов  [new]
MrShin
Member

Откуда:
Сообщений: 1197
Akina
лишний символ

Зато нет лишней операции, уж не знаю какой там оптимизатор
11 фев 19, 13:42    [21806358]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос для формы поиска и обработка логических операторов  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18462
MrShin
уж не знаю какой там оптимизатор
Как ни странно, но даже убогий оптимизатор Аксесса умеет посчитать константные выражения, не содержащие нескалярных функций, и избавиться от них.
11 фев 19, 15:15    [21806510]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить