首页 > 其他分享 >使用CRM REST Builder的Predefined Query在js结合FetchXML语句进行查询

使用CRM REST Builder的Predefined Query在js结合FetchXML语句进行查询

时间:2023-07-10 15:23:58浏览次数:33  
标签:Predefined restrictedProdList false Builder FetchXML let isSubmit new data

一般情况下使用拓展工具RESTBuilder编辑器,可以很方便的进行操作js中增删改查均能实现,但在某些较为特殊的场景下,需要根据条件去拼接查询过滤条件的,使用编辑器生成的代码无法实现,需要结合使用fetchXML,比如某个条件多个值都查询需要使用in查询,再或者需要过滤关联表中的某个字段的值。

代码使用示例:

 1 /**
 2  * 根据出口目的国以及限售区域判断是否存在不可销售的产品,如果存在,返回false
 3  */
 4 function checkProductRegion() {
 5     var isSubmit = true;
 6     let returnAnalysisId = commonUtil.delBrackets(Xrm.Page.data.entity.getId());
 7     let destcountryId = commonUtil.getLookupId("new_destcountry") // 出口目的国
 8     let destcountryName = commonUtil.getLookupName("new_destcountry") // 出口目的国
 9 
10     let returnAnalysisFetchXml = `<fetch mapping="logical" version="1.0">
11             <entity name="new_return_analysis_detail">
12                 <attribute name="new_name"/>
13                 <attribute name="new_product_fourthid"/>
14                 <link-entity name="new_product_fourth" from="new_product_fourthid" to="new_product_fourthid" alias="PF" link-type="inner">
15                     <attribute name="new_issale"/>
16                     <link-entity name="new_product_team" from="new_product_teamid" to="new_product_teamid" alias="PT" link-type="inner">
17                         <attribute name="new_restrictedsales"/>
18                     </link-entity>
19                 </link-entity>
20                 <filter type="and">
21                     <condition attribute="new_return_analysis" operator="eq" value="${returnAnalysisId}"/>
22                 </filter>
23             </entity>
24         </fetch>`;
25 
26     var url = `/new_return_analysis_details?fetchXml=${encodeURIComponent(returnAnalysisFetchXml.replace(/>\s+</g, '><'))}`;
27     commonUtil.queryWithUrl(url, (result) => {  
28         if (result.data.filter(r => r["PF.new_issale"] == false).length > 0) {
29             isSubmit = false;
30             Xrm.Utility.alertDialog(`提交失败 : 明细中有物料不可销售`);
31             return isSubmit;
32         }
33         let restrictedProdList = result.data.filter(r => r["PT.new_restrictedsales"] == 10).map(p => p._new_product_fourthid_value)
34         if (restrictedProdList.length == 0) {
35             return isSubmit;
36         }
37 
38         let productRegionRelationShipFetchXml = `<fetch mapping="logical" version="1.0">
39             <entity name="new_productregionrelationship">
40                 <attribute name="new_productcode" />
41                 <attribute name="new_country_region" />
42                 <filter type="and">
43                     <condition attribute="new_productcode" operator="in"><value>${restrictedProdList.join('</value><value>')}</value></condition >
44                     <condition attribute="new_country_region" operator="eq" value="${destcountryId}" />
45                 </filter>
46             </entity>
47         </fetch>`;
48 
49         var url = `/new_productregionrelationships?fetchXml=${encodeURIComponent(productRegionRelationShipFetchXml.replace(/>\s+</g, '><'))}`;
50         commonUtil.queryWithUrl(url, (results) => {  
51             // 限制区域的产品资源数量 != 查询到的【产品资源与销售区域的关系】数量
52             // 也就是存在当前出库目的国不可销售的产品资源
53             let canntSaleList = restrictedProdList.filter(p => !results.data.some(r =>r.new_productcode === p.id))
54             if (canntSaleList.length) {
55                 isSubmit = false;
56                 let prodNameList = result.data.filter(r => canntSaleList.indexOf(r._new_product_fourthid_value) >= 0).map(p => p.new_name)
57                 Xrm.Utility.alertDialog(`提交失败 : ${`收益分析明细[${prodNameList.join(",")}]在出口目的国[${destcountryName}]不可销售! `}`);
58             }
59         }, false);
60     }, false);
61     
62     return isSubmit;
63 }
简单的示例:
let productRegionRelationShipFetchXml = `<fetch mapping="logical" version="1.0">
            <entity name="new_productregionrelationship">
                <attribute name="new_productcode" />
                <attribute name="new_country_region" />
                <filter type="and">
                    <condition attribute="new_productcode" operator="in"><value>${restrictedProdList.join('</value><value>')}</value></condition >
                    <condition attribute="new_country_region" operator="eq" value="${destcountryId}" />
                </filter>
            </entity>
        </fetch>`;

        var url = `/new_productregionrelationships?fetchXml=${encodeURIComponent(productRegionRelationShipFetchXml.replace(/>\s+</g, '><'))}`;
