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

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

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

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

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

我这里使用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条件。

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

然后拉动滚动条到上面,点击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后面用的字段名是架构名称,而不是逻辑名称。

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

能打开的话,也说明这个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);
        })
    }
}


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

查找字段的值显示:

货币字段的值显示:

两个选项字段的值显示:

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

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

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

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

时间: 2025-01-13 16:00:20

CRM 客户端程序开发:根据主键使用OData获取记录的值的相关文章

CRM 客户端程序开发:设置实体表单界面字段的值

为了方便演示,我这里新建一个实体,实体定义如下: 还为它定义了如下的自定义字段,每种可定义的类型都有,基本上都是使用默认设置: 并且修改了它的窗体类型为主要的窗体,使它新建记录的界面如下所示: 我这里用代码演示,新建记录的时候为每个字段设置默认值.代码当然是JavaScript代码,需要放到类型为JScript的Web资源中,上传到CRM中并发布,然后和事件挂钩,这样就可以执行了. 我打开以前新建的解决方案,右击 CrmPackge 项目下面的 WebResources 文件夹,选择 添加 >

CRM 客户端程序开发:获取表单界面上各种字段的值及其他属性

我们写程序常用的就是获取字段的值,对于不同的字段类型,通过getValue() 获取到的值如下,这个表摘自SDK中的 Xrm.Page.data.entity attribute (client-side reference) 章节. Attribute Type Return Type boolean Boolean datetime Date To get the string version of a date using the Microsoft Dynamics CRM user's

CRM 客户端程序开发:自定义系统标准按钮的可用性

一般是新建一个解决方案用于客制化命令栏和Ribbon区,我这里是新建了一个 RibbonEditor的解决方案,然后将你要修改的实体加入进来. 我这里是选择 报价单 实体,然后点击 确定 按钮. 在 CRM > 设置 > 解决方案页面 点击 自定义 图标. 选择前面建立的解决方案,然后点击 OK 按钮. 确保选择的选项卡是Command Bar,因为我这里要修改的实体是Dynamics CRM 2013版本中的更新的实体.在 ENTITIES 中选择你要修改的实体,上面部分就会更新成你选择实体

tcp客户端程序开发

https://www.cnblogs.com/python-No/ 话不多说,直接进入正题 一:客户端一共分为5大块: 1.创建客户端套接字 2.和服务端套接字建立连接 3.发送数据 4.接收发送 5.关闭客户端套接字 二:socket类的介绍 导入 socket 模块import socket 创建客户端 socket 对象socket.socket(AddressFamily, Type) send(data) 表示发送数据,data是二进制数据 recv(buffersize) 表示接收

.NET开发中主键关联外键的值

本人总结的3种: 1.根据前台获取的WID编号到后台去活动外键表数据返回,获取WName: 2.在实体类主键表Model中添加属性public string WName{get;set;},在前端获取Bll业务逻辑时加入Model.WName返回显示: 3.在sql语句中内联查询:sql="select a.*,b.WName from Goods a left join Category b on a.WID=b.WID"

关于hibernate查询视图时,相同主键的两条记录映射问题【已解决】

做项目中间遇到一个很诡异的问题: 有两个表:A和AHistory(A表记录删除后存入此表,A的历史表),当我复制一条记录到AHistory表时,此时A表和AHistory表两条记录id相同,后续通过修改操作将两表任意一条记录更新为不同的信息,但ID仍然相同:此时,如果用hibernate映射到实体类中时,想象中的应该是两个不同的实体类,拥有不同的属性等. 然而,当我在程序中查询这两条ID相同的记录后,所得到两个的hibernate映射实体类却完全相同. 通过此问题,才知道hibernate会将查

mybatis生成UUID主键,且获取当前新增的UUID主键

在平时业务需求中,有可能会需要当前新增对象的主键ID. 在此我对用UUID作为主键ID做了实验. 1 <selectKey keyProperty="user.userId" resultType="java.lang.String" order="BEFORE"> 2 select uuid() 3 </selectKey> keyProperty:selectKey子元素返回值将赋值到领域模型的哪个属性中. resul

微信小程序详细图文教程-10分钟完成微信小程序开发部署发布(3元获取腾讯云服务器带小程序支持系统)

很多朋友都认为微信小程序申请.部署.发布很难,需要很长时间. 实际上,微信和腾讯云同是腾讯产品,已经提供了10分钟(根据准备资源情况,已完成小程序申请认证)完成小程序开发.部署.发布的方式.当然,实现的是基础功能.但是,可以给学习者很便捷的体验和很好的启发. 不过,随着微信平台和云服务的发展,真担心,程序猿会失业! 目录 一.微信小程序申请 二.服务器设置(申请.部署.域名) 1.申请服务器 2.部署服务器 3.域名申请和配置 三.小程序发布 1.下载DEMO 2.下载开发工具并安装 3.配置参

oracle 如何获取表的主键列名,如何获取表的所有列名

获取表的主键列名 SQL  select   *   from   user_cons_columns     where   constraint_name   =   (select   constraint_name   from   user_constraints                 where   table_name   =   'BST_FAVORITE'  and   constraint_type   ='P'); 记住:表名要大写执行试试,该表所有主键都查出来了