在页面交互脚本js中实现窗体交互逻辑是很常见的crm场景,一般情况下使用拓展工具RESTBuilder编辑器,可以很方便的进行操作,增删改查均能实现,但在某些较为特殊的场景下,需要根据条件去拼接查询过滤条件的,使用编辑器生成的代码无法实现,需要结合使用fetchXML,当然这个编辑器中也拓展了结合fetchxml的方式,跟webapi调用一样只不过需要传递fetchxml,项目中使用了一个封装好的JS工具库XrmServiceToolkit.js,使用起来更方便,直接调用方法和传递fetchxml即可。
方法如下:
1.解决方案中添加XrmServiceToolkit.js Web资源 
2.业务实体的窗体资源中添加XrmServiceToolkit.js
3.业务实体窗体单独的交互js脚本中 fetchXML方式调用查询
 1 var moduleid = Xrm.Page.data.entity.getId();
2     var fetchXML = '<fetch mapping="logical" version="1.0">'
3         + '<entity name="crm_ordermanage">'
4         + '<attribute name="crm_name" />'
5         + '<filter>'
6         + '<condition attribute="crm_ordermanageid" operator="eq" value="' + moduleid + '" />'
7         + '</filter>'
8         + '<link-entity name="opportunity" from="opportunityid" to="crm_opportunity" alias="b" link-type="inner">'
9         + '<attribute name="crm_oldproject" />'
10         + '<attribute name="crm_approvalstatus" />'
11         + '<filter>'
12         + '<condition attribute="crm_oldproject" operator="not-null" />'
13         + '<condition attribute="crm_approvalstatus" operator="eq" value="171060002" />'
14         + '</filter>'
15         + '</link-entity>'
16         + '</entity>'
17         + '</fetch>'
18     var query = XrmServiceToolkit.Soap.Fetch(fetchXML);
19     if (query.length <= 0) {
20         Xrm.Utility.alertDialog("查询失败!");
21         return;
22     }
可以把查询的FetchXML单独弄一个方法,并且查询的过滤条件可以都放到最下面,也可以在单独link的实体里单独过滤,放到最下方过滤的方式如下:
 1 function getOrderManagerFetchXML(orderdetailid) {
2     var fetchXML = '<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">'
3         + '<entity name = "crm_ordermanage" >'
4         + '<attribute name="crm_orderclassification" />'
5         + '<link-entity name="crm_ordermanagedetails" from="crm_ordermanage" to="crm_ordermanageid" alias="ab" link-type="outer">'
6         + '<attribute name="crm_ordermanagedetailsid" />'
7         + '</link-entity>'
8         + '<filter>'
9         + '<condition entityname="ab" attribute="crm_ordermanagedetailsid"  value="' + orderdetailid + '" operator="eq" />'
10         + '</filter>'
11         + '</entity >'
12         + '</fetch >';
13     return fetchXML;
14 }
调用传值编码问题:
在js中写的fetchXML语句,在发起调用接口前,都需要先用encodeURIComponent转义一下
 
但在转义后,原先进行模糊查询的过滤条件就偶尔调用不成功,后来发现是0开头或者9结尾的都不能查询 查询后发现%连接0或9%都在转义后有特殊意义 所以才会报错无效的xml格式 最后找到解决办法
%的后面加上25 即将原来的%替换成%25 问题就解决了

 
 

