You are browsing the archive for 2009 二月.

jBPM开发:实现一个简单的审批流程

二月 18, 2009 in Java开源

 

本文使用jBPM自带的身份认证组件模型来实现一个简单的审批流程,其中使用到的技术点在本文中暂且

不解释,就先来一个先睹为快,对jBPM最常用的功能有一个感性的认识,在后面的文章中慢慢解释各个技术点,

进一步的加深jBPM的应用。

 

1,数据准备

 

jBPM的身份认证组件基于以下几张表:

  1. JBPM_ID_GROUP:组模型的层次关系
  2. JBPM_ID_MEMBERSHIP:模型组下的成员关系
  3. JBPM_ID_USER:成员信息

 

为了进行展示,我们先创建一些基础数据来测试后面创建的审批工作流

1
2
3
4
5
6
7
8
9
10
11
12
13
insert into JBPM_ID_GROUP (ID_, CLASS_, NAME_, TYPE_, PARENT_)
values (1, 'G', '资源管理室', 'UM', 2);
 
insert into JBPM_ID_MEMBERSHIP (ID_, CLASS_, NAME_, ROLE_, USER_, GROUP_)
values (6, 'M', null, 'role_superadmin', 1, 1);
insert into JBPM_ID_MEMBERSHIP (ID_, CLASS_, NAME_, ROLE_, USER_, GROUP_)
values (7, 'M', null, 'departmentManager', 2, 1);
 
insert into JBPM_ID_USER (ID_, CLASS_, NAME_, EMAIL_, PASSWORD_)
values (1, 'A', 'aronehome1', 'arone.lijun@gmail.com', '111111');
insert into JBPM_ID_USER (ID_, CLASS_, NAME_, EMAIL_, PASSWORD_)
values (2, 'A', 'aronehome1', 'arone.lijun@gmail.com', '111111');
commit;

 

2,定义流程

 

使用jBPM的流程定义向导来创建一个新的流程定义

  1. 首先在src/java目录下创建java包结构com.hand.processes
  2. 启动jBPM流程定义向导定义流程:表达式审批流程
    Source Folder:jBPMDemo/src/java/com/hand/processes
    Process Name:expression_approve
  3. 选择左边工具面板中的图标,后点击右边的画布创建流程中的各节点
  4. 添加节点后使用 clip_image001 将各节点连接起来

 

完成后的效果如下图:

clip_image002

 

<<Task Node>>审批任务节点中,右键选择审批任务节点,添加一个任务,如下图:

clip_image002[6]

 

clip_image002[8]

 

Task Name:审批

Assignment Type:Expression

Assignment Expression:group(资源管理室)–>member(role_superadmin)

这个表达式利用了jBPM自带的身份组件模型,只要指定组的名称和角色的名称,jBPM会自动找出符合条件的用户,并为她们创建任务实例。

 

上面的审批流程说明流程启动之后就等待一个任务的执行,这个任务由组为:资源管理室,并且角色为:role_superadmin 的用户,

因此我们上面的数据中找到的用户就是aronehome,流程会等待aronehome这个用户的一个动作之后才会继续往下执行,否则一直处于等待状态。

 

 

3,发布流程到数据库

 

由于jBPM流程运行的时候,它是从数据库中读取相关的流程定义信息,因此开发完成流程之后需要先将流程定义信息发布到数据中。

在Myeclipse设计器中选择Deployment,选择本地保存方式,先将流程定义文件和图片打包为zip文件,选择如下图点击“Save Without Deploying…”按钮

clip_image002[10]

 

然后运行之前创建的“流程发布页面”:

http://localhost:7001/jbpmWeb/deploy.html

选择保存的zip文件,发布后可以到数据库中去验证流程是否成功。

1
SELECT * FROM jbpm_processdefinition WHERE name_ = '表达式审批流程';

 

 

4,启动jBPM流程

 

启动流程可以采用如下的两种方法

  1. 使用jBPM控制台管理页面来启动流程(操作步骤省略)
  2. 编写测试脚本来启动流程,主要的启动代码:
1
2
ProcessInstance processInstance = JbpmConfiguration.parseResource("jbpm.cfg.xml").createJbpmContext().newProcessInstance("表达式审批流程");
processInstance.signal();

 

 

5,查看流程执行图

 

先查询出流程中的任务实例ID(此SQL仅能用于开发中不严格的数据查询):

1
2
3
4
5
6
7
8
SELECT id_, name_, actorid_
  FROM jbpm_taskinstance
 WHERE token_ = (SELECT MAX(roottoken_)
                   FROM jbpm_processinstance
                  WHERE processdefinition_ =
                        (SELECT MAX(id_)
                           FROM jbpm_processdefinition
                          WHERE name_ = '表达式审批流程'));

 

运行之前创建的“流程执行情况查看页面”:

http://localhost:7001/jbpmWeb/showDiagram.jsp

输入上面SQL查询处理的taskinstance id,效果图如下:

clip_image002[12]

 

上图说明流程执行到审批这个任务节点,等待用户做出响应。

 

 

下一篇文章开始描述jBPM的主要组成。

 

 

jBPM开发:配置Eclipse IDE开发环境

二月 17, 2009 in Java开源

 

上文已经介绍了如何将jBPM Console应用发布到 Weblogic服务器,下面描述如何配置 Eclipse 开发环境,以提高后面jBPM开发的工作效率。

 

Jboss为jBPM提供了基于Eclipse的插件工具,因此开发人员可以使用原生的Eclipse IDE,也可以使用Myeclipse这样的集成工具。

本人使用Myeclispe作为开发工具,因此本文基于Myeclipse作为配置的环境

 

一、配置开发工具

 

1,安装Eclipse Designer到Myeclipse6

将jbpm-jpdl-suite-3.2.3/designer/eclipse/plugins目录下的文件及文件夹拷贝到myeclipse安装目录下的eclipse/plugins目录下之后,重起myeclipse即可

 

2,安装Eclipse Designer到Myeclipse7

首先是将jBPM设计器的插件,即jbpm-jpdl-suite-3.2.3/designer/eclipse/plugins目录下的文件及文件夹 拷贝到一个特定的目录,

如:D:\Genuitec\MyPlugins\jbpm-jpdl-designer-3.1.5;

后修改CreatePluginsConfig.java中的代码:new CreatePluginsConfig(“D:\\Genuitec\\MyPlugins\\jbpm-jpdl-designer-3.0.11″).print();

将路径修改为jBPM设计器插件的目录,并使用双斜杠(\\)代替单斜杠(\),运行它之后控制台会有结果输出。

之后将输出的结果拷贝添加到Myeclipse7安装目录下的configuration\org.eclipse.equinox.simpleconfigurator\bundles.info文件中

以clean的方式启动Myeclipse,命令:myeclipse.exe –clean

CreatePluginsConfig请参考前面的博文MyEclipse7下安装插件

 

3,添加jBPM设计和运行环境

启动myeclipse之后,通过windows –> Preferences –> JBoss jBPM添加jBPM运行环境,路径指向jbpm-jpdl-suite-3.2.3的位置。

clip_image002

 

 

二、配置开发环境

 

1,创建jBPM流程项目

安装jBPM设计器之后,可以在myeclipse新建向导中找到JBoss jBPM –> Process Project ,根据向导创建一个jBPM流程项目。

创建之后的jBPM项目结构如下:

clip_image002[6]

 

2,修改数据库连接信息

修改hibernate.cfg.xml文件中关于数据库连接的信息,可以根据实际情况选择其中的一种连接方式:JDBC Driver和JNDI DataSource。

JDBC Driver的方式:

1
2
3
4
5
org.hibernate.dialect.Oracle9Dialect
oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:@localhost:1521:xe
gdcms
gdcms1

JNDI DataSource方式:

1
java:comp/env/jdbc/jbpmDB

采用JNDI的方式需要在Weblogic服务器上面定义DataSource。

 

3,添加jar库文件

路径:<项目> –> 属性 –> Java Build Path –> Libraries –> Add External JARs

添加如下的库文件:
ojdbc14.jar
c3p0-0.9.0.jar:如果hibernate.cfg.xml配置中启用c3p0连接池需要提供
hibernate3.jar
jbpm-webapp-3.1.2.jar

 

 

