Crystal сообщает, если оператор пытается включить и исключить одно и то же поле

В подотчете я пытаюсь вернуть «Да» или «Истина» в основной отчет, если существуют оба условия в операторе if. Проблема в том, что отчет оценивает каждую строку, и я хочу, чтобы он искал оба условия во всех строках как группу.

Что я пробовал:

shared stringvar PRODCAT:= if ({OEORDLIN_SQL.prod_cat} in ["TRD","TSI"])
and 
not({OEORDLIN_SQL.prod_cat} in ["TRD","TSI"]) then "Yes" else "No" 

Я добавил формулы для обоих условий A и B и использовал их в формуле, но получаю те же результаты. Он будет оценивать только каждую строку:

WhilePrintingRecords;
shared stringvar PRODCAT:= if {@a} = "Yes" and {@b} = "Yes" then "Yes" else "No"

person user3271285    schedule 04.02.2014    source источник
comment
У меня возникли проблемы с пониманием логики, которую вы ищете в своем коде. Проще говоря, вы хотите, чтобы вложенный отчет возвращал True, если в нем присутствуют и TRD, и TSI?   -  person Ryan    schedule 04.02.2014
comment
Почему бы вам не использовать sql expression в почтовом отчете? Это было бы намного проще.   -  person craig    schedule 04.02.2014
comment
Еще одна проблема: как может `{OEORDLIN_SQL.prod_cat} быть ВХОДОМ и НЕ ВХОДИТЬ в TRD и TSI одновременно?   -  person craig    schedule 04.02.2014
comment
Подотчет проходит нормально. Проблема в том, что формула работает для каждого элемента в отчете. Итак, если есть 3 элемента, я получаю три результата. Мне нужно, чтобы формула работала со всеми элементами в целом и возвращала один результат.   -  person user3271285    schedule 06.02.2014


Ответы (2)


Создайте два поля sql expression:

// {%TRD}
(
  SELECT COUNT(1)
  FROM   OEORDLIN_SQL a
  WHERE  order_id = order.order_id
  AND    prod_cat='TRD'
  GROUP BY order_id
)

// {%TSI}
(
  SELECT COUNT(1)
  FROM   OEORDLIN_SQL b
  WHERE  order_id = order.order_id
  AND    prod_cat='TSI'
  GROUP BY order_id
)

Используйте по мере необходимости:

// {@do something}
If {%TSD}>0 AND {%TSI>0 Then
  ...
Else
 ...
person craig    schedule 04.02.2014
comment
Райан, данные поступают из позиций в заказе. Таким образом, в заказе мне нужно выяснить, есть ли у меня товары как с продкатом TR или TSI, так и с товарами, у которых нет этого продката. пример - пункт 1 prodcat = TRD пункт 2 proccat = ABC. - person user3271285; 04.02.2014
comment
Крейг — каждый элемент возвращается в виде строки. - person user3271285; 04.02.2014

Извините, не понял, что ваша проблема заключалась в вставке поля сводки.

Создайте две числовые функции, isInPRODCAT и isNotInPRODCAT. Вставьте их в раздел сведений вашего отчета.

isInPRODCAT:= if ({OEORDLIN_SQL.prod_cat} in ["TRD","TSI"]) then 1 else 0
isNotInPRODCAT:= if not({OEORDLIN_SQL.prod_cat} in ["TRD","TSI"]) then 1 else 0 

Затем вставьте два сводных поля в нижний колонтитул вашего подотчета. Сделайте их max() из двух функций.

Создайте 2 общие переменные:

    shared numbervar max_isInPRODCAT:= {max_isInPRODCAT}        
    shared numbervar max_isNotInPRODCAT:= {max_isNotInPRODCAT}

затем в основном отчете проверьте, если max_isInPRODCAT = 1 и max_isNotInPRODCAT = 1

ХТН

person Beth    schedule 04.02.2014
comment
Сделал, как вы предложили, но формулы оцениваются на уровне строк, та же проблема, что и раньше. Любые другие идеи? - person user3271285; 04.02.2014
comment
вам нужно выполнить проверку в основном отчете в разделе под разделом сведений, где вычисляется общая переменная. Проверьте возвращаемые значения из подотчетов в основном отчете, чтобы убедиться, что они заданы и переданы правильно. - person Beth; 05.02.2014
comment
Подотчет проходит нормально. Проблема в том, что формула работает для каждого элемента в отчете. Итак, если есть 3 элемента, я получаю три результата. Мне нужно, чтобы формула работала со всеми элементами в целом и возвращала один результат. - person user3271285; 05.02.2014