一般情况下使用拓展工具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 shipmentId = commonUtil.delBrackets(Xrm.Page.data.entity.getId())

let fetchXml = `<fetch mapping="logical" version="1.0">

<entity name="new_box_single_detail">

<attribute name="new_customs_receipts"/>

<attribute name="new_is_erp"/>

<link-entity name="new_outbound_order_details" from="new_outbound_order_detailsid" to="new_out_detail" alias="OOD" link-type="inner"/>

<filter type="and">

<condition entityname="OOD" attribute="new_outbound_order" operator="eq" value="${shipmentId}"/>

</filter>

</entity>

</fetch>`

let boxDetailQuery = `/new_box_single_details?fetchXml=${encodeURIComponent(fetchXml.replace(/>\s+</g, '><'))}`

let showButton = false

commonUtil.queryWithUrl(boxDetailQuery, result => {

showButton = result.success && result.data.length

&& result.data.filter(d => !d.new_is_erp && d.new_customs_receipts).length > 0

}, false)

多条件主表与关联表都筛选的的fetchxml示例:
 1 let fetchXml = `<fetch mapping="logical" version="1.0">
2 <entity name="foton_kd_claimdetail">
3 <all-attributes />
4 <link-entity name="foton_kd_vehiclelib" from="foton_kd_vehiclelibid" to="foton_vehicle" alias="LIB" link-type="inner"/>
5 <filter type="and">
6 <condition entityname="LIB" attribute="foton_codefoton" operator="eq" value="${vehicleno}"/>
7 <condition attribute="foton_ftcontractno" operator="eq" value="${contractno}"/>
8 <filter type="or">
9 <filter type="and">
10 <condition attribute="foton_status" operator="eq" value="136020000"/>
11 <condition attribute="foton_addtype" operator="eq" value="136020001"/>
12 </filter>
13 <condition attribute="foton_status" operator="eq" value="136020005"/>
14 </filter>
15 </filter>
16 </entity>
17 </fetch>`
18 let queryStr = `/foton_kd_claimdetails?fetchXml=${encodeURIComponent(fetchXml.replace(/>\s+</g, '><'))}`
19 //queryStr += ` and ((foton_status eq 136020000 and foton_addtype eq 136020001) or foton_status eq 136020005)&$orderby=createdon desc,foton_nofoton asc`
20 commonUtil.queryWithUrl(queryStr, result => {
21 debugger
22 if (!result.success || !result.data || result.data.length < 1) {
23 Xrm.Utility.alertDialog("未能查询到索赔明细数据!")
24 return
25 }
26 }
主要注意的地方时在调用是fetchXML需要使用encodeURIComponent进行序列化

使用CRM REST Builder的Predefined Query在js结合FetchXML语句进行查询的更多相关文章

  1. Dynamics CRM REST Builder

    今天介绍个很棒的工具叫CRM REST Builder,不管是2016之前的odata查询或者现在的web api都不在话下,界面如下,选项非常丰富 这里以retrieve multiple举个例子, ...

  2. Elasticsearch Query DSL 整理总结(一)—— Query DSL 概要,MatchAllQuery,全文查询简述

    目录 引言 概要 Query and filter context Match All Query 全文查询 Full text queries 小结 参考文档 引言 虽然之前做过 elasticse ...

  3. crm使用FetchXml分组聚合查询

    /* 创建者:菜刀居士的博客  * 创建日期:2014年07月09号  */ namespace Net.CRM.FetchXml {     using System;     using Micr ...

  4. Command and Query Responsibility Segregation (CQRS) Pattern 命令和查询职责分离(CQRS)模式

    Segregate operations that read data from operations that update data by using separate interfaces. T ...

  5. Dynamic CRM 2013学习笔记(十七)JS读写各种类型字段方法及技巧

    我们经常要对表单里各种类型的字段进行读取或赋值,下面列出各种类型的读写方法及注意事项: 1. lookup 类型 清空值 var state = Xrm.Page.getAttribute(" ...

  6. Flashback Query、Flashback Table(快速闪回查询、快速闪回表)

    Flashback Query闪回查询 flashback query是基于undo表空间的闪回,与之相关的参数如下: SQL> show parameter undo NAME         ...

  7. SQL Server捕获发生The query processor ran out of internal resources and could not produce a query plan...错误的SQL语句

    最近收到一SQL Server数据库服务器的告警邮件,告警内容具体如下所示: DATE/TIME: 10/23/2018 4:30:26 PM DESCRIPTION:  The query proc ...

  8. 【spring data jpa】使用jpa的@Query,自己写的语句,报错:org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'status' cannot be found on null

    报错: org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'status' ...

  9. 通过redash query results 数据源实现跨数据库的查询

    redash 提供了一个简单的 query results 可以帮助我们进行跨数据源的查询处理 底层数据的存储是基于sqlite的,期望后期有调整(毕竟处理能力有限),同时 query results ...

  10. query.validate.js使用说明+中文API

    转自:http://www.cnblogs.com/hejunrex/archive/2011/11/17/2252193.html 看到一篇好的文章不容易,记录下来以防丢失! 官网地址:http:/ ...

随机推荐

  1. Paimon lookup store 实现

    Lookup Store 主要用于 Paimon 中的 Lookup Compaction 以及 Lookup join 的场景. 会将远程的列存文件在本地转化为 KV 查找的格式. Hash htt ...

  2. “地表最强”人形机器人亮相:视觉&语音推理能力

    Figure 02配备了机载的视觉语言模型(VLM),使其能够进行快速的常识性视觉推理. 相关: https://mbd.baidu.com/newspage/data/landingsuper?co ...

  3. 3.6 Linux命令基本格式

    本节开始,我们不会再见到图形界面了,因为对服务器来讲,图形界面会占用更多的系统资源,而且会安装更多的服务.开放更多的端口,这对服务器的稳定性和安全性都有负面影响.其实,服务器是一个连显示器都没有的家伙 ...

  4. c++设计模式:设计原则

    c++设计八大原则(降低改变带来的代码修改) 一.依赖倒置原则(DIP) 1.高层模块(稳定)不应该依赖于低层模块(变化),二者应该依赖于抽象(更稳定) <高层模块 包括 低层模块所依赖的抽象, ...

  5. 【性能测试】01基础知识篇-并发用户、RPS、TPS的解读

    本文介绍并发用户.RPS.TPS的基本概念以及三者之间的关系. 术语定义 并发用户:在性能测试工具中,一般称为虚拟用户(Virtual User,简称VU),指的是现实系统中操作业务的用户. 说明 并 ...

  6. Gitlab的备份以及密码重置

    关于gitlab代码的备份 要求: 每天备份一次,备份至少7天的数据 备份到远程服务器 开始 编写备份脚本 gitlab_back.sh #! /bin/bash # gitlab 机房备份路径 Lo ...

  7. 剖析Air724UG的硬件设计,还有大发现?01部分

    ​ 一.绪论 Air724UG是一款基于紫光展锐UIS8910DM平台设计的LTE Cat 1无线通信模组.支持FDD-LTE/TDD-LTE的4G远距离通讯和Bluetooth近距离无线传输技术,支 ...

  8. 低功耗4G模组Air780E快速入门:固件的远程升级

    ​ 今天我们学习Air780E快速入门之固件的远程升级,小伙伴们,学起来吧! 一.生成差分包 合宙的远程升级支持使用合宙云平台和自建服务器,此例程使用的是合宙云平台. 1.1 准备新旧版的core和脚 ...

  9. Java多线程设计模式之线程池模式

    前序: Thread-Per-Message Pattern,是一种对于每个命令或请求,都分配一个线程,由这个线程执行工作.它将"委托消息的一端"和"执行消息的一端&qu ...

  10. 面试官:来谈谈Vue3的provide和inject实现多级传递的原理

    前言 没有看过provide和inject函数源码的小伙伴可能觉得他们实现数据多级传递非常神秘,其实他的源码非常简单,这篇文章欧阳来讲讲provide和inject函数是如何实现数据多级传递的.ps: ...