三、配置本地发布环境

 

在进行jBPM工作流开发的过程中,开发人员可以在jBPM管理控制台中发布流程定义到数据库中;

也可以通过在Myeclipse工具中配置web应用来发布流程定义。本节描述如何利用Myeclipse在开发环境

中配置web应用来发布流程定义以及查看执行的流程图。

 

1,创建Web项目

利用Myeclipse的Web Project新建向导创建一个Web项目。

clip_image002[8]

 

2,拷贝配置和tag库文件

将上面创建jBPM项目后并配置好的相关配置文件拷贝到新建的web应用项目下,需要将jBPM项目下src/config.files文件目录拷贝到web项目下

从下载的jBPM套件中将jbpm.tld文件拷贝到WEB-INF目录下

添加jar库文件,参考2.3

 

3,修改web.xml配置

jBPM上传流程文件的时候会将流程图(jpg)文件上传到数据库表jbpm_bytearray中,因此需要添加servlet来处理图片。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
	UploadServlet
	org.jbpm.webapp.servlet.UploadServlet
 
 
	ProcessImageServlet
	org.jbpm.webapp.servlet.ProcessImageServlet
 
 
	UploadServlet
	/upload
 
 
	ProcessImageServlet
	/processimage

 

4,添加weblogic.xml配置文件

添加weblogic.xml文件到WEB-INF目录下,主要内容包括:

1
2
3
4
 
		true
 
     /jbpmWeb

 

5,增加发布流程页面

在WebRoot路径下添加jBPM流程发布流程页面deploy.html,页面的代码如下:

?View Code HTML4STRICT
1
2
3
4
5
6
7
8
9
10
 
    <title>Deploy a Process Archive File</title>
 
 
    <h2>Let's Deploy a Process</h2>
    <form action="upload" enctype="multipart/form-data" method="post" />
      Select the file you want to upload : 
      <br>
 
    </form>

运行效果:

clip_image002[10]

 

6,增加流程执行情况查看页面

在WebRoot路径下添加jBPM流程运行页面showDiagram.jsp,只要流程运行之后,提供任务的实例ID就可以查询出流程执行情况,

并标记出停留在哪个任务节点上面,页面的代码如下:

?View Code HTML4STRICT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
 
 
 
 
 
<title>提供任务实例ID查询流程执行图</title>
 
 
 <form method="post" action="showDiagram.jsp">
	<p>
		Task Instance ID: <br>
 
	</p>
</form>

效果图:

clip_image002[12]

 

 

下一篇文章就正式进入jBPM工作流的开发。

 

Myeclipse工程项目文件:Download Oracle EBS二次开发系列视频教程之在Oracle EBS中注册Form和Function(5) Version 1

 

jBPM开发:基于Oracle发布 jBPM Console 到Weblogic 10.3

二月 16, 2009 in Oracle 融合中间件

 

从今天开始,将介绍一些本人在项目中使用的开源工作流引擎jBPM的开发笔记,关于jBPM的介绍网上很多,我就不罗嗦了。

 

网上关于jBPM控制台发布到Weblogic10.3的内容比较少,我在开始配置的时候也遇到了很多问题,

同时得到了同事hall.hu大侠的指点才顺利将jbpm-jpdl-suite-3.2.3控制台发布成功,因此本文先从配置jBPM管理控制台开始工作流开发之旅。

 

一、前提条件

 

1,下载jbpm-jpdl-suite-3.2.3程序包,并解压文件到一个文件夹,如jbpm-jpdl-suite-3.2.3

2,准备好数据库系统,本文基于Oracle 10 Express Edition,创建如下的数据库用户aronehome:

1
2
3
create user aronehome identified by aronehome;
grant resource to aronehome;
grant create session to aronehome;

3,安装Weblogic10.3

从OTN网站下载安装程序,按照向导安装,详细步骤可以参考本博客的相关文章

 

 

二、设置数据库

 

1,创建jBPM数据库对象

由于jBPM的流程定义信息以及流程执行相关的信息都保存在数据库中,因此需要先创建jBPM需要的数据库对象,

