Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / SQL-запрос для формы поиска и обработка логических операторов / 14 сообщений из 14, страница 1 из 1
11.02.2019, 08:15
    #39771998
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос для формы поиска и обработка логических операторов
авторГанов Александр (перенесено отсюда )
как вариант использовать "+", который превратит отсутствующий параметр в "нулевую строку", в том случае если какой-то параметр запроса не был использован пользователем
разобрался с "+".

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

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
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, я их убрал после формирования строки циклом, но понимаю, что это корявое решение.
Код: vbnet
1.
2.
3.
4.
5.
6.
'обрезаем 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



Может быть у кого-то есть пример "правильной" реализации таких запросов. Заранее благодарствую
...
Рейтинг: 0 / 0
11.02.2019, 08:30
    #39772004
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос для формы поиска и обработка логических операторов
Ганов АлександрНе могу понять одно как справиться с AND. если их внести под скобку в начале каждой строки начиная со второй строки делаешь свой построитель условий. Это не сильно сложно.
...
Рейтинг: 0 / 0
11.02.2019, 08:40
    #39772006
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос для формы поиска и обработка логических операторов
Ганов АлександрНе могу понять одно как справиться с AND.
Стандартный подход - формируется строка запроса без условий в формате:

Код: sql
1.
2.
3.
SELECT ...
FROM ...
WHERE 1=1


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

Код: sql
1.
AND (...)


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

Код: sql
1.
2.
3.
SELECT ...
FROM ...
WHERE 1=1 AND (...) AND (...) ...



И никаких геморроев с обрезкой концевого AND.
...
Рейтинг: 0 / 0
11.02.2019, 09:08
    #39772009
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос для формы поиска и обработка логических операторов
Ганов Александр,


я предпочитаю так
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
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
...
Рейтинг: 0 / 0
11.02.2019, 09:09
    #39772010
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос для формы поиска и обработка логических операторов
Можно еще проще:
Код: sql
1.
WHERE True AND...
...
Рейтинг: 0 / 0
11.02.2019, 09:24
    #39772013
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос для формы поиска и обработка логических операторов
MrShin, лишний символ...
...
Рейтинг: 0 / 0
11.02.2019, 09:56
    #39772029
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос для формы поиска и обработка логических операторов
огромное всем спасибо. принцип понял. книжки книжками, а практические советы дорогого стоят
...
Рейтинг: 0 / 0
11.02.2019, 11:47
    #39772100
SQL-запрос для формы поиска и обработка логических операторов
Код: vbnet
1.
"WHERE " & "([Название] like '*" + [fldНазвание].Value + "*') AND "


Здесь,благодаря символу "+" для конкатенации при пустом поле fldНазвание возвращается только "WHERE ", что и требовалось.
Код: vbnet
1.
& "([ДатаЗапуска] >=" + IIf(IsNull([fldДатаЗапускаНачало].Value) = False, Format([fldДатаЗапускаНачало].Value, "General Number"), Null) & ") AND "

Здесь и в строках ниже при пустом поле возвращается ") AND ".
Если вам нравится баловаться символом "+", то тогда его надо указать и вместо "&", т.е.:
Код: vbnet
1.
& "([ДатаЗапуска] >=" + IIf(IsNull([fldДатаЗапускаНачало].Value) = False, Format([fldДатаЗапускаНачало].Value, "General Number"), Null) + ") AND "

Тогда при пустом поле вернется Null, т.е. строка выпадает.
...
Рейтинг: 0 / 0
11.02.2019, 12:04
    #39772116
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос для формы поиска и обработка логических операторов
Akina
Код: sql
1.
WHERE 1=1 AND...

MrShinМожно еще проще:
Код: sql
1.
WHERE True AND...

Akinaлишний символ...
Без лишних символов.
Код: sql
1.
WHERE -1 AND.....

или даже так
Код: sql
1.
WHERE 1 AND.....

(хотя всегда использую True)
...
Рейтинг: 0 / 0
11.02.2019, 12:09
    #39772126
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос для формы поиска и обработка логических операторов
Кривцов Анатолий, спасибо за подсказку. единственное. при "+" в остальных строках в первой все равно останется 1шт AND , а так получается что модель работоспособна и по сути надо только в первой строчке резануть AND , либо добавлять его только в том случае если поле первого условия есть какое-либо продолжение. в общем и целом все понял. все предельно просто. Еще раз всем спасибо
...
Рейтинг: 0 / 0
11.02.2019, 12:30
    #39772152
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос для формы поиска и обработка логических операторов
Ганов Александр, обычно я делаю так
Код: vbnet
1.
2.
3.
4.
5.
6.
tt =vbnullstring, str =vbnullstring
for i=0 to x
str=str & tt & .fields(i)
'после первого вхождения в цикл в цикле присваиваю
tt=" AND " 
next
...
Рейтинг: 0 / 0
11.02.2019, 12:34
    #39772155
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос для формы поиска и обработка логических операторов
alecko, спасибо. отличный вариант
...
Рейтинг: 0 / 0
11.02.2019, 13:42
    #39772212
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос для формы поиска и обработка логических операторов
Akinaлишний символ
Зато нет лишней операции, уж не знаю какой там оптимизатор
...
Рейтинг: 0 / 0
11.02.2019, 15:15
    #39772296
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос для формы поиска и обработка логических операторов
MrShinуж не знаю какой там оптимизаторКак ни странно, но даже убогий оптимизатор Аксесса умеет посчитать константные выражения, не содержащие нескалярных функций, и избавиться от них.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / SQL-запрос для формы поиска и обработка логических операторов / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]