我有一些性能非常慢的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
的所有值时才能正常工作,但问题是如果用户只选择特定值,它也会包含空值,这是错误的。
那么,如果用户在SQL中选择select all
作为参数值,有没有办法让这些条件成为可选项?
答案 0 :(得分:4)
由于您在SSRS中执行此操作,因此您无法选择更改您真正需要执行的Fetch XML。 (如果用户选择&#34;全部&#34;,则不要在new_gen_comp_type
上包含约束
我能想到的唯一选择是愚蠢但它应该有用。在事件new_all
上创建一个默认为&#34; ALL&#34;的新属性,并运行更新语句以将所有现有事件填充到&#34; ALL&#34;。然后将您的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>
如果用户选择&#34; ALL&#34;第二个陈述是真的,一切都将被退回。如果用户选择除ALL之外的其他内容,则第二个语句将始终为false,并且第一个语句将仅返回匹配的内容。
请注意,属性operator="in"
不适用于多个值。您需要为每个值创建一个值子标记...
来自XSD:
属性&#34;值&#34;用于与a比较的所有运算符 单值(例如,eq)。 元素&#34;值&#34;用于与多个值进行比较的运算符(例如,in)。 有些运营商既不需要属性&#34;值&#34;或元素&#34;值&#34; (例如,null)。
答案 1 :(得分:4)
我使用数据集过滤器找到了解决方案,我从fetchxml中删除了所有条件(我只留下那些不是可选的条件)。然后我将所有参数设置为多值,如果用户选择多于一个值,它将使参数成为可选参数,否则如果他选择一个值,它将使用它进行搜索。
我为每个条件添加了一个过滤器,例如,如果你在fetch xml中有一个条件,就像这样:
<condition attribute="attribute1" operator="in" value="@a1" />
...
...
然后我为每个条件添加了一个过滤器,如下所示:
[attribute1]
。in
。fx
并输入以下表达式=IIf(Parameters!a1.Count>1,Fields!attribute1.Value,Parameters!a1.Value)
。因此,如果用户仅为参数值选择一个值,则条件将为false,然后将字段attribute1
与参数值进行比较,因此将应用条件,否则将比较字段值它的值始终为真,因此条件将始终为真并被忽略。
该解决方案的问题在于,用户无法选择多个值并使用它们进行搜索,因为它会选择所有值,因此我会尝试通过以下方式解决此问题:
检查参数值的选定值是否等于填充参数的数据集总值的计数,或者是否未从数据集填充,将总值与总数进行比较计算所有值,而不是检查计数是否大于1,但我无法做到这一点。我收到一个错误,我无法在过滤器表达式中使用聚合。
尝试在参数值中包含空值(在我的情况下我不能这样做,因为参数值是从数据集填充的),因此我可以检查所选值是否为null然后忽略条件,像这样:=IIf(Parameters!a1.value = nothing,Fields!attribute1.Value,Parameters!a1.Value)
。
如果您可以制作其中一个作品,那么此解决方案将正常工作。
请注意,如果该字段具有标签Parameters!a1.Label
和值Parameters!a1.Value
,则可能需要使用attribute1name
而不是attribute1
,这是fetchxml的工作方式。因此,请使用参数标签获取名称以将其与attribute1name
进行比较,或使用参数值将其与attribute1
进行比较。
答案 2 :(得分:0)
虽然这是一个假设,但我发现您正在CRM中尝试基于FetchXML的报告。 建议在这种情况下使用CRM default filters。 查询不需要任何条件,只需选择列。
这将允许您拥有可选参数。
[注意:过滤器/参数仅适用于被查询的实体/相关实体]