[标签]软件使用,软件开发,U8,T3T6
用友和畅捷通软件与用友其他产品、外部第三方软件产品之间的数据交换问题,采用XML数据交换格式,为用户提供《企业应用集成(EAI)》工具。

根据我们为客户开发应用第三方软件实现数据交换的经验,本文主要介绍“Web Interface (ASP)”实现方法。
EAI实现数据交换主要步骤
一、定义“注册编码”与账套关联。
1、EAI接口设置
1.1 EAI基本设置
U8服务器:指向提供EAI服务的服务器,通常是U8系统服务器
EAI登录身份验证:在EAI服务器上操作EAI时的身份,操作导入、导出、交换等功能
EAI数据源:指定EAI元数据存放在哪一账套中。注意:通常不改变!
【EAI接口设置】

必须绑定“EAI数据源”(即,套账)
1.2 外部系统注册 EAI注册号关联账套号
系统编码(也称之为“注册编码”,本文统一称为EAI注册号)与账套关联。换言之,需要对多个账套操作,就设置多个EAI注册号。
在外部,直接使用EAI注册号对账套导入、导出、查询。
风险提示,得EAI注册号就可操作对应的账套!

1.3测验
浏览器地址栏输入并回车
http://EAI服务器名或IP/u8eai/import.asp
返回信息:正常

二、企业应用集成EAI
1、系统注册
与“外部系统注册”是一致的。【企业应用集成】

如果使用外部系统执行导入、导出、查询,至此设置完毕。
2、数据交换
2.1 数据映射
建立外部编码和名称与内部编码和名称对应关系,一对一,也可以多对一,即内部必须唯一。
导入导出设置:设置每个具体项目的导入、导出文件的存放路径及导出数据的过滤条件,在以后的数据交换时系统按照预设的条件进行操作。

2.2 数据交换
按“导入导出设置”导入导出。数据导入和导出工作的执行由数据交换功能完成,可以一次导入或导出多种数据类型。

比如,“执行”后,将2018-10-31凭证50号导出为xml文件,存放在“E:\EAI测试”文件夹
3、数据交换计划
可以设置数据交换的计划,以便实现在无人值守的情况下,系统按您预先设置的计划自动进行数据交换。
在使用EAI数据交换计划时必须先配置EAI接口设置。
3.1 数据交换计划设置
用户可以设置数据交换的计划,以便实现在无人值守的情况下,系统按您预先设置的计划自动进行数据交换。一个注册系统的一个数据类型可以设置多个计划。
您可根据按年、按月、按星期、按日等方式设置各计划的数据交换执行规则,且可设定数据交换时是否按照数据映射关系执行。

3.2 数据交换计划执行
数据交换计划执行功能用于执行用户已设置的数据交换计划,以便实现在无人值守的情况下,系统按您预先设置的计划自动进行数据交换。
三、EAI二次开发
1、EAI二次开发模式
1.1 【通过EAI工具】
在开始菜单中选择 用友U8企业应用集成(EAI)à企业应用集成,登录企业应用集成主界面。在这里可以将U8数据以标准XML文件的形式导出或将标准XML数据文件导入U8系统。二次开发程序员只需编写一个工具将标准XML数据文件进行适当转换写入外部系统或取出外部系统数据写成标准XML数据文件。(参考EAI安装目录\xml\Samples\下的例子)。
处理流程如下:

1.2 【本地调用EAI接口】
处理流程如下:

这种方式可根据开发者的需要批量处理或者实时处理。接口调用非常简单,简化了编程。开发者只需将标准数据传入接口。
类库:U8Distribute.DLL
ProgID:U8Distribute.iDistribute
VB代码示例:
Dim obj as Object
Dim strRet as string
Set Obj=CreateObject(U8Distribute.iDistribute)
strRet =obj. Process(sXml)
可以根据回执内容strRet对操作结果进行相应的处理。
传入参数sXml和返回结果strRet为标准XML数据串,具体格式后面会说明。
C#代码示例:
方法:String Process(String RequestXml)
参数:RequestXml?数据交换请求消息,详见数据交换格式定义。
返回值?数据交换Response消息,详见数据交换格式定义。
1.3 【远程调用EAI接口】
处理流程如下:

EAI远程数据交换采用XmlHttp POST的方式。接口为:
POST上传:数据交换请求消息与本地调用一样,详见数据交换格式定义。
Response接收:数据交换响应消息与本地调用一样,详见数据交换格式定义。
2、EAI数据交换格式】
2.1 数据交换消息总体格式
EAI数据交换消息格式分为框架和内容两部分:
<ufinterface sender="002" receiver="u8" roottag="epartment" proc="dd">
<department></department >
</ufinterface>
2.2 框架部分
如:
<ufinterface sender="002" receiver="u8" roottag="epartment" proc="add">
......
</ufinterface>
包含数据交换的控制信息,其中:
sender: 发送方,填外部系统注册码,简称EAI注册码
receiver: 接收方,填u8即可
roottag:数据类型,根据EAI\XML\Template目录中的数据交换模板文件填写
proc:数据交换的操作,分为add/edit/delete/query
2.3 内容部分
如: <department></department >
指消息中携带的档案或单据等业务数据。U8EAI提供了一整套完整的基本档案和单据的数据交换模版(在EAI\XML\Template目录下),模板中定义了消息内容部分的格式和字段。
Requset消息格式(执行导入导出操作后,返回的xml)
Request消息格式的框架部分同上所述,内容部分根据不同的操作有所不同:
对于add/edit操作,Request消息的内容就是档案和单据内容,具体格式详见数据模板。
对于delete/query操作, Request消息的内容包含过滤条件,条件格式如下:
<ufinterface sender="002" receiver="u8" roottag="department" proc="Query">
<department>
<field display="部门编码" name="cDepCode"operation="=" value=3" logic="" />
</department >
</ufinterface>
2.4 Response消息格式
Response消息是EAI接口执行Request消息之后的返回结果,不同的操作有所不同:
对于query操作, 返回的结果就是查询的数据,格式详见EAI数据模板。
对于add/edit/delete操作,返回的结果包括单据体每一行数据的详细执行结果(由Item节点描述),如下:
<ufinterface roottag="return" docid="823482692" proc="add">
<!-- key:单据表体行数据的编号,比如:销售订单表体的存货编码
succeed:成功或失败号,0为成功,其他值为失败
dsc:成功或失败的文字描述
-->
<item key="001" succeed="0" dsc=""/>
<item key="002" succeed="0" dsc=""/>
</ufinterface>
2.5 凭证的add操作的Response格式比较特殊:
<ufinterface roottag="voucheraddreturn" docid="" proc="add">
<item accounting_period="10" voucher_type="记" voucher_id="888" u8voucher_id="1138" entry_id="" succeed="0" dsc="凭证已成功保存" u8accounting_period="10" ></item>
</ufinterface>
voucher_id:外部系统原始凭证号;
u8voucher_id:U8生成的凭证号;
succeed:是否成功,0为成功,非零为失败;
accounting_period:会计期间;
voucher_type:凭证类别
3、开发代码参考
3.1 本地COM调用
VB代码:
Dim eaiBroker As Object
Set eaiBroker = CreateObject("U8Distribute.iDistribute") '创建EAI服务代理接口对象
Dim responseXml As String
responseXml = eaiBroker.Process(requestXml) '调用EAI服务代理的数据交换方法Process,传入Request交换消息, 并获取EAI返回的Response消息。
...'处理返回结果
Set eaiBroker =Nothing '释放EAI服务代理接口对象
.Net代码:
引用U8SOFT\EAI\U8Distribute.dll
U8Distribute.iDistributeClass eaiBroker = new U8Distribute.iDistributeClass(); //创建EAI服务代理接口对象
String responseXml = eaiBroker.Process(requestXml); //调用EAI服务代理的数据交换方法Process,传入Request交换消息 , 并获取EAI返回的Response消息。
...... //处理返回结果
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(eaiBroker); //释放EAI服务代理接口对象
JAVA代码:
采用JNI、JCOM、JACOB技术调用EAI服务代理COM组件,下面以JACOB为例:
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
class Test
{
public static void main(String[] args)
{
Dispatch eaiBroker = new Dispatch("U8Distribute.iDistribute"); //创建EAI服务代理接口对象
String responseXml = Dispatch.call(eaiBroker, "Process", new Variant(requestXml)); //调用EAI服务代理的数据交换方法Process,传入Request交换消息, 并获取EAI返回的Response消息。
...... //处理返回结果
}
}
3.2 HTTP远程调用
远程调用采用HTTP POST的方式上传Request消息。
VB代码:
Dim xmlhttp As Object
Set xmlhttp = CreateObject("MSXML2.XMLHTTP") '创建XMLHTTP对象
Call xmlhttp.open("POST", "http://u8appsrv/u8eai/import.asp", False) '使用XMLHTTP对象打开 网络连接,URL中的u8appsrv填U8应用服务器
xmlhttp.send requestXml '发送Request消息
Dim responseXml As String
responseXml = xmlhttp.responseText '获取返回Response消息
...处理返回结果
.Net代码:
引用D:\U8SOFT\Interop\Interop.MSXML2.dll
MSXML2.XMLHTTPClass xmlHttp = new MSXML2.XMLHTTPClass();
xmlHttp.open("POST", "http://localhost/u8eai/import.asp", false, null, null);
xmlHttp.send(dom.OuterXml);
String responseXml = xmlHttp.responseText;
...//处理返回结果
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xmlHttp); //COM释放
JAVA代码:
class Test
{
public static void main(String[] args)
{
URL url = new URL("http://localhost/u8eai/import.asp");
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setConnectTimeout(3000000);
con.setReadTimeout(3000000);
con.setDoInput(true);
con.setDoOutput(true);
con.setAllowUserInteraction(false);
con.setUseCaches(false);
con.setRequestMethod("POST");
con.setRequestProperty("Content-type","application/x-www-form-urlencoded");
//发送Request消息
OutputStream out = con.getOutputStream();
DataOutputStream dos = new DataOutputStream(this.out);
dos.write(requestXml.getBytes("UTF-8"));
//获取Response消息
InputStream in = con.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
StringBuilder sb = new StringBuilder();
String s = null;
while ((s = br.readLine()) != null) {
sb.append(s);
}
String responseXml = sb.toString();
}
}
4、EAI通用SQL查询接口
由于EAI接口返回的数据格式是固定的标准格式,很有可能返回的数据中没有用户所需要的字段;另外,对于U8中的业务数据,EAI接口也不是100%覆盖的。
针对以上情况,EAI提供了一个灵活的数据查询通用接口--EAI通用SQL查询接口,该接口支持向EAI数据交换代理传递SQL语句进行查询操作,可以查询当前U8帐套的所有数据,用户不用直接访问U8帐套库。查询返回的结果为.Net中的Dataset的XML格式的数据。调用该接口只需给EAI数据交换服务代理传递特殊的Request消息即可:
4.1 Request消息格式如下:
<ufinterface sender="001" receiver="u8" roottag="SQLEXE" proc="department" codeexchanged="n">
<sql value="select * from inventory"/>
</ufinterface>
其中内容部分<sql value=""/> 节点为SQL查询语句。
框架部分的roottag值必须固定为"SQLEXE" , proc的值用来标识Dataset的行节点,可以是任意字符串。
4.2 Response消息格式如下(Select语句输出表的xml格式):
<ufinterface sender="u8" receiver="002" roottag="SQLEXE" proc="department" request-roottag="SQLEXE">
<NewDataSet>
<department>
<cDepCode>1</cDepCode>
<bDepEnd>true</bDepEnd>
<cDepName>采购1部</cDepName>
</department>
<department>
<cDepCode>2</cDepCode>
<bDepEnd>true</bDepEnd>
<cDepName>销售1部</cDepName>
</department>
</NewDataSet>
</ufinterface>
根节点的proc的值用来标识Dataset的行节点,一般为表名。