NC技巧知识积累

1、单据部分

NC开发涉及到的知识点多且琐碎,鉴于用友本身没有非常详细的文档且UAP平台本身的缺陷,造成我们开发人员经常会碰到许多莫名其妙的错误。解决这些错误又非常耗费时间和经历。因此,我个人总结了一些单据开发过程中的心得与大家共享,希望能对各位的开发产生帮助。

NC单据的开发分为以下几步:

1、建数据库表;

2、导入数据字典;

3、选择GUI界面类型;

4、绑定数据模型;

设置主子表

设置值对象关系

5、

6、定义表单程序的按钮;

选择系统预制按钮

建立自定义按钮并选择

7、定义业务动作脚本;

8、校验规则设定;

9、生成及部署代码;

下面对每步开发过程中可能会碰到的疑难问题做下总结。

1建数据库表:

1.1此步操作会在数据库中注册相应的节点信息。

1.2命名规范:

建议主表名称使用projectname_tablename_h,主表主键使用pk_tablename_h

建议子表名称使用projectname_tablename_b,子表主键使用pk_tablename_b

主表必须存在公司主键且公司主键必须使用pk_corp,数据库数据类型为CHAR(4)

单据必须有ts、dr字段,对应数据库数据类型分别为CHAR(19)、SMALLINT

下面是业务中用到的数据模型在数据库及NC中的对应模型:

业务模型

数据库模型

NC数据类型

主键型数据

CHAR(20)

String

pk_corp

CHAR(4)

String

Boolean类型

CHAR(1)

UFBoolean

日期类型

CHAR(10)

UFDate

时间类型(ts)

CHAR(19)

UFDateTime

dr

SMALLINT

Integer

整数型

INT

Integer

浮点型

DECIMAL(20,8)

UFDouble

普通字符串

VARCHAR(250)

String

1.3建PDM的时候要注意不要遗漏主键标志,否则会造成单据保存时莫名的错误

子表中必须包含主表主键,且名称必须同主表主键名称pk_tablename_h。

2导入数据字典:

2.1此步操作会将数据字典以大字段的形式保存入数据库中的数据字典表中。

2.2数据字典和单据模板中的字段并不是引用的关系,而是借助数据字典的内容自动生成的模板,因此数据字典变化不会引起单据模板变动,这点需要认知清楚。

2.3建议导入数据字典时导入到选定的目录里,不要放在根目录下。

2.4导入过程中如碰到点击下一步没有反应,请首先检查PDM中信息是否有问题,比如DataType是否还是<Undefined>之类的问题。

3选择GUI界面类型:

3.1此步操作未在数据库中储存关键性脚本,所有配置均用于生成框架代码。。

3.2卡片界面、列表界面、管理界面的UI继承的类不同,一般单据管理界面即可。

3.3如无审批流则建议使用基本档案单据。业务单据中必须另外包含以下字段:

单据主表:

名称

编码

数据库模型

公司主键

pk_corp

CHAR(4)

单据号

vbillno

CHAR(20)

数据权限

datalimit

CHAR(20)

制单人

voperatorid

CHAR(20)

制单日期

doperatordate

CHAR(10)

审批人

vapproveid

CHAR(20)

审批日期

dapprovedate

CHAR(10)

审核批语

vapprovenote

VARCHAR(250)

最后修改人

vrevisorid

CHAR(20)

最后修改日期

drevisedate

CHAR(10)

备注

vnote

VARCHAR(250)

单据类型

pk_billtype

CHAR(20)

单据状态

vbillstatus

SMALLINT

业务类型

pk_busitype

CHAR(20)

单据子表:

名称

编码

数据库模型

来源单据类型

vsourcebilltype

CHAR(20)

来源单据ID

vsourcebillid

CHAR(20)

来源单据行ID

vsourcebillrowid

CHAR(20)

上层单据类型

vlastbilltype

CHAR(20)

上层单据ID

vlastbillid

CHAR(20)

上层单据行ID

vlastbillrowid

CHAR(20)

4绑定数据模型:

