根据官方的建议,在表单界面使用OData终结点最好使用REST版本,而不是jQuery版本,所以我这个示例是按照官方的建议来做的。

因为我的JavaScript水平不怎么高,我就直接利用SDK里面的示例辅助JavaScript类库吧。这个类库的位置在 SDK\SampleCode\JS\RESTEndpoint\JavaScriptRESTDataOperations \JavaScriptRESTDataOperations\Scripts。

我将这个文件夹下面的 SDK.REST.js 和 json2.js 作为Web 资源上传到CRM中,如下图所示:

Dynamics CRM 客户端程序开发:根据主键使用OData获取记录的值 - 罗勇 - 罗勇的博客

 

Dynamics CRM 客户端程序开发:根据主键使用OData获取记录的值 - 罗勇 - 罗勇的博客

 

然后还需要将这两个Web资源添加到实体的窗体中,以便能够利用其功能,这个动作就和做网页开发时候通过Script标签引入js文件差不多。我这里是将这两个web资源添加到测试实体的主要窗体中。

Dynamics CRM 客户端程序开发:根据主键使用OData获取记录的值 - 罗勇 - 罗勇的博客

 
我这里使用DynamicsXRMTools这个解决方案来构造OData查询语句,这个工具的介绍请参考我前面的博文:Dynamics CRM 客户端程序开发:常用工具介绍之Dynamics XRM Tools  。

打开DynamicsXRMTools这个解决方案,选择 OData Query Designer这个tabpage,然后点击 Designer,在Select Entity Set中选择合适的实体,我这里选择的时new_Test2013这个实体,注意实体架构名称后会自动加上Set供你选择。在Filter Criteria中选择和输入合适的查询条件,因为我这里是使用主键来查询,所以列我就选择 测试实体,运算符我选择Equals,就是中文等于的意思,后面我输入一条记录的 guid。这个步骤相当于写SQL的选择表和确定Where条件。

Dynamics CRM 客户端程序开发:根据主键使用OData获取记录的值 - 罗勇 - 罗勇的博客

 

下面我们来确定选择的列,拉动垂直滚动条,找到Entity Attributes这个tabpage,将你要查询的列打勾,右边的Order by Criteria是排序的意思,我这里是查询一条记录就没有必要排序了。

Dynamics CRM 客户端程序开发:根据主键使用OData获取记录的值 - 罗勇 - 罗勇的博客


然后拉动滚动条到上面,点击Generate按钮,就会生成OData查询字符串。我这里生成的是

https://demo.luoyong.me:446/xrmservices/2011/OrganizationData.svc/new_Test2013Set?$select=new_Test2013Id,new_Lookup,new_SingleLine,new_MultiLine,new_Float,new_Currency,new_TwoOptionSet,new_name,new_Datetime,new_Decimal,new_OptionSet,new_Integer,statecode,statuscode&$filter=new_Test2013Id eq guid'7881F7A4-6DCE-E311-80D9-00155D016705'

 注意select后面用的字段名是架构名称,而不是逻辑名称。

Dynamics CRM 客户端程序开发:根据主键使用OData获取记录的值 - 罗勇 - 罗勇的博客

 

我们可以将这个URL放到google chrome浏览器中打开(当然如果没有保留凭据的话会让你登陆),如下所示:

Dynamics CRM 客户端程序开发:根据主键使用OData获取记录的值 - 罗勇 - 罗勇的博客

 
能打开的话,也说明这个OData表达式是正确的,也可以从浏览器中看到各个字段的值。

下面我们在表单的onload事件中加一些代码,放在前面博文代码的后面,总体如下:

 

 
  

