1、NC客户化开发手册中级篇1NC客户化开发手册前言目录前言 1第一章 规范篇 21.1 代码规范 21.2 注释规范 21.3 异常规范 21.4 其他规范 2第二章 基础篇 32.1 单据信息 32.1.1获取卡片和列表容器(Panel) 32.1.2当前界面卡片/列表状态 32.1.3获取/设置当前单据的操作状态: 32.1.4获取选择的树节点 32.1.5是否单表体 32.1.6设置单据卡片表头区域比例 32.1.7设置表体页签状态 32.1.8获取单据模板上定义的所有字段 32.2 VO的获取和赋值及更新 32.2.1 VO的获取 32.2.2 VO的操作 42.3 字段处理 52.3.
2、1表头字段值 52.3.2表体字段值 52.3.3字段设置可编辑: 52.3.4隐藏字段 52.3.5设置数度 52.3.6设置字段焦点 62.4 公式 62.4.1执行、设置公式: 62.4.2公式解析器: 62.5 单据行操作 62.5.1获取表体选择行 62.5.2删除表体的自动排序 62.5.3行编辑状态: 62.5.4选中表体所有行 62.5.5列表下,表头行可多选的实现 72.5.6行操作(删除,增行等) 72.6 获取系统相关 72.6.1常量的获取(公司,操作员,时间) 72.6.2单据号的获取 72.7 程序健壮性及易用性 82.7.1单据保存时强制调用非空验证方法: 82.
3、7.2弹出消息框代码: 82.7.3在编辑事件中常用的判断 82.7.4设置表体没有右键菜单方法 8第三章 高级篇 83.1 审批流 83.2 后台预警 83.3 后台任务 83.4 消息 83.5 错误定位(日志分析) 8第一章 个性化应用1 1.1 单据常用设置1.1.1 校验是否允许表体为空修改校验类里的 public boolean isAllowEmptyBody(String tablecode) return true; 1.1.2 显示单据中的行号在client端的xxxxxxCtrl.java中的public boolean isShowListRowNo() 显示列表的行号
4、 return true; public boolean isShowCardRowNo() 显示卡片的行号 return true; 1.1.3 对某个表里的某个字段进行汇总 在模板中给要汇总的字段的是否合计属性打上勾 然后再对应的Controller类中修改下面几个方法:public boolean isShowCardRowNo() return true; public boolean isShowCardTotal() return true; public boolean isShowListRowNo() return true; public boolean isShowLis
5、tTotal() return true; 再在对应的UI类中相应的方法中添加如下代码:/自动汇总 表体申请拨款金额 并给 表头的申请拨款金额 赋值getBillCardPanel().setHeadItem(napplytotal, getBillCardPanel().getTotalTableModel().getValueAt(0, 1);napplytotal:指的是赋值的字段名;0:指的是汇总表中的行;1:指的是汇总表中的列。1.2 单据界面个性化1.2.1 表体为零的,不显示为空,金额以千分位格式显示列表下千分位显示getBillListPanel().getParentList
6、Panel().setShowThMark(true);getBillCardPanel().getBodyPanel().getRendererVO().setShowZeroLikeNull( false); / resolved 金额以会计格式显示,如:123,456,789,12 getBillCardPanel().getBodyPanel().getRendererVO().setShowThMark(true); nc.vo.pub.bill.BillTempletBodyVO tbodyvos = (nc.vo.pub.bill.BillTempletBodyVO) getBi
7、llCardPanel().getTempletData().getChildrenVO(); for (int j = 0; j tbodyvos.length; j+) if (tbodyvosj.getPos() = 0 & tbodyvosj.getShowflag() = true) if (tbodyvosj.getDatatype().toString().equals(2) (UIRefPane) getBillCardPanel().getHeadItem( tbodyvosj.getItemkey().getComponent() .getUITextField() .se
8、tNumShowType( nc.ui.pub.beans.textfield.IUITextFieldNUMShowType.THOUSANDS_SEPARATORS); 1.2.2 设置字体颜色getBillListPanel().getParentListPanel().setCellBackGround(i, key,new Color(252, 169, 175);1.2.3 单据组合表头/* * 设置组合表体表头 * param bill */ public static void groupableTableHeader(BillCardPanel bill) BillData
9、billData = bill.getBillData(); /* wjh追加 组合表头 利用单据模板上的自定义1 开始 */ if (billData.getBodyItems() != null) nc.vo.pub.bill.BillTempletBodyVO tbodyvos = (nc.vo.pub.bill.BillTempletBodyVO) bill .getTempletData().getChildrenVO(); for (int j = 0; j tbodyvos.length; j+) / 根据模板上属性“自定义项1”来组合表体的组合表头 if (tbodyvosj.
10、getUserdefine1() != null & tbodyvosj.getUserdefine1().trim().length() != 0) / 由于可能存在多叶签情况,所以要对叶签进行判断 String tablecode = tbodyvosj.getTable_code(); BillScrollPane scrollpane = bill .getBodyPanel(tablecode); GroupableTableHeader tableheaer = (GroupableTableHeader) scrollpane .getTable().getTableHeader
11、(); String colName = tbodyvosj.getUserdefine1(); ColumnGroup cg1 = new ColumnGroup(colName); addColItem(scrollpane, cg1, tbodyvosj.getItemkey(); int njs = 1; for (int n = j + 1; n 1) tableheaer.addColumnGroup(cg1); break; else if (njs 1) tableheaer.addColumnGroup(cg1); break; /* * * 添加组合表头子项 王韶勇追加 *
12、 * * param scrollpane * param colGroup * param sColItem */ private static void addColItem(BillScrollPane scrollpane, ColumnGroup colGroup, String sColItem) if (scrollpane.hasHideCol(sColItem) return; TableColumn col = scrollpane.getShowCol(sColItem); if (col != null) colGroup.add(col); 1.2.4 多表头Colu
13、mnGroup group = new ColumnGroup(“表头1”);GroupableTableHeader gt = (GroupableTableHeader) getBillCardPanel().getBillTable(表体名).getTableHeader();gt.addColumnGroup(group);group.add(getBillCardPanel().getBodyPanel(表体名).getShowCol(列名);ColumnGroup group1 = new ColumnGroup(祖名); GroupableTableHeader gt1 = (G
14、roupableTableHeader) getBillListPanel().getBodyTable().getTableHeader(); gt1.addColumnGroup(group1); group1.add(getBillListPanel().getBodyTable().getColumnModel().getColumn(2); group1.add(getBillListPanel().getBodyTable().getColumnModel().getColumn(3);1.2.5 报表列分组注释:详细解释请参看nc.vo.pub.cquery.FldgroupVO
15、FldgroupVO vos = new FldgroupVO3;FldgroupVO vo1 = new FldgroupVO();/ vo1.setPrimaryKey(0001);vo1.setGroupname(#1机组);vo1.setGroupid(new Integer(0);vo1.setGrouptype(0);vo1.setItem1(3);vo1.setItem2(2);vo1.setToplevelflag(Y);FldgroupVO vo2 = new FldgroupVO();/ vo2.setPrimaryKey(0002);vo2.setGroupname(#2
16、机组);vo2.setGroupid(new Integer(0);vo2.setGrouptype(0);vo2.setItem1(5);vo2.setItem2(4);vo2.setToplevelflag(Y);FldgroupVO vo3 = new FldgroupVO();/ vo3.setPrimaryKey(0003);vo3.setGroupname(#3机组);vo3.setGroupid(new Integer(0);vo3.setGrouptype(0);vo3.setItem1(7);vo3.setItem2(6);vo3.setToplevelflag(Y);vos
17、0 = vo1;vos1 = vo2;vos2 = vo3;/ 设置字段分组,在此不起作用,使用其下代码alterFieldGroup(vos)/ getReportBaseClass().setFieldGroup(vos);/ 修改表头列分组getReportBaseClass().alterFieldGroup(vos);1.2.6 单据联查PfLinkData linkQuery = new PfLinkData(); linkQuery.setBillID(单据主键的值); / SFClientUtil.openLinkedQueryDialog(H80103, this.getBi
18、llUI(), linkQuery);1.3 系统信息获取1.3.1 当前操作员的人员信息 /* * 根据当前操作员查询出人员信息 * * param sOperator * return */ public static PsndocVO getPsndocByOpreator(String sOperator) PsndocVO psnmanvo = null; try / 当前操作人关联业务员 UserAndClerkVO clerkVO = (IUserAndClerkQueryService) NCLocator .getInstance().lookup( IUserAndCler
19、kQueryService.class.getName() .findByUserID(sOperator); if (clerkVO = null | clerkVO.getPk_psndoc() = null | clerkVO.getPk_psndoc().length() = 0) return null; PsnBasManUnionVO psnBasManUnionVOs = (IPsnDocQueryService) NCLocator .getInstance().lookup(IPsnDocQueryService.class.getName() .queryPsnUnion
20、VosByUnionCondition( bd_psnbasdoc.pk_psnbasdoc = + clerkVO.getPk_psndoc() + ); / 人员管理档案VO psnmanvo = psnBasManUnionVOs0.getPsnmanvo(); return psnmanvo; catch (Exception ex) ex.printStackTrace(); return psnmanvo; public static UserAndClerkVO getOpreatorsByClerkId(String ClerkId) / 当前操作人关联业务员 UserAndC
21、lerkVO OpreatorVOs = null; try /根据人员档案主键查询出人员管理档案主键 IJHPubBill Qrypk = (IJHPubBill)NCLocator.getInstance().lookup(IJHPubBill.class); String psndocpk = Qrypk.QryManPKByBasPK(ClerkId); OpreatorVOs = (IUserAndClerkQueryService) NCLocator .getInstance().lookup( IUserAndClerkQueryService.class.getName()
22、.queryByClerkId(psndocpk); catch (ComponentException e) e.printStackTrace(); catch (BusinessException e) e.printStackTrace(); return OpreatorVOs; 通过查找业务关联的操作员public static UserAndClerkVO getOpreatorsByClerkId(String ClerkId) / 当前操作人关联业务员 UserAndClerkVO OpreatorVOs = null; try /根据人员档案主键查询出人员管理档案主键 IJ
23、HPubBill Qrypk = (IJHPubBill)NCLocator.getInstance().lookup(IJHPubBill.class); String psndocpk = Qrypk.QryManPKByBasPK(ClerkId); OpreatorVOs = (IUserAndClerkQueryService) NCLocator .getInstance().lookup( IUserAndClerkQueryService.class.getName() .queryByClerkId(psndocpk); catch (ComponentException e
24、) e.printStackTrace(); catch (BusinessException e) e.printStackTrace(); return OpreatorVOs; Qrypk.QryManPKByBasPK(ClerkId)实现方法为:public String QryManPKByBasPK(String psnbasdocPK) throws BusinessException String sql = select pk_psnbasdoc from bd_psndoc where pk_psndoc=?; String pk_psndoc = null; SQLPa
25、rameter para = new SQLParameter(); para.addParam(psnbasdocPK); List psndocPK = (List)this.executeQuery(sql, para, new ColumnListProcessor( 1); for (Iterator iter = psndocPK.iterator(); iter.hasNext();) pk_psndoc = (String) iter.next(); return pk_psndoc; 1.3.2 总帐的最小未结帐月份ICreateCorpQueryService cc= (I
26、CreateCorpQueryService)getLocator().lookup(ICreateCorpQueryService.class.getName(); /查询总帐的最小未结帐月份 String sYearMonth = cc.querySettledPeriod(dwbm, GL);1.3.3 IP地址public static String getDefaultLoginIP() if (isRunningServer() return InvocationInfoProxy.getInstance().getRemoteHost(); else String ip = null; try ip = InetAddress.getLocalHost().getHostAddress(); catch (UnknownHostException e) Logger.error(e.getMessage(), e); throw new BusinessRuntimeException(e.getMessage(); return ip; private static boolean isRunningServer() return RuntimeEnv.getInstance().isRunningInServer(); 1.3.