4.1此步操作会在数据库dev_votable中注册VO的对应关系,但此部分信息与移植无太大关系。

4.2选择完主子表模型后如果子表关联主表主键名称处没有正常带出主表主键,则一般原因为子表中主表主键名称与主表中的主表主键不一致或主表中主键为设置为primarykey;

4.3第一次绑定数据模型后如果删除重做,则会出现“主表值对象类”中VO路径为灰色不能修改的情况,这是因为第一次注册的时候在dev_votable表中写入了信息,将此表中相关信息删除后重新打开即可;

由于整个UAP开发平台利用缓存处理的情况较多,如果暂时显示未生效,请重启客户端。

5使用表单设计器设计表单:

5.1此步操作中的所有信息均记录在数据库对应表中,与单据中代码无关。

5.2开启表头编辑公式:

在UI的initSelfData()方法中增加

this.getBillCardPanel().setAutoExecHeadEditFormula(true);

5.3开启卡片界面显示公式:

在Ctrl类里的isLoadCardFormula()方法返回值设置为true

5.4增加新页签时应当注意,新增的页签顺序总是在最后,增加时应提前整理好思路按照显示的顺序逐次添加页签。

的高级属性中的数据类型为小数型时,在参照类型处输入数字为控制小数点后位数。

BillItem的高级属性中的数据类型为参照型时,在参照类型处输入自定义参照需用<>括起来。

5.6BillItem的高级属性中的“关键字名”勿随意使用,只有在表体参照配置公式时才会用到。

5.7保存按钮旁的生成其他模板功能为我们制作报表提供了极大的便利。由于报表模板生成工具操作不够直观化,制作报表的过程推荐使用配置单据模板然后生成报表模板的形式。

6定义表单程序的按钮:

6.1此步操作未在数据库中储存关键性脚本,所有配置均用于生成框架代码。

6.2建议在“单据的所有按钮”中将所有可能用到按钮都加进去,在“列表/卡片状态选择的按钮”中只选择当前需要的按钮,方便以后拓展。

6.3使用“删除”按钮时需在“单据的所有按钮”中同时选出“作废”按钮。

7定义业务动作脚本:

7.1此步操作未在数据库中储存关键性脚本,所有配置均用于生成框架代码。

7.2业务动作脚本生成在modules\模块名\META-INF\VAR\source下,在数据库中并未保存。生成代码时需同时把此部分代码导入项目工程的private包中的nc.bs.pub.action目录下,并在部署上线时一起移植。

7.3如果要修改业务动作脚本,业务动作脚本在修改后不能马上体现修改的内容。这时修改的内容已经成功提交,但由于NC中间件的问题需重启中间件才能显示出修改的内容。

8校验规则设定:

8.1此步操作未在数据库中储存关键性脚本,所有配置均用于生成框架代码。

8.2在此步最后保存时如果报ORA-01400错误时,如下:

这是由于PDM中未设置主键造成的,UAP在第二步选择VO时会自动检测PDM中的主键列,出以上错误时,子表关联主表主键名称应该也是空的,如下:

问题原因同绑定数据模型时。

9生成及部署代码:

9.1请不要完全相信UAP生成代码中的VO类,有时候没有问题的PDM是会生成出确实参数的VO类的。如果单据保存、主子表联动等出现问题却始终找不到问题原因,那么试着分析下对应的VO类是否存在问题。

10NC知识总结:

10.1代码结构:

在开发中遇到没做过的功能主要靠经验去找,这时候我们必须理解框架,才能快速定位到想找的东西。

首先我们应该明确的一点就是,类似卡片界面下表头和表尾中每个Item对象的展现形式,在NC中是通过BillItem实现的。而类似卡片界面下的表体及整个列表界面的展现形式与BillItem是不同的,数据是承载在BillModel里的。

下面是UI中几个比较关键的内容的介绍:

BillCardPanel是界面类和边界类。它以卡片的形式提供单据的界面,并作为模板的边界类,封装了单据模板的数据和逻辑,提供了访问单据格式和数据的属性和方法。

BillListPanel和BillCardPanel一样,只是提供的列表形式的界面。