if (typeof (LuoYong) == "undefined")
{ LuoYong = { __namespace: true }; }
LuoYong.DemoScript = {
    OnLoadHandler: function () {
        if (Xrm.Page.ui.getFormType() == 1) {//新建记录
            //主属性,名称字段,只能是单行文本
            Xrm.Page.getAttribute("new_name").setValue("名称字段的值");
            //为单行文本字段赋值
            Xrm.Page.getAttribute("new_singleline").setValue("单行文本的值");
            //为两个选项字段赋值,只能赋值为true或者false
            Xrm.Page.getAttribute("new_twooptionset").setValue(true);
            //为选项集字段赋值,为整数,是选项集的存储值,不是显示值
            Xrm.Page.getAttribute("new_optionset").setValue(100000001);
            //为货币字段赋值,小数即可
            Xrm.Page.getAttribute("new_currency").setValue(100.5);
            //为浮点数字段赋值,小数即可
            Xrm.Page.getAttribute("new_float").setValue(101.5);
            //为十进制字段赋值,小数即可
            Xrm.Page.getAttribute("new_decimal").setValue(102.5);
            //为整数字段赋值
            Xrm.Page.getAttribute("new_integer").setValue(100);
            //为日期和时间字段赋值
            Xrm.Page.getAttribute("new_datetime").setValue(new Date());
            //为多行文本字段赋值
            Xrm.Page.getAttribute("new_multiline").setValue("多行文本字段的值多行文本字段的值多行文本字段的值多行文本字段的值多行文本字段的值");
            //为查找字段赋值
            var lookValue = new Array();
            lookValue[0] = new Object();
            lookValue[0].id = "F3A0BB75-F3AD-E311-80B4-00155D016705";
            lookValue[0].entityType = "account";
            lookValue[0].name = "A. Datum 公司 (示例)";
            Xrm.Page.getAttribute("new_lookup").setValue(lookValue);
            //利用新版本的alertDialog做提示
            Xrm.Utility.alertDialog("新建状态下为字段赋值完毕!", function () { });
        }
        //异步保存记录后查询该记录的值
        Xrm.Page.data.save().then(function successCallback() {
            SDK.REST.retrieveRecord(Xrm.Page.data.entity.getId(), "new_Test2013", "new_Test2013Id,new_Lookup,new_SingleLine,new_MultiLine,new_Float,new_Currency,new_TwoOptionSet,new_name,new_Datetime,new_Decimal,new_OptionSet,new_Integer,statecode,statuscode", null, function (retrivedData) {
                alert("异步保存记录成功,记录ID:" + retrivedData.new_Test2013Id);
                alert("查找字段字段:Id:" + retrivedData.new_Lookup.Id + ";LogicalName:" + retrivedData.new_Lookup.LogicalName + ";Name:" + retrivedData.new_Lookup.Name);
                alert("单行文本字段:" + retrivedData.new_SingleLine);
                alert("多行文本字段:" + retrivedData.new_MultiLine);
                alert("浮点数字段:" + retrivedData.new_Float);
                alert("货币字段:" + retrivedData.new_Currency.Value);
                alert("两个选项字段:" + retrivedData.new_TwoOptionSet);
                alert("名称字段:" + retrivedData.new_name);
                alert("日期时间字段:" + retrivedData.new_Datetime);
                alert("十进制数字段:" + retrivedData.new_Decimal);
                alert("选项集字段:" + retrivedData.new_OptionSet.Value);
                alert("整数字段:" + retrivedData.new_Integer);
                alert("状态字段:" + retrivedData.statecode.Value);
                alert("状态说明字段:" + retrivedData.statuscode.Value);
            }, function ErrorCallback(message) {
                alert("查询数据失败!" + message);
            });
        }, function errorCallback(errorMessage) {
            alert("异步保存记录失败,errorCode:" + errorMessage.errorCode + ";message:" + errorMessage.message + ";debugMessage:" + errorMessage.debugMessage);
        })
    }
}


 然后我们去测试下,新增一条记录。提示异步保存成功,提示截图如下:

Dynamics CRM 客户端程序开发:根据主键使用OData获取记录的值 - 罗勇 - 罗勇的博客

 

查找字段的值显示:

Dynamics CRM 客户端程序开发:根据主键使用OData获取记录的值 - 罗勇 - 罗勇的博客

  

货币字段的值显示:

Dynamics CRM 客户端程序开发:根据主键使用OData获取记录的值 - 罗勇 - 罗勇的博客

 

两个选项字段的值显示:

Dynamics CRM 客户端程序开发:根据主键使用OData获取记录的值 - 罗勇 - 罗勇的博客

 

 日期时间字段的值显示,可以看到自动转变换为用户所在的时区了。

Dynamics CRM 客户端程序开发:根据主键使用OData获取记录的值 - 罗勇 - 罗勇的博客

 

 选项集字段的值,注意只能获取到选项的存储值,这是个整数。

Dynamics CRM 客户端程序开发:根据主键使用OData获取记录的值 - 罗勇 - 罗勇的博客

 

每个新建实体都有的状态字段的值,它其实是一个选项集字段,显示出来的也是存储值,是整数。

Dynamics CRM 客户端程序开发:根据主键使用OData获取记录的值 - 罗勇 - 罗勇的博客


其余的字段没有什么特别之处就不截图了。