接触过CRM2011的同学们肯定考虑过这样的一个问题,就是我们CRM系统中的那些实体能否通过外部开发工具,比如VS2010来获取呢?更深一步的说,我们能否获取Workflow实体的所有数据,然后在VS2010中,通过程序来执行获取数据的Workflow?答案是肯定的。经过整理,我把整个实现过程和大家分享下。

下图是我的CRM系统中定义的所有的工作流,那么我们可以在VS2010中通过一个DataGridView控件来绑定取出的这些数据。

(图1)

主要的实现代码及步骤如下:

第一步, 首先当然是要配置下参数,以便连接到我们的CRM Server,

我设置了如下几个重要的配置参数,

Static string _discoveryServer = @"crmServerName"; //这个是服务器的机器名

Static string _orgName = "OrganzaitonName"; // CRM的Organization名字

Static string _domain = "domainName"; //你的域名

Static string _username = "username"; //服务器用户名

Static string _password = "******"; //服务器密码

第二步,参数设置完毕之后,然后就要建立连接,代码如下

ServerConnection serverConnect = new ServerConnection();

ServerConnection.Configuration serverConfig = serverConnect.GetServerConfiguration(_discoveryServer, _orgName, _username, _password, _domain);

// connect to the Organization service.

// this statement is required to enable early-bound type support.

_serviceProxy = new OrganizationServiceProxy (serverConfig.OrganizationUri,

serverConfig.HomeRealmUri,

serverConfig.Credentials,

serverConfig.DeviceCredentials));

这个serverConfig.OrganizationUri取到的值是经过我处理的,他应该是这样的http://{服务器的机器名}/XRMServices/2011/Discovery.svc。

这里我写了一个单独的ServerConnection 类去调用我们设置的参数,当然我们设置的连接参数也可以作为一个单独的XML文件去配置,然后通过读取XML取得设置的参数。这儿为了方便,我就直接在代码里面定义死了。

好了,这样就建立好了我们的连接,需要说明的是,这里面我们用到了一个OrganizationServiceProxy 类,这个类的命名空间是通过引用我们第三方的Dll生成的。CRM SDK里面有提供这些DLL,我列举下主要用到的DLL(如下图),你们可以去网上下载。

(图2)

对应命名空间写法是:

Using Microsoft.Xrm.Sdk;

Using Microsoft.Xrm.Portal;

Using Microsoft.Xrm.Client;

第三步 ,连接建立成功后,我们当然要去取数据啦。下面的代码就是取出
CRM 中所有激活状态workflow 的数据列表,并显示在DataGridview中。

// Retrieve the workflow.

QueryExpression entityQuery = new QueryExpression("workflow");

entityQuery.ColumnSet = new ColumnSet (new String [] {"name", "workflowid", "primaryentity", "activeworkflowid" });

entityQuery.Criteria = new FilterExpression (LogicalOperator.And); //这个地方我们可以通过它的And条件去找出我们激活状态的workflow数据

entityQuery.Criteria.AddCondition ("parentworkflowid", ConditionOperator.Null, null);

entityQuery.Criteria.AddCondition ("activeworkflowid", ConditionOperator.NotNull, null); //既然是激活状态,设置搜索条件当然是activeworkflowid 不能是Null啦。

DataCollection<Entity> workFlowCollection = _serviceProxy.RetrieveMultiple (entityQuery).Entities;

DataTable dt = new DataTable ("temptable");

dt.Columns.Add ("ID", typeof(int));

dt.Columns.Add ("workflowid", typeof (string));

dt.Columns.Add ("name", typeof(string));

dt.Columns.Add ("primaryentity", typeof (string));

int i = 0;

foreach (Entity entity in workFlowCollection)

{

i = i + 1;

string name = entity ["name"].ToString ();

String id = entity ["workflowid"].ToString ();

string primaryentity = entity["primaryentity"].ToString ();

DataRow dr = dt.NewRow ();

dr ["ID"] = i;

dr ["workflowid"] = id;

dr ["name"] = name;

dr ["primaryentity"] = primaryentity;

dt.Rows.Add (dr);

}

//binding the workflow data.

dataGridView1.DataSource = dt;

好了实现绑定之后,我们执行这个方法的时候,自然会把CRM数据列表中的数据显示在DataGridView中啦。

执行结果如下,我只取了四个重要的字段:分别是我wokflowid,name,primaryentity。

取出数据的结果如下图所示。通过工作流的name我们不难和上面图1中我列出在CRM中看到的数据是一致的。

(图3)

下面我们再做件事情,就是当点击每一行时,能把这行Workflow关联的所有Entity的数据在新的DataGridView中显示出来。代码就不多写了。和取工作流所有数据的代码步骤一样的。只是Entity的name是我们Workflow中的primayentity值而已。

string entityObjectName = dataGridView1.Rows[e.RowIndex].Cells["primaryentity"].Value.ToString ();

然后把这个entity的名字传给QueryExpression对象就可以啦。

QueryExpression entityQuery = new QueryExpression (entityObjectName);

接下来的代码和取workflow是一样的。执行后将会把这条entity的所有数据都显示出来,结果如下图所示。