主要注意的地方时在调用是fetchXML需要使用encodeURIComponent进行序列化

标签:Predefined,restrictedProdList,false,Builder,FetchXML,let,isSubmit,new,data
From: https://www.cnblogs.com/adingfirstlove/p/17541225.html

相关文章

  • String、StringBuffer、StringBuilder 的区别?
    一.介绍String、StringBuffer、StringBuilder:  前言: String、StringBuffer、StringBuilder均在java.lang包下;String: 在Java中,String是一个特殊的引用类型,用于表示文本字符串。它提供了许多方法来操作和处理字符串,比如连接、截取、查找、替换等。String类......
  • gson builder
    publicstaticfinalGsongson=newGsonBuilder().serializeNulls().registerTypeAdapter(LocalDateTime.class,(JsonSerializer<LocalDateTime>)(localDateTime,typeOfSrc,context)->{if(Objects.isNull(loca......
  • PowerBuilder从入坑到放弃(二)编码规范
    前言上一篇我们从0到1用pb开发了一个helloworld程序,并成功将开发的程序编译打包并且制作了安装包。程序员最讨厌的莫过于写文档和别人不写注释。不知道大家会不会和我一样,在找bug时,有段代码,心中不知默默的骂了它多少遍。哪个sx写的这代码,研究了一段时间发现,原来那sx竟是自己......
  • 代码生成器 CodeBuilder 3 正式版发布
    CodeBuilder是一款强大的代码生成工具,目前发布了3.0,大家可以前去下载体验官方主页。1、多种数据源基于ADO.NET的数据驱动基于Fireasy3,支持从SqlServer、MySql、Oracle、Firebird、PostgreSql、SQLite、达梦、人大金仓、神通数据库,以及Odbc、OleDb驱动。可以获取所有......
  • Java 基础复习——StringBuffer 和 StringBuilder
    StringBuffer和StringBuilderStringBuffer类简介java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删很多方法和String相同,但StringBuffer是可变长度的StringBuffer是一个容器注意:StringBuffer的直接父类是AbstractStringBuilder有属......
  • HBuilder 快捷键的教程
    /*注:本教程针对HBuilder5.0.0,制作日期2014-12-31*/创建HTML结构:h8(敲h激活代码块列表,按8选择第8个项目,即HTML代码块,或者敲htEnter)中途换行:'Ctrl+Enter'设置charset:me6Enter引用外部js:s2Enter'Ctrl+Enter'创建js区块:sEnter创建函数:fun3(或者funnEnter)为函数......
  • 07.生成器模式(Builder)
    使用生成器模式来解决问题定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。生成器模式的结构和说明Builder:生成器接口,定义创建一个Product对象所需的各个部件的操作。ConcreteBuilder:具体的生成器实现,实现各个部件的创建,并负责组装Produ......
  • org.springframework.boot.builder.SpringApplicationBuilder.init([LjavalangObject;
    一SpringBoot2.0.4集成SpringCloud异常:org.springframework.boot.builder.SpringApplicationBuilder.([Ljava/lang/Object;)V二、异常处理参考:缘起初学springcloud的朋友可能不知道,其实SpringBoot与SpringCloud需要版本对应,否则可能会造成很多意料之外的错误,比如eureka注册了......
  • diskimage-builder制作ironic ARM镜像
    虚环境安装克隆源码的仓库:$gitclonehttps://git.openstack.org/openstack/diskimage-builder$gitclonehttps://git.openstack.org/openstack/dib-utils建立虚环境:$virtualenvdib-env启用虚环境$sourcedib-env/bin/activate停止环境$sourcedib-env/bin/deac......
  • Java中的String、StringBuilder和StringBuffer
    StringString为什么不可变?有什么好处?在Java中的String源码中,我们可以看到字符串String类就是char数组的封装,且字符char[]前面的修饰关键字是private和final。final决定了char数组是私有成员变量,不可以指向新的数组。private决定了该数组只能有String类内部访问,所以不可变。好......