CrmFetchKit.js是一个跨浏览器的一个类库,允许通过JavaScript来执行fetch xml的查询,还可以实现批量更新,分页查询等。目前已支持Chrome 25, Firefox 19 和 IE9/10 .

它的最大优势是可以通过fetchxml 来查询,这样我们就可以实现真正的多表联合查询,虽然可以用OData终结点的$expand来进行多表的联合查询,但这种方式没办法过滤多表的条件,它只能过滤主表的条件。

下面来看下简单的多表查询的例子:

1.首先定义一个fetchxml:

  1: var fetchxml = ['<fetch version="1.0" output-format="xml-platform" ',
  2:                     'mapping="logical" ',
  3:                     'returntotalrecordcount="true" >',
  4:                 '<entity name="new_floor_price">',
  5:                 '<attribute name="new_floor_priceid" />',
  6:                 '<order attribute="modifiedon" descending="true" />',
  7:                 '<filter type="and">',
  8:                     '<condition attribute="new_approval_status" operator="eq" value="" />',
  9:                 '</filter>',
 10:                 '<link-entity name="new_fp_item" from="new_fp" to="new_floor_priceid" alias="ar">',
 11:                     '<attribute name="new_floor_price" />',
 12:                     '<filter type="and">',
 13:                     '<condition attribute="new_modelid" operator="eq" value="' + modelid + '" />',
 14:                     '</filter>',
 15:                 '</link-entity>',
 16:                 '</entity>',
 17:             '</fetch>'].join('');

我一般先写好sql语句,然后在 http://sql2fetchxml.com/ 这里生成fetchxml 语句,再小改下参数就成了。

在上面的框里输入SQL 语句,点击 中间的Convert,就可以在下面的框里生成 Fetchxml的语句。

2. 调用很简单:

  1: CrmFetchKit.Fetch(fetchxml).then(function (results) {
  2:         if(results!=null)
  3:             setAttributeValue("new_floor_price", Number(results[0].getValue("ar.new_floor_price")));
  4:     }, onFetchError);

3. 错误处理:

  1: function onFetchError(xhr, status, errorThrown) {
  2:
  3:     var errormsg = $(xhr.responseXML).find('Message').text();
  4:
  5:     alert('CrmFetchKit-Error occured: ' +  errormsg);
  6: }

4. 另一种写法:

  1: // execute the query (async)
  2: CrmFetchKit.Fetch(fetchxml)
  3:   .fail(function(xhr, status, errorThrown){
  4:
  5:       // get the error-message
  6:       var msg = $(xhr.responseXML).find('Message').text();
  7:
  8:       alert('Error occured: ' + msg);
  9:   })
 10:   .done(function(results){
 11:
 12:       var contactid = null;
 13:
 14:       for( var i = 0, max = results.length; i < max; i++) {
 15:
 16:     contactid = results[i].getValue('contactid');
 17:
 18:     // Assign (async)
 19:     CrmFetchKit.Assign(contactid, 'contact', bId);
 20:       }
 21:   });

这个示例中,还介绍了CrmFetchKit.Assign的用法

CrmFetchKit.Assign(contactid, 'contact', bId);

这样就可以实现批量更新了

5. FetchMore 用法

  1: var fetchxml = ['<fetch version="1.0" output-format="xml-platform" ',
  2:                         'mapping="logical" ',
  3:                         'returntotalrecordcount="true" ',
  4:                         'count="10">',
  5:                 ' <entity name="contact">',
  6:                 ' <attribute name="lastname" />',
  7:                 ' <attribute name="contactid" />',
  8:                 ' <filter type="and">',
  9:                 ' <condition attribute="lastname" operator="like" value="test%" />',
 10:                 ' </filter>',
 11:                 ' </entity>',
 12:                 '</fetch>'].join('');
 13:
 14: CrmFetchKit.FetchMore(fetchxml).then(function (response) {
 15:
 16:     // 获取实体名
 17:     var entityname = response.entityName;
 18:
 19:     // fetchxml里必须设置 'returntotalrecordcount="true" '
 20:     var total = response.moreRecords;
 21:
 22:     // 取得实体的数组
 23:     var set = response.entities;
 24:
 25:     // 分页就需要这个 page-cookie
 26:     var pageCookie = response.pagingCookie;
 27:
 28:     ...
 29:
 30: }, onFetchError);

6. FetchAll用法:

  1: var fetchxml = ['<fetch version="1.0" output-format="xml-platform" ',
  2:                         'mapping="logical" ',
  3:                         'count="10">',
  4:                 ' <entity name="contact">',
  5:                 ' <attribute name="lastname" />',
  6:                 ' <attribute name="contactid" />',
  7:                 ' <filter type="and">',
  8:                 ' <condition attribute="lastname" operator="like" value="test%" />',
  9:                 ' </filter>',
 10:                 ' </entity>',
 11:                 '</fetch>'].join('');
 12:
 13: CrmFetchKit.FetchAll(fetchxml).then(function (entities) {
 14:
 15:     /* success-handler */
 16:
 17: }, onFetchError);

7. 下载地址

Download  CRM Fetch Kit

注意事项:

1. 要注意全部是小写

