NC开发笔记指导
用友 NC客户化开发手册
NC客户化开发手册
本手册是北京齐力创辉科技发展有限公司(TTS)内部培训资料,只限于公司内部应用,任何人未经过书面许可不得扩大本教程的使用范围。严禁任何非法传播、翻印或仿制,违者必究!
©本手册的著作权属于北京齐力创辉科技发展有限公司
前言
目录
第一章 规范篇
1.1 代码规范
1.1.1 程序中代码规范
1.1.1.1 常量命名
所有的字符都必须大写。采用有意义的单词组合表达,单词与单词之间以“_”下划线隔开。
Ø 命名尽量简短,不要超过16个字符。
程序开发中最好不要直接对literal进行工作,最好引入常量方式应用;只有在特别的情况下才能使用, 如在for循环中初始化变量时可直接用-1,0,1这些常量。
例如:public final int MAX_SIZE = 120;
public final int MAX_WIDTH = 100;
public final String PROPERTY_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中不推荐采用前缀,而是推荐保持名称的语义
例如:public int width;
public String fileName;
public static ApplicationContext context;
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.1 sql书写规范
1) SQL语句全部使用小写。
2) 连接符或运算符or、in、and、=、<=、>=, +,- 等前后加上一个空格。
3) 严禁使用select * …….形式的语句,必须指出select的具体字段,即select col1, col2,… from tablea where …。★。
4) 严禁使用 insert into table values(?,?,?),必须指出具体要赋值的字段,即 insert into tablea (col1, col2,…) values(?,?,…)。
5) SQL语句包含多表连接时,建议对每个表命名别名,对每个字段的使用都要带上表别名,即 select a.col1, a.col2, b.col3 from tablea a, tableb b where a.col4=b.col5。
1.1.2.2 性能规范
1) 在进行多条记录的增加、修改、删除时,建议使用批处理功能,批处理的次数以整个SQL语句不超过相应数据库的SQL语句大小的限制为准。
2) 禁止使用or 超过 500,如 xx =’123’ or xx=’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 业务数据类型规范
类型 |
规则(使用SQL Server描述) |
编码类 |
字符型。依据规则确定用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) 如果是单行修改代码,注释要加上修改的目的、时间、修改人。
例如://edit by 张三 增加此行代码目的 2012-03- 05
2) 如果是块修改代码必须在要修改的代码开始和结尾做标记
例如://edit by 张三 增加参照入库单生单的额外条件 2012-03- 05 begin
中间部分添加修改的代码块
//edit by 张三 增加参照入库单生单的额外条件 2012-03- 05 end
3) 如果是单行增加代码,注释要加上增加的目的、时间、修改人。
例如://add by 张三 增加此行代码目的 2012-03- 05
4) 如果是块修改代码必须在要修改的代码开始和结尾做标记
例如:/add by 张三 增加参照入库单生单的额外条件 2012-03- 05 begin
中间部分添加修改的代码块
// add by 张三 增加参照入库单生单的额外条件 2012-03- 05 end
1.2.4 整体代码注释
比较长的代码,规定必须每行或者每隔一行必须有逻辑上的注释(即:代码思路的注释)。
1.3 异常规范
1.3.1 代码中异常处理
代码中异常处理必须遵循NC平台的异常处理,禁止在自己写的方法中进行异常的扑捉、打印异常信息,如果在自己的代码中必须做异常的处理的话就进行异常的throw,由最外层的异常捕获机制进行捕获和用户的交互。
1.4 其他规范
1.4.1 SVN使用规范
1) SVN服务器的使用规范,每个人必须使用自己的用户,每天早上上班时进行代码的更新,每天下班前对已经完工的功能进行代码的提交。
2) 代码在提交前必须先进行更新,预防自己本地的代码覆盖他人并发修改的代码。
1.4.2 数据库服务器使用规范
在还原用户数据库到服务器上时,如果客户的数据库文件超过5G,必须建立单独的实例。如果不超过5G就可以还原到公用的orcl实例中。
第二章 基础篇
1
2
2.1 单据信息
1.4.3 获取卡片和列表容器(Panel)
F 卡片
UI端:getBillCardPanelWrapper().getBillCardPanel()或者getBillCardPanel()
EventHandler:getBillCardPanelWrapper().getBillCardPanel()
F 列表
UI端:getBillCardPanelWrapper().getBillListPanel()或者getBillListPanel()
EventHandler:getBillCardPanelWrapper().getBillListPanel()
1.4.4 当前界面卡片/列表状态
getBillManageUI().isListPanelSelected()
1.4.5 获取/设置当前单据的操作状态:
getBillUI().setBillOperate(intnewBillOperate);
getBillUI().getBillOperate()
1.4.6 获取选择的树节点
getBillTreeCardUI().getBillTreeSelectNode();
getBillTreeCardUI().getBillTreeSelectNode().getData();
1.4.7 是否单表体
isSingleDetail() true:为单表体;false:为单表头;(在校验类里)
1.4.8 设置单据卡片表头区域比例
((nc.ui.pub.bill.BillCardLayout)getBillCardPanel().getLayout()).setHeadScale(80);
1.4.9 设置表体页签状态
F 显示状态:getBillCardPanel().getBodyPanel("").setVisible(false);
F 可用状态:getBillCardPanel().getBillModel("subbillb").setEnabled(false);
F 获取当前页签编码:getBillCardPanelWrapper().getBillCardPanel().getCurrentBodyTableCode()
1.4.10 获取单据模板上定义的所有字段
nc.vo.pub.bill.BillTempletBodyVO[] tbodyvos =
(nc.vo.pub.bill.BillTempletBodyVO[]) billCardPanel.getTempletData().getChildrenVO();
1.4.11 列表启用表头多选对话框
getBillListPanel().setParentMultiSelect(true);
2.2 VO的获取和赋值及更新
1.4.12 VO的获取
1.4.12.1 getBufferData():
EventHandler中可以直接调用,可以获取单据对应的缓存数据,getBufferData().getCurrentVO()卡片下为获取当前单据的VO对象,列表下则为获取当前选择行的VO对象。UI类当和EventHandler类在同一个包下时,也可以直接调用该方法。当UI类与EventHandler类不在同一个包下时,可以通过getManageEventHandler()获取EventHandler对象,然后再调用EventHandler的getBufferData()获取缓存数据。
1.4.12.2 界面取值
F 得到单据表体当前被选中的VO:
getBillCardPanelWrapper().getSelectedBodyVOs(); //如果没有被选择的行那么返回NULL
F 从界面上得到VO
getBillCardPanelWrapper().getBillVOFromUI();//得到界面上全部数据的VO
getBillListWrapper().getVOFromUI()//被选择行的VO
F 得到界面变化数据的VO
(ClientUI)getChangedVOFromUI()或者getBillListWrapper().getChangedVOFromUI()
1.4.12.3 通过VO的className
F 卡片
getBillCardPanel().getBillData().getBillValueVO(billVOName, headVOName, bodyVOName)
getBillCardPanel().getBillData().getBillValueChangeVO(billVOName, headVOName, bodyVOName)
F 列表
getBillListPanel().getBillListData().getBillSelectValueVO(billVOName, headVOName, bodyVOName)
getBillListPanel().getBillListData().getBillSelectValueVOs(billVOName, headVOName, bodyVOName)
getBillListPanel().getBillListData().getBillValueVO(row, billVOName, headVOName, bodyVOName)
1.4.12.4 通过PK值查询
InvbasdocVOinvbasdocVO = (InvbasdocVO)HYPubBO_Client.queryByPrimaryKey(InvbasdocVO.class, pk_inv);
1.4.13 VO的操作
1.4.13.1 界面VO操作
F 设置Buffer中的TS到当前设置VO:
setTSFormBufferToVO(billVO); billVO为AggregatedValueObject类型
F 得到当前VO的一个副本:getBufferData().getCurrentVOClone()
F 刷新某一行的VO
BillManageUI.getBillListWrapper().updateListVo(hvo, selectedRows[i]);
1.4.13.2 VO的数据库操作
1.4.13.2.1 SuperVO
针对SuperVO,通用的方式为下面两种。如果是特殊的单据如供应链等需要特殊的操作,不能使用下面的方法
F 前台:HYPubBO_Client
F 后台:BaseDAO
1.4.13.2.2 (供应链)的GeneralBillHelper类
ret = GeneralBillHelper.queryBills(单据类型, (QryConditionVO)voCond);
2.3 字段处理
1.4.14 表头字段值
取值
F getBillCardPanel().getHeadItem("strKey").getValueObject()
F 表头VO.getAttributeValue('"字段名");
赋值
F 表头VO.setAttributeValue("字段名" ,值); 聚合VO.setHeaderValue("字段名" ,值);
F getBillCardPanel().setHeadItem("字段名" ,值);
1.4.15 表体字段值
获取
F getBillCardPanelWrapper().getBillCardPanel().getBodyValueAt(rowIndex, "strKey")。其中rowIndex为要获取字段所在的行。
F 卡片下获取表体相应页签下的字段:getBillCardPanel().getBodyItem("plh_topics_b2", "nitemmny")
F 获取单据模板上定义的所有字段
nc.vo.pub.bill.BillTempletBodyVO[] tbodyvos = nc.vo.pub.bill.BillTempletBodyVO[]) billCardPanel.getTempletData().getChildrenVO();
赋值
为表体某行某个字段赋值:
F 聚合VO.setItemValue(行索引值, “字段名”, 值);
F getBillCardPanel().setBodyValueAt(aValue, row, strKey);
aValue:为要赋的值; row:为所在的行;strKey:为字段名;
注意:
得到表体上的值,得到的类型是object类型的。要进行一下转换(),但是不能直接转:如下getBillCardPanel().getHeadItem(“字段名”).getValueObject().toString();这样转是容易出错。正确定的转换方式为:Object obj = getBillCardPanel().getHeadItem("pk_npic_schedule_id").getValueObject();
String pk_contract=obj==null?"":obj.toString();
1.4.16 字段设置可编辑:
getBillCardPanel().getBodyItem("字段名").setEdit(true);
1.4.17 隐藏字段
getBillCardPanel().hideBodyTableCol("bodyitem");
代码设置卡片状态下表头和表体某一字段的编辑状态:
// 表头
getBillCardPanel().getHeadItem("").setEdit(false);
// 表体
getBillCardPanel().getBillModel().setCellEditable(row,"nqichunum",false);
1.4.18 设置精度
// 先获取BillModel
nc.ui.pub.bill.BillModelbm = getReportBase().getBillModel();
// 通过以下方法设置精度
bm.getItemByKey(key).setDecimalDigits(3);
1.4.19 将UFDouble显示为小数点后2位的操作
UFDouble().setScale(2, UFDouble.ROUND_HALF_UP); //保留小数点后2位,并“四舍五入”
1.4.20 设置字段焦点
表头字段:
getBillCardPanel().getHeadItem("jobname").getComponent().requestFocus()
表体字段:
其中参数mm和ii是表体的行和列
getBillCardPanel().getBillTable().setColumnSelectionInterval(m,m); getBillCardPanel().getBillTable().setRowSelectionInterval(i,i);
2.4 公式
1.4.21 执行、设置公式:
F getBillCardPanel().execHeadFormula(formula),其他方法请参照getBillCardPanel().或getBillListPanel()中的针对公式的方法。
1.4.22 公式解析器:
F 参照红皮书《NCV5-公式技术红皮书》
2.5 单据行操作
1.4.23 获取表体选择行
F 获取表体的选中行的行号getBillCardPanelWrapper().getBillCardPanel().getBillTable().getSelectedRow();或getBillCardPanelWrapper().getBillCardPanel().getBodyPanel().getTable().getSelectedRow();
F 获取编辑行getBillCardPanelWrapper().getBillCardPanel().getBillTable().getEditingRow()
F 获取总行数getBillCardPanelWrapper().getBillCardPanel().getBillTable().getRowCount()
F 获取列表多条记录的方法
1、int[] selectRows = ((BillManageUI) getBillUI()).getBillListPanel().getHeadTable().getSelectedRows();
2、 ((BillManageUI) getBillUI()).getBillListPanel().getHeadBillModel().getBodySelectedVOs(DemoYsHVO.class.getName());
其中,方法1只在Ctrl、Shift多选时能取到多条记录的行号。方法2都能取到多选记录的VO。
1.4.24 删除表体的自动排序
F getBillCardPanel().getBillTable().setSortEnabled(false);
F 卡片和列表下的排序方法(TRUE:升序;FALSE:降序)
列表:getBillListWrapper().getBillListPanel().getBodyBillModel().setSortColumn("vdef21");
卡片:getBillCardPanelWrapper().getBillCardPanel().getBillModel().sortByColumn("reserve6", true);
F 锁定页面排序:
getBillTable().setSortEnabled(false);
1.4.25 行编辑状态:
F getBillCardPanelWrapper().getBillCardPanel().getBillModel().setRowEditState(true)
F 设置表格为行不可编辑状态:
getBillCardPanelWrapper().getBillCardPanel().getBillModel().setNotEditAllowedRows(rows);
rows是一个INT类型的数组
F 终止编辑getBillCardPanel().stopEditing();
1.4.26 选中表体所有行
BillCardPanel card = getBillCardPanel();
card.getBillTable("uap_quotarev_b").selectAll();
1.4.27 列表下,表头行可多选的实现
//设置列表多选框
getBillListPanel().setMultiSelect(true);
//设置列表Ctrl、Shift多选
getBillListWrapper().getBillListPanel().getHeadTable().
setSelectionMode(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
1.4.28 行操作(删除,增行等)
F 删行 getBillCardPanel().delLine();getBillCardPanel().getBodyPanel("plh_presstask_b6").delLine();
F 增行getBillCardPanel().addLine();getBillCardPanel().getBodyPanel("plh_presstask_b6"). addLine ();
F 行操作不可用:getButtonManager().getButton(IBillButton.Line).setVisible(false);
F 更新行操作按钮:getBillUI().updateButton(getButtonManager().getButton(IBillButton.Line));
F 清空表体行:
getBillCardPanel().getBillTable().selectAll();
getBillCardPanel().delLine();
F 列表多行选择: getBillListPanel().setMultiSelect(true);
F BillListPanel.setParentMultiSelect(true);
F 单据列表支持选中多行:
getBillListPanel().getHeadTable().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
2.6 获取系统相关
1.4.29 常量的获取(公司,操作员,时间)
F 得到当前登录公司的主键(UI):
ClientEnvironment.getInstance().getCorporation().getPrimaryKey();
getClientEnvironment().getCorporation().pk_corp.toString();
F 得到当前登录用户的主键(UI):
ClientEnvironment.getInstance().getUser().getPrimaryKey();
F 公司主键:ClientEnvironment.getInstance().getCorporation().getPrimaryKey();
getBillUI()._getCorp().getPrimaryKey();
F 操作员主键:ClientEnvironment.getInstance().getUser().getPrimaryKey();
getBillUI()._getOperator();
F 服务端时间:ClientEnvironment.getServerTime();
getBillUI().getServerTime();
SFServiceFacility.getServiceProviderService().getServerTime().toString()
F 客户端日期:ClientEnvironment.getInstance().getDate();
getBillUI().getDate();
1.4.30 单据号的获取
F 前台:billNo = HYPubBO_Client.getBillNo(单据类型, 公司ID, null, null);
F 后台:
1、nc.bs.pub.billcodemanage.BillcodeGenerater gene = new nc.bs.pub.billcodemanage.BillcodeGenerater ();String billcode = gene.getBillCode (单据类型,公司ID,null,null)
2、String billNo = new nc.bs.trade.business.HYPubBO().getBillNo(单据类型, 公司ID,null,null);
2.7 程序健壮性及易用性
1.4.31 单据保存时强制调用非空验证方法:
getBillCardPanelWrapper().getBillCardPanel().dataNotNullValidate()
1.4.32 弹出消息框代码:
在UI类中:showWarningMessage(“提示消息”);showHintMessage(“状态栏上的消息”);
在EventHandler类中:getBillUI().showErrorMessage(“提示消息”);
1.4.33 在编辑事件中常用的判断
判断是不是对表体进行的编辑: e.getPos()==IBillItem.BODY或者e.getPos()==0
判断是不是对表体进行的编辑: e.getPos()==IBillItem.HEAD或者e.getPos()==1
判断是对单据上哪个字段进行的编辑: “字段名“.equals(e.getKey());
1.4.34 设置表体没有右键菜单方法
BillCardPanel.setBodyMenuShow(false);
第三章 高级篇
3
3.1 审批流
1.4.35 审批流开发注意事项
1) 开发带审批流单据,单据上必须包含以下字段
字段编码 |
中文名 |
数据类型 |
是否必输 |
说明 |
pk_corp |
公司ID |
char(4) |
N |
|
vbillno |
单据号 |
varchar(20) |
Y |
|
dbilldate |
单据日期 |
char(10) |
N |
|
voperatorid |
操作人 |
char(20) |
N |
|
pk_billtype |
单据类型 |
varchar(4) |
|
|
pk_busitype |
业务类型 |
char(20) |
|
|
vbusicode |
业务编码 |
varchar(20) |
|
|
vbillstatus |
单据状态 |
smallint |
|
|
vapproveid |
审核人 |
char(20) |
|
|
dapprovedate |
审核日期 |
char(10) |
|
|
vapprovenote |
审核批语 |
varchar(100) |
|
|
vmodifiid |
修改人 |
char(20) |
|
|
dmodifidate |
修改日期 |
char(10) |
|
|
tlastmodifitime |
修改时间 |
char(19) |
|
|
dr |
删除标志 |
smallint |
N |
|
ts |
时间戳 |
char(19) |
N |
|
2) 单据如果要在审批过程中进行一些回写和其他逻辑必须指定一个审批后台类,指定审批后台类的放入如下:
图中那个画圈的DMO类就是后天审批流的检查类,里面提供了审批流执行中各个环节的方法。审批中要处理的逻辑就在这个类中写。
如果某个单据要在审批中做业务处理,就参照产品的其他单据的DMO类仿写一个类在自己的单据类型上进行指定,然后在相应的方法中写具体的业务代码。
DMO类的主要几个方法说明如下:
1) checkPass: 流程结束,整个单据审批通过。
2) checkNoPass:流程结束,整个单据审批不通过。
3) checkGoing: 流程运行中,单据审批进行中。
4) checkCommit: 单据提交方法。
5) backNoState:单据弃审方法。
6) backGoing:审批流接口方法:实现逐级弃审时匹配的接口方法。
3.2 后台预警
1.4.36 后台预警插件开发方法
新增加的业务插件类必须继承IBusinessPlugin接口,在implementReturnObject方法中构造自己的预警方法体,需要预警的时候再返回一个非空的P2PAlartMessage对象。
3.3 后台任务
1.4.37 后台任务插件开发方法
新增加的后台任务类必须继承IBackgroundWorkPlugin接口,在executeTask这个方法中添加后台任务的具体逻辑。返回一个字符串类型的任务处理信息。
3.4 消息
1)消息的存储表在pub_workflownote
3.5 错误定位(日志分析)