Страница 1 из 1
Аргументы отчета и фильтр - И на ИЛИ (ИЛИ-НЕ, НЕ-ИЛИ)???
Добавлено: 13 ноя 2008, 10:22
Александр
не подскажите, а то уже мозг закипает
есть отчет есть куча аргументов объединённых в фильтре по И (And)
ну например
Код: Выделить всё
(if(status='',1,if(status = clt_status,1,0))>0 )
and
(period>= wait)
and
(prod_all >= count )
and
(if(trim(type_b)='',1,if(type_b=mid( prod_type ,5,2),1,0))>0)
and
(if(trim(type)='',1,if(type=mid( prod_type ,10,2),1,0))>0)
and
(if(trim( product )='',1,pos( upper( prod_name ), upper( product ) ,1))>0)
and
(if(trim( oblast )='' ,1,pos(upper( cnt_oblast ), upper( oblast) ,1)) >0)
and
(if(trim( gorod )='',1,pos(upper( cnt_gorod ), upper( gorod ),1))>0)
последние два аргумента oblast (область) и gorod (город) также идут по И а мне нужно использовать их по ИЛИ (or) подцепив к верхним по И (and)
говоря по русски - мне нужно чтобы область и город обрабатывались вместе независимо от того заполнен один или другой аргумент
как это сделать - вообше не понимаю
если бы можно было в фильтре написать такую конструкцию
Код: Выделить всё
...
and
if(
case (if(trim( oblast )='' and trim( gorod )='',0,
if(trim( oblast )<>'' and trim( gorod )='',1,
if(trim( oblast )='' and trim( gorod )<>'',3,
if(trim( oblast )<>'' and trim( gorod )<4>0,1,0)
when 0 then if(pos(upper( cnt_oblast ), upper( oblast) ,1)) >0,1,0
when 1 ....
when 2 ....
when 3 .... )>0
т.е. обработать любые комбинации этих двух аргументов...
чувствую что пошёл не туда - подскажите более простой синтаксис объединения по ИЛИ (or)
типа если сделать просто
Код: Выделить всё
...
and
(if(
if(trim( oblast )='' ,1,pos(upper( cnt_oblast ), upper( oblast) ,1)) +
if(trim( gorod )='',1,pos(upper( cnt_gorod ), upper( gorod ),1))>0)
не работает - т.к. если один из аргументов пустой - всегда идет ИСТИНА - а это в моем случае ЛОЖЬ
выручайте товарисча

Добавлено: 13 ноя 2008, 15:53
Юрий
Если я правильно понял вопрос нужно в конструкцию
... and .... and вставить группу с or
Это делается так ... and ... and ( ... or ...) тогда сначала просчитается
or и результат присоединится к и.
Арифметические скобки указывающие приоритет операции.
Добавлено: 13 ноя 2008, 16:05
Александр
понятно что or и скобки - просто не понятно как это записать чтобы получит ИСТИНУ или ЛОЖЬ для двух условий сразу
вот так я получаю для одного поля
Код: Выделить всё
(if(trim( oblast )='' ,1,pos(upper( cnt_oblast ), upper( oblast) ,1))>0
т.е. если аргумент пустой я ставлю единицу=ИСТИНА если не пустой то проверяю на вхождение и опять же смотрю если нет вхождений то ноль=ЛОЖЬ иначе если есть то ИСТИНА
а вот как тоже самое записать по И для двух аргументов? мне просто нужен пример, может чтобы получить Истину не обязательно добиваться нуля или единицы
потому что вот этот код
Код: Выделить всё
...
and
(if(trim( oblast )='' ,1,pos(upper( cnt_oblast ), upper( oblast) ,1))>0 or
if(trim( gorod )='',1,pos(upper( cnt_gorod ), upper( gorod ),1))>0))
немного не то....
сработает конечно
во я понял что мне нужно!!!!
смотри вот сейчас - если первый аргумент (область) пустой а во втором забит город - то будут выведены все без исключения области и нужные города
а мне нужно чтобы прошли только города которые совпали с аргументом (области исключить вообще поскольку они не заданы)
т.е.
1. первый аргумент задан второй нет = фильтруем только по первому
2. первый аргумент нет второй задан = фильтруем только по второму
3. первый аргумент задан второй задан = фильтруем по двум по ИЛИ
4. первый аргумент нет второй нет = не учитываем эту секцию фильтра вообще
вот как такое сделать?
Добавлено: 13 ноя 2008, 22:36
Старик Крупский
Вот трансляция того, о чем говорил Юрий
(if(status='',1,if(status = clt_status,1,0))>0 )
and
(period>= wait)
and
(prod_all >= count )
and
(if(trim(type_b)='',1,if(type_b=mid( prod_type ,5,2),1,0))>0)
and
(if(trim(type)='',1,if(type=mid( prod_type ,10,2),1,0))>0)
and
(if(trim( product )='',1,pos( upper( prod_name ), upper( product ) ,1))>0)
and
((if(trim( oblast )='' ,1,pos(upper( cnt_oblast ), upper( oblast) ,1)) >0)
OR
(if(trim( gorod )='',1,pos(upper( cnt_gorod ), upper( gorod ),1))>0))
А сплюсовывать твои последние строчки тоже можно, только их нужно проверить на Null.
If (IsNull (oblast), '' , oblast )
Добавлено: 14 ноя 2008, 07:25
Александр
Ну что-ж такое то!! или я на этой работе совсем перестал уметь выражать свои мысли?

скорее просто растерял их вообще
вот эта строчка
Код: Выделить всё
((if(trim( oblast )='' ,1,pos(upper( cnt_oblast ), upper( oblast) ,1)) >0)
OR
(if(trim( gorod )='',1,pos(upper( cnt_gorod ), upper( gorod ),1))>0))
сработает следующим образом
если область не задана - вывести строки со всеми областями
+
если город задан - вывести строки содержащие данные города
но дело то все в том

что мне то в этой секции нужно несколько иное
если область не задана - не обрабатывать это условие (как будто нет его)
+
если город задан - вывести строки содержащие только эти города
все отличие в том что первый вариант выдает то что его не спрашивают как бы

(ужас, не знаю как по другому сказать то.... хотя - нужно условие исключающее аргумент из секции ИЛИ...

- все, дальше молчу)
как вот такое то условие записать? (и для остальных 3х комбинаций тоже)

понимаю что вопрос уже сместился от заданной темы в сторону
Добавлено: 14 ноя 2008, 08:58
Anderyt
хм.. эти блоки должны работать правильно
Код: Выделить всё
(if(trim( oblast )='' ,1,pos(upper( cnt_oblast ), upper( oblast) ,1)) >0)
and
(if(trim( gorod )='',1,pos(upper( cnt_gorod ), upper( gorod ),1))>0)
такая конструкция как раз закрывает глаза на неуказанный аргумент и как бы отключает соответствующий блок. но все остальные блоки все равно работают по И.
и что, это все работает не так, как нужно?
хм.. а можно на каком нить примере пояснить?.. на пальцах..
Добавлено: 14 ноя 2008, 09:16
Александр
может и я пойму наконец что хочу

на пальцах вот смотри
4 строки
Код: Выделить всё
область город
1. московская область --
2. -- москва
3. липецкая область --
4. московская область москва
если условие по И
Код: Выделить всё
(if(trim( oblast )='' ,1,pos(upper( cnt_oblast ), upper( oblast) ,1)) >0)
and
(if(trim( gorod )='',1,pos(upper( cnt_gorod ), upper( gorod ),1))>0)
вариант 1 область не задана - город - москва
по первому условию - получим 1,2,3,4
по второму - 2,4
т.е. всю таблицу
а мне при этих условиях нужно получить только 2,4
Добавлено: 14 ноя 2008, 09:42
Anderyt
вариант 1 область не задана - город - москва
по первому условию - получим 1,2,3,4
по второму - 2,4
т.е. всю таблицу
а мне при этих условиях нужно получить только 2,4
э-э-э..
а сейчас что, возвращается все 4 строки????
там же И..
Добавлено: 14 ноя 2008, 09:52
Александр
Добавлено: 14 ноя 2008, 10:15
Anderyt
дак значит, фильтр работает так, как хотелось?

ну самом деле конструкции такие должны работать. у нас используются похожие. блок как бы исключается из фильтра, если аргумент не задан, что собственно и нужно сделать, если в общих чертах сформулировать эту задачу
