Reporting services 如何在FetchXML中使条件成为可选条件

Reporting services 如何在FetchXML中使条件成为可选条件,reporting-services,dynamics-crm-2011,dynamics-crm,dynamics-crm-2013,fetchxml,Reporting Services,Dynamics Crm 2011,Dynamics Crm,Dynamics Crm 2013,Fetchxml,我有一些性能非常慢的SQL报告,因此我们将它们全部转换为FetchXML,但所有SQL报告都具有所有可选条件,如下所示: <condition attribute="attribute1" operator="in" value="@a1" /> ... ... 选择 ... 从…起 其中(@operator='All'或operator=@operator) 和(@new_gen_comp_name='All'或new_gen_comp_name=@new_gen_comp_n

我有一些性能非常慢的SQL报告,因此我们将它们全部转换为FetchXML,但所有SQL报告都具有所有可选条件,如下所示:

<condition attribute="attribute1" operator="in" value="@a1" /> 
...
...
选择
...
从…起
其中(@operator='All'或operator=@operator)
和(@new_gen_comp_name='All'或new_gen_comp_name=@new_gen_comp_name)
...
在参数值中,有一个值
All
,如果用户选择该值,该条件将被忽略,因此它将从该字段获取所有值

现在我想在FetchXML中实现这一点,我尝试在它们之间放置两个条件,一个用于值,另一个用于包含空值,如下所示:

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

...
...
...
...
只有当用户选择参数
@new\u gen\u comp\u type
的所有值时,这才有效,但问题是如果用户仅选择特定值,它也将包括空值,这是错误的


那么,如果用户为参数值选择了
select all
,比如SQL中的参数值,那么有没有办法使这些条件成为可选的呢?

因为您是在SSRS中执行此操作的,所以您没有一个选项来更改提取XML,而这正是您真正需要做的。(如果用户选择“全部”,则不要在
新建\u gen\u comp\u type
上包含约束)

我能想到的唯一选择是有点愚蠢,但它应该是有效的。在事件
new\u all
上创建一个默认为“all”的新属性,并运行update语句将所有现有事件填充为“all”。然后将FetchXml筛选器更改为:


如果用户选择“ALL”,则第二条语句将为true,并返回所有内容。如果用户选择ALL之外的内容,则第二条语句将始终为false,第一条语句将只返回匹配的内容

请注意,属性
operator=“in”
不能用于多个值。您需要为每个值创建一个值子标记

从XSD:

属性“value”用于与 单个值(例如,eq)。 元素“value”用于与多个值(例如,in)进行比较的运算符。 有些运算符既不需要属性“value”,也不需要元素“value”(例如,null)


我使用数据集过滤器找到了解决方案,从fetchxml中删除了所有条件(我只保留了那些非可选的条件)。然后,我将所有参数设置为多值,如果用户选择多个值,则会将参数设置为可选,否则,如果用户选择一个值,则会使用它进行搜索

我为每个条件添加了一个过滤器,例如,如果在获取xml中有这样一个条件:

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

...
...
然后,我为每个条件添加了一个过滤器,如下所示:

  • 右键单击要从中读取表的数据集
  • 单击属性
  • 选择过滤器选项卡
  • 单击添加按钮
  • 在表达式中选择fild
    [attribute1]
  • 对于操作员,在中选择
  • 对于值,单击功能按钮
    fx
    ,然后输入以下表达式
    =IIf(参数!a1.Count>1,字段!attribute1.value,参数!a1.value)
因此,如果用户仅为参数值选择一个值,则条件将为false,然后将字段
attribute1
与参数值进行比较,因此将应用该条件,否则将将字段值与其值进行比较,这始终为true,这样,条件将始终为真并被忽略

该解决方案的问题在于,用户无法选择多个值并使用它们进行搜索,它将被视为选择了所有值,我试图通过以下方式克服此问题:

  • 检查参数值的选定值是否等于从中填充参数的数据集的总值的计数,或者如果未从数据集填充,则将总值与所有值的总值进行比较,而不是检查计数是否大于1,但我无法做到这一点。我遇到一个错误,无法在筛选器表达式中使用聚合

  • 试图在参数值中包含null值(在我的例子中,我无法这样做,因为参数值是从数据集填充的),这样我可以检查所选值是否为null,然后忽略该条件,如下所示:
    =IIf(parameters!a1.value=nothing,Fields!attribute1.value,parameters!a1.value)

如果你能使其中一个工作,那么这个解决方案将工作良好


请注意,您可能需要使用
参数!a1.标记
而不是
参数!a1.Value
如果该字段有一个标签
attribute1name
和一个值
attribute1
,这就是fetchxml的工作方式。因此,请使用参数标签获取名称以将其与
attribute1name
进行比较,或者使用参数值将其与
attribute1

进行比较。虽然这是一个假设,但我发现您正在尝试在CRM中创建基于FetchXML的报告。 建议在这种情况下使用。 查询不需要条件,只需要选择列

这将允许您拥有可选参数


[注意:过滤器/参数仅适用于被查询的实体/相关实体]

感谢您的回复,但是参数值中没有
ALL
值,但是有一个复选框
select ALL
(因为我将所有参数设置为允许多个值),如果我选中该复选框,则参数的值为