NC客户化开发手册(中级篇)

更新时间:2024-01-19 19:51:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

NC客户化开发手册

前言

目录

前言 ........................................................................................................................................................................... 1 第一章

1.1 1.2 1.3 1.4 第二章

2.1

规范篇 ................................................................................................................... 错误!未定义书签。 代码规范 .......................................................................................................... 错误!未定义书签。 注释规范 .......................................................................................................... 错误!未定义书签。 异常规范 .......................................................................................................... 错误!未定义书签。 其他规范 .......................................................................................................... 错误!未定义书签。 基础篇 ................................................................................................................... 错误!未定义书签。 单据信息 .......................................................................................................... 错误!未定义书签。 2.1.1获取卡片和列表容器(Panel) ......................................................................... 错误!未定义书签。 2.1.2当前界面卡片/列表状态 ................................................................................ 错误!未定义书签。 2.1.3获取/设置当前单据的操作状态: ................................................................ 错误!未定义书签。 2.1.4获取选择的树节点 ......................................................................................... 错误!未定义书签。 2.1.5是否单表体 ..................................................................................................... 错误!未定义书签。 2.1.6设置单据卡片表头区域比例 ......................................................................... 错误!未定义书签。 2.1.7设置表体页签状态 ......................................................................................... 错误!未定义书签。 2.1.8获取单据模板上定义的所有字段 ................................................................. 错误!未定义书签。 2.2

VO的获取和赋值及更新.................................................................................. 错误!未定义书签。 2.2.1 VO的获取 ...................................................................................................... 错误!未定义书签。 2.2.2 VO的操作 ...................................................................................................... 错误!未定义书签。 2.3

字段处理 .......................................................................................................... 错误!未定义书签。 2.3.1表头字段值 ..................................................................................................... 错误!未定义书签。 2.3.2表体字段值 ..................................................................................................... 错误!未定义书签。 2.3.3字段设置可编辑: ......................................................................................... 错误!未定义书签。 2.3.4隐藏字段 ......................................................................................................... 错误!未定义书签。 2.3.5设置数度 ......................................................................................................... 错误!未定义书签。 2.3.6设置字段焦点 ................................................................................................. 错误!未定义书签。 2.4

公式 .................................................................................................................. 错误!未定义书签。 2.4.1执行、设置公式: ......................................................................................... 错误!未定义书签。 2.4.2公式解析器: ................................................................................................. 错误!未定义书签。 2.5

单据行操作 ...................................................................................................... 错误!未定义书签。 2.5.1获取表体选择行 ............................................................................................. 错误!未定义书签。 2.5.2删除表体的自动排序 ..................................................................................... 错误!未定义书签。 2.5.3行编辑状态: ................................................................................................. 错误!未定义书签。 2.5.4选中表体所有行 ............................................................................................. 错误!未定义书签。 2.5.5列表下,表头行可多选的实现 ..................................................................... 错误!未定义书签。 2.5.6行操作(删除,增行等) .................................................................................. 错误!未定义书签。

第 1 页 / 共 19 页

2.6

获取系统相关 .................................................................................................. 错误!未定义书签。 2.6.1常量的获取(公司,操作员,时间) ......................................................... 错误!未定义书签。 2.6.2单据号的获取 ................................................................................................. 错误!未定义书签。 2.7

程序健壮性及易用性 ...................................................................................... 错误!未定义书签。 2.7.1单据保存时强制调用非空验证方法: ......................................................... 错误!未定义书签。 2.7.2弹出消息框代码: ......................................................................................... 错误!未定义书签。 2.7.3在编辑事件中常用的判断 ............................................................................. 错误!未定义书签。 2.7.4设置表体没有右键菜单方法 ......................................................................... 错误!未定义书签。

第三章

3.1 3.2 3.3 3.4 3.5

高级篇 ................................................................................................................... 错误!未定义书签。 审批流 .............................................................................................................. 错误!未定义书签。 后台预警 .......................................................................................................... 错误!未定义书签。 后台任务 .......................................................................................................... 错误!未定义书签。 消息 .................................................................................................................. 错误!未定义书签。 错误定位(日志分析)................................................................................... 错误!未定义书签。

第一章 个性化应用

1.1 单据常用设置 1.1.1 校验是否允许表体为空

修改校验类里的

public boolean isAllowEmptyBody(String tablecode) { }

