在用友工作的时候,一般很多人先接触的都是nc6系列的产品,但是目前还是有很多的项目是5系列的,而对于基本的单据制作,nc6和nc5是不一样的,通过来说,nc6是通过建立元数据,然后发布元数,然后发布节点就可以了。很多不是经常做nc5的人对于nc的单据就很陌生了,下面我总结相关的重要步骤:
NC56单据开发
- 建表 数据库表
如:-- Create table
create table SHHT812_LK
(
PK_LK VARCHAR2(30) not null,
VBILLCODE VARCHAR2(30),
VOPERATORID VARCHAR2(30),
DMAKEDATE CHAR(10),
VAPPROVEID VARCHAR2(30),
DAPPROVEDATE CHAR(10),
VAPPROVENOTE VARCHAR2(50),
VBILLSTATUS NUMBER,
BILLTYPE VARCHAR2(20),
DBILLDATE CHAR(10),
DR NUMBER,
TS CHAR(19),
PK_CORP VARCHAR2(100),
VDEF1 NUMBER,
VDEF2 VARCHAR2(100),
VDEF3 NUMBER(20,8),
VDEF4 NUMBER(20,8),
VDEF5 NUMBER(20,8),
VDEF6 VARCHAR2(100),
VDEF7 VARCHAR2(100),
VDEF8 VARCHAR2(100),
VDEF9 VARCHAR2(100),
VDEF10 VARCHAR2(100),
VDEF11 VARCHAR2(100),
VDEF12 VARCHAR2(100),
VDEF13 VARCHAR2(100),
VDEF14 VARCHAR2(100),
VDEF15 VARCHAR2(100),
VDEF16 VARCHAR2(100),
VDEF17 VARCHAR2(100),
VDEF18 VARCHAR2(100),
VDEF19 VARCHAR2(1000),
VDEF20 VARCHAR2(100),
VDEF21 VARCHAR2(100),
VDEF22 VARCHAR2(100),
VDEF23 VARCHAR2(100),
VDEF24 VARCHAR2(100),
VDEF25 VARCHAR2(100),
VDEF26 VARCHAR2(100),
VDEF27 VARCHAR2(100),
VDEF28 VARCHAR2(100),
VDEF29 VARCHAR2(100),
VDEF30 VARCHAR2(100),
GRAPHCODE VARCHAR2(50),
GRAPHNAME VARCHAR2(100),
NWORKORDER VARCHAR2(30),
WXTYPE VARCHAR2(30),
QCCGRWL VARCHAR2(50),
VNOTE VARCHAR2(200),
LKR VARCHAR2(200),
LKDEPT VARCHAR2(200)
)
-- Create table
create table SHHT812_LK_B
(
PK_LK_B VARCHAR2(30) not null,
PK_LK VARCHAR2(30),
DR NUMBER,
TS CHAR(19),
VDEF1 NUMBER(20,8),
VDEF2 NUMBER(20,8),
VDEF3 NUMBER(20,8),
VDEF4 NUMBER(20,8),
VDEF5 NUMBER(20,8),
VDEF6 VARCHAR2(100),
VDEF7 VARCHAR2(100),
VDEF8 VARCHAR2(100),
VDEF9 VARCHAR2(100),
VDEF10 VARCHAR2(100),
VDEF11 VARCHAR2(100),
VDEF12 VARCHAR2(100),
VDEF13 VARCHAR2(100),
VDEF14 VARCHAR2(100),
VDEF15 VARCHAR2(100),
VDEF16 VARCHAR2(100),
VDEF17 VARCHAR2(100),
VDEF18 VARCHAR2(100),
VDEF19 VARCHAR2(100),
VDEF20 VARCHAR2(100),
VDEF21 VARCHAR2(100),
VDEF22 VARCHAR2(100),
VDEF23 VARCHAR2(100),
VDEF24 VARCHAR2(100),
VDEF25 VARCHAR2(100),
VDEF26 VARCHAR2(100),
VDEF27 VARCHAR2(100),
VDEF28 VARCHAR2(100),
VDEF29 VARCHAR2(100),
VDEF30 VARCHAR2(100),
VDEF31 VARCHAR2(100),
VDEF32 VARCHAR2(100),
VDEF33 VARCHAR2(100),
VDEF34 VARCHAR2(100),
VDEF35 VARCHAR2(100),
VDEF36 VARCHAR2(100),
VDEF37 VARCHAR2(100),
VDEF38 VARCHAR2(100),
VDEF39 VARCHAR2(100),
VDEF40 VARCHAR2(100),
INVCODE VARCHAR2(100),
INVNAME VARCHAR2(100),
INVNUMBER NUMBER(20,8),
INVJLDW VARCHAR2(20),
INVSPEC VARCHAR2(50),
INVTYPE VARCHAR2(50),
INVJSTJ VARCHAR2(50),
INVZLDJ VARCHAR2(50),
INVXXGF VARCHAR2(50),
INVFZXS VARCHAR2(50),
INVWXCC VARCHAR2(50),
INVZYTJ VARCHAR2(50),
INVFJXY VARCHAR2(50),
INVJDDJ VARCHAR2(50),
INVTSSM VARCHAR2(50),
INVGYZT VARCHAR2(50),
INVNOTE VARCHAR2(200),
RESPONSER VARCHAR2(50),
XQSL NUMBER(20,8),
LKSL NUMBER(20,8),
LKJE NUMBER(20,8)
)
- 新增单据模板
客户化---------模板管理--------模板设置---------单据模板设置工具
(注意:所有字段都需要小写)
- 生成VO类
二次开发工具------UAP集成开发工具-------第一个图标 ------工具与选项-----根据数据源生成VO
- 单据类型管理
增加一条单据类型
- VO对照管理
- 单据号管理
- 把生成的VO和前台的三个类分别放在public端和client端
package nc.ui.shht.z507921;
import nc.ui.trade.bill.AbstractManageController;
import nc.ui.trade.businessaction.IBusinessActionType;
import nc.ui.trade.button.IBillButton;
import nc.vo.shht.z507921.AggYDVO;
import nc.vo.shht.z507921.YDBVO;
import nc.vo.shht.z507921.YDVO;
public class ClientCtrl extends AbstractManageController{
public String[] getCardBodyHideCol() {
// TODO Auto-generated method stub
return null;
}
public int[] getCardButtonAry() {
// TODO Auto-generated method stub
return new int[]{
IBillButton.Query,
IBillButton.Add,
IBillButton.Save,
IBillButton.Edit,
IBillButton.Line,
IBillButton.Delete,
IBillButton.Cancel,
IBillButton.Return,
IBillButton.Refresh,
//ISHHTButton.LK,
};
}
public boolean isShowCardRowNo() {
// TODO Auto-generated method stub
return false;
}
public boolean isShowCardTotal() {
// TODO Auto-generated method stub
return false;
}
public String getBillType() {
// TODO Auto-generated method stub
return "YDDJ";
}
public String[] getBillVoName() {
// TODO Auto-generated method stub
return new String[]{
AggYDVO.class.getName(),
YDVO.class.getName(),
YDBVO.class.getName()
};
}
public String getBodyCondition() {
// TODO Auto-generated method stub
return null;
}
public String getBodyZYXKey() {
// TODO Auto-generated method stub
return null;
}
public int getBusinessActionType() {
// TODO Auto-generated method stub
return IBusinessActionType.BD;
}
public String getChildPkField() {
// TODO Auto-generated method stub
return "pk_yd_b";
}
public String getHeadZYXKey() {
// TODO Auto-generated method stub
return null;
}
public String getPkField() {
// TODO Auto-generated method stub
return "pk_yd";
}
public Boolean isEditInGoing() throws Exception {
// TODO Auto-generated method stub
return null;
}
public boolean isExistBillStatus() {
// TODO Auto-generated method stub
return true;
}
public boolean isLoadCardFormula() {
// TODO Auto-generated method stub
return false;
}
public String[] getListBodyHideCol() {
// TODO Auto-generated method stub
return null;
}
public int[] getListButtonAry() {
// TODO Auto-generated method stub
return new int[]{
IBillButton.Query,
IBillButton.Add,
IBillButton.Save,
IBillButton.Edit,
IBillButton.Delete,
IBillButton.Cancel,
IBillButton.Card,
IBillButton.Refresh,
};
}
public String[] getListHeadHideCol() {
// TODO Auto-generated method stub
return null;
}
public boolean isShowListRowNo() {
// TODO Auto-generated method stub
return false;
}
public boolean isShowListTotal() {
// TODO Auto-generated method stub
return false;
}
}
package nc.ui.shht.z507921;
import nc.ui.trade.controller.IControllerBase;
import nc.ui.trade.manage.BillManageUI;
import nc.ui.trade.manage.ManageEventHandler;
public class ClientEH extends ManageEventHandler{
public ClientEH(BillManageUI billUI, IControllerBase control) {
super(billUI, control);
// TODO Auto-generated constructor stub
}
@Override
protected void onBoSave() throws Exception {
// TODO Auto-generated method stub
getBillCardPanelWrapper().getBillCardPanel().dataNotNullValidate();//必输项目检测
super.onBoSave();
}
@Override
protected void onBoElse(int intBtn) throws Exception {
// TODO Auto-generated method stub
// if (intBtn == ISHHTButton.LK) {
// //lk();
// }
}
}
package nc.ui.shht.z507921;
import org.hibernate.id.SequenceGenerator;
import org.hibernate.util.GetGeneratedKeysHelper;
import nc.bs.pub.billcodemanage.BillcodeGenerater;
import nc.ui.pub.bill.BillCardBeforeEditListener;
import nc.ui.pub.bill.BillEditEvent;
import nc.ui.pub.bill.BillEditListener;
import nc.ui.pub.bill.BillItemEvent;
import nc.ui.trade.bill.AbstractManageController;
import nc.ui.trade.manage.BillManageUI;
import nc.ui.trade.manage.ManageEventHandler;
import nc.vo.pub.CircularlyAccessibleValueObject;
import nc.vo.trade.pub.IBillStatus;
public class ClientUI extends BillManageUI implements BillEditListener,BillCardBeforeEditListener{
@Override
protected AbstractManageController createController() {
// TODO Auto-generated method stub
return new ClientCtrl();
}
protected ManageEventHandler createEventHandler() {
// TODO Auto-generated method stub
return new ClientEH(this,getUIControl());
}
@Override
public void setBodySpecialData(CircularlyAccessibleValueObject[] vos)
throws Exception {
// TODO Auto-generated method stub
}
@Override
protected void setHeadSpecialData(CircularlyAccessibleValueObject vo,
int intRow) throws Exception {
// TODO Auto-generated method stub
}
@Override
protected void setTotalHeadSpecialData(CircularlyAccessibleValueObject[] vos)
throws Exception {
// TODO Auto-generated method stub
}
@Override
protected void initPrivateButton() {
// TODO Auto-generated method stub
//add by slm 2018-11-1 14:27:22 新增生成利库单按钮
// nc.vo.trade.button.ButtonVO createLK = nc.ui.shht.button.ButtonFactory
// .createButtonVO(ISHHTButton.LK, "利库", "利库");
// addPrivateButton(createLK);
}
@Override
protected void initSelfData() {
// TODO Auto-generated method stub
getBillCardPanel().setAutoExecHeadEditFormula(true);//表头加载公式
getBillListPanel().getBodyBillModel().execLoadFormula();//表体加载公式
}
@Override
public void setDefaultData() throws Exception {
// TODO Auto-generated method stub
//初始赋值
getBillCardPanel().setHeadItem("dr", 0);//删除标志
getBillCardPanel().setHeadItem("billtype", getUIControl().getBillType());//本单据类型
getBillCardPanel().setHeadItem("vbillstatus", IBillStatus.FREE);//本单据状态
getBillCardPanel().setHeadItem("pk_corp", _getCorp().getPrimaryKey());//公司主键
getBillCardPanel().setTailItem("voperatorid", _getOperator());//本单据制单人
getBillCardPanel().setTailItem("dmakedate", _getDate());//本单据制单日期
BillcodeGenerater bg=new BillcodeGenerater();
String billcode_b=bg.getBillCode(getUIControl().getBillType(), _getCorp().getPrimaryKey(), null, null);//本单据号获得
getBillCardPanel().setHeadItem("vbillcode", billcode_b);//本单据号
//getBillCardPanel().setHeadItem("pk_yd", "111111");//本单据号
}
@Override
public void afterEdit(BillEditEvent e) {
// try {
// afterSetVO(e);
// } catch (Exception e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }
super.afterEdit(e);
}
private void afterSetVO(BillEditEvent e) throws Exception {}
public boolean beforeEdit(BillItemEvent e) {
// TODO Auto-generated method stub
return false;
}
}
- 功能注册、权限分配、功能节点默认模板设置。
这样,一个简单的单据就算是完成了。