Как сделать условие необязательным в FetchXML

#reporting-services #dynamics-crm-2011 #dynamics-crm #dynamics-crm-2013 #fetchxml

#службы отчетов #dynamics-crm-2011 #dynamics-crm #dynamics-crm-2013 #fetchxml

Вопрос:

У меня есть несколько отчетов SQL с очень низкой производительностью, поэтому мы преобразовали их все в FetchXML, но во всех отчетах SQL все условия необязательны, что-то вроде этого:

 SELECT 
  ...
FROM ...
WHERE (@operator          = 'All' OR Operator          = @operator)
  AND (@new_gen_comp_name = 'All' OR new_gen_comp_name = @new_gen_comp_name)
  ...
 

В значениях параметров есть значение, All если пользователь выберет это значение, условие будет проигнорировано, и поэтому он получит все значения из этого поля.

Теперь я хочу сделать это в FetchXML, я попытался поставить два условия с фильтром or между ними, одно для значения, а другое для включения нулевых значений, подобных этому:

 <fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true">
   <entity name="incident"> 
      ...
      ...
      <filter type="and">
         <filter type="and">
           <condition attribute="createdon" operator="on-or-after" value="@StartDate" /> 
           <condition attribute="createdon" operator="on-or-before" value="@EndDate" /> 
         </filter>
         <filter type="or">
           <condition attribute="new_gen_comp_type" operator="in" value="@new_gen_comp_type" /> 
           <condition attribute="new_gen_comp_type" operator="null" /> 
         </filter>
      </filter>

      ...
      ...
  </entity>
</fetch>
 

Это работало нормально, только если пользователь выбирал все значения для параметра @new_gen_comp_type , но проблема в том, что если пользователь выбирает только определенные значения, он также будет включать значения null, а это неправильно.

Итак, есть ли какой-либо способ сделать эти условия необязательными в случае, если пользователь выбирает select all значения параметра, как в SQL?

Комментарии:

1. Вы нашли решение этой проблемы?

2. @MoisesCardenas Да, смотрите Мой ответ ниже.

Ответ №1:

Поскольку вы делаете это в SSRS, у вас нет возможности изменить выборку XML, что вам действительно нужно сделать. (Если пользователь выбирает «ВСЕ», не включайте ограничение на new_gen_comp_type )

Единственный вариант, который я могу придумать, довольно глупый, но он должен работать. Создайте новый атрибут для инцидента new_all , для которого по умолчанию используется значение «ВСЕ», и запустите инструкцию update, чтобы заполнить все существующие инциденты значением «ВСЕ». Затем измените фильтр FetchXML на:

 <filter type="or">
    <condition attribute="new_gen_comp_type" operator="eq" value="@new_gen_comp_type" /> 
    <condition attribute="new_all" operator="eq" value="@new_gen_comp_type" /> 
</filter>
 

Если пользователь выбирает «ВСЕ», второе утверждение будет истинным, и все будет возвращено. Если пользователь выбирает что-то помимо ALL, второй оператор всегда будет false, а первый оператор вернет только то, что соответствует.

Пожалуйста, обратите внимание, что атрибут operator="in" не будет работать с несколькими значениями. Вам нужно создать дочерний тег value для каждого значения…

Из XSD:

Атрибут «значение» используется для всех операторов, которые сравниваются с одним значением (например, eq). Элемент «value» используется для операторов, которые сравниваются с несколькими значениями (например, in). Некоторые операторы не требуют ни атрибута «value», ни элемента «value» (например, null).

Комментарии:

1. Спасибо за ваш ответ, но ALL в значениях параметров нет значения, однако есть флажок select all (поскольку я установил все параметры так, чтобы разрешать несколько значений), если я установил этот флажок, значение параметра становится всеми значениями в нем через запятую, так как я могу узнать, является ли пользовательвыбирает все значения или нет? Я думаю, что могу сравнить количество выбранных значений параметра Parameters!new_gen_comp_type.Value.Count с количеством значений в наборе данных, которые значения параметров заполнены справа?

2. Я попытался сравнить количество выбранных значений параметра со значениями набора данных, чтобы узнать, выбрал ли пользователь все значения или нет, но возникла ошибка, из-за которой я не могу использовать агрегат в вычисляемом поле. Как решить эту проблему, чтобы попробовать ваше решение?? Кроме того, в этом отчете у меня много условий, около 10 условий, нужно ли мне добавлять еще один объект для каждого условия, или этот новый атрибут new_all будет работать нормально и возвращать все значения?