return true;

1.1.2 显示单据中的行号

在client端的xxxxxxCtrl.java中的

public boolean isShowListRowNo() { // 显示列表的行号

} }

return true; return true;

public boolean isShowCardRowNo() { // 显示卡片的行号

1.1.3 对某个表里的某个字段进行汇总

? ?

public boolean isShowCardTotal() { }

return true;

在模板中给要汇总的字段的是否合计属性打上勾 然后再对应的Controller类中修改下面几个方法: }

return true;

public boolean isShowCardRowNo() {

第 2 页 / 共 19 页

public boolean isShowListRowNo() { ?

public boolean isShowListTotal() { }

再在对应的UI类中相应的方法中添加如下代码:

return true; }

return true;

//自动汇总 表体申请拨款金额 并给 表头的申请拨款金额 赋值

getBillCardPanel().setHeadItem(\napplytotal:指的是赋值的字段名;

0:指的是汇总表中的行;1:指的是汇总表中的列。

1.2 单据界面个性化

1.2.1 表体为零的,不显示为空,金额以千分位格式显示

列表下千分位显示

getBillListPanel().getParentListPanel().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[]) for (int j = 0; j < tbodyvos.length; j++) { }

if (tbodyvos[j].getPos() == 0 && tbodyvos[j].getShowflag() == true) { }

if (tbodyvos[j].getDatatype().toString().equals(\ }

((UIRefPane) getBillCardPanel().getHeadItem(

tbodyvos[j].getItemkey()).getComponent()) .getUITextField() .setNumShowType(

getBillCardPanel().getTempletData().getChildrenVO();

nc.ui.pub.beans.textfield.IUITextFieldNUMShowType.THOUSANDS_SEPARATORS);

1.2.2 设置字体颜色

getBillListPanel().getParentListPanel().setCellBackGround(i, key,new Color(252, 169, 175));

1.2.3 单据组合表头

/**

*设置组合表体表头 *@parambill */

publicstaticvoid groupableTableHeader(BillCardPanel bill) {

BillData billData = bill.getBillData();

第 3 页 / 共 19 页

/* wjh追加 组合表头 利用单据模板上的自定义1 开始 */

if (billData.getBodyItems() != null) {

nc.vo.pub.bill.BillTempletBodyVO[] tbodyvos =

.getTempletData().getChildrenVO();

(nc.vo.pub.bill.BillTempletBodyVO[]) bill

for (int j = 0; j < tbodyvos.length; j++) {// 根据模板上属性“自

定义项1”来组合表体的组合表头 if (tbodyvos[j].getUserdefine1() != null

&&

tbodyvos[j].getUserdefine1().trim().length() != 0) {

// 由于可能存在多叶签情况,所以要对叶签进行判断

String tablecode = tbodyvos[j].getTable_code();

BillScrollPane scrollpane = bill

{

.getBodyPanel(tablecode);

GroupableTableHeader tableheaer =

.getTable().getTableHeader();

(GroupableTableHeader) scrollpane

String colName = tbodyvos[j].getUserdefine1(); ColumnGroup cg1 = new ColumnGroup(colName); addColItem(scrollpane, cg1, int njs = 1;

for (int n = j + 1; n < tbodyvos.length; n++, j++) {

tbodyvos[j].getItemkey());

if (tbodyvos[n].getUserdefine1() != null

if }

&&

.trim().length() != 0 && n == j + 1)

tbodyvos[n].getUserdefine1().toString()

(tbodyvos[n].getUserdefine1().equals(colName)

&& tbodyvos[n].getTable_code().equals(

tablecode)) {

addColItem(scrollpane, cg1,

tbodyvos[n].getItemkey());

njs++; continue; if (njs > 1) { } break;

tableheaer.addColumnGroup(cg1);

} else {

} else {

if (njs > 1) {

第 4 页 / 共 19 页

}

}

}

}

}

}

}

tableheaer.addColumnGroup(cg1);

break;

/** *

*添加组合表头子项王韶勇追加 *

*

*@paramscrollpane *@paramcolGroup *@paramsColItem */

privatestaticvoid addColItem(BillScrollPane scrollpane, ColumnGroup

String sColItem) {

colGroup,

}

if (scrollpane.hasHideCol(sColItem))

return;

TableColumn col = scrollpane.getShowCol(sColItem); if (col != null)

colGroup.add(col);

1.2.4 多表头

ColumnGroup group = new ColumnGroup(“表头1”);

GroupableTableHeader gt = ((GroupableTableHeader) getBillCardPanel().getBillTable(\表体名\gt.addColumnGroup(group);

group.add(getBillCardPanel().getBodyPanel(\表体名\列名\ColumnGroup group1 = new ColumnGroup(\祖名\

GroupableTableHeader gt1 = ((GroupableTableHeader) 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

第 5 页 / 共 19 页

FldgroupVO[] vos = new FldgroupVO[3]; FldgroupVO vo1 = new FldgroupVO(); // vo1.setPrimaryKey(\vo1.setGroupname(\机组\vo1.setGroupid(new Integer(0)); vo1.setGrouptype(\vo1.setItem1(\vo1.setItem2(\vo1.setToplevelflag(\

FldgroupVO vo2 = new FldgroupVO(); // vo2.setPrimaryKey(\vo2.setGroupname(\机组\vo2.setGroupid(new Integer(0)); vo2.setGrouptype(\vo2.setItem1(\vo2.setItem2(\vo2.setToplevelflag(\

FldgroupVO vo3 = new FldgroupVO(); // vo3.setPrimaryKey(\vo3.setGroupname(\机组\vo3.setGroupid(new Integer(0)); vo3.setGrouptype(\vo3.setItem1(\vo3.setItem2(\vo3.setToplevelflag(\vos[0] = vo1; vos[1] = vo2; vos[2] = vo3;

// 设置字段分组,在此不起作用,使用其下代码alterFieldGroup(vos) // getReportBaseClass().setFieldGroup(vos); // 修改表头列分组

getReportBaseClass().alterFieldGroup(vos);

1.2.6 单据联查

PfLinkData linkQuery = new PfLinkData();

linkQuery.setBillID(单据主键的值); //

SFClientUtil.openLinkedQueryDialog(\,

linkQuery);

this.getBillUI(),

第 6 页 / 共 19 页

1.3 系统信息获取 1.3.1 当前操作员的人员信息

}

publicstatic UserAndClerkVO[] getOpreatorsByClerkId(String ClerkId){

// 当前操作人关联业务员

UserAndClerkVO[] OpreatorVOs = null; try {

//根据人员档案主键查询出人员管理档案主键

IJHPubBill Qrypk = (IJHPubBill)NCLocator.getInstance().lookup(IJHPubBill.class); }

return psnmanvo;

PsnBasManUnionVO[] psnBasManUnionVOs = ((IPsnDocQueryService) NCLocator

.getInstance().lookup(IPsnDocQueryService.class.getName()))

.queryPsnUnionVosByUnionCondition(\

+ clerkVO.getPk_psndoc() + \);

/**

*根据当前操作员查询出人员信息 *

*@paramsOperator *@return */

publicstatic PsndocVO getPsndocByOpreator(String sOperator) {

PsndocVO psnmanvo = null; try {

// 当前操作人关联业务员

UserAndClerkVO clerkVO = ((IUserAndClerkQueryService) NCLocator }

.getInstance().lookup(

IUserAndClerkQueryService.class.getName()))

.findByUserID(sOperator);

|| clerkVO.getPk_psndoc().length() == 0) {

if (clerkVO == null || clerkVO.getPk_psndoc() == null

returnnull;

// 人员管理档案VO

psnmanvo = psnBasManUnionVOs[0].getPsnmanvo(); return psnmanvo; ex.printStackTrace();

} catch (Exception ex) {

第 7 页 / 共 19 页

通过查找业务关联的操作员

publicstatic UserAndClerkVO[] getOpreatorsByClerkId(String ClerkId){

}

// 当前操作人关联业务员

UserAndClerkVO[] OpreatorVOs = null; try { }

return OpreatorVOs;

//根据人员档案主键查询出人员管理档案主键

IJHPubBill Qrypk = (IJHPubBill)NCLocator.getInstance().lookup(IJHPubBill.class); String psndocpk = Qrypk.QryManPKByBasPK(ClerkId);

OpreatorVOs = ((IUserAndClerkQueryService) NCLocator

.getInstance().lookup(

IUserAndClerkQueryService.class.getName()))

.queryByClerkId(psndocpk);

}

}

return OpreatorVOs;

String psndocpk = Qrypk.QryManPKByBasPK(ClerkId);

OpreatorVOs = ((IUserAndClerkQueryService) NCLocator

.getInstance().lookup(

IUserAndClerkQueryService.class.getName()))

.queryByClerkId(psndocpk);

} catch (ComponentException e) {

e.printStackTrace(); e.printStackTrace(); } catch (BusinessException e) {

} catch (ComponentException e) {

e.printStackTrace(); e.printStackTrace(); } catch (BusinessException e) {

Qrypk.QryManPKByBasPK(ClerkId)实现方法为:

public String QryManPKByBasPK(String psnbasdocPK) throws BusinessException {

String sql = \; String pk_psndoc = null;

SQLParameter para = new SQLParameter(); para.addParam(psnbasdocPK);

List psndocPK = (List)this.executeQuery(sql, para, new ColumnListProcessor(

第 8 页 / 共 19 页

}

for (Iterator iter = psndocPK.iterator(); iter.hasNext();) { }

return pk_psndoc;

pk_psndoc = (String) iter.next();

1));

1.3.2 总帐的最小未结帐月份

ICreateCorpQueryService cc=

(ICreateCorpQueryService)getLocator().lookup(ICreateCorpQueryService.class.getName()); //查询总帐的最小未结帐月份

String[] sYearMonth = cc.querySettledPeriod(dwbm, \

1.3.3 IP地址

public static String getDefaultLoginIP() {

}

private static boolean isRunningServer() { }

return RuntimeEnv.getInstance().isRunningInServer(); if (isRunningServer()) }

return InvocationInfoProxy.getInstance().getRemoteHost(); String ip = null; try { } return ip;

ip = InetAddress.getLocalHost().getHostAddress(); Logger.error(e.getMessage(), e);

throw new BusinessRuntimeException(e.getMessage()); } catch (UnknownHostException e) { else {

1.3.4 用户信息查询

IUserManageQuery umq = (IUserManageQuery)

UserVO psnVO =

IUserManageQuery.class.getName());

NCLocator.getInstance().lookup(

umq.getUser(task.getSenderman());

userName = psnVO.getUserName();

第 9 页 / 共 19 页

1.3.5 客户端获取服务器段的nchome路径

ClientEnvironment.getInstance().getServerURL() String ncHome =

RuntimeEnv.getInstance().getProperty(RuntimeEnv.SERVER_LOCATION_PROPERTY);

1.4 系统消息 1.4.1 待办事务

可以参考下, 后台代码,就是往数据库插入一条记录 //////////////////////////////1

PFMessageBO pfm = new PFMessageBO();

CommonMessageVO comvo = new CommonMessageVO(); UserNameObject usvo = new UserNameObject(\ usvo.setUserPK(\ usvo.setUserCode(\ usvo.setUserName(\

comvo.setSender(\

comvo.setReceiver(new UserNameObject[]{usvo}); comvo.setMessageContent(\导入数据演示\ comvo.setTitle(\外部平台导入数据\

comvo.setType(MessageTypes.MSG_TYPE_INFO); pfm.insertCommonMessage(comvo); ///2

PFMessageBO pfm = new PFMessageBO();

CommonMessageVO comvo = new CommonMessageVO(); UserNameObject usvo = new UserNameObject("a"); usvo.setUserPK("0001ZZ100000000000VJ"); usvo.setUserCode("a"); usvo.setUserName("a"); comvo.setSender("a");

comvo.setReceiver(new UserNameObject[]{usvo}); comvo.setMessageContent("导入数据演示"); comvo.setTitle("外部平台导入数据"); comvo.setType(MessageTypes.MSG_TYPE_INFO); pfm.insertCommonMessage(comvo); ///////////////////////////////

发送待办消息 UAP发送待办消息方法

void nc.itf.uap.pf.IPFMessage.insertCommonMsg(CommonMessageVO cMsgVO) throws BusinessException

参数说明 cMsgVO 普通消息VO, 结构定义如下:

public class CommonMessageVO extends ValueObject {

第 10 页 / 共 19 页

/** 消息内容 */ private String m_message = null; /** 发送人PK */ private String m_sender = null;

/** 接收人pk */ private UserNameObject[] m_receiver = null; /** 发送时间 */ private UFDateTime m_sendDate = null; /** 标题 */ private String m_title = null;

/**消息优先级*/ private int priority = MessagePriority.PRI_NORMAL(另外两个常量是 PRI_LOW;PRI_HIGH); } 使用说明

该方法前后台均可使用,用于向指定的用户发送业务消息。执行效果为在消息中心的 待办事务中插入一条普通消息,双击时弹出消息内容对话框。 public class MessageTypes { /**

* 公告消息,可由任何人看到的消息 */

public final static int MSG_TYPE_PUBLIC = -1; /**

* 预警消息,预警平台产生的预警消息 */

public static final int MSG_TYPE_PA = 0; /**

* 对发消息,某人向另外一人直接发送的消息 */

public static final int MSG_TYPE_P2P = 1; /**

* 业务流消息,业务流平台产生的需要业务处理的推式消息 */

public final static int MSG_TYPE_BUSIFLOW_PUSH = 3; /**

* 业务流消息,业务流平台产生的需要业务处理的拉式消息 */

public final static int MSG_TYPE_BUSIFLOW_PULL = 4; /**

* 业务流消息 */

public final static int MSG_TYPE_BUSIFLOW = 5; /**

* 普通消息,一般的通知消息 */

public static final int MSG_TYPE_INFO = 6; /**

* 后台消息,类同于预警但又不同于预警 */

public static final int MSG_TYPE_BG = 10;

第 11 页 / 共 19 页

1.4.2 保存后推送审批流消息

//如果有审批流,则发消息

if(billstatus == IBillStatus.CHECKGOING){

PuTool.sendMessageToMen(voUI.getHeadVO().getCoperator(), //制单人 }

voUI.getHeadVO().getCapproverid(), voUI.getHeadVO().getPrimaryKey(), voUI.getVBillCode(),

ScmConst.PO_MaterialAppBill);

1.4.3 手工发送消息

String pk_wf_task = null;

// IPFMessage ipfmsg = (IPFMessage) NCLocator.getInstance() // .lookup(IPFMessage.class.getName());

// ipfmsg.insertBizMsgs(new WorkflownoteVO[] { noteVO }); UFDateTime now = new UFDateTime(new Date());

noteVO.setActiontype(WorkflownoteVO.WORKITEM_TYPE_APPROVE);

// 发送业务消息到待办事务 给制单人

WorkflownoteVO noteVO = new WorkflownoteVO(); noteVO.setBillid(parentVO.getPrimaryKey()); noteVO

.setBillno((String) parentVO

.getAttributeValue(\

String corp_user = (String) parentVO

.getAttributeValue(\

noteVO.setCheckman(corp_user.substring(5));

noteVO.setMessagenote(parentVO.getAttributeValue(\

+ \已补单。\

.getAttributeValue(\

noteVO.setPk_billtype((String) parentVO noteVO.setPk_corp(corp_user.substring(0, 4));

noteVO.setSenderman(ClientEnvironment.getInstance().getUser()

.getPrimaryKey());

+ (String) parentVO.getAttributeValue(\+ \

String sql = \

ResultSetProcessor rs = new ArrayListProcessor();

ArrayList al = (ArrayList) DBCacheFacade.runQuery(sql, rs); if (al != null && al.size() > 0) { }

Object[] ob = (Object[]) al.get(1); pk_wf_task = (String) ob[0];

第 12 页 / 共 19 页

String pk = billUpd.insertVO(noteVO);

noteVO.setIscheck(\

noteVO.setReceivedeleteflag(UFBoolean.FALSE); noteVO.setSenddate(now);

noteVO.setApprovestatus(WFTask.STATUS_Start); if (noteVO.getPk_businesstype() == null)

noteVO.setPk_businesstype(IPFConfigInfo.STATEBUSINESSTYPE);

1.5 文件操作 1.5.1 文件目录创建方法

//获得NC_HOME绝对路径

//目录如果不存在,则创建目录

java.io.File srcDir = new java.io.File(srcPath); java.io.File clsDir = new java.io.File(outPath); if (!srcDir.exists())

srcDir.mkdirs(); clsDir.mkdirs(); if (!clsDir.exists())

String nchome = RuntimeEnv.getInstance().getNCHome();

nchome = new File(nchome).getAbsoluteFile().getCanonicalFile().toString(); String moduleHome = nchome + \ + module; //System.out.println(\ //获得编译前后Java文件目录和Class文件目录 String outPath = \; if (isBSClass) else

outPath = moduleHome + \; String srcPath = moduleHome + \;

outPath = moduleHome + \;

1.5.2 单据导出

@Override

protected void onBoExport() throws Exception { ()

._getModuleCode(),((BillManageUI) getBillUI

()).getBillListPanel());

nc.ui.pub.print.PrintEntry print = new nc.ui.pub.print.PrintEntry print.setTemplateID(getBillUI()._getCorp().getPrimaryKey(),

._getModuleCode(), getBillUI()._getOperator(),

(null, dataSource); getBillUI()

nc.ui.pub.print.IDataSource dataSource = new ListPanelPRTS(getBillUI

第 13 页 / 共 19 页

getBillUI() }

.getBusinessType(), getBillUI().getNodeKey());

ScmPrintTool.exportExcelByPrintTemplet(print,null);

1.6 脚本 1.6.1 自定义脚本类

可以自定义自己的脚本类型及脚本类,只要在pub_busiclass表中将 actiontype(脚本类 型) 与 classname(脚本类) 对应上即可,然后再脚本类中通过执行脚本类将参数 传递进去即可,如下:

retObj = bsBusiAction.processAction(\自定义脚本类型\

\单据类型\dmakedate.toString(), null,

vo.m_preValueVo, null, null);

系统会根据【单据类型】和【自定义脚本类型】在pub_busiclass表中查找对应的脚 本类。

1.6.2 调用其他脚本

// 获取业务动作类

IPFBusiAction bsBusiAction = (IPFBusiAction)

NCLocator.getInstance().lookup(IPFBusiAction.class.getName());

// 调用其他单据类型的动作脚本(参数1:操作类型,比如;参数2:单据 类型;参数3:日期字符串;参数4:审批流、工作流执行过程中需要与用户 交互的上下文VO;参数5:聚合vo;参数6: 用户对象;参数7:环境参数) retObj = bsBusiAction.processAction(\RMBBillType.RMF_OUTBILL,

dmakedate.toString(),null,vo.m_preValueVo,null,

null);

1.7 事件监听

1.7.1 移除字段的参照监听添加新的监听类

示例代码如下:

BillItem headItem = billData.getHeadItem(“LOANBILLNO”);

if (headItem != null) {

UIRefPane loanRef = (UIRefPane) headItem.getComponent(); if (loanRef != null) { }

loanRef.getUIButton().removeActionListener(

loanRef.getUIButton().getListeners(

ActionListener.class)[0]);

loanRef.getUIButton().addActionListener(

new LoanBillListener(this));

loanRef.setAutoCheck(false);

第 14 页 / 共 19 页

}

1.7.2 页签转换事件监听

UI工厂生成的代码,如果是多页签(表头或表体),那么监听页签之间转换事件的方法如下: 在ClientUI类的initSelfData()中实现如下代码即可: //卡片表头增加页签转换事件监听

getBillCardWrapper().getBillCardPanel().getHeadTabbedPane().addChangeListener(new ChangeListener(){

public void stateChanged(ChangeEvent e) {

int index = getBillCardPanel().getHeadTabbedPane().getSelectedIndex(); String saleid = getBillCardPanel().getHeadItem(\getBillCardPanel().getHeadItem(\} });

//卡片表体增加页签转换事件监听

getBillCardWrapper().getBillCardPanel().getHeadTabbedPane().addChangeListener(new ChangeListener(){

public void stateChanged(ChangeEvent e) { } });

//列表表体增加页签转换事件监听

getBillListPanel().getBodyTabbedPane().addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e) { } });

1.8 NC常用开发技巧

1.8.1 得到表体某一列合计值

getBillListPanel().getBodyScrollPane(\getBillListPanel().getParentListPanel().setTotalRowShow(true); getBillCardPanel().setTatolRowShow(true); 然后获取获取合计行的值

getBillCardPanel().getTotalTableModel().getValueAt(\行号\列字段\

设置合计的模式

getHeadBillModel().setRowSelectMode(false);设置为false后,合计行为所有的的合计,默认的是合计选择行的合计

1.8.2 NC加锁

public void updateForEx(CubasdocVO cubasdoc) throws BusinessException,

DbException { // 获取锁

boolean islock = false;

islock = PKLock.getInstance().acquireBatchLock

第 15 页 / 共 19 页

(cubasdoc.getLockpks(),

}

cubasdoc.getUserid(), \

// 更新 if (islock) { } // 异常 else { }

throw new nc.vo.pub.BusinessException try { }

getCubasdocDMO().updateForEx(cubasdoc); // 释放锁

PKLock.getInstance().releaseBatchLock

cubasdoc.getUserid(), \

} finally {

(cubasdoc.getLockpks(),

(nc.vo.bd.BDMsg.MSG_LOCKED());

1.8.3 附件管理功能实现

import java.awt.Container; import java.awt.Frame; import java.io.File; import nc.ui.ml.NCLangRes;

import nc.ui.pub.beans.MessageDialog; import nc.ui.pub.beans.UIFileChooser; import nc.ui.pub.beans.util.NCOptionPane; import nc.ui.pub.filemanager.FileManagerDialog; import nc.ui.pub.filemanager.FileManagerUtil; @SuppressWarnings(\

public class MyFileManagerDialog extends FileManagerDialog {

private int iMaxAttachmentSize = 5 * 1024 * 1024;// 上传附件的大小限制在5M private int iMaxCount = 5; //上传附件的个数限制在5个 //构造函数

public MyFileManagerDialog() { super(); }

public MyFileManagerDialog(String[] dirs, String[] dirShowNames) {

super(dirs, dirShowNames); }

public MyFileManagerDialog(Container parent, String[] dirs, String[] dirShowNames)

第 16 页 / 共 19 页

{

super(parent, dirs, dirShowNames); }

public MyFileManagerDialog(Container parent, String title, String[] dirs, String[] dirShowNames) {

super(parent, title, dirs, dirShowNames); }

public MyFileManagerDialog(Frame owner, String[] dirs, String[] dirShowNames) {

super(owner, dirs, dirShowNames); }

public MyFileManagerDialog(Frame owner, String title, String[] dirs, String[] dirShowNames) {

super(owner, title, dirs, dirShowNames); }

protected void onFileUpload() {

String id = super.getDir(); if (id == null) {

NCOptionPane.showMessageDialog(this, NCLangRes.getInstance ().getStrByID(\return; }

UIFileChooser fileChooser = new UIFileChooser(); fileChooser.setFileSelectionMode(0); fileChooser.setMultiSelectionEnabled(false); int rs = fileChooser.showOpenDialog(this); if (rs != 0) return;

File file = fileChooser.getSelectedFile(); if (!(file.exists())) return;

String localFilePath = file.getAbsolutePath();

String fileName = fileChooser.getSelectedFile().getName(); if ((localFilePath == null) || (localFilePath.length() <= 0)) return;

if (FileManagerUtil.isFileExistedServer(getDir(), fileName)) { int result = NCOptionPane.showConfirmDialog(this, NCLangRes.getInstance().

getStrByID(\().

第 17 页 / 共 19 页

getStrByID(\if (result != 0) { return; } }

//add by yzk at 2010-06-22 start

int iFileLength = (int) fileChooser.getSelectedFile().length(); if (iFileLength > iMaxAttachmentSize) {

MessageDialog.showHintDlg(this.getParent(), \提示信息\附件大小不 能超过 \!\return; }

int res = this.getUITreeFile().getRowCount(); if(res >= iMaxCount){

MessageDialog.showHintDlg(this.getParent(), \提示信息\附件个数不能超 过5个!\return; }

//add by yzk at 2010-06-22 end

FileManagerUtil.saveFileToServer(id, localFilePath); updateTree(); } }

1.8.4 存储特殊字符

数据库用BLOB类型,模板上设置成大文本和字符都可以 这个一般都是用来存图片什么的

1.9 常用的算法 1.9.1 判断字符串是否为数字

1用JAVA自带的函数

public static boolean isNumeric(String str){

第 18 页 / 共 19 页

for (int i = str.length();--i>=0;){ if (!Character.isDigit(str.charAt(i))){ return false; } } return true; }

2用正则表达式

public static boolean isNumeric(String str){ Pattern pattern = Pattern.compile(\ return pattern.matcher(str).matches(); }

3用ascii码

public static boolean isNumeric(String str){ for(int i=str.length();--i>=0;){ int chr=str.charAt(i); if(chr<48 || chr>57) return false; }

第 19 页 / 共 19 页

本文来源:https://www.bwwdw.com/article/60wo.html

Top