#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 по умолчанию. Запрос не требует условия и просто выбирает столбцы.
Это позволит вам иметь необязательные параметры.
[Примечание: фильтры / параметры применимы только к запрашиваемым объектам / связанным объектам]