NCV5自定义技术红皮书精Word格式.docx
《NCV5自定义技术红皮书精Word格式.docx》由会员分享,可在线阅读,更多相关《NCV5自定义技术红皮书精Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
提供预制脚本..............................................................................................73.2
删除以前版本中在bd_ref_relation表中预置的脚本......................................7第四章
自定义项使用后的显示......................................................81.
通用情况...................................................................................................82.
特殊情况和特殊需求...............................................................................83.
工具类设计...............................................................................................84.
工具类使用说明.......................................................................................94.1
卡片界面引用自定义项的显示:
..................................................................94.2
列表界面引用自定义项的显示....................................................................104.3
管理界面引用自定义项的显示....................................................................105.
使用举例.................................................................................................106.
特殊情况的处理.....................................................................................106.1
查找自定义项的引用情况...........................................................................106.2
初始化自定义项.........................................................................................106.3
显示引用了的自定义项...............................................................................11第五章
自定义项使用后的打印....................................................121.
统计型自定义项打印涉及的修改.........................................................122.
把统计型自定义项的主键翻译成名称的方法.....................................123.
使用举例.................................................................................................124.
类图.........................................................................................................13第六章
自定义项档案的升级API.................................................141.
API介绍.................................................................................................142.
本升级方案的前提.................................................................................143.
升级方案.................................................................................................143.1
普通情况的升级.........................................................................................143.2一张表中保存了两种或多种数据的单据或档案的升级.................................15
3.3自定义项字段与业务字段不在同一张表的情况下的升级..............................15
第七章
附录..................................................................................161.升级接口JAVADOC.............................................................................16
第一章前言
自定义项管理包括定义自定义项、引用自定义项及自定义项档案定义。
主要解决系统业务单据中已有项目不能满足实际需要时,可以在系统中设置自定义项,并在单据中引用。
较之以前版本,V5.0从效率和易用性上有比较大的改变,具体体现在如下几个方面:
●任何档案的自定义项都可以引用基本档案、自定义项档案。
例如:
存货管理档案的自定义项1可以引用自定义项档案、也可以引用任何基本档案(包括存货管理档案它自己)。
●档案或单据的自定义项使用后,如果使用的是统计性自定义项,则保存的都是被引用档案的主键。
存货的自定义项1引用了客商管理档案,则存货的自定义项1中保存的是客商管理档案的主键。
(以前保存的可能是主键、也有可能是名称)。
●自定义项引用节点的展现方式的改变。
我们提供了一些API或注册机制以帮助开发人员快速实现上述这些改变。
本文的目的是对这些API或者注册机制进行详细的描述,以供开发人员参考。
第二章自定义项引用节点展现
本章指的是自定项引用节点的界面展现方式的改变,着眼于实现V5的如下新需求:
修改该档案的展现方式。
完全列表的方式不便于应用,修改为左边是进行自定义项引用的对象树(都是平级的)(如果可能按照产品模块构造树),右侧是该对象包含的自定义项列表。
[需求条目:
B05090109][解决版本:
V5]
1.实现方式
为了实现自定义项引用的展现方式,并且“按照产品模块构造树”,决定在bd_defused表中增加一个字段fun_code,其数据类型是varchar(60。
用来存储某功能节点所属模块的功能节点号。
客商档案和存货档案都是数据客户话的基本档案,所以客商和存货的自定义项引用在bd_defused表中的预制数据的fun_code的值都是“1008”(基本档案的功能节点号是1008)
2.需要产品组配合的工作
2.1预制脚本
凡是在安装盘中对表bd_defused进行预制数据的脚本都需要修改,添加对该表新加字段fun_code的初始值,其值是功能节点所属模块的功能节点号。
原预制脚本:
insertintobd_defused(pk_defused,objcode,objname,defnum,freenum,pk_corp,ts,dr
values('
secent00000000000001'
'
secent'
结算中心'
20,0,null,'
2001-09-1713:
57:
39'
0
修改后预制脚本(由于“结算单位”是属于“基本档案”,其功能节点号是:
1008):
insertintobd_defused(pk_defused,objcode,objname,defnum,freenum,pk_corp,ts,dr,fun_codevalues('
0,’1008’
2.2程序中向bd_defused表中插入数据
现在只发现基本档案中的“项目档案”存在此种用法,如果还有其他产品组存在此种用法,请添加新加字段的预制值。
第三章自定义项引用校验
本章讲的自定义项引用的校验主要指如下两方面:
其一,自定义项引用节点修改某个自定义项的引用关系的校验:
客商档案的自定义项1引用了自定义项档案“明族”,并且在某条具体的客商档案数据中的自定项1保存了具体的某个民族(如:
汉族),如果在自定项档案中又想把客商档案的自定义1修改为自定义项档案“学历”,这就会在客商档案表中导致错误数据,所以要做此校验。
其二,就是删除校验。
1.V5以前版本自定义项引用的检查的注册机制及其存在的弊端
1.1自定义项引用节点修改某个自定义项的引用关系的校验:
以前版本中不管具体档案或单据中是否真正使用了该引用的自定义项,在自定义项引用节点中都没法修改该单据或档案的自定义项引用。
1.2删除校验
V5以前采用的是使用向表bd_ref_relation表中注册默认脚本的方式来实现的。
客商管理档案有30个自定义项(def1..def30),按照以前的做法,就往bd_ref_relation表中注册了30条语句,认为被引用表都是bd_defdoc。
这种默认注册机制存在以下弊端:
单据或档案自定义项引用后保存名称
这种情况下,以前的版本没有做引用检查。
客商的自定义项1引用了自定义项档案“民族”,某条具体客商记录中的def1保存了“汉族”这个民族自定义项档案内容的名称,则在删除自定义项档案“民族”的档案内容“汉族”时,是检查不到客商的自定义项1已经使用过它的,从而导致删除了不该删的数据。
单据或档案自定义项引用后保存主键
沿用上面的例子:
客商的自定义项1引用了自定义项档案“民族”,某条具体客商记录中的def1保存了“汉族”这个民族自定义项档案内容的主键,则在删除自定义项档案“民族”的档案内容“汉族”时,可以通过自定义项引用检查,得知客商的def1已经使用了该自定义项档案内容,不能删除该自定义项档案。
由于向表bd_ref_relation表中注册的信息太多,会导致性能低下
客商管理档案有30个自定义项(def1..def30),按照以前的做法,就往bd_ref_relation表中注册了30条语句,认为被引用表都是bd_defdoc(现在这种认为是错误的)!
而在实际情况中,这30个自定义项极为少数的情况能都用上(即使用上也不一定都是统计型的),但是在引用检查时就需要检查30次了。
如果引用的不是自定义档案,而是引用基本档案,则以前没有办法做校验例如:
如果客商档案通过自定义的方式引用的存货档案,根据以前的机制,在删除某存货档案时,是没法去校验该存货是否被某个客商档案引用了。
2.V5中单据或档案自定义项使用了统计型自定义项后的检查分析
基于V5自定义项档案部分的最新情况,也为了解决单据或档案的自定项使用了统计型自定义项后引用检查存在的问题(如果引用的是基本档案,则不能检查;
检查的时候性能低下)。
我们有了如下的解决方案:
按需注册正确的引用脚本。
2.1应用场景
A.定义一个统计型自定义项“AAAA”,让他引用“存货管理档案”
B.在自定义项引用处,让客商管理档案的自定义项1,引用“AAAA”,此
时在bd_ref_relation表中注册一条信息(如果修改成其他的统计型自定义项,也要相应的修改,如果修改成非统计型自定义项档案,择需要删除
C.修改统计型自定义项“AAAA”,让他引用“民族”(自定义项档案),则
修改B在表bd_ref_relation中插入的注册信息(
如果已经被引用了的统计型自定义项也不能修改了,则不需要做此处理)
2.2解决方案
为了实现上述引用场景,我们主要需要解决获取“引用表名”、“被引用表名”、“被引用字段名”的问题。
2.2.1获取引用表名
由于自定义项引用表中,只能知道某个选择的自定义项引用记录是属于哪个
档案的(例如客商管理档案),具体哪个档案有哪几个表并不清楚,所以我们新加一个表:
bd_defcsttblnme
我们需要在安装盘中提供这个表的预制数据。
需要产品组提供本表的预制脚本。
一个档案或单据,可能会牵涉到多个表,例如,供应链单据头,可能牵涉到多个表,则需要在此表中预制多条数据。
2.2.2获取被引用表名和被引用字段名
可以通过这个自定义项引用的自定义档案所对应的bdinfo中获取。
2.2.3由此引起的其他变化
自定义项定义处,统计型的自定义项定义,如果被引用,则不能修改(以前是提示“请谨慎修改!
”);
自定义项引用处,如果引用的是统计型自定义项定义,则判断该统计型自定义项定义是否参照了档案,如果没有,则报错“您引用的是统计型自定义项,请先关联档案后在引用!
”(以前没有这种判断)
3.总结:
需要产品组配合的工作
3.1提供预制脚本
本工作需要产品组做的事只有一件,就是提供表bd_defcsttblnme的预制脚本。
这个预制脚本的形式如下(如果checkclassname字段和fieldclassname需要预置的话,):
Insertintobd_defcsttblnme(pk_defcsttblnme,pk_defused,tablename,checkclassname,fieldclassname,dr,tsvalues(‘BD000000000000000001’,’sm000000000000000003’,’bd_cubasdoc’,0,null,null’2006-06-0813:
39’
3.2删除以前版本中在bd_ref_relation表中预置的脚本
由自定义项引用引起的一些在表bd_ref_relation中的预制脚本需要删除,这些脚本可以用如下一条语句来找出:
select*frombd_ref_relationwhere(referencingtablecolumnlike'
def_'
orreferencingtablecolumnlike'
def__'
andreferencedtablename='
bd_defdoc'
第四章自定义项使用后的显示
本章介绍利用单据模板开发的单据或者档案使用了自定义项后的显示问题。
具体介绍程序员经常使用的API。
1.通用情况
对于用单据模板来开发UI界面的单据(或基本档案)使用自定义项,一般都需要做如下几件事:
●该单据的自定义项引用是否引用了自定义项定义;
●如果引用了,根据自定义项定义的数据类型,在界面上显示不同的控件;
●不同的数据类型,分别需要进行如下的处理:
✧日期:
日期参照
✧备注:
字符录入框(需要限定可录入长度,为100)
✧统计:
参照
✧数字:
数字录入框(需要判断小数位数和录入长度);
2.特殊情况和特殊需求
另外,在研究基本档案各个功能节点的自定义项引用情况发现有如下一些比较特殊的情况:
单据模板上显示自定义项一般指的是在卡片界面、列表界面显示自定义项。
同时卡片和列表的表头和表体都有可能有自定义项。
表头自定义项和表体自定义项都可能来自多个自定义项引用,例如:
存货管理档案的表头自定义项来自“存货管理档案”和“存货档案”、客商管理档案的自定义项来自“客商管理档案”和“客商档案”等。
在项目支持过程中,有客户提出这样的需求:
存货基本档案的自定义项即时引用了,也不是一定需要显示,只有集团用户登录的时候才需要显示。
3.工具类设计
针对如上特殊情况和需求,对单据模板使用自定义项的UI,设计了如下一些工具类(类图):
4.工具类使用说明
4.1卡片界面引用自定义项的显示:
如果是卡片界面需要显示引用的自定义项,则需要在加载界面时插入如下代码:
String[]strDefObjs=newString[]{"
结算单位"
};
String[]strPrefix=newString[]{"
def"
new
CardDefShowUtil(this.getBillCardPanel(.showDefWhenRef(strDefObjs,strPrefix,true;
如果不想引用就显示,而是根据单据模板自定义项的设置情况进行显示,可以自己实现显示策略:
实现接口IDefShowStrategyimpl(如果仅仅是根据单据模板原自定义项的显示情况来判断是否显示,可以使用该默认实现:
nc.ui.trade.bill.DefaultDefShowStrategyByBillItem,得到具体实现的实例impl,然后用如下方式调用:
CardDefShowUtil(this.getBillCardPanel(,impl.showDefWhenRef(strDefObjs,strPrefix,true;
4.2列表界面引用自定义项的显示
如果是列表界面,则用ListDefShowUtil,使用方法与1类似;
4.3管理界面引用自定义项的显示
如果是管理界面,则用ManageDefShowUtil,是用方法与1类似;
5.使用举例
可以参照NC5.0版的如下类:
nc.ui.bd.invdoc.InvMandocUI存货管理档案
nc.ui.bd.invdoc.InvBasDocUI存货基本档案
nc.ui.bd.settle.SettleUnitUI结算单位
nc.ui.bd.settle.SettleCenterUI结算中心
6.特殊情况的处理
如果用以上工具不能解决问题,可以按照如下步骤来分解处理自定义项引用后的现实问题。
6.1查找自定义项的引用情况
IDefdefservice=(IDefNCLocator.getInstance(.lookup(IDef.class.getName(;
nc.vo.bd.def.DefVO[]defs=null;
try{
defs=defservice.queryDefVO("
物料生产档案"
getUnitCode(;
}catch(BusinessExceptione{
Logger.error(e.getMessage(,e;
}
6.2初始化自定义项
getBillListPanel(.getBillListData(.updateItemByDef(defs,"
true;
getBillCardPanel(.getBillData(.updateItemByDef(defs,"
6.3显示引用了的自定义项
SetDefVisuabled.getInstance(.setDefVisuabled(getBillListPanel(.getBillListData(,defs,"
SetDefVisuabled.getInstance(.setDefVisuabled(getBillCardPanel(.getBill