NC客户化开发手册初级篇1.docx
《NC客户化开发手册初级篇1.docx》由会员分享,可在线阅读,更多相关《NC客户化开发手册初级篇1.docx(26页珍藏版)》请在冰豆网上搜索。
NC客户化开发手册初级篇1
NC客户化开发手册
本手册是北京齐力创辉科技发展有限公司(TTS)内部培训资料,只限于公司内部应用,任何人未经过书面许可不得扩大本教程的使用范围。
严禁任何非法传播、翻印或仿制,违者必究!
©本手册的著作权属于北京齐力创辉科技发展有限公司
前言
目录
前言1
第一章规范篇2
1.1代码规范2
1.2注释规范2
1.3异常规范2
1.4其他规范2
第二章基础篇3
2.1单据信息3
2.1.1获取卡片和列表容器(Panel)3
2.1.2当前界面卡片/列表状态3
2.1.3获取/设置当前单据的操作状态:
3
2.1.4获取选择的树节点3
2.1.5是否单表体3
2.1.6设置单据卡片表头区域比例3
2.1.7设置表体页签状态3
2.1.8获取单据模板上定义的所有字段3
2.2VO的获取和赋值及更新3
2.2.1VO的获取3
2.2.2VO的操作4
2.3字段处理5
2.3.1表头字段值5
2.3.2表体字段值5
2.3.3字段设置可编辑:
5
2.3.4隐藏字段5
2.3.5设置数度5
2.3.6设置字段焦点6
2.4公式6
2.4.1执行、设置公式:
6
2.4.2公式解析器:
6
2.5单据行操作6
2.5.1获取表体选择行6
2.5.2删除表体的自动排序6
2.5.3行编辑状态:
6
2.5.4选中表体所有行6
2.5.5列表下,表头行可多选的实现7
2.5.6行操作(删除,增行等)7
2.6获取系统相关7
2.6.1常量的获取(公司,操作员,时间)7
2.6.2单据号的获取7
2.7程序健壮性及易用性8
2.7.1单据保存时强制调用非空验证方法:
8
2.7.2弹出消息框代码:
8
2.7.3在编辑事件中常用的判断8
2.7.4设置表体没有右键菜单方法8
第三章高级篇8
3.1审批流8
3.2后台预警8
3.3后台任务8
3.4消息8
3.5错误定位(日志分析)8
第一章规范篇
1.1代码规范
1.1.1程序中代码规范
1.1.1.1常量命名
所有的字符都必须大写。
采用有意义的单词组合表达,单词与单词之间以“_”下划线隔开。
命名尽量简短,不要超过16个字符。
程序开发中最好不要直接对literal进行工作,最好引入常量方式应用;只有在特别的情况下才能使用,如在for循环中初始化变量时可直接用-1,0,1这些常量。
例如:
publicfinalintMAX_SIZE=120;
publicfinalintMAX_WIDTH=100;
publicfinalStringPROPERTY_NAME="menu";
1.1.1.2变量命名
变量的命名包括实例变量,静态变量,函数参数的命名。
避免在命名中采用数字,除非命名意义明确,程序更加清晰,对实例变量的命名中不应该有数字。
变量名称是名词意义。
采用有符合问题域意义的单词或单词组合。
第一个单词全部小写,后续的每个单词采用首字母大写,其余小写(特殊单词除外,如URL)。
命名尽量简短,不要超过16个字符。
除了生命周期很短的临时变量外,避免采用单字符作为变量名,实例变量的命名不要用单字符。
常用的单字符变量如整型用i、j、k、m、n字符型用c、d、e,坐标用x、y、z。
在某些情况下,变量可能需要加上类型前缀,所有的类型前缀必须是小写,他与变量名称的实体部分没有任何间隔,实体部的每个单词都是首字母大写,其余字母小写(特殊单词除外如URL),类的全局变量强烈建议使用,一般的类型前缀如下:
类型前缀
类型
例子
b
Boolean、boolean
bsingle
f
浮点数
fsize
d
UFDouble
dmoney
dt
Date
dtToday
c
Character,、char
cinput
obj
OBJECT变量
ObjUser
str
字符串(String,StringBuffer)
strFileName
i
整型数
iCount
ary
数组
aryName
conn
连接
ConnActiveConnection
stmt
Statement
StmtFindUser
rs
Resultset
RsUsers
al
ArrayList
alData
map
Map
map_key_value
set
Set
setValue
col
Collection
colNames
msg
消息
msgText
err
错误
errCode
btn
按钮
btnSubmit
不在特别的情况下,Java中不推荐采用前缀,而是推荐保持名称的语义
例如:
publicintwidth;
publicStringfileName;
publicstaticApplicationContextcontext;
1.1.1.3方法、类和接口的命名和规范
命名多数为动词结构。
采用有符合问题域意义的单词或单词组合。
第一个单词采用小写,后续的每个单词采用首字母大写,其余小写(特殊字除外如URL),没有特别理由不用下划线作为分隔符。
一般功能性的方法不允许方法的代码长度超过200行,如果方法实现逻辑比较复杂就拆分类若干个小方法,每个方法添加功能注释。
一个类文件最好不要超过2000行。
1.1.1.4包的命名
采用逻辑上的层次结构,从而减少依赖。
Ø产品模块对外的接口定义放在nc.itf.模块名.xx。
Ø服务的实现类nc.impl.模块名.xx。
Ø后台业务类代码nc.bs.xx。
Ø值对象命名:
nc.vo.模块名。
ØUI层命名:
nc.ui.模块名。
Ø命名简短,常采用缩写。
Ø包名所有字符都为小写。
Ø不要用java,javax作为自定义包的前缀。
1.1.2数据库设计规范
1.1.2.1sql书写规范
1)SQL语句全部使用小写。
2)连接符或运算符or、in、and、=、<=、>=,+,-等前后加上一个空格。
3)严禁使用select*…….形式的语句,必须指出select的具体字段,即selectcol1,col2,…fromtableawhere…。
★。
4)严禁使用insertintotablevalues(?
?
?
),必须指出具体要赋值的字段,即insertintotablea(col1,col2,…)values(?
?
…)。
5)SQL语句包含多表连接时,建议对每个表命名别名,对每个字段的使用都要带上表别名,即selecta.col1,a.col2,b.col3fromtableaa,tablebbwherea.col4=b.col5。
1.1.2.2性能规范
1)在进行多条记录的增加、修改、删除时,建议使用批处理功能,批处理的次数以整个SQL语句不超过相应数据库的SQL语句大小的限制为准。
2)禁止使用or超过500,如xx=’123’orxx=’456’,禁止在SQL语句中in中的元素个数在50以上。
3)禁止在一条SQL语句中使用3层以上的嵌套查询,如果有,请考虑使用临时表或中间结果集。
4)如果有多表连接时,应该有主从之分,并尽量从一个表取数。
1.1.2.3数据库字段级表名的命名规范
模块名称规则表,一般数据库表设计的前缀默认采用以下规则,以下表的详细信息请参考NC规范中的NC产品形态文档:
模块名称
系统规则名
模块名称
系统规则名
模块名称
系统规则名
UAP
系统管理
sm
UAP
pub
财务会计平台
dap
基础数据
bd
外部交换平台
xx
管理会计平台
dmp
报表&BPM
报表
iufo
BI平台
bi
BPM
bpm
财务
总账管理
gl
收付报
arap
固定资产
fa
存货核算
ia
项目成本
jc
资金
资金结算
fts
资金监控
fvm
资金计划
fp
票据管理
fbm
信贷管理
fi
资金预测
fi
资金计息
fi
网上银行
ebank
预算
预算管理
ntb
人力资源
人力资源规划
HRP
职务职能管理
OM
员工信息管理
HI
招聘甄选管理
RM
员工调配管理
HI
员工离职管理
HI
政策制度管理
HRPM
劳动合同管理
HRCM
培训开发管理
TRM
考勤管理
TBM
出差管理
HRBT
休假管理
HRLM
加班管理
HROM
绩效管理
PE
薪酬管理
WA
福利管理
BM
经理自助
MSS
基础设置
HR
人力资源取数函数
RPT
员工自助
ESS
供应链
采购管理
po
销售/分销管理
so
库存管理
ic
销售价格
prm
内部交易
to
供应商管理
vrm
合同管理
ct
委外加工
sc
发运管理
dm
供应链公共
scm
制造
设备管理
fm
成本管理
cm
制造基础数据
pd
需求管理
mm
生产计划
mm
生产定单
mm
车间作业
sf
能力计划
crp
装配计划
mm
检修管理
er
质量管理
质量管理
qc
其他
cdm
pm
2)所有表、视图、触发器、索引、函数、约束、主外键必须指定名称,规则如下:
对于各种数据库对象的命名规则,目前的NC系统中存在两种风格,采用拼音和采用英文的,目前这两种规范都可以,但是注释一定要清楚。
数据库对象
规则
最大长度
例子
表
系统规则名_名称
18
sm_firm
字段名
18
acc_code,acc_name
视图
v_系统规则名_名称(*)
18
ac_accsub
触发器
t_表名_名称(*)
18
t_firm
函数
f_名称
18
f_fun()
Check
ck_表名_字段名(*)
18
ck_gl_accsub_code
主键
pk_表名
18
pk_gl_accsub
外键
fk_表名_字段名(*)--此处超过18位处理
18
fk_gl_vouch_accsub_code
索引
i_表名_字段名(*)
18
i_gl_accsub_code
表空间
ts_名称
18
ts_sys
(*)注:
由于数据库对象之间的命名规则与最大长度限制可能造成命名存在冲突。
如存在,可以通过缩减表名或字段字符来实现;
1)所有的外键、约束、索引、函数、触发器、存储过程名不允许重复;
4)业务中主子表的命名规则:
系统规则名_名称或主表:
系统规则名_名称_h子表:
系统规则名_英文名称_b。
5)业务中主子子表的命名规则:
主表:
系统规则名_英文名称_h
子表:
系统规则名_英文名称_b
子子表:
系统规则名_英文名称_bs
1.1.2.4业务数据类型规范
类型
规则(使用SQLServer描述)
编码类
字符型。
依据规则确定用char还是varchar。
名称类
字符型。
依据规则确定用char还是varchar。
布尔类
Char
(1),Y/N
状态类
Smallint,用0,1,2,3……表示
级次类
16位整型Smallint
金额类
精确数值型,一般为decimal(20,8)
大金额
32,10
系统标识类
估计可能最大值<32,767:
16位整型smallint
估计可能最大值>32,767:
32位整型smallint
摘要备注类
可变字符型。
需要定义几种:
200,1000
价格数量类
精确数值型,一般为decimal(20,8)
单价类
精确数值型,一般为decimal(20,8)
比率类
精确数值型,一般为decimal(20,8)
3)不要用SQL保留字来命名表、视图、字段、索引。
数据库的保留字见各数据库厂商规范;
4)字符型字段的确定。
长度固定用char,不固定用varchar;
5)不要将Null与空串“”视为相同。
在不同的数据库中对这两者的理解是不相同的。
在
Oracle中空串与Null理解一样。
如果碰到这种情况统一用Null;
6)空值问题:
所有经常用来做为查询条件的字段都不允许使用空值,引用基础档案的,在基础档案增加表示空值的档案,其他使用N/A表示。
1.2注释规范
1.2.1类、方法注释
类、方法开始必须要加上注释,标注方法或者类的用途、作者、时间。
如果是方法注释必须加上方法的参数说明(注释每个参数代表的实际意义),
1.2.2主要算法注释
算法描述指在实现级别的描述注释,如在方法内的注释,对类实现的注释,这样使得程序更加易懂,方便程序算法的修改和BUG的修复。
一般采用块/行注释,对于简短的描述采用行注释,不要用文档注释。
注释的主要内容包括:
1)某些局部变量的意义和用途;
2)复杂的控制结构的注释,如循环、分枝、条件表达式,说明控制所要达到的目标;
3)复杂的代码段的描述,说明代码完成的功能,以及为什么这样做。
1.2.3修改原有产品或者其他人代码注释
如果是修改产品或者其他人代码时必须加上注释
1)如果是单行修改代码,注释要加上修改的目的、时间、修改人。
例如:
//editby张三增加此行代码目的2012-03-05
2)如果是块修改代码必须在要修改的代码开始和结尾做标记
例如:
//editby张三增加参照入库单生单的额外条件2012-03-05begin
中间部分添加修改的代码块
//editby张三增加参照入库单生单的额外条件2012-03-05end
3)如果是单行增加代码,注释要加上增加的目的、时间、修改人。
例如:
//addby张三增加此行代码目的2012-03-05
4)如果是块修改代码必须在要修改的代码开始和结尾做标记
例如:
/addby张三增加参照入库单生单的额外条件2012-03-05begin
中间部分添加修改的代码块
//addby张三增加参照入库单生单的额外条件2012-03-05end
1.2.4整体代码注释
比较长的代码,规定必须每行或者每隔一行必须有逻辑上的注释(即:
代码思路的注释)。
1.3异常规范
1.3.1代码中异常处理
代码中异常处理必须遵循NC平台的异常处理,禁止在自己写的方法中进行异常的扑捉、打印异常信息,如果在自己的代码中必须做异常的处理的话就进行异常的throw,由最外层的异常捕获机制进行捕获和用户的交互。
1.4其他规范
1.4.1SVN使用规范
1)SVN服务器的使用规范,每个人必须使用自己的用户,每天早上上班时进行代码的更新,每天下班前对已经完工的功能进行代码的提交。
2)代码在提交前必须先进行更新,预防自己本地的代码覆盖他人并发修改的代码。
1.4.2数据库服务器使用规范
在还原用户数据库到服务器上时,如果客户的数据库文件超过5G,必须建立单独的实例。
如果不超过5G就可以还原到公用的orcl实例中。
第二章基础篇
2
3
3.1单据信息
3.1.1获取卡片和列表容器(Panel)
☞卡片
UI端:
getBillCardPanelWrapper().getBillCardPanel()或者getBillCardPanel()
EventHandler:
getBillCardPanelWrapper().getBillCardPanel()
☞列表
UI端:
getBillCardPanelWrapper().getBillListPanel()或者getBillListPanel()
EventHandler:
getBillCardPanelWrapper().getBillListPanel()
3.1.2当前界面卡片/列表状态
getBillManageUI().isListPanelSelected()
3.1.3获取/设置当前单据的操作状态:
getBillUI().setBillOperate(intnewBillOperate);
getBillUI().getBillOperate()
3.1.4获取选择的树节点
getBillTreeCardUI().getBillTreeSelectNode();
getBillTreeCardUI().getBillTreeSelectNode().getData();
3.1.5是否单表体
isSingleDetail()true:
为单表体;false:
为单表头;(在校验类里)
3.1.6设置单据卡片表头区域比例
((nc.ui.pub.bill.BillCardLayout)getBillCardPanel().getLayout()).setHeadScale(80);
3.1.7设置表体页签状态
☞显示状态:
getBillCardPanel().getBodyPanel("").setVisible(false);
☞可用状态:
getBillCardPanel().getBillModel("subbillb").setEnabled(false);
☞获取当前页签编码:
getBillCardPanelWrapper().getBillCardPanel().getCurrentBodyTableCode()
3.1.8获取单据模板上定义的所有字段
nc.vo.pub.bill.BillTempletBodyVO[]tbodyvos=
(nc.vo.pub.bill.BillTempletBodyVO[])billCardPanel.getTempletData().getChildrenVO();
3.1.9列表启用表头多选对话框
getBillListPanel().setParentMultiSelect(true);
3.2VO的获取和赋值及更新
3.2.1VO的获取
3.2.1.1getBufferData():
EventHandler中可以直接调用,可以获取单据对应的缓存数据,getBufferData().getCurrentVO()卡片下为获取当前单据的VO对象,列表下则为获取当前选择行的VO对象。
UI类当和EventHandler类在同一个包下时,也可以直接调用该方法。
当UI类与EventHandler类不在同一个包下时,可以通过getManageEventHandler()获取EventHandler对象,然后再调用EventHandler的getBufferData()获取缓存数据。
3.2.1.2界面取值
☞得到单据表体当前被选中的VO:
getBillCardPanelWrapper().getSelectedBodyVOs();//如果没有被选择的行那么返回NULL
☞从界面上得到VO
getBillCardPanelWrapper().getBillVOFromUI();//得到界面上全部数据的VO
getBillListWrapper().getVOFromUI()//被选择行的VO
☞得到界面变化数据的VO
(ClientUI)getChangedVOFromUI()或者getBillListWrapper().getChangedVOFromUI()
3.2.1.3通过VO的className
☞卡片
getBillCardPanel().getBillData().getBillValueVO(billVOName,headVOName,bodyVOName)
getBillCardPanel().getBillData().getBillValueChangeVO(billVOName,headVOName,bodyVOName)
☞列表
getBillListPanel().getBillListData().getBillSelectValueVO(billVOName,headVOName,bodyVOName)
getBillListPanel().getBillListData().getBillSelectValueVOs(billVOName,headVOName,bodyVOName)
getBillListPanel().getBillListData().getBillValueVO(row,billVOName,headVOName,bodyVOName)
3.2.1.4通过PK值查询
InvbasdocVOinvbasdocVO=(InvbasdocVO)HYPubBO_Client.queryByPrimaryKey(InvbasdocVO.class,pk_inv);
3.2.2VO的操作
3.2.2.1界面VO操作
☞设置Buffer中的TS到当前设置VO:
setTSFormBufferToVO(billVO);billVO为AggregatedValueObject类型
☞得到当前VO的一个副本:
getBufferData().getCurrentVOClone()
☞刷新某一行的VO
BillManageUI.getBillListWrapper().updateListVo(hvo,selectedRows[i]);
3.2.2.2VO的数据库操作
3.2.2.2.1SuperVO
针对SuperVO,通用的方式为下面两种。
如果是特殊的单据如供应链等需要特殊的操作,不能使用下面的方法
☞前台:
HYPubBO_Client
☞后台:
BaseDAO
3.2.2.2.2(供应链)的GeneralBillHelper类
ret=GeneralBillHelper.queryBills(单据类型,(QryConditionVO)voCond);
3.3字段处理
3.3.1表头字段值
取值
☞getBillCardPanel().getHeadItem("strKey").getValueObject()
☞表头VO.getAttributeValue('"字段名");
赋值
☞表头VO.setAttributeValue("字段名",值);聚合VO.setHeaderValue("字段名",值);
☞getBillCardPanel().setHeadItem("字段名",值);
3.3.2表体字段值
获取
☞getBillC