当我们选中名字是'Test3'的workflow时,关联的所有entity数据都显示了出来,这里我们要取的最重要的一个数据就是Entityid和workflowid,因为最后一步我们要执行这条记录的工作流。我们只需要传递两个参数就可以执行了。这两个参数就是Entityid和workflowid。

执行工作流的代码如下:

// Create an ExecuteWorkflow request.

ExecuteWorkflowRequest request = new ExecuteWorkflowRequest ()

{

WorkflowId = WorkflowId,

EntityId = EntityId

};

// execute the workflow.

ExecuteWorkflowResponse response = (ExecuteWorkflowResponse) _serviceProxy.Execute (request);

执行工作流得代码很简单,一个request传入两个参数,然后response就可以执行我们要的结果啦!

这儿我们执行刚才名字是'Test3'的workflow。

去CRM系统中查看执行记录发现,被工作流被执行了。

下图中2012年11月1日建立的日期记录就是刚被执行触发的。

大功告成!

转载于:https://www.cnblogs.com/csswuxi/archive/2012/11/02/2751314.html

VS2010中获取并调用CRM2011中的工作流相关推荐

  1. jsp中获取不到servlet中的ArrayList

    jsp中获取不到servlet中的ArrayList 错误原因: 因为servlet尽管将请求转发(重定向)到其他页面,但是仍会执行完请求转发后面的代码.jsp也是servlet所以也遵循这个原则! ...

  2. centOS6.5中部署java调用h2o中python包环境

    centOS6.5中部署java调用h2o中python包环境 升级centOS6.5中的python版本 6.5版本中自带了python2.6.6的环境,但对于使用h2o版本过低,建议升级至3.6或 ...

  3. java 拦截器响应中取所有参数,spring boot拦截器中获取request post请求中的参数

    最近有一个需要从拦截器中获取post请求的参数的需求,这里记录一下处理过程中出现的问题. 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取 ...

  4. android 6.0 log,android 6.0 logcat机制(二)logcat从logd中获取log保存到文件中

    一.设置保存log文件的路径 在手机刚开机的时候,会有类似如下命令执行 /system/bin/logcat -r 5120 -v threadtime -v usec -v printable -n ...

  5. android 6.0 logcat机制(二)logcat从logd中获取log保存到文件中

    这篇博客分析的是logcat是如何获取logd中的log,然后写入文件. 一.设置保存log文件的路径 在手机刚开机的时候,会有类似如下命令执行 /system/bin/logcat -r 5120 ...

  6. python中的模块调用_Python中模块互相调用的例子

    Python中模块互相调用容易出错,经常是在本地路径下工作正常,切换到其他路径来调用,就各种模块找不到了.解决方法是通过 __file__ 定位当前文件的真实路径,再通过 sys.path.appen ...

  7. 拦截器获取请求参数post_spring boot拦截器中获取request post请求中的参数

    最近有一个需要从拦截器中获取post请求的参数的需求,这里记录一下处理过程中出现的问题. 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取 ...

  8. java中函数的调用,java中如何调用函数

    java动态调用函数,Java 中使用动态代码,java函数调用,java中如何调用函数 如何在 Java 中调用 C 函数 宗薇 [期刊名称]<网络新媒体技术> [年(卷),期]2000 ...

  9. RecyclerView中获取item在屏幕中的绝对坐标

    本文为原创作品,转载请标明出处:https://blog.csdn.net/wjj1996825/article/details/80433143 需求分析:在项目中有时候我们用RecyclerVie ...

最新文章

  1. suse11 oracle11g 安装
  2. 深度学习已成强弩之末?Bengio等大牛NeurlPS2019上支招
  3. 开发日记-20190402
  4. 操作系统(十三)处理机调度的概念、层次
  5. ngrx心得体会总结
  6. echarts常用实例
  7. Linux内核很吊之 module_init解析 (下)【转】
  8. RFileWriteStream 写入汉字
  9. jzoj6065-[NOI2019模拟2019.3.18]One?One!【FFT】
  10. python中错误和异常处理
  11. css实现发光的input输入框
  12. 正则规则大全 JAVA
  13. 小程序短视频项目———上传短视频业务流程简介
  14. java 加载spring_spring的加载机制?
  15. OpenCV C++ 常用功能
  16. 原 python下DataFrame, Series, ndarray, list, dict, tuple的相互转换
  17. Waymo已经开始绘制亚特兰大地图数据,自动驾驶汽车路测地点又添新城
  18. 图片标注工具Labelme使用
  19. 小学阅读方法六种_小学数学阅读理解解题技巧,附常见的6种方法
  20. 线性代数-MIT 18.06-汇总

热门文章

  1. 辅助域控如何抢占角色(主域控已经down机不可恢复了)
  2. Oracle动态采样学习
  3. linux学习笔记四:安装lsusb
  4. _INTSIZEOF(n)解析
  5. 【原】使用Json作为Python和C#混合编程时对象转换的中间文件
  6. java 实现接口后重写方法报错
  7. 【转】ASP.NET中页面传值
  8. 国人的发明:鲁班语言
  9. 1.1.3 性能指标-速率 带宽 吞吐量
  10. Python中numpy数组的拼接、合并