BillModel是一个实体类和控制类,具有维护列表数据的功能,用来维护卡片的表体数据(bodyModel),列表的表头和表体数据。因此如果要找表体内容的解决方案请先从BillModel这里入手,相反,如果是找表头的解决方案就不要在这里面费劲了。

BillItem是一个实体类和元素类。代表单据中的单个数据元素,负责卡片和列表中数据项的格式,卡片中表头和表尾数据。

BillData是一个实体类和集合类,用来维护BillItem的集合,以Hashtable的形式将BillItem组织成HeadItems,BodyItems,TailItems三组。

BillCardPanel可以访问BillModel和BillData等,同时BillCardPanel对象由其他各个对象逐层组装而成。

从上面的介绍我们可以看出,卡片界面下的表头和表体是使用的不同体制进行展现的,因此取数方式、显示编辑公式的运作原理甚至可处理的方法的数量都会有所不同,在开发中不要单纯的认为表头能实现的功能表体就一定能实现。

11开发过程中常见问题及解决办法:

11.1浏览器无法进入NC登录界面,浏览器有黄色叹号提示错误。

这主要是因为该系统用户的java权限造成的,需要手动在Java\jre1.5.0_07\lib\security\java.policy中添加如下代码:

grant{

permissionjava.security.AllPermission;

};

重新打开浏览器,问题解决。

11.2把制作完成的补丁文件部署到服务器上后,重启中间件。本地机器清理缓存,然后登录NC后,报VO错误。

首先代码部署后的编译过程是这样的:首先进行public的编译,然后利用public进行client的编译,其次利用public、client代码进行private的编译。

这个问题主要出在public端的VO类在进行了client端的编译后再进行private端的编译时产生了序列化不一致的问题。为了保证VO类的序列化一致,只需在VO类中加入privatestaticfinallongserialVersionUID=-8940196742313994740L;这样的声明代码即可。这个在Eclipse的默认设置中是会以黄叹号的形式显示在类名出,点击叹号Eclipse提示TheserializableclassXXXdoesnotdeclareastaticfinalserialVersionUIDfieldoftypelong,选择自动生成序列化代码即可让Eclipse自动生成代码。

我们进一步思考,之所以会出现序列化问题,原因在于public端的VO类在client端及private端均进行了调用,且未书写序列化代码。而在前台client端及后台private端均会调用到的VO类最主要的无非是接口用的前后台数据传输VO。因此,接口用到的VO类或接口中承载所涉及的VO类应保证其一定有序列化代码。另外,前后台均会用到的public端其他类均需对此类问题引起注意。

11.3使用UAP集成开发工具的“生成VO代码”功能时报错。

这个实际上是UAP平台的一个bug,当使用此工具时,如果未点击过“目标文件目录”、“作者名”,则有可能造成这两处内容读取失败。所以在使用时请确保至少点击一次“目标文件目录”和“作者名”后再点击确定按钮。

另外,由于“主表VO名称”处限制了名称的长度,如果遇到路径过长的VO类,请先起一个临时路径,导出后再进行重命名。

11.4将测试数据库的节点脚本移植入正式环境后,为何找不到对应位置的节点?

出现这种情况节点并未丢失。打开【二次开发工具】->【UAP集成开发工具】->【系统管理工具】->【自定义菜单】,点击“修改模块内结构”,会在“其他节点”中找到刚才导入的节点,通过调整位置可以将节点还原回原本位置。如果正式环境中原本没有做过节点位置的个性化调整,则直接使用“恢复默认结构”即可。

11.5在Eclipse中生成EJB时发现框中是空的,应当如何处理,如下:

这个问题一般是由于Eclipse所在项目代码中的.module文件或module.xml文件与当前引用的nchome\modules\模块名下的.module文件或module.xml文件中的<modulename="XXX">不一致造成的。比如大小写不一致。

Eclipse在每次启动的时候MDE插件都会自动将当前Eclipse里所有MDE项目的module与MDE指向的nchome中的modules进行匹配,如果在nchome中不存在该module信息,则会将项目中的module信息自动复制一份到nchome下,存在则不操作。因此如果当前MDE项目在建立后修改过模块名的话,需要注意项目中模块名与nchome中模块名是否一致。