使用SQL*Plus工具运行 jbpm-jpdl-suite-3.2.3/db/jbpm.jpdl.oracle.sql 脚本文件来创建jBPM的数据库对象。

 

2,定义JDBC数据源

由于web.xmlhibernate.cfg.xml 中使用了JNDI的数据源连接,JNDI的名称为:jdbc/JbpmDataSource

因此在发布应用之前需要在Weblogic服务器上创建数据源,数据源使用上面创建的数据库用户aronehome连接到数据库,详细步骤可以参考本博客的相关文章。

 

 

三、添加依赖库

 

将如下的jar库文件打包到deploy/jbpm-console.war文件中的WEB-INF/lib目录中

  1. antlr-2.7.6.jar
  2. cglib-nodep-2.1_3.jar
  3. common-logging-1.1.jar
  4. dom4j-1.6.1.jar
  5. hibernate3.jar
  6. jsf-api.jar
  7. jsf-impl.jar
  8. jstl-1.2.jar

可以使用winrar之类的工具来操作

 

 

四、修改配置文件内容

 

1,修改hibernate.xfg.xml配置

由于jbpm-console.war包中默认使用的是HSQL数据库,现在需要连接Oracle,需要修改SQL方言配置,将WEB-INF/classes/hibernate.cfg.xml中的

1
2
3
org.hibernate.dialect.HSQLDialect
修改为:
org.hibernate.dialect.Oracle10gDialect&nbsp;

 

2,创建weblogic.xml文件 

jBPM Console应用启用了jaas安全性的控制,需要在weblogic.xml文件中进行必要配置,配置中将角色分配给成员组,使组成员具备默写角色。

1
2
3
4
5
6
7
8
9
10
11
12
 
 
 
		user
		adminGroup
 
 
		admin
		adminGroup
 
 
	true

 

使用上面的配置内容创建weblogic.xml文件,并将它打包到deploy/jbpm-console.war文件中的WEB-INF/目录中,简单的方法是使用winrar这样的工具直接将文件拖进去。

上面的配置是将user和admin这两个角色都分配给adminGroup这个组,那么只要是adminGroup这个组的成员都具备了user和admin的角色。

prefer-web-inf-classes 元素指定了应用首先装载WEB-INF目录下的库,而不是CLASSPATH中的库。

如果不添加此元素的配置,启动应用的时候会报出如下的错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
严重: Error in named query: GraphSession.findLatestProcessDefinitionQuery
org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [    
     select pd
     from org.jbpm.graph.def.ProcessDefinition as pd
     where pd.name = :name
     order by pd.version desc    
  ]
	at org.hibernate.hql.ast.HqlLexer.panic(HqlLexer.java:57)
	at antlr.CharScanner.setTokenObjectClass(CharScanner.java:340)
	at org.hibernate.hql.ast.HqlLexer.setTokenObjectClass(HqlLexer.java:31)
	at antlr.CharScanner.(CharScanner.java:51)
	at antlr.CharScanner.(CharScanner.java:60)
  ......
	at org.jbpm.JbpmContext.getJobSession(JbpmContext.java:563)
	at org.jbpm.job.executor.JobExecutorThread.acquireJobs(JobExecutorThread.java:112)
	at org.jbpm.job.executor.JobExecutorThread.run(JobExecutorThread.java:58)
2008-12-30 13:48:26 org.hibernate.impl.SessionFactoryImpl

 

五、配置Weblogic安全认证信息

 

由于jBPM控制台启用了安全认证,所以需要配置,否则无法登陆,登陆weblogic的管理界面,选择:

应用程序的安全设置 —> 安全领域 —> myrealm –> 用户和组

根据向导创建用户组:adminGroup

根据向导创建用户,如manager,并将其分配到adminGroup组中。

 

六、部署登陆jBPM控制台应用

 

登陆weblogic的管理界面,使用其中的应用部署向导,选择jbpm-console.war文件部署应用。

部署成功后登陆 http://localhost:7001/jbpm-console

使用上面Weblogic域中创建的用户manager登陆

clip_image002

 

 

