Dynamic CRM使用FetchXML在js中查询与调用传递编码问题
在页面交互脚本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 问题就解决了