11.6主子表单据录入完毕后发现无论选择哪条主表数据,子表数据显示的均为所有数据。

出现这种问题一般是由于子表的VO类中getParentPKFieldName()方法返回空值造成的,其应当返回主表主键编码所组成的字符串。

2、报表开发整理(付善飞张广臣)

1查询模板初始化返回类型,显示类型的值代表的意思

返回类型0表示编码1表示名称2表示主键

显示类型0表示编码1表示主键2表示名称

2在报表上添加自定义按钮

this.registerButton(newButtonObject("返回","返回",0),newIButtonActionAndState(){

//定义点击按钮事件处理方法

publicvoidexecute()throwsException{

//这里写事件方法

}

publicintisButtonAvailable(){

//当有数据的时候按钮可用

returnIButtonActionAndState.ENABLE_WHEN_HAS_DATA;

}});

3单据的全选全消方法

/**全选方法**/

protectedvoidonBoSelAll()throwsException{

//表头数据的行数

Introw=this.getPrintClientUI().getBillListPanel().getHeadBillModel().getRowCount();

BillModelheadModel=this.getPrintClientUI().getBillListPanel().getHeadBillModel();

for(intn=0;n<row;n++){

//设置表头每行的状态已选择

headModel.setRowState(n,BillModel.SELECTED);

}

//更新页面

this.getPrintClientUI().getBillListPanel().updateUI();

}

/**取消全选方法**/

protectedvoidonBoSelNone()throwsException{

//表头数据的行数

introw=this.getPrintClientUI().getBillListPanel().getHeadTable()

.getRowCount();

BillModelheadModel=this.getPrintClientUI().getBillListPanel()

.getHeadBillModel();

for(intn=0;n<row;n++){

//设置表头每行的状态未选择

headModel.setRowState(n,BillModel.UNSTATE);

}

//更新页面

this.getPrintClientUI().getBillListPanel().updateUI();

//更新按钮状态

this.getPrintClientUI().updateButton(button);

}

4获得单据的查询条件

ConditionVO[]vo=((HYQueryConditionDLG)getQueryUI()).getQryCondEditor()

.getGeneralCondtionVOs();

5报表隐藏某一列

getReportBase().hideColumn(列编码);

6报表某列可编辑

getReportBase().getBody_Item(列名).setEdit(true);

7更改报表模板列的名称

ColumnGroup[]colums=

((GroupableTableHeader)getReportBase().getBillTable().getTableHeader()).

getColumnGroups();//报表的所有列

colums[列的序号].setText(新名称);

8报表有关的参数设置

//设置是否显示小数列的千分位

getReportBase().setShowThMark(true);

//设置是否显示合计列

getReportBase().setTatolRowShow(true);

//设置不显示零

getReportBase().getBodyPanel().getRendererVO().setShowZeroLikeNull(true);

//设置是否显示行号

getReportBase().setRowNOShow(true);

//点击一行时,选中的是整体一行

getReportBase().getBillTable().setColumnSelectionAllowed(false);

//屏蔽表体中的右键菜单

getReportBase().setBodyMenuShow(false);

//负数是否显示红字

getReportBase().getBodyPanel().getRendererVO().setShowRed(true);

//负数是否显示符号

getReportBase().getBodyPanel().getRendererVO().setNegativeSign(true);

报表中,小数位数默认是两位,如果要修改,只能逐个子段进行修改

getReportBase().getBodyItem("msavenum").setDecimalDigits(4);

//设置不显示的按钮

//设置合计列

getReportBase().getBodyItem("nfcsl").setTatol(true);

//隐藏列

getReportBase().hideColumn(hideColumns);

//显示隐藏的列

getReportBase().showHiddenColumn(showColumns);

如果要隐藏查询条件面板,可以在报表的Ctrl类(继承nc.ui.trade.report.controller.IReportCtl)里,通过isShowCondition()返回false来设置

