Аргументы отчета и фильтр - И на ИЛИ (ИЛИ-НЕ, НЕ-ИЛИ)???

Здесь обсуждаем систему TDM/PDM/Workflow Lotsia PDM PLUS (PartY PLUS).
Ответить
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Аргументы отчета и фильтр - И на ИЛИ (ИЛИ-НЕ, НЕ-ИЛИ)???

Сообщение Александр »

не подскажите, а то уже мозг закипает :wink:
есть отчет есть куча аргументов объединённых в фильтре по И (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) :wink:
говоря по русски - мне нужно чтобы область и город обрабатывались вместе независимо от того заполнен один или другой аргумент
как это сделать - вообше не понимаю
если бы можно было в фильтре написать такую конструкцию

Код: Выделить всё

...
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)
не работает - т.к. если один из аргументов пустой - всегда идет ИСТИНА - а это в моем случае ЛОЖЬ

выручайте товарисча :wink:
Последний раз редактировалось Александр 14 ноя 2008, 07:37, всего редактировалось 1 раз.

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Юрий
Активный участник
Сообщения: 239
Зарегистрирован: 13 янв 2005, 14:30
Используемое ПО: Lotsia PDM PLUS LT
Откуда: Украина, Донецк
Контактная информация:

Сообщение Юрий »

Если я правильно понял вопрос нужно в конструкцию
... and .... and вставить группу с or

Это делается так ... and ... and ( ... or ...) тогда сначала просчитается
or и результат присоединится к и.

Арифметические скобки указывающие приоритет операции.
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

понятно что or и скобки - просто не понятно как это записать чтобы получит ИСТИНУ или ЛОЖЬ для двух условий сразу :wink:

вот так я получаю для одного поля

Код: Выделить всё

(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. первый аргумент нет второй нет = не учитываем эту секцию фильтра вообще

вот как такое сделать?

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Старик Крупский
Активный участник
Сообщения: 803
Зарегистрирован: 27 июл 2006, 22:17
Откуда: Москва

Сообщение Старик Крупский »

Вот трансляция того, о чем говорил Юрий

(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 )
"Лучше меньше, да лучше" (C)
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

Ну что-ж такое то!! или я на этой работе совсем перестал уметь выражать свои мысли? :wink: :wink: скорее просто растерял их вообще :wink:

вот эта строчка

Код: Выделить всё

((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)) 
сработает следующим образом
если область не задана - вывести строки со всеми областями
+
если город задан - вывести строки содержащие данные города


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


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

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

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Сообщение 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)
такая конструкция как раз закрывает глаза на неуказанный аргумент и как бы отключает соответствующий блок. но все остальные блоки все равно работают по И.
и что, это все работает не так, как нужно?
хм.. а можно на каком нить примере пояснить?.. на пальцах..
лучше день потерять, потом за пять минут долететь!
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

может и я пойму наконец что хочу :wink:
на пальцах вот смотри
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

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Сообщение Anderyt »

вариант 1 область не задана - город - москва
по первому условию - получим 1,2,3,4
по второму - 2,4
т.е. всю таблицу

а мне при этих условиях нужно получить только 2,4
э-э-э..
а сейчас что, возвращается все 4 строки????
там же И..
лучше день потерять, потом за пять минут долететь!
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

Андрюха скажи - а не было ли вчера затмения на солнце???? :wink: :wink: :wink: :wink: :wink:
пойду я лучше в театр работать :wink:
конечно все работает - у меня еще сотня отчетов с такими же фильтрами - но чтото смущает - вот только понять не могу что...

ладно закрыли тему :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Сообщение Anderyt »

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