至此jBPM控制台应用已经成功发布到Weblogic服务器,下面将介绍如何配置eclipse开发工具环境。

 

 

WebService系列:问题处理(Troubleshooting)

二月 14, 2009 in Oracle 融合中间件

 

 

WebService系列讲解PLSQL Web Service + OC4J 开发过程中遇到很多的问题,本文将一些常见的问题进行整理,以备后续查阅

这些问题的解决方案不一定是唯一的解决方法,参考的过程中请根据实际情况进行比较的筛选

 

1,OC4J运行Web Service:Missing <wsse:Security> in SOAP Header

原因:SOAP头中没有包括安全验证的信息,需要为请求的消息提供SOAP头信息

解决方案:实现IHeaderHandler接口的类,并赋给Soapclient30的实例;如果使用OC4J测试界面,选择必须的选项,让它包括头信息

 

2,VBA代理程序报错:解析SOAP头失败

背景:已经实现了IHeaderHandler接口,并赋给了Soapclient30的实例,同时OC4J服务器端没有报出任何错误,但是VBA代理程序报错:解析SOAP头失败

我遇到的原因:IHeaderHandler接口的实现类中IHeaderHandler_ReadHeader和IHeaderHandler_WillWriteHeaders函数没有返回True

解决方案:修改IHeaderHandler_ReadHeader和IHeaderHandler_WillWriteHeaders方法的返回值为True

 

3,OC4J运行Web Service:返回自定义Table类型报OWS-04005错误

原因:由于在JDeveloper中发布Web Services的时候没有包括自定义类型的实现类

解决方案:重新发布,选择需要的Java Class文件

 

4,PLSQL:传入Table参数多出一行空行

问题描述:传入的Table类型参数,传到PL/SQL端后,由于序列化的缘故,它会自动在Table后面添加一行空的记录因此在进行PL/SQL处理的时候,需要将Count减1。
                  否则很有可能报出不能插入Null的错误,当然这样的错误很有可能也是程序中没有提供必要的值,需要进行仔细的检查

解决方案:PLSQL程序中将PLSQL 记录表变量的数量减1

 

5,OC4J运行Web Service:Policy requires nonce

错误信息如下:ERROR OWS-04005 An error occurred for port: xxxx: oracle.j2ee.ws.common.soap.fault.SOAP11FaultException: Policy requires nonce.

原因:添加安全验证信息的时候有一个选项没有去掉(Nonce Required in Token/标记中所需的现时)

解决方案:修改Web Services的安全验证设置后重新发布或者在OC4J上面修改选项

 

6,OC4J运行Web Service:The security token could not be authenticated or authorized

原因:提供的安全验证用户名或者密码不正确,这个错误信息不属于程序的错误

解决方案:提供正确的信息,如果无法解决请找OC4J管理员协助

 

以上是我在实际的开发过程中遇到的一些关键问题!!!

 

WebService系列:Office VBA调用已安全性认证的Web Service

二月 14, 2009 in Oracle 融合中间件

 

上一篇文章中已经描述了如何生成 Office VBA 客户端代理程序来调用 Web Service,但是如果Web Service已

添加了安全性认证的话,仅仅使用MS Office2003 WebServices Tools工具产生的代理程序还不足以完成调用。

 

本文描述如何扩展Microsoft提供的SOAP Toolit中的IHeaderHandler接口来格式化SOAP Headers,进而实现

调用Web Service时提供必要的安全认证信息,本文只描述最基本的基于用户名口令认证方式。

 

一、编写安全认证的SOAP头信息

 

WebService系列:为WebService添加安全性一文中,当调用一个已添加安全验证的Web Service时,需要提供必要的验证信息,

验证信息包含在SOAP Header部分,本文的目标就是在VBA代理程序调用Web Service时,添加如下的SOAP Header信息到Web Service的请求消息中

1
2
3
4
5
 
 
 
               aronehome
               aronehome

 

在前面的文章中已经说明了VBA代理类主要完成的任务,其中就是初始化一个Soapclient30的实例,

而Soapclient30提供了一个属性HeaderHandler来接收实现IHeaderHandler接口的实现类。