/**

*

*<P>此方法为覆盖父类方法

*<BR>是否显示查询条件面板,设置为false为不显示

*@return

*@seenc.ui.trade.report.controller.IReportCtl#isShowCondition()

*/

publicbooleanisShowCondition(){

returnfalse;

}

9报表的查询条件参照,如何多选?

在默认的情况下,报表的参照是不支持多选的。需要在代码里面控制一下。

将init方法,在初始化时加入即可。

publicvoidinit(){

UIRefPanedeptid=newUIRefPane();//自定义参照模板dept

this.deptid.setRefNodeName("部门档案");/*-=notranslate=-*/参照的名称

this.deptid.setReturnCode(false);//是否返回编码

this.deptid.setMultiSelectedEnabled(true);//是否多选

this.getQryDlg().setValueRef("dept",this.deptid);//给部门dept字段赋detpid参照

}

10常用的一些方法

CurTime.getCurrentTimeStampString();//获取ts

newSequenceGenerator().generate(pkcorp,num)//主键

FormulaParse;//服务器端公式解释器

3、打印模板、开发整理(张广臣付善飞)

1、打印模板的行高指的是什么?

打印模板的行高的单位是磅(1cm=28.6磅),列宽使用单位为1/10英寸(既1个单位为2.54mm)行高的单位和cm(厘米)可以这样转换:行高:1毫米=2.7682个单位1厘米=27.682个单位1个单位=0.3612毫米列宽:1毫米=0.4374个单位1厘米=4.374个单位1个单位=2.2862毫米像素

2、在套打信封时,邮政编码中间需要有空格,如何实现?

使用金额套打:_space_(String变量,int空格个数)函数

如_space_(tostring(h_postCode3),2),假设h_postCode3=100100

将h_postCode3转换为100100这种形式.每个数字之间空两个格。

3、如何实现一张凭证固定打5行,没有的用空行代替?

首先要把其他的行设成固定行,将场景设置为强制分页。场景通过设置“固定打印行数”,可以规定每页向下扩展的行数,以此决定每页打印的内容。

4、创建自定义纸张并应用于NC打印模板中

需要对NC的打印模板和打印服务器端进行配置

4.1打印服务器端配置

依次点击“开始/设置/打印机和传真”,在“打印机和传真”窗口中点击“文件/服务器属性”,打开“打印服务器属性”对话框

然后选中“创建新格式”复选框,并在“表格名”中输入“max”(名称可随意),在“纸张大小:”的“单位”中选择“英制”,“宽度”中输入“8.30”(自定义的宽度),“高度”中输入“22.00”(自定义的高度)。最后要点击“保存格式”按钮,保存该自定义的格式。该格式就可以在打印机属性的纸张中就有了自定义的格式了。

右击打印机图标,选择“属性”,弹出“属性”对话框。选择“设备设置”将牵引送纸,手动送纸,进纸器都设置为“max”(自定义的纸张)。

4.2打印模板配置

在NC模板编辑器下打开“页面设置”。选择“纸型”选项卡,单击打印机图标

,弹出选择打印机对话框,选择打印机,然后单击“确定”。

“纸型”选项卡下,在“纸型”下拉菜单,选择“max”(自定义纸型)

选择“页边距”选项卡,输入“左”“右”“上”“下”的边距。

5、如何对打印进行二次开发

5.1首先定义一个数据源对象,使其实现IDataSource接口

5.2拼装打印数据源

5.3打印入口处理

代码示例:

PrintEntrype=newPrintEntry(getBillUI());

//设置打印模板ID的查询条件

pe.setTemplateID(

getBillUI()._getCorp().getPrimaryKey(),

getBillUI()._getModuleCode(),

getBillUI()._getOperator(),

getBillUI().getBusinessType(),getBillUI().getNodeKey());

//如果分配了多个打印模板,可选择一个模板

pe.selectTemplate();

pe.beginBatchPrint();//开始批量打印

for(inti=0;i<pds.length;i++){

pe.setDataSource(pds[i]);//设置数据源

}

pe.endBatchPrint();//结束批量打印

