NC开发笔记指导

用友 NC客户化开发手册

2013年08月03日 17:41:44

阅读数:12151

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.2 VO的获取和赋值及更新 3

2.2.1 VO的获取 3

2.2.2 VO的操作 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这些常量。

例如: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 错误定位(日志分析)

原文地址:https://www.cnblogs.com/wanglichaoya/p/8979406.html

时间: 2024-08-18 16:33:31

NC开发笔记指导的相关文章

【Kinect开发笔记之(一)】初识Kinect

一.Kinect简介 Kinect是微软在2010年6月14日对XBOX360体感周边外设正式发布的名字.它是一种3D体感摄影机(开发代号"Project Natal"),同时它导入了即时动态捕捉.影像辨识.麦克风输入.语音辨识.社群互动等功能. 二.Kinect分类 Kinect for Xbox 360:该版本设计之初就是为了Xbox 360定制的,并未考虑其他的平台.从微软授权角度而言,它无法用于商业开发. Kinect for Windows : 固件上做了升级,支持"

【Kinect开发笔记之(二)】Kinect for windows发展历程

新版本SDK和旧版本的SDK完全兼容,如果您之前安装过旧版本的,可以直接安装新版本的SDK,但是如果您之前的开发版本是Beta版的,则需要卸载之后再安装新版本.在Kinect for Windows SDK 1.0版本中,SDK和示例文件是打包一起安装的.而在之后的版本,为了可以分别升级,微软把这两者分开独立为Kinect for Windows SDK和Kinect for Windows Developer Toolkit这两部分,所以需要分别下载安装, Kinect for Windows

[Openwrt 项目开发笔记]:Samba服务&amp;vsFTP服务(四)

在上一节中,我们讲述了如何在路由器上挂载U盘,以及如何通过改造U盘提升路由器的存储和数据处理能力.通过增加USB挂载,为我们后续进行智能家居构建提供了保障. 在本节中,我将简单介绍如何在路由器上建立网络文件共享服务. 一.为何要建立文件共享服务: 在智能家居网络中,一个很重要的需求就是安全.当一个智能家居方案部署之后,用户往往最先考虑的也是安全问题.那么怎样进行安全管理呢?一种常用的解决方法是实时的监控传感器以及家电的状态,一旦发生异常,通过邮件.短信甚至打电话的方式通知用户.当用户接收到异常之

张高兴的 Windows 10 IoT 开发笔记:RTC 时钟模块 DS3231

原文:张高兴的 Windows 10 IoT 开发笔记:RTC 时钟模块 DS3231 GitHub:https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/DS3231 注意:不包含闹钟设置

Android开发笔记(一百零三)地图与定位SDK

集成地图SDK 国内常用的地图SDK就是百度和高德了,二者的用法大同小异,可按照官网上的开发指南一步步来.下面是我在集成地图SDK时遇到的问题说明: 1.点击基本地图功能选项,不能打开地图,弹出"key验证出错!请在AndroidManifest.xml文件中检查key设置的"的红色字提示.查看日志提示"galaxy lib host missing meta-data,make sure you know the right way to integrate galaxy&

微信订阅号开发笔记(二)

微信开发的流程其实很简单 o(∩_∩)o 哈哈!在微信网站的编辑操作 额,就不说了.虽然有人问过.下面是我的微信开发过程,简单记录下. 成为开发者 材料:1.自己的服务器资源,百度的BAE,新浪的SAE都不错. 2.懂那么点编程语言. 3.注册微信公众号. 上面的都有了之后,就可以自己动手开发了.哇咔咔,好兴奋.有木有. 在登录进去之后,怎么成为开发者?不知道,自己看去. 开始coding吧. 1.验证 if (! empty ( $_GET ['echostr'] ) && ! empt

微信订阅号开发笔记(三)

1.接收语音识别结果 if($msgType=="voice"){ //收到语音消息 //MediaId 语音消息媒体id,可以调用多媒体文件下载接口拉取数据. //Format 语音格式,如amr,speex等 $format = $postObj->Format; $mediaId = $postObj->MediaId; //开通语音识别功能,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段. //注:由于客户端缓

微信订阅号开发笔记(四)

1.创建菜单 //创建菜单 public function createMenu(){ $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token="; $url.=$this->getacctoken(); //目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单.一级菜单最多4个汉字, //二级菜单最多7个汉字,多出来的部分将会以"..."代替.请注意,创建自定义菜单

Swift开发笔记

Swift开发笔记(一) 刚开始接触XCode时,整个操作逻辑与Android Studio.Visual Studio等是完全不同的,因此本文围绕IOS中控件的设置.事件的注册来简单的了解IOS开发 1.新建一个Xcode项目,项目目录大致如图: 2.在Main.storyboard添加控件 首先要显示右侧的工具栏(Utilities),之后选择显示Object Library,就可以找到常用的一些控件了,然后添加几个控件到界面中 3.将控件和ViewController进行关联 此时要将Ed