NCV63数据导入技术红皮书概述Word格式文档下载.docx
- 文档编号:20189054
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:35
- 大小:284.28KB
NCV63数据导入技术红皮书概述Word格式文档下载.docx
《NCV63数据导入技术红皮书概述Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《NCV63数据导入技术红皮书概述Word格式文档下载.docx(35页珍藏版)》请在冰豆网上搜索。
4.1InputItemCreator类33
4.2InputItemGenerator类33
4.3DefInputItemGenerator类35
4.4Conversion类37
4.5VOConvertor类37
第一章前言
目前NC系统的很多档案(或单据)录入数据的方式一般是手工一条条的在界面上输入然后保存到数据库,如果遇到了稍微多一些的数据,用户必须重复完成同一个操作,这样使得用户会把大量的时间和精力放在导入过程上,这种导入方式效率很低,也违反了软件可以消除人类重复劳动的基本理念。
为了使实施人员、测试人员和用户能够提高数据录入的效率,从NC5.5开始特增加了数据导入功能。
通过该功能可以实现数据的批量录入,用户只需用事先准备好的数据文件进行导入而不必像原来那样重复的在界面输入和保存。
在批量导入期间,用户完全可以去做其他事情,只要最后来查看导入日志就可以知道数据导入的详细情况。
如果有出错的数据未能保存到数据库,可以根据日志中的错误信息修改该数据后进行二次导入,这样就可以节省大量手工录入的时间。
目前的可支持的数据文件格式为MicrosoftOfficeExcel的CSV格式,xlsx文件,xls文件
第二章数据导入功能总体设计
数据导入功能的展现形式是一个单独的功能结点(数据导入),作为一个工具来使用,凡是可导入的档案(或单据)都可以注册到该工具中(其UI类必须先实现相应接口),然后通过该工具对档案(或单据)进行数据导入操作。
2.1数据导入用例图
2.2数据导入的前台界面类图
nc.ui.trade.excelimport.ExcelImportUI类是导入工具的入口类。
该类中有一个ToftPanel用来引用待导入档案(或单据)的UI类对象,也就是说所有需要数据导入的档案(或单据)的UI类都必须是ToftPanel的子类。
在绘制档案(或单据)的界面时实际上是创建了一个档案(或单据)UI类对象,默认调用的是无参构造方法,所以这些档案(或单据)的UI类需要提供无参构造方法,否则会有异常。
(在该工具界面展现的待导入档案(或单据)的界面是没有按钮的,并且去除了其所有的界面事件监听器。
)
2.3术语定义
2.3.1格式文件
根据待导入的档案(或单据)而生成对应的excel格式文件,这个excel格式文件设定了数据的录入格式,用来存储待导入的数据。
可以自定义设定档案(或单据)的格式文件中的输入项,但是基本格式是不能变的。
输入项包括必输项和非必输项,必输项是会被自动强制选择的,而非必输项可以自定义设置。
2.3.2导入
通过解析格式文件中的数据,将这些数据保存到数据库中,导入过程中如果出现保存异常会有提示信息,导入结束之后会有日志。
2.4数据导入的设计思路
1,所有需要数据导入功能的档案(或单据)的UI类(即结点入口类)必须实现nc.itf.trade.excelimport.IImportableEditor接口。
2,通过输出的格式文件规范导入数据的格式,以便于进行数据的转换(即通信协议是底层程序已经确定的)。
IImportableEditor接口中的getInputItems方法用来返回档案(或单据)的所有输入项列表。
3,将格式文件中的数据解析后传到数据导入器中,数据导入器回调该数据所属档案(或单据)的UI类中所实现IImportableEditor的getImportableInfo方法来判断当前档案是否允许导入(如参数控制),如果可以导入则调用其addNew方法,然后调用其setValue方法,将一条数据正确设置到界面上,最后调用其save方法,进行保存数据操作,完成了和业务逻辑的衔接(这一步操作实际上模拟的是界面录入数据的过程)。
循环对导入的所有数据完成这个操作。
如果档案不允许导入则直接抛出异常给用户提示。
4,数据导入工具提供导入时的错误信息提示和日志功能,能够将调用各个档案(或单据)的保存方法时产生的业务异常信息实时的呈现给用户,同时还有这次导入过程的日志(包括界面日志和本地文件日志)。
5,档案(或单据)实现IImportableEditor接口之后,可通过向数据导入工具的注册文件夹中添加该档案(或单据)的注册信息,达到数据导入工具对该档案(或单据)的集成。
第三章实现数据导入节点开发流程
3.1接口介绍
想要实现数据导入的档案(或单据),其UI类(也就是对应结点的入口类)必须实现nc.itf.trade.excelimport.IImportableEditor接口。
该接口的方法如下:
/**
*返回档案的可导入性信息
*
*用于档案在导入之前的判断,信息中包含档案是否可导入和不可导入的原因
*/
publicImportableInfogetImportableInfo();
/**
*新增操作
*用于在档案或单据的UI界面上新增一条数据,使界面进入新增状态
publicvoidaddNew();
*将传入的对象的属性值设置到UI上
*@paramobj
*传入对象(一般为vo)
publicvoidsetValue(Objectobj);
*保存操作
*用于保存界面的数据,是衔接业务逻辑校验和数据库保存的方法
*在保存过程中产生的异常会抛给外层进行处理
*@throwsException
publicvoidsave()throwsException;
*取消操作
*用于导入数据保存时出错跳过该数据时调用
publicvoidcancel();
*为了导出格式文件而返回的导入项列表
publicList<
InputItem>
getInputItems();
3.2导出格式文件
导出格式文件时所调用的方法是:
publicList<
该方法返回档案(或单据)的输入项列表,InputItem接口是描述输入项的接口。
生成的格式文件的输入项名称行的第一列是程序解析CSV文件的信息,是该行所有输入项所在的页签名和对应编码列表,编码和名称是按顺序对应的。
如下图:
币种(单表体)
部门档案(单表头):
客商基本档案(主子表)
会计科目(非模板主子表)
档案(或单据)的UI类如何实现getInputItems方法?
根据档案(或单据)界面的创建方式可以分为两类:
3.2.1档案(或单据)界面使用了单据模板
这样的档案(或单据)UI类实现getInputItems方法时可以直接使用InputItemCreator工具类的getInputItems系列方法(见JAVADOC文档)来返回输入项列表。
该方法是以BillData作为参数的,能够自动生成模板上的输入项列表。
其页签名信息及编码名称信息和模板上控件的信息是对应的,在解析完数据文件后进行界面设值的时候,模板能够根据对应关系正确设值。
信息对应关系如下:
格式文件信息
单据模板信息
页签名(如bd_currtype、ADDR)
页签编码(bd_currtype、ADDR页签)
属性编码(如addrname)
项目主键(项目主键为addrname)
属性名称(如客商编码)
显示名称(显示名称为客商编码)
输出格式文件时的必输项也是根据单据模板上的“是否必输项”信息得到的。
注:
InputItemCreator.getInputItems方法对于模板上的输入项是有过滤的:
不显示的输入项是不会被放到导出的输入项列表中的。
3.2.2档案(或单据)界面没有使用单据模板
这样的档案(或单据)UI类实现getInputItems方法时可以使用InputItemGenerator工具类的相关方法(见JAVADOC文档)来返回输入项列表。
输入项的页签名信息、编码名称信息、以及其他属性的信息都需要实现者手工设定。
比如会计科目档案,它的UI类没有使用单据模板,因此必须手工设定输入项列表,采用硬编码的方式:
*返回表头"
基本信息"
输入项列表
privateList<
getBaseInfoInputItems(){
String[]itemsKeys={"
subjcode"
"
subjname"
engsubjname"
"
pk_subjtype"
cashbankflag"
remcode"
balanorient"
currency"
period"
sumprint_level"
incurflag"
balanflag"
bothorient"
innersubj"
unit"
sealflag"
"
outflag"
accremove"
ctlsystem"
};
String[]showNames={"
科目编码"
科目名称"
外文名称"
科目类型"
现金分类"
助记码"
科目方向"
默认币种"
有效期"
汇总打印级次"
发生额方向控制"
余额方向控制"
账簿余额双向显示"
内部交易科目"
计量单位"
封存"
表外科目"
是否核销科目"
受控系统"
String[]notNullItems={"
returnInputItemGenerator.getHeadInputItems(itemsKeys,showNames,
bd_accsubj"
notNullItems);
}
这里进行手工录入的时候一定要保证输入项编码和名称的对应关系,对是否必输项的设置支持通过编码或者名称来指定。
提供了输入项编码数组、输入项名称数组和必输项数组之后,通过调用InputItemGenerator的相关方法就可以生成输入项列表了。
3.2.2.1未使用单据模板档案的自定义项输入项的处理
未使用单据模板的档案如果有自定义项面板页签的时候,可以通过使用DefInputItemGenerator工具类的相关方法(见JAVADOC文档)来返回其自定义项页签输入项列表。
比如会计科目档案的自定义项页签输入项列表可以这样获得:
自定义项"
的输入项列表
privateList<
getDefPanelInputItems(){
returnDefInputItemGenerator.getHeadDefInputItems("
科目档案"
getPk_corp(),"
bd_accsubj_def"
);
}
DefInputItemGenerator类中的相关方法要求一个参数docName(String),这个参数必须是引用自定义项结点中对象名下的某个档案名称。
3.2.3特殊情况的处理
3.2.3.1改变输入项属性
因为数据导入工具在导出输入项时有一个过滤条件:
不显示或不可编辑的输入项不会被放到最终的输入项列表中。
如果由于特殊的业务逻辑,如某个输入项有时可编辑有时不可编辑,但是该输入项在模板上的设置是不可编辑的,那么就需要在档案(或单据)UI类实现的getInputItems方法中对这个特殊输入项进行特殊处理:
1,通过InputItemCreator工具根据单据模板生成最初输入项列表(此时列表中的输入项是所有可显示的输入项,包括不可编辑的)。
2,对该特殊的输入项使用InputItemImpl.getEquivalent方法生成等价的输入项实例对象InputItemImpl,它包含了原输入项的所有信息。
(注:
这是因为单据模板生成的输入项列表中的输入项实例所属类是内部类,无法调用其set方法,为此提供一个InputItem接口的公用实现InputItemImpl,由该类来负责对输入项对象的set操作。
3,将生成的等价输入项设为可编辑的,再将其替换最初输入项列表中的原输入项。
比如人员管理档案中的“部门”属性和“业务员编码”属性:
List<
items=InputItemCreator.getInputItems(
getBillCardPanel().getBillData(),false);
for(InputItemitem:
items){
//将"
部门"
设为不可为空,以便于后续的操作
if("
pk_deptdoc"
.equals(item.getItemKey())){
InputItemImplnewItem=InputItemImpl.getEquivalent(item);
newItem.setNotNull(true);
items.set(items.indexOf(item),newItem);
业务员编码"
设为可编辑,以便于后续的操作
clerkcode"
newItem.setEdit(true);
3.2.3.1.1“封存”类属性的处理
对于档案和单据界面中普遍存在的封存类属性(包括“是否封存”、“封存日期”等),一般的处理方式是:
根据“新增档案不可封存”的原则,在格式文件中不提供这类字段,也就是将这类字段设为不可编辑的。
例如:
getInputItems(){
List<
items=InputItemCreator.getInputItems(getBillData(),false);
processSpecialItems(items);
returnitems;
*处理列表中的特殊属性:
*1,将属性"
(页签存货管理信息"
是否封存"
)设为不可编辑
privatevoidprocessSpecialItems(List<
for(InputItemitem:
if("
newItem.setEdit(false);
items.set(items.indexOf(item),newItem);
}
}
3.2.3.2虚拟输入项
如果由于特殊的业务逻辑使得在导出格式文件时需要添加模板上不存在的(或不显示的)输入项,这时就需要构造虚拟输入项,并且将其添加到输入项列表中。
比如客商银行档案,因为客商银行档案必须有自己所属的客商基本档案,所以需要在其输入项列表中提供“客商编码”来绑定所属的客商基本档案,这个“客商编码”就是虚拟输入项,因为它在模板上是不存在。
代码如下:
/**
*返回输入项列表
*因为客商银行不可脱离客商基本档案单独存在
*所以在输入项列表中额外增加了"
客商编码"
属性(必输项)
*(客商编码+pk_corp能确定唯一的客商,而客商名称不可以)
*以便于客商银行在新增的时候有自己的所属客商
*
*@seenc.itf.trade.excelimport.IImportableEditor#getInputItems()
items=InputItemCreator.getInputItems(getBillData(),true);
addSpecialItems(items);
*为参数输入项列表添加特殊的输入项("
privatevoidaddSpecialItems(List<
if(items!
=null){
StringtabCode=items.get(0).getTabCode();
StringtabName=items.get(0).getTabName();
InputItemcustcode=InputItemGenerator.getHeadInputItem(
"
custcode"
0,"
tabCode,tabName,true);
items.add(custcode);
3.2.4格式文件中填写数据的约束
格式文件中第一行是表名和列名信息,在对应的列输入相应的数据,第一列是关键字信息,当档案(或单据)是主子表时才需要填写。
具体例子如下:
3.2.4.1单表体(代表档案:
币种)
文件中每一行数据代表一条币种信息
3.2.4.2单表头(代表档案:
部门档案)
文件中每一行数据代表一条部门档案信息
3.2.4.3主子表(代表档案:
客商基本档案)
主表信息在最上面的数据区,子表在下面的数据区。
数据区之间用一个空行来隔离,如果一条主表数据有多条子表数据可以在第一列为每条数据设置关键字,由关键字来确定主子表数据的对应关系。
如下图的编码是“qqq1”的客商(关键字为“1”)对应的发货地址是“q1”和“q2”(关键字为“1”)。
3.2.4.4录入数据的格式约定和注意事项
1,业务含义为“是否”的列(界面对应的控件是复选框)填写数据应为“是”“否”“Y”“N”“y”“n”。
2,界面对应的控件是下拉框的列对应的数据是下拉框中所显示的值。
3,界面对应的控件是参照的列对应的数据是参照中值的编码或者名称。
4,界面对应的控件是日期输入框的列对应的日期格式为“YYYY-MM-DD”或者“YYYY-MM”。
(如2008-01-01或2008-01)
3.3导入
3.3.1导入操作所使用的方法
publicImportableInfogetImportableInfo();
publicvoidaddNew();
publicvoidsetValue(Objectobj);
publicvoidsave()throwsException;
publicvoidcancel();
数据导入工具回调这些方法完成了对界面输入数据后保存的模拟,在调用这些方法之前,导入工具已经将数据文件进行了解析(解析由数据导入工具底层处理,无需实现类考虑),形成了相应的VO列表,然后循环调用以上方法,将所有的VO进行设值保存操作。
在数据导入工具回调这些方法之前会先调用getImportableInfo()方法来判断档案是否可导入,如果不可导入则将其不可导入的原因呈现给用户并且结束导入操作。
一般情况下,档案不可导入是因为系统参数的控制:
比如参数控制“客商档案不允许下级公司增加”,则登录状态为公司时是不能导入数据的。
具体实现如“客商管理档案”:
publicImportableInfogetImportableInfo(){
UFBooleancanImport=UFBoolean.FALSE;
//可导入
try{
canImport=SysInitBO_Client.getParaBoolean(getpk_corp(),"
BD002"
}catch(Exceptionex){
Logger.error(ex.getMessage(),ex);
returnnewImportableInfo(canImport.booleanValue(),
ImportableInfo.REASON);
3.3.2导入工具处理数据流程
数据导入工具对一个VO(及一条数据)的处理流程图如下:
3.3.2.1详细流程说明
1,调用的是addNew()方法,使得界面进入新增状态。
2,调用setValue(Object)方法,将VO的数据正确设到界面上。
3,调用save()进行保存操作,如果保存成功则对这条数据处理结束;
如果保存失败则根据用户的选择来进行下一步:
若选择在界面上修改数据后继续则调用save()方法,若选择跳过则调用cancel()方法。
4,将该数据保存到数据库中或者取消操作,该数据处理结束。
3.3.3具体方法的实现细节
这四个方法中除了setValue(Object)、save()方法,其他两个方法一般可以直接调用档案(或单据)UI类的事件处理类中对应的相关方法即可。
3.3.3.1setValue(Object)方法的实现细节
setValue(Object)方法是整个接口中实现起来最复杂的,需要仔细周密的考虑。
它的具体实现一般有两种情况:
1,档案(或单据)界面是单据模板做成的
(可调用单据模板的导入数据专用设值方法setImportBillValueVO)
2,档案(或单据)界面不是单据模板做成的
(转换为对应档案(或单据)的VO后再进行设值)
流程图如下所示:
如图所示第一步中的数据是导入工具根据
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NCV63 数据 导入 技术 红皮书 概述