3. Также вы уверены в том, что атрибут operator=»in» не будет работать с несколькими значениями. Потому что у меня все работает нормально, и я проверил его снова, и он работает нормально. И в приведенной вами фразе говорится, что in operator должен нормально работать с несколькими значениями The element "value" is used for operators that compare to multiple values (for example, in).

4. @MahmoudGamal вы описали свой параметр как проверяющий «Все» в своем вопросе, поэтому я предположил, что это то, что было передано. Та же логика, которую я описываю, все равно будет работать, просто вместо значения по умолчанию «Все» по умолчанию используется значение CSV, то есть «A, B, C». С учетом сказанного, в вашем втором комментарии звучит так, будто пользователь может выбрать несколько значений, а не только все, если это правильно, то моя реализация не будет работать.

5. @MahmoudGamal что касается, operator="in" я не знаю, что CRM предполагает, что значение является csv, и выполняет его разделение перед передачей в SQL. Оператор «in» будет нормально работать с несколькими значениями, но каждое значение должно быть в своем собственном <value></value> элементе. Вы не можете передать несколько значений в value="" атрибуте.

Ответ №2:

Я нашел решение для этого, используя фильтры dataset, я удалил все условия из fetchxml (я оставил только те условия, которые не являются необязательными). Затем я сделал все параметры многозначными, если пользователь выберет более одного значения, это сделает параметр необязательным, в противном случае, если он выберет одно значение, он будет выполнять поиск по нему.

Я добавил фильтр для каждого условия, например, если у вас есть условие в выборке xml, подобное этому:

 <condition attribute="attribute1" operator="in" value="@a1" /> 
...
...
 

Затем я добавил фильтр для каждого условия следующим образом:

  • Щелкните правой кнопкой мыши набор данных, из которого считывается таблица.
  • Щелкните свойства.
  • Выберите вкладку фильтры.
  • Нажмите кнопку Добавить.
  • В выражении выберите [attribute1] поле .
  • Для оператора выберите in .
  • Для значения нажмите функциональную кнопку fx и введите следующее выражение =IIf(Parameters!a1.Count>1,Fields!attribute1.Value,Parameters!a1.Value) .

Таким образом, если пользователь выбирает только одно значение для значений параметров, условие будет ложным, тогда поле attribute1 будет сравниваться со значением параметров, поэтому условие будет применено, в противном случае значение поля будет сравниваться с его значением, которое всегда будет истинным, так что условие всегда будет истинными игнорируется.

Проблема с этим решением заключается в том, что пользователь не может выбирать несколько значений и выполнять поиск по ним, оно будет обрабатываться так, как оно выбирает все значения, я попытался преодолеть это с помощью:

  • Проверка, равны ли выбранные значения для значений параметра общему количеству значений набора данных, из которого заполняется параметр, или если он не заполняется из набора данных, сравните итоговые значения с общим количеством всех значений вместо проверки, если количество больше 1,но я не смог этого сделать. Я получил сообщение об ошибке, что я не могу использовать агрегат в выражениях фильтров.
  • Попытка включить значение null в значения параметров (я не мог этого сделать в моем случае, потому что значения параметров были заполнены из набора данных), чтобы я мог проверить, является ли выбранное значение null, а затем игнорировать условие, что-то вроде этого : =IIf(Parameters!a1.value = nothing,Fields!attribute1.Value,Parameters!a1.Value) .

Если вы могли бы выполнить одну из этих работ, то это решение будет работать нормально.

Обратите внимание, что вам может потребоваться использовать Parameters!a1.Label вместо Parameters!a1.Value если у этого поля есть метка attribute1name и значение attribute1 , так работает fetchxml . Поэтому используйте метку параметра, чтобы получить имя для сравнения attribute1name или использовать значение параметра для сравнения attribute1 .

Ответ №3:

Несмотря на предположение, я вижу, что вы пытаетесь создать отчет на основе FetchXML в CRM. В этом случае рекомендуется использовать фильтры CRM по умолчанию. Запрос не требует условия и просто выбирает столбцы.

Это позволит вам иметь необязательные параметры.

[Примечание: фильтры / параметры применимы только к запрашиваемым объектам / связанным объектам]