如何在FetchXML中创建条件可选

时间:2014-06-19 07:15:09

标签: reporting-services 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的所有值时才能正常工作,但问题是如果用户只选择特定值,它也会包含空值,这是错误的。

那么,如果用户在SQL中选择select all作为参数值,有没有办法让这些条件成为可选项?

3 个答案:

答案 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" /> 
...
...

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

  • 右键单击表正在读取的数据集。
  • 点击属性。
  • 选择过滤器标签。
  • 单击“添加”按钮。
  • 在表达式中选择fild [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。 查询不需要任何条件,只需选择列。

这将允许您拥有可选参数。

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