2. 给lookup赋值时,要注意lookup类型是正确的

Dynamic CRM 2013学习笔记 系列汇总

Dynamic CRM 2013学习笔记(九)CrmFetchKit.js介绍:Fetchxml、多表联合查询, 批量更新的更多相关文章

  1. Dynamic CRM 2013学习笔记(十二)实现子表合计(汇总,求和)功能的通用插件

    上一篇 Dynamic CRM 2013学习笔记(十一)利用Javascript实现子表合计(汇总,求和)功能 , 介绍了如何用js来实现子表合计功能,这种方法要求在各个表单上添加js方法,如果有很多 ...

  2. Dynamic CRM 2013学习笔记 系列汇总

    这里列出所有 Dynamic CRM 2013学习笔记 系列文章,方便大家查阅.有任何建议.意见.需要,欢迎大家提交评论一起讨论. 本文原文地址: Dynamic CRM 2013学习笔记 系列汇总 ...

  3. Dynamic CRM 2013学习笔记(十六)用JS控制Tab可见,可用

    一个Form里经常会有好几个Tab,有时要根据一些条件设置哪些Tab可用,可见.下面就介绍下如何用JS对Tab进行控制. 1. 控制可见   function setTabVisableByName( ...

  4. Dynamic CRM 2013学习笔记(十八)根据主表状态用JS控制子表自定义按钮

    有时要根据主表的审批状态来控制子表上的按钮要不要显示,比如我们有一个需求审批通过后就不能再上传文件了. 首先打开Visual Ribbon Editor, 如下图,我们可以利用Enable Rules ...

  5. Dynamic CRM 2013学习笔记(二十三)CRM JS智能提示(CRM 相关的方法、属性以及页面字段),及发布前调试

    我们知道在CRM的js文件里引用XrmPageTemplate.js后,就可以实现智能提示,但每个js文件都引用太麻烦了,其实可以利用vs的功能让每个js文件自动实现智能提示CRM的js: 另外,我们 ...

  6. Dynamic CRM 2013学习笔记(二十五)JS调用web service 实现多条记录复制(克隆)功能

    前面介绍过如何克隆一条当前的记录: Dynamic CRM 2013学习笔记(十四)复制/克隆记录 , 主要是通过界面上加一个字段,单击form上的clone 按钮时,改变这个字段的值以触发插件来实现 ...

  7. Dynamic CRM 2013学习笔记(二十八)用JS动态设置字段的change事件、必填、禁用以及可见

    我们知道通过界面设置字段的change事件,是否是必填,是否可见非常容易.但有时我们需要动态地根据某些条件来设置,这时有需要通过js来动态地控制了. 下面分别介绍如何用js来动态设置.   一.动态设 ...

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

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

  9. Dynamic CRM 2013学习笔记(二十九)报表设计:reporting service 报表开发常见问题

    在报表开发过程中,经常会遇到各种各样的问题,比如The report cannot be displayed. (rsProcessingAborted),一点有意义的提示都没有:再就是分页问题,经常 ...

随机推荐

  1. web form 控件

    webform的简单控件1.Label:文本显示,编译后是span属性:颜色,样式,边线宽度2.Literal:纯文本显示,编译后是text 3.TextBox:文本框TextMode-密码框.文本域 ...

  2. 《C和指针(Pointer on c)》 学习笔记

    转载:http://dsqiu.iteye.com/blog/1687944 首先本文是对参考中三个连接的博客进行的整理,非常感谢三位博主的努力,每次都感叹网友的力量实在太强大了…… 第一章 快速上手 ...

  3. Unity协程(Coroutine)原理深入剖析

    Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 其实协程并没有那么复杂,网上很多地方都说是多 ...

  4. SQL Server 查询处理中的各个阶段(SQL执行顺序)

    SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后 ...

  5. javascript中document.appendChild和document.body.appendChild的问题

    在IE7中 var conentDiv = document.createElement("div"); document .body .appendChild(conentDiv ...

  6. ORACLE fetch bulk collect into limit

    DECLARE TYPE rr IS REF CURSOR; TYPE r_emp IS RECORD( empno ), ename ), job ), mgr ), hiredate DATE, ...

  7. androidannotations 简单配置

    1.build.gradle 需要添加的内容 标注的颜色是新建项目之后,build.gradle文件需要添加的内容. buildscript { repositories { jcenter() } ...

  8. 判断闰年的方法以及如何获得单链表的倒数第K个元素

    今天很悲催,心中向往的公司,打电话过来面试,问到我两个问题,结果竟然都没有回答上,伤心了,记录下今天失败,希望以后不要被同样的问题给PASS. 问题1.如何判断是否为闰年 所谓闰年那就是:四年一闰,百 ...

  9. hdu 5666 (大数乘法) Segment

    题目:这里 题意:在线段x+y=q与坐标轴围成的三角形中,求有多少个坐标为整数的点,答案模上p. 很容易就想到最后答案就是((q-1)*(q-2))/2然后模上p就是了,但是这个数字比较大,相乘会爆l ...

  10. ObjC.class-cluster

    class cluster In a class cluster, only an abstract superclass is public. Allocating an instance actu ...