//pe.preview();//预览

其中:pe是打印实体,pds是打印数据源数组

4、外部交换平台培训(孟建云姜文杰)

1、利用二次开发工具为自定义单据“报销单”开发集成功能。

1.1、问题描述

需要将外系统XML格式的单据数据集成至NC系统中来,但是目前NC系统没有集成报销单T1的功能,需要定制开发该功能。并且由于K系统的报销单格式与NC系统报销单的标准格式不一致,需要修改单据转换规则以使得K系统数据能正确导入。

1.2、外系统数据导入的一般步骤:

1.2.1、注册外部系统。

1.2.2、准备外系统数据。

1.2.3、配置辅助信息(可选)。

1.2.4、设置基础数据对照(可选)。

配置Servlet的URL地址。

利用客户端发送数据。

1.3、具体开发指导

单据插件信息注册

1.以公司(或者集团)身份登陆NC系统。

2.选择客户化>二次开发工具>UAP集成开发工具。

3.在UAP集成开发工具界面,点击UAP表单集成开发中心。

4.在UAP集成开发工具DeveloperWorkshop界面,选择演示二次开发系统>报销单管理。

5.在菜单栏,选择外部交换平台>插件开发。

6.在单据插件信息注册界面,在模块名输入框中输入demo。

7.在单据标识输入框中输入T1,在单据描述输入框中输入报销单,在业务操作下拉框中选择add,在导入范围下拉框中选择集团公司,在单据加锁级别下拉框中选择单据类型+公司(账簿)+流水号,在插件类名称输入框中输入nc.bs.demo.expensebill.T1Plugin。在选择VO类型单选按钮组中选择主子表,在主表名参照输入框中参照demo_expensebill,在子表名参照输入框中参照demo_expensedetail,在聚合VO名输入框中输入nc.vo.demo.expensebill.MyBillVO,在主表VO名输入框中输入nc.vo.demo.expensebill.DemoExpensebillVO,在子表VO名输入框中输入nc.vo.demo.expensebill.DemoExpensedetailVO。

8.点击下一步。

单据转换规则定义

9.在校验文件生成规则界面上,选择重新生成校验文件多选框。

10.点击下一步。

11.在校验&对照文件维护界面上,对自动生成的单据转换规则进行定义,主要工作:首先剔出每个记录中不需要的字段,然后修改每个字段的“最大长度”、“允许为空”、“需要参照的NC基础档案”三个属性值。不需要字段主要有记录本身的主键字段(如表头记录billhead的pk_expensebill、primaryKey等,表体记录billbody的pk_expensedetail、primaryKey等),对字段属性的修改需要参照该单据的单据模版(如表头记录billhead的字段pk_cusdoc参照客商档案,字段pk_deptmanager和pk_drawpsn参照人员档案,字段vctrldeptid参照部门档案,字段vapproveid和voperatorid参照操作员)。

表头记录billhead的pk_corp字段需要参照公司目录。

右击左树pk_corp节点,在弹出的菜单中,选择需要与接收方一致,在右表修改需要与接收方一致的值为是。

12.点击下一步,保存单据转换规则(校验文件)。

13.点击下一步,跳过样本数据预览界面。

14.点击下一步,跳过辅助信息规则配置界面。

(1)、手动加载界面:注意目标URL地址

配置Servlet的URL地址。将要发送至的帐套编码作为account属性值写入要发送到的Servlet的URL中(或者写入XML文件的头中),将接收公司和主体帐簿(如果带的话)的代码拼成接收方(接收公司编码@接收主体账簿编码)作为receiver属性写入要发送到的Servlet的URL中(或者XML文件的头中)。

前半部分指定目标地址和端口上的Servlet服务。

后半部分是URL参数,其优先级高于数据文档头属性。(可选)

(2)、自定义程序加载界面:

?还可以使用NC中PostFile类来进行发送

?还可以通过交换平台的后台任务来进行发送。(已经在预警平台注册)

插件代码编写和部署

15.在插件代码维护界面上,选择代码导出路径,不必选择包含导出代码多选按钮。

