【问题标题】:Advanced Find - combine related entitie with OR高级查找 - 将相关实体与 OR 组合
【发布时间】:2013-08-02 11:10:40
【问题描述】:

有没有办法创建该查询?

我需要来自 Adress 和 Contact Adress 的数据,通常我可以通过 Combine OR 组合它们,但在这种情况下不是。

我想我必须用PreExecute() 方法编写新插件,获取我的查询,解析数据,然后手动获取相等的地址或者还有其他方法吗?

【问题讨论】:

  • 您是尝试创建视图,还是尝试通过 SDK 访问数据?
  • 没关系。我只需要在视图中向用户显示数据。我对系统代表开发人员的可能性感兴趣。并发现唯一的办法就是写一个插件。

标签: dynamics-crm-2011 dynamics-crm


【解决方案1】:

我不知道有什么方法可以做到以上几点。

我不会写一个插件而是做一个报告。

我能想到的最简单的方法是在没有过滤器的情况下执行 fetchXML。

<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true">
  <entity name="account">
    <attribute name="name" />
    <attribute name="primarycontactid" />
    <attribute name="telephone1" />
    <attribute name="accountid" />
    <attribute name="address1_city" />
    <order attribute="name" descending="false" />
    <link-entity name="contact" from="parentcustomerid" to="accountid" alias="ac">
        <attribute name="address1_city" />
    </link-entity>
  </entity>
</fetch>

然后使用

切换报告中行的可见性
=Fields!address1_city.Value="Sydney" Or Fields!ac_address1_city.Value="Sydney"

显然你可以用参数替换 Sydney

【讨论】:

  • 我需要为实体视图之一制作它。所以,正如我所说,你提出了很好的想法,但不适合我。是吗?
  • 更正以上内容对实体视图没有帮助。对不起。
【解决方案2】:

简而言之,没有办法通过高级查找来完成您所要求的事情。

您提出的示例查询只会向您显示关联联系人具有地址匹配的帐户(以及显然具有地址匹配的帐户)。在高级查找中关联另一个实体后,您将只能看到具有关联记录的父级 - 无法执行(有效的)外部连接。

您唯一的选择实际上是在 Silverlight 或 HTML 中构建一些东西并将其添加为网络资源 - 一旦进入该代码,您几乎可以显示任何您想要的东西。正如其他人所建议的,这在报告中是可能的。

【讨论】:

  • 编程中没有什么是不可能的。总有解决方法。
【解决方案3】:

我解决了这个问题。

  • 使用Execute() 方法和一些方法创建预验证插件 数据解析方法。
  • 在实体视图中添加一些带有GUID 的字段。
  • 如果插件在您的视图中找到了 guid,它将为您的 fetchxml 查询 实体和第二个查询实体 else 将显示默认视图。
  • 分析您希望向用户显示的数据。
  • 注册您的插件。
  • 利润。

PS 我会在重构和客户批准后的一两天内添加源代码。

编辑:

首先 - 你需要创建新的GUID 并添加字符串字段以使用该 guid 进行查看(最好对用户隐藏它)。 使用RetrieveMultiple 操作和Post 验证创建插件(在Pre 操作中您可能会丢失更改)

在插件中:主要方法 RetrieveMultiple 将从那里获取上下文和服务,然后您需要获取 fetchXml 并检查是否有您的 GUID

            string fetchXml = string.Empty;
            var query = context.InputParameters["Query"] as QueryExpression;
            var fetchQuery = context.InputParameters["Query"] as FetchExpression;

                if (query == null)
                {
                    if (fetchQuery == null)
                    {
                    return;
                    }
               fetchXml = fetchQuery.Query;
                }

                // Convert query to a fetch expression for processing and apply filter
                else
                {
                    fetchXml =
                        ((QueryExpressionToFetchXmlResponse)
                            service.Execute(new QueryExpressionToFetchXmlRequest {Query = query})).FetchXml;
                }

                if (fetchXml.Contains(OpportunityFilterGuid))
            {
                    ApplyFilter(context, service, query);
                }
            }

在您需要的ApllyFilter 方法中:

  1. 从用户那里获取查询(他可以添加一些新的文件)。

  2. 使用GUID 删除您的字段。

  3. 执行查询。

  4. 删除可能与您的OR 声明冲突的文件。

  5. 添加link-entity进行查询。

  6. 执行查询。

  7. 将从第二个查询接收到的实体添加到第一个。

  8. 使用 LINQ 选择不重复的实体。

     collectionOne.Entities.GroupBy(oppId => oppId.Id).Select(opp => opp.First())
    
  9. 将该数据发送给客户端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 2018-06-07
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    相关资源
    最近更新 更多