注意事项:Xrm.Page中的方法使用的是实体、字段、关系的逻辑名称。
窗体调试:contentIFrame.Xrm.Page.getControl("compositeControlParams").setDisabled(false);

一、Xrm.Page.context:上下文信息管理器
1、Xrm.Page.context.getServerUrl():获取服务器URL。
2、Xrm.Page.context.getOrgUniqueName():获取组织名称。
3、Xrm.Page.context.getUserRoles():获取当前用户安全角色数组(每个对象中存储的是安全角色的Guid)。
Iframe 中获取当前数据guid
this.parent.Xrm.Page.context.getId();

二、Xrm.Page.data.entity:实例数据管理器
㈠Xrm.Page.data.entity:实例级别
1、Xrm.Page.data.entity.getId():返回当前实例的Guid值。
2、Xrm.Page.data.entity.getEntityName():返回当前实例所属实体的逻辑名称。
3、Xrm.Page.data.entity.getIsDirty():返回当前实例是否修改。
4、Xrm.Page.data.entity.getDataXml():
5、Xrm.Page.data.entity.addOnSave(function/functionName):添加保存记录时调用的函数。
⑴取消OnSave事件:event.returnValue = false;
function OnSaveHandler(ExecutionObj){ //2013适用,注意:要勾选上表单编辑中的执行上下文
ExecutionObj.getEventArgs().preventDefault(); }

6、Xrm.Page.data.entity.removeOnSave(function/functionName):删除保存记录时调用的函数。
7、Xrm.Page.data.entity.save(无/"saveandclose"/"saveandnew"):保存/保存并关闭/保存并新建。

㈡Xrm.Page.data.entity.attributes:属性集级别
1、Xrm.Page.data.entity.attributes.getLength():返回属性集中的属性数量。
2、Xrm.Page.data.entity.attributes.forEach( function( attribute, index ) ):遍历属性集,执行函数操作,参数为当前属性和索引值。
3、Xrm.Page.data.entity.attributes.get( String / Index / null / function(attribute, index) ):返回属性或属性集。
Xrm.Page.getAttribute( String / Index / null / function(attribute, index) ):快捷方式
⑴String:返回指定逻辑名称的属性(对象)。
⑵Index:返回指定索引值的属性(对象)。
⑶null:返回所有属性(数组)。
⑷function(attribute, index):返回函数return true的属性(数组)。

㈢Xrm.Page.getAttribute:属性级别
1、Xrm.Page.getAttribute("LogicalName").getAttributeType():返回属性的类型。
2、Xrm.Page.getAttribute("LogicalName").getFormat():返回属性格式的设置选项。
3、Xrm.Page.getAttribute("LogicalName").getName():返回属性的逻辑名称。
4、Xrm.Page.getAttribute("LogicalName").addOnChange(function/functionName):添加属性变更时调用的函数。
5、Xrm.Page.getAttribute("LogicalName").removeOnChange(function/functionName):删除属性变更时调用的函数。
6、Xrm.Page.getAttribute("LogicalName").setSubmitMode("always"/"never"/"ditry"):设置在保存记录时,是否提交属性中的数据。
⑴always:始终
⑵never:从不
⑶ditry:脏页
7、Xrm.Page.getAttribute("LogicalName").setRequiredLevel("none/required/recommended"):可选/必选/推荐。

属性取值方法:若字段内容为空,则返回值为null。
1、单行文本、多行文本:
Xrm.Page.getAttribute("LogicalName").getValue():String
2、整数、浮点数、十进制数、货币:
Xrm.Page.getAttribute("LogicalName").getValue():Number
3、两个选项:
Xrm.Page.getAttribute("LogicalName").getValue():Boolean
4、选项集:
Xrm.Page.getAttribute("LogicalName").getText():String
Xrm.Page.getAttribute("LogicalName").getValue():Number
Xrm.Page.getAttribute("LogicalName").getOption("选项的值"):Option对象
⑴text:选项的标签
⑵value:选项的值
Xrm.Page.getAttribute("LogicalName").getOptions():Option对象数组
5、日期和时间:
Xrm.Page.getAttribute("LogicalName").getValue():Date对象
6、查找:
Xrm.Page.getAttribute("LogicalName").getValue():LookUp对象数组
⑴[0].id:对象的Guid
⑵[0].name:对象的主字段内容(LookUp中的显示名称)
⑶[0].entityType:对象所属实体的逻辑名称(LogicalName)