16.点击生成按钮,开始编辑插件类T1Plugin的代码。

17.在方法processBill(Object,UfinterfaceVO,XsysregisterVO)中,编写如下代码:

18.点击编译按钮,将.java文件编译成.class文件。

19.点击下一步。

20.点击下一步,跳过交换平台测试界面。

21.点击完成,跳过导出和插件相关的配置文件界面,退出集成开发向导。

修改单据转换规则

22.在NC主界面上,选择客户化>外部交换平台维护>交换规则定义。

23.在交换规则定义界面上,选择打开菜单。

24.在打开对话框上,在单据类型参照输入框中参照值T1。

25.在打开对话框上,点击确定按钮。

26.在左树右表的交换规则定义界面上,点击左树的交换文档节点,修改右表根标签值为expensebill。

27.在左树上,点击billhead节点,修改右表中外系统定义的表标签值为header。

28.在左树上,点击billbody节点,修改右表中外系统定义的表标签值为detail。

29.在左树上,双击billhead节点,打开billhead文件夹。

30.在左树上,点击pk_corp节点,修改右表中该字段在外系统中的名称为company。

31.在左树上,点击pk_cusdoc节点,修改右表中该字段在外系统中的名称为cusdoc。

32.在左树上,点击pk_deptmanager节点,修改右表中该字段在外系统中的名称为deptmanager。

33.在左树上,点击pk_drawpsn节点,修改右表中该字段在外系统中的名称为deptmanager。

34.在左树上,点击pk_billtype节点,修改右表中默认值为T1。

35.在菜单栏,选择另存为菜单。

36.在另存为对话框上,在外部系统参照输入框中参照值1101。

37.在另存为对话框上,点击确定按钮。

38.在NC主界面上,选择客户化>外部交换平台维护>手动加载界面。

39.在手动加载界面的数据文件目录中浏览输入报销单样本.xml文件所在的目录。

40.在数据文件列表中选中报销单样本.xml一行。

41.在菜单栏上,选择发送菜单。

42.查看发送回执文件,如果resultcode等于1的话,表示数据加载成功,否则,根据错误提示,修改单据转换规则、数据文档头属性值以及基础数据对照等配置信息。

43.如果数据加载成功,在NC主界面上,选择演示二次开发系统>报销单管理。

44.在报销单管理界面上,选择菜单栏的查询菜单。

45.在查询条件对话框上,点击确定按钮。

46.在报销单管理界面上,便会显示单据号为T1200612050001的一行数据。

2、外部交换平台服务端的文件目录:

pfxxtemp目录,存贮外部交换平台接受到的原始数据文件、转换翻译完毕的标准XML文件、传送失败的文件。

xmleditor目录,存放校验文件管理的样式文件,可不用考虑。

exportbills目录,存放外部交换平台发送给外系统的数据文件。

billdefine目录,存放所有需要交换的档案和单据的交换规则文件。

auxiregister目录,每个模块在这个目录下注册一个文件,文件的内容是模块所涉及单据的辅助信息格式。详细情况参考4.3节辅助信息项设置。

businessprocessor目录,每个模块在这个目录下注册一个文件,文件的内容是模块所涉及单据在外部交换平台的注册信息,如单据类型、业务插件类名称、业务操作、单据导入范围、单据加锁级别等。

billconfiginfo目录,每个模块在这个目录下注册一个文件,文件的内容是模块所涉及单据的基本信息,如表和VO对象名。详细内容参考4.1节注册单据相关信息。

sendurl.xml文件,定义了NC系统通过HTTP回发数据给外系统时的各种参数,如发送地址、业务操作、发送方、接受方、单据类型等等。

globalset.xml用于存放外部交换平台的全局参数,如默认帐套、单篇最大传输上限等。

3、异常问题总结

(1)交换环境初始化异常:不能识别的外部系统

在外部系统信息设置上没有注册该外部系统。需要在节点外部系统信息设置上增加一个外部系统信息。

(2)交换环境初始化异常:不能识别的接收公司

该公司不存在(未建账)或者xml头信息receiver的值不对。

相关推荐