CRM JS

注意事项: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 () { });
});
}

原文地址:https://www.cnblogs.com/jayblog/p/9318354.html