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

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

Код: 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
SQL-запрос для формы поиска и обработка логических операторов
    #39772004
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганов АлександрНе могу понять одно как справиться с AND. если их внести под скобку в начале каждой строки начиная со второй строки делаешь свой построитель условий. Это не сильно сложно.
...
Рейтинг: 0 / 0
SQL-запрос для формы поиска и обработка логических операторов
    #39772006
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганов АлександрНе могу понять одно как справиться с 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
SQL-запрос для формы поиска и обработка логических операторов
    #39772009
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганов Александр,


я предпочитаю так
Код: 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
SQL-запрос для формы поиска и обработка логических операторов
    #39772010
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще проще:
Код: sql
1.
WHERE True AND...
...
Рейтинг: 0 / 0
SQL-запрос для формы поиска и обработка логических операторов
    #39772013
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin, лишний символ...
...
Рейтинг: 0 / 0
SQL-запрос для формы поиска и обработка логических операторов
    #39772029
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
огромное всем спасибо. принцип понял. книжки книжками, а практические советы дорогого стоят
...
Рейтинг: 0 / 0
SQL-запрос для формы поиска и обработка логических операторов
    #39772100
Код: 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
SQL-запрос для формы поиска и обработка логических операторов
    #39772116
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL-запрос для формы поиска и обработка логических операторов
    #39772126
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кривцов Анатолий, спасибо за подсказку. единственное. при "+" в остальных строках в первой все равно останется 1шт AND , а так получается что модель работоспособна и по сути надо только в первой строчке резануть AND , либо добавлять его только в том случае если поле первого условия есть какое-либо продолжение. в общем и целом все понял. все предельно просто. Еще раз всем спасибо
...
Рейтинг: 0 / 0
SQL-запрос для формы поиска и обработка логических операторов
    #39772152
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганов Александр, обычно я делаю так
Код: 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
SQL-запрос для формы поиска и обработка логических операторов
    #39772155
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecko, спасибо. отличный вариант
...
Рейтинг: 0 / 0
SQL-запрос для формы поиска и обработка логических операторов
    #39772212
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinaлишний символ
Зато нет лишней операции, уж не знаю какой там оптимизатор
...
Рейтинг: 0 / 0
SQL-запрос для формы поиска и обработка логических операторов
    #39772296
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShinуж не знаю какой там оптимизаторКак ни странно, но даже убогий оптимизатор Аксесса умеет посчитать константные выражения, не содержащие нескалярных функций, и избавиться от них.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / SQL-запрос для формы поиска и обработка логических операторов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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