属性设值方法:若要设置字段为空,则设置为null。
1、单行文本、多行文本:
Xrm.Page.getAttribute("LogicalName").setValue(String);
2、整数、浮点数、十进制数、货币:
Xrm.Page.getAttribute("LogicalName").setValue(Number);
3、两个选项:
Xrm.Page.getAttribute("LogicalName").setValue(Boolean);
4、选项集:
Xrm.Page.getAttribute("LogicalName").setValue(Number);
5、日期和时间:
Xrm.Page.getAttribute("LogicalName").setValue(Date Object);
e.g:Xrm.Page.getAttribute("LogicalName").setValue(new Date(1990,10,12)); // 显示 1990/11/12
6、查找:
Xrm.Page.getAttribute("LogicalName").setValue(LookUp Object 数组);
e.g:
var lookup = new Array(1);
lookup[0] = new Object();
lookup[0].id = Xrm.Page.getAttribute("new_chazhao").getValue()[0].Id;
lookup[0].name = Xrm.Page.getAttribute("new_chazhao").getValue()[0].Name;
lookup[0].entityType = Xrm.Page.getAttribute("new_chazhao").getValue()[0].entityType;
Xrm.Page.getAttribute("LogicalName").setValue(lookup);
//js中得到该实体中lookup的属性 retrieveRecord(Xrm.Page.getAttribute("new_coursename").getValue()[0].id, "new_courseSet", function (data, textStatus, XmlHttpRequest) {
var Item = new Object();
Item.id = data.new_courselevel.Id
Item.name = data.new_courselevel.Name;
Item.typename = data.new_courselevel.LogicalName;
var array = new Array();
array[0] = Item;
Xrm.Page.getAttribute("new_courselevellook").setValue(array);
}, null, false);

三、Xrm.Page.ui:窗体界面管理器
㈠Xrm.Page.ui:窗体级别
1、Xrm.Page.ui.getFormType():返回表单窗体的类型。
⑴ 0:未定义
⑵ 1:创建
⑶ 2:更新
⑷ 3:只读模式
⑸ 4:已禁用
⑹ 5:快速创建(已弃用)
⑺ 6:批量编辑
⑻11:读优化
2、Xrm.Page.ui.refreshRibbon():刷新功能区。

3、Xrm.Page.ui.close():关闭窗体。

Xrm.Page.ui.tabs.get("general").setLabel("Major"); //js改变选项卡标签值

㈡Xrm.Page.ui.controls:控件级别(相似方法同上)
1、Xrm.Page.ui.controls.getLength();
2、Xrm.Page.ui.controls.forEach(function(control, index));
3、Xrm.Page.ui.controls.get(String/Index/null/function(attribute, index));
Xrm.Page.getControl(String/Index/null/function(attribute, index))(快捷方式)
4、属性.controls.get(0):可以获得对应控件。