而HeaderHandler对象定义了SOAP头如何读取和写入,下面就描述如何编写实现IHeaderHandler接口的VBA类模块 UserTokenAuthHelper 来返回一个OC4J Web Service能够识别的SOAP头信息。

下面是实现的类模块代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Option Explicit
 
Implements IHeaderHandler
 
Private Const XmlnsSoap As String = "http://schemas.xmlsoap.org/soap/envelope/"
Private Const SecurityXmlnsWsse As String = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
Private Const SecurityXmlns As String = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
Private Const SecurityXmlnsEnv As String = "http://schemas.xmlsoap.org/soap/envelope/"
Private Const UsernameTokenXmlnsWsse As String = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
Private Const UsernameTokenXmlns As String = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
Private Const WssePasswordType As String = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"
 
Private myUsernameToken As String
Private myPassword As String
Private myMustUnderstand As Integer
 
Public Property Let UsernameToken(ByVal pUsernameToken As String)
    myUsernameToken = pUsernameToken
End Property
 
Public Property Get UsernameToken() As String
    UsernameToken = myUsernameToken
End Property
 
Public Property Let Password(ByVal pPassword As String)
    myPassword = pPassword
End Property
 
Public Property Get Password() As String
    Password = myPassword
End Property
 
Public Property Let MustUnderstand(ByVal pMustUnderstand As Integer)
    myMustUnderstand = pMustUnderstand
End Property
 
Public Property Get MustUnderstand() As Integer
    MustUnderstand = myMustUnderstand
End Property
 
Private Function IHeaderHandler_ReadHeader(ByVal par_Reader As MSOSOAPLib30.ISoapReader, ByVal par_HeaderNode As MSXML2.IXMLDOMNode, ByVal par_Object As Object) As Boolean
    IHeaderHandler_ReadHeader = True
End Function
 
Private Function IHeaderHandler_WillWriteHeaders() As Boolean
    IHeaderHandler_WillWriteHeaders = True
End Function
 
Private Sub IHeaderHandler_WriteHeaders(ByVal par_ISoapSerializer As MSOSOAPLib30.ISoapSerializer, ByVal par_Object As Object)
    Dim tempHeaderDoc As String
    tempHeaderDoc = ""
    tempHeaderDoc = tempHeaderDoc &amp; " " _
                    &amp; "" _
    tempHeaderDoc = tempHeaderDoc &amp; " " _
                    &amp; "" &amp; myUsernameToken &amp; "" _
                    &amp; "" &amp; myPassword &amp; ""
    tempHeaderDoc = tempHeaderDoc &amp; "" _
                    &amp; "" _
                    &amp; ""
    par_ISoapSerializer.WriteXml tempHeaderDoc   
End Sub

上面的UserTokenAuthHelper类实现了按照OC4J的要求将安全验证需要的SOAP Header信息添加到请求消息中的功能

 

二、添加UserTokenAuthHelper实现类到Web Services代理类

 

上面已经实现了UserTokenAuthHelper类来添加SOAP Header信息,用于进行安全验证。只要修改MS Office2003 WebServices Tools生成的Web Services代理类,

将SOAP头信息传给消息即可,在代理类Class_Initialize()方法的最后添加如下的代码:

1
2
3
4
5
6
7
'用户认证
Dim objCurAuthHelper As UserTokenAuthHelper
Set objCurAuthHelper = New UserTokenAuthHelper
objCurAuthHelper.UsernameToken = "aronehome"
objCurAuthHelper.Password = "aronehome"
objCurAuthHelper.MustUnderstand = 1
Set sc_UserListInfo.HeaderHandler = objCurAuthHelper

 

在任何一个代理类都是相同的代码,只要根据实际代理类替换红色部分的Soapclient30变量就可以了。

 

再次运行VBA程序进行调试,提供正确的用户和密码,程序能够成功运行。上面代码中的用户名和密码直接写为aronehome/aronehome,根据情况进行修改,

最后将其修改为让用户录入的方式来提供,当然如果你提供错误的用户名或者密码,那Web Services返回的错误应该是:The security token could not be authenticated or authorized.

 

 

VBA客户端代理程序下载:Download TEMPLFLD_R11i Version 1