Dynamic CRM使用FetchXML在js中查询与调用传递编码问题的更多相关文章

  1. 关于js中函数的调用问题

    js中函数的调用方法 1.直接调用 函数名(参数): 2.通过指向函数的变量去调用 例如: var myval = 函数名: 此刻 myval是指向函数的一个指针: myval(实际参数):此刻调用的 ...

  2. JS中函数的调用和this的值

    调用每一个函数会暂停当前函数的执行,传递控制权和参数给新函数.除了声明时定义的形式参数,每个函数还接收两个附加的参数:this 和 arguments. 参数this在面向对象编程中非常重要,他的值取 ...

  3. 使用另一种方式实现js中Function的调用(call/apply/bind)

    在JavaScript中函数的调用可以有多种方式,但更经典的莫过于call和apply.call跟apply都绑定在函数上,他们两个的第一个参数意义相同,传入一个对象,他作为函数的执行环境(实质上是为 ...

  4. JS中的的Url传递中文参数乱码,如何获取Url中参数问题

    一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码:<script type=”text/javascript” ...

  5. 在Node.js中使用ffi调用dll

    类似的文章还是比较多的,但或多或少有一些问题没有解决,在此我将其整合并分享给大家: 测试环境: Node.js 9.9.0 VisualStudio 2015 "ffi": &qu ...

  6. js中的apply调用

    今天看了阮一锋老师的一篇文章,感觉很明了对闭包的理解,尤其是文章中的apply的介绍 apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象. ...

  7. js中字符串可以调用的方法

    var s = "hello,world"   //定义一个字符串 s.length()                   // => 11 s.charAt(0)     ...

  8. js中的方法调用

    <script> var m = {com: { sao: {citi:{}}}}; m.com.sao.citi.init = new function() { this.name = ...

  9. js中通过ajax调用网上接口

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

随机推荐

  1. 蓝牙、WiFi、ZigBee三大无线通信技术协议模块哪一个是最好的?

    曾经,在2015年极客公园创新大会上,小米首次在非官方平台发布了新款产品小米智能家庭套装.自此,Zigbee便常出现在大众视野中. 如今,小米在IoT物联网应用开发者平台上明确说明,不再推广Zigbe ...

  2. 超详细干货!Docker+PXC+Haproxy搭建高可用强一致性的MySQL集群

    前言 干货又来了,全程无废话,可先看目录了解. MySQL搭建集群最常见的是binlog方式,但还有一种方式是强一致性的,能保证集群节点的数据一定能够同步成功,这种方式就是pxc,本篇就使用图文方式一 ...

  3. JS:undefined number

    undefined数据类型:未定义属性 undefined 表示不含值 <script> var t1=""; var t2; if (t1===undefined) ...

  4. Java基础-并发篇

    3.1. JAVA 并发知识库 3.2. JAVA 线程实现/创建方式 3.2.1. 继承 Thread 类 ​ Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例. ...

  5. 揭开Vue异步组件的神秘面纱

    简介 在大型应用里,有些组件可能一开始并不显示,只有在特定条件下才会渲染,那么这种情况下该组件的资源其实不需要一开始就加载,完全可以在需要的时候再去请求,这也可以减少页面首次加载的资源体积,要在Vue ...

  6. NC24325 [USACO 2012 Mar S]Flowerpot

    NC24325 [USACO 2012 Mar S]Flowerpot 题目 题目描述 Farmer John has been having trouble making his plants gr ...

  7. Contest

    Contest 题目 链接 题目描述 \(n\) 支队伍一共参加了三场比赛. 一支队伍 \(x\) 认为自己比另一支队伍 \(y\) 强当且仅当 \(x\) 在至少一场比赛中比 \(y\) 的排名高. ...

  8. 经典的损失函数:交叉熵和MSE

    经典的损失函数: ①交叉熵(分类问题):判断一个输出向量和期望向量有多接近.交叉熵刻画了两个概率分布之间的距离,他是分类问题中使用比较广泛的一种损失函数.概率分布刻画了不同事件发生的概率. 熵的定义: ...

  9. Lambda表达式有参数有返回值的练习(自定义接口)和Lambda省略格式&Lambda使用前提

    给定一个计算器Calculator接口,内含抽象方法calc可以将两个int数字相加得到和值 使用L ambdo的标准格式调用invokeCalc方法,完成120和130的相加计算 public in ...

  10. 运行Flutter时连接超时

    这个墙不知道浪费了开发者多少的时间!!!!!!!!!!!!!!!!!!! 1.修改仓库地址为阿里仓库: 编辑android/build.gradle,把文件中的两处: google() jcenter ...