控件方法:
1、Xrm.Page.getControl("控件逻辑名称").setVisible(true/false):可见/不可见控件。
2、Xrm.Page.getControl("控件逻辑名称").setDisabled(true/false):禁用/启用控件。
3、Xrm.Page.getControl("LogicalName").addCustomView(viewId, entityName, viewDisplayName, fetchXml, layoutXml, isDefault):添加查找对话框视图(查找字段的视图选择器必须开启)。
// 指定视图的GUID(任意)
var viewId = null;
// 查找实体的逻辑名称
var entityName = null;
// 指定视图的名称
var viewDisplayName = null;
// 视图的fetchXml查询
var fetchXml = null;
// 指定视图布局XML
var layoutXml = null;
// 是否设置为默认视图
var isDefault = true;
4、Xrm.Page.getControl("LogicalName").addCustomFilter(fetchXml):添加视图筛选条件,对所有视图有效,必须在addPreSearch中调用。
5、Xrm.Page.getControl("LogicalName").addPreSearch(function):在显示查询视图前,调用参数方法,常用于添加视图筛选条件。
 · 猜想:点击查找按钮,加载查询语句,执行addPreSearch参数方法,显示查找视图。
 · 注意:对同一个查询控件执行多次addPreSearch方法,在执行其参数方法时,会按照添加顺序依次执行每次添加的参数方法。

6、Xrm.Page.getControl("IFrameLogicalName").setSrc(URL):设置资源地址。
 · 每次展开选项卡,IFrame将刷新重置,因此,对src的修改,应放在TabStateChange事件中,而不是OnLoad事件。

㈢Xrm.Page.ui.tabs: 选项卡级别(相似方法同上)
1、Xrm.Page.ui.tabs.getLength();
2、Xrm.Page.ui.tabs.forEach(function(attribute, index));
3、Xrm.Page.ui.tabs.get(String/Index/null/function(attribute, index));
选项卡方法:见SDK。

㈣Xrm.Page.ui.tabs.get(...).sections:选项卡中节级别(相似方法同上)
1、Xrm.Page.ui.tabs.get(...).sections.getLength();
2、Xrm.Page.ui.tabs.get(...).sections.forEach(function(attribute, index));
3、Xrm.Page.ui.tabs.get(...).sections.get(String/Index/null/function(attribute, index));
节方法:见SDK。

㈤Xrm.Page.ui.navigation.items:关联导航视图(相似方法同上)
1、Xrm.Page.ui.navigation.items.getLength();
2、Xrm.Page.ui.navigation.items.forEach(function(item, index));
3、Xrm.Page.ui.navigation.items.get(String/Index/null/function(attribute, index));
 · String:在CRM2013中为"nav_关系名称"
节方法:见SDK。

四、Xrm.Utility:
1、Xrm.Utility.openEntityForm(LocalName, Id, Parameters):
⑴打开新记录:Xrm.Utility.openEntityForm("account");
⑵打开新记录并设置默认值:Xrm.Utility.openEntityForm("account", null, parameters);
var parameters = {};
parameters["文本/十进制数"] = String;
parameters["数字/货币"] = Number;
parameters["两个选项"] = true/false;
parameters["选项集"] = Value;
parameters["时间和日期"] = "1/31/1990";
parameters["查找"] = ID;
parameters["查找name"] = Name;
parameters["查找type"] = EntityType(仅限系统自带客户/负责人字段);
⑶打开已有记录:Xrm.Utility.openEntityForm("account", "A85C0252-DF8B-E111-997C-00155D8A8410");

Xrm.Page.ui.getFormType() != 1 窗体不是创建状态

Xrm.Page.ui.setFormNotification('创建保存成功!', "INFO", "remind"); 通知

var object=new Object();
obj.new_type = { Value: "100000000" }; //picklist赋值
obj.new_contractno = { Id: "" +id + "", LogicalName: "" + Xrm.Page.data.entity.getEntityName() + "", Name: "1" };//lookup赋值

