【问题标题】:How to Make a Condition Optional in FetchXML如何在 FetchXML 中使条件可选
【发布时间】:2014-08-09 15:37:26
【问题描述】:

我有一些性能很慢的 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 的所有值时才能正常工作,但问题是如果用户只选择特定值,它也会包含空值,这是错误的。

那么,如果用户选择select all 作为 SQL 中的参数值,是否有任何方法可以使这些条件成为可选?

【问题讨论】:

  • 你找到解决这个问题的方法了吗?
  • @MoisesCardenas 是的,请参阅下面的答案。

标签: reporting-services dynamics-crm-2011 dynamics-crm dynamics-crm-2013 fetchxml


【解决方案1】:

由于您在 SSRS 中执行此操作,因此您无法更改 Fetch XML,而这是您真正需要做的。 (如果用户选择“ALL”,则不要在new_gen_comp_type 上包含约束)

我能想到的唯一选择有点愚蠢,但应该可以。在默认为“ALL”的事件new_all 上创建一个新属性,并运行更新语句将所有现有事件填充为“ALL”。然后将您的 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”,则第二个语句为真,所有内容都将返回。如果用户选择了 ALL 之外的其他内容,则第二个语句将始终为 false,而第一个语句将只返回匹配的内容。

请注意,operator="in" 属性不适用于多个值。您需要为每个值创建一个值子标签...

来自 XSD:

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

【讨论】:

  • 感谢您的回复,但参数值中没有ALL 值,但是有一个复选框select all(因为我将所有参数设置为允许多个值),如果我选择该复选框参数的值变成了逗号分隔的所有值,那么我怎么知道用户是否选择了所有值?我想我可以将参数Parameters!new_gen_comp_type.Value.Count 的选定值的计数与填充参数值的数据集中的值的计数进行比较?
  • 我尝试将参数的选择值的计数与数据集的值进行比较,以了解用户是否选择了所有值,但出现我无法使用的错误计算字段中的聚合。如何解决这个问题来尝试你的解决方案?此外,我在该报告中有很多条件,大约 10 个条件,我是否需要为每个条件添加一个实体,或者这个新属性 new_all 可以正常工作并返回所有值?
  • 您还确定属性 operator="in" 不适用于多个值。因为它对我来说工作正常,我再次检查它并且工作正常。你引用的那句话说in 运算符应该可以很好地处理多个值The element "value" is used for operators that compare to multiple values (for example, in).
  • @MahmoudGamal 您将参数描述为检查问题中的“全部”,所以我认为这是传入的内容。我描述的相同逻辑仍然有效,而不是默认值“全部”默认为您的 CSV,即“A、B、C”。话虽如此,在您的第二条评论中,听起来用户可以选择多个值,而不仅仅是全部,如果这是正确的,那么我的实现将无法正常工作。
  • @MahmoudGamal 就operator="in" 而言,我不知道 CRM 假定该值是 csv 并在将其传递给 SQL 之前对其执行拆分。 "in" 运算符可以很好地处理多个值,但每个值都必须在它自己的 &lt;value&gt;&lt;/value&gt; 元素中。您不能在 value="" 属性中传递多个值。
【解决方案2】:

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

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

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

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

  • 右键单击要读取表的数据集。
  • 点击属性。
  • 选择过滤器选项卡。
  • 点击添加按钮。
  • 在表达式中选择字段[attribute1]
  • 对于运营商,请选择in
  • 对于值,点击功能按钮fx,输入以下表达式=IIf(Parameters!a1.Count&gt;1,Fields!attribute1.Value,Parameters!a1.Value)

因此,如果用户只为参数值选择一个值,则条件将为 false,则字段 attribute1 将与参数值进行比较,因此将应用条件,否则字段值将与其参数值进行比较值,它始终为真,因此条件将始终为真并被忽略。

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

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

  • 试图在参数值中包含一个空值(在我的情况下我不能这样做,因为参数值是从数据集中填充的),以便我可以检查所选值是否为空然后忽略条件,类似这样:=IIf(Parameters!a1.value = nothing,Fields!attribute1.Value,Parameters!a1.Value)

如果您可以完成其中一项工作,那么此解决方案将可以正常工作。

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      • 1970-01-01
      • 2019-04-13
      • 2021-09-22
      • 1970-01-01
      • 2013-05-19
      相关资源
      最近更新 更多