高级JS
1. Xrm.Page.context.getClient()
它是用来替代之前的 context.isOutlookClient() 接口的,返回值可能是 Browser 、Outlook或者Mobile之一。
2. Xrm.Page.data.refresh(save).then(successCallback, errorCallback)
用来异步刷新界面,可以保存当前修改且不需要重新载入页面。我们知道Dynamics CRM 2011 记录详情界面保存后后悔重新载入页面,现在Dynamics CRM 2013提供了新选择。
3. Xrm.Page.data.save().then(successCallback, errorCallback)
异步的保存对记录的更改,并在保存成功后调用回掉函数successCallback。
4. Xrm.Page.getAttribute(arg).getIsPartyList()
返回查找字段是不是参与方列表,比如活动的必须方字段就是,我们新建的客制化实体目前是的查找字段是不能查找多个实体的,就不是参与方列表。
5. Xrm.Page.context.getUserName()
以前有getUserId(),要给查找实体是系统用户(SystemUser)的查找类型字段赋值为当前用户还真是有点麻烦,需要用ODATA查询下用户的主属性(姓名)的值才能赋值。当时我就在想,为啥没有getUserName()呢?哈哈,这不,想啥来啥,赞一个。我用代码 alert(Xrm.Page.context.getUserName()); 获取到的输出如下,正是当前用户的姓名。

5.Xrm.Page.data.entity.getPrimaryAttributeValue()
这个用来获取实体的主属性的值,主属性默认情况下就是解决方案前缀加上_name,比如new_name,示例代码是 alert(Xrm.Page.data.entity.getPrimaryAttributeValue());,结果如下:

6. Xrm.Page.ui.setFormNotification()
在Dynamics CRM 2011中,只有少部分地方系统有窗体通知,比如商机界面如果没有选择价目表会出现窗体提示,但是SDK中并没有提供自定义开发的时候如何设置窗体消息的方法,虽然网上有人说可以做到,毕竟官方没有公开支持嘛。一些用户也有这需求,因为总是弹出窗口来提示有时候挺烦人的。

到Dynamics CRM 2013时明确方便的支持了,示例代码是 Xrm.Page.ui.setFormNotification('窗体通知消息一错误', 'ERROR', 'D1ADCA8C-D70D-4A2E-A759-BA08FE8A221B'); ,效果如下图所示:

使用代码 Xrm.Page.ui.setFormNotification('窗体通知消息一警告', 'WARNING', 'D1ADCA8C-D70D-4A2E-A759-BA08FE8A221B'); 的效果如下图所示:

使用代码 Xrm.Page.ui.setFormNotification('窗体通知消息一信息', 'INFO', 'D1ADCA8C-D70D-4A2E-A759-BA08FE8A221B'); 的效果如下图所示:

当然,一次添加多个消息也是可以的,如下图所示。

这里会用到一个GUID的值,我一般使用Visual Studio自带的创建GUID工具即可。

7. Xrm.Page.ui.clearFormNotification(uniqueId)
清除参数指定的表单级别的消息。
8. Xrm.Page.getControl(arg).setNotification(message)
为指定的控件设置一个消息,能阻止窗体保存,是代替以前用alert方法弹出对话框提示错误信息的绝好替代方法。
9. Xrm.Page.getControl(arg).clearNotification()
清除为指定控件设置的消息。
10. Xrm.Utility.isActivityType(entityName)
传入实体的逻辑名称,判断boolean值告知是否是活动实体
11. Xrm.Utility.alertDialog(message,onCloseCallback)
显示一个消息,并在用户点击确定按钮后调用回调函数 onCloseCallback,请以后使用该函数代替window.alert。
12. Xrm.Utility.confirmDialog(message,yesCloseCallback,noCloseCallback)
显示一个确认对话框,当用户点击确定时调用函数yesCloseCallback,点击取消时调用函数noCloseCallback。
下面这个例子涵盖了前面几个函数:
function BtnOnClick() {
Xrm.Utility.confirmDialog('确定要继续操作吗?', function () {
Xrm.Page.getControl('new_name').setNotification('你点击了确定按钮!');
Xrm.Page.ui.clearFormNotification('D1ADCA8C-D70D-4A2E-A759-BA08FE8A221B');
}, function () {
Xrm.Utility.alertDialog('你点击了取消按钮', function () { });
});
}

CRM JS的更多相关文章

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

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

  2. Dynamics CRM JS的调试的弊端解决办法

    说道CRMJS的调试的博客,之前已经有人写过.很简单,和平常网站JS的调试过程大致相同. 但是Dynamics 中JS调试最麻烦的莫过于出错之后需要修改代码了.因为随着JS代码的修改,伴随着需要保存和 ...

  3. 调试CRM JS开发

    CRM 2013 的表单是一个IFrame,如果使用jquey来控制表单的话调试起来比较麻烦,如果直接使用浏览器(firefox)来开发和验证脚本可能会事半功倍. 首页列表页主窗体:var table ...

  4. Dynamices CRM JS 类库 神器 XrmServiceToolkit - A Microsoft Dynamics CRM 2011 & CRM 2013 JavaScript Library

    XrmServiceToolkit - A Microsoft Dynamics CRM 2011 & CRM 2013 JavaScript Library http://xrmservic ...

  5. Dynamics CRM - js中用webapi基于fetchxml查询遇到的问题 -- Invalid URI: The Uri scheme is too long.

    最近用WebApi做基于Fetchxml的查询的时候,遇到一个很蛋疼的报错:Invalid URI: The Uri scheme is too long. 检查了整个URL,也没发现有什么问题. - ...

  6. CRM JS 设置lookup字段 setSimpleLookupValue

    function setSimpleLookupValue(LookupId, Type, Id, Name) { /// <summary> /// Sets the value for ...

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

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

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

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

  9. Dynamic CRM 2015学习笔记(3)oData 查询方法及GUID值比较

    本文将比较二种查询字符串在同一个oData查询方法中的不同,另外,还将介绍如何比较不同方法返回的GUID的值. 用同一个oData查询方法,如果传入查询的字符串不一样,返回结果的格式竟然完全不一样. ...

随机推荐

  1. odoo开发笔记 -- 搜索视图继承扩展

    odoo开发笔记 -- 搜索视图继承扩展

  2. 关于微信JS SDK接口wx.previewImage预览接口的使用

    然后后之前的项目,突然往微信上迁移了,一些微信的接口没怎么用过,比较陌生,这次的功能是想调用微信的接口,实现图片放大的功能, 就找到官方文档:http://qydev.weixin.qq.com/wi ...

  3. 原生js实现vue组件功能

    在如今VUE盛行的情况下,我们一直在惊叹于VUE的组件的功能,却不知道,原生js早就已经支持了这个功能. 最近在公开课学到的,js还有很多很多需要探索学习. 下面是一个简单的例子 <!DOCTY ...

  4. [java初探外篇]__关于StringBuilder类与String类的区别

    前言 我们前面学习到String类的相关知识,知道了它是一个字符串类,并且了解到其中的一些方法,但是当时并没有太过注意到String类的特点,今天就StringBuilder类的学习来比较一下两者的区 ...

  5. PostgreSQL 数据类型

    数值类型 数值类型由两个字节,4字节和8字节的整数,4字节和8字节的浮点数和可选精度的小数.下表列出了可用的类型. www.yiibai.com Name Storage Size Descripti ...

  6. 自己动手实现java数据结构(三) 栈

    1.栈的介绍 在许多算法设计中都需要一种"先进后出(First Input Last Output)"的数据结构,因而一种被称为"栈"的数据结构被抽象了出来. ...

  7. xmldocument内嵌入另一个xmldocument,xmlnode的方法

    string xmlstr1 = @"<root><head>myHead</head><body></body></roo ...

  8. 多模块拆分时 DepencyManagement 与 Dependencys区别

    1.DepencyManagement dependencyManagement让子项目中引用一个依赖而不用显示的列出版本号.Maven会沿着父子层次向上走,直到找到一个拥有dependencyMan ...

  9. PHP 九九乘法表的4种表达方式

    九九乘法表的四种不同表现形式 x轴对称: //第一种 for($i=1;$i<=9;$i++){ for($j=1;$j<=$i;$j++) { echo $i.'x'.$j.'='.$i ...

  10. [PHP] 算法-原址排序数组使奇数位于偶数前面的PHP实现

    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 1.遍历数组,判断元素奇数偶数 ...