用友NC二次开发一些经验以及处理的问题

354 篇文章 100 订阅
  1. 参照开发

系统参照的用法

UIRefPane  ref = new UIRefPane();

Ref.setRefNodeName(nc.vo.bd.ref.RefNodeNameConst.DEPTDOC);

nc.ui.bd.ref.IBusiType这个类里定义了参照对应的具体类

自定义参照

自己定义的参照类一般都继承自nc.ui.bd.ref.AbstractRefModel这个抽象类

下面列举一些常用的方法:

public String[] getFieldCode()   // 返回参照字段对应的表字段编码

public String[] getFieldName()  //返回参照字段对应的显示名称

public String getPkFieldCode()  //返回主键字段编码

public String getRefTitle()         //返回参照名称

public String getTableName()  //返回查询的表名称,可以是表连接语句

public String[] getHiddenFieldCode() //返回参照的隐藏字段

public int getDefaultFieldCount()     //返回参照的默认字段数量

public String getWherePart()   //返回查询条件

如果需要实现一些特殊的参照,比如树结构的参照,则应该继承AbstractRefTreeModel类

  1. ClientUI类常用方法
protected ManageEventHandler createEventHandler() //返回UI的事件处理类

protected AbstractManageController createController() //返回UI画面的控制类

protected BusinessDelegator createBusinessDelegator()  //返回UI的业务处理类

protected void initSelfData()                                               //初始化UI界面,比如设置精度

protected void initEventListener()                 //初始化单据监听,比如:BillCardBeforeEditListener

public abstract void setDefaultData() throws Exception //设置界面默认数据
  1. 多表的树结构(比如说,显示部门下的人员)

NC的树结构一般都是单表,那么parentid在数据表里也是对应的主键值。那么多表的时候只需在返回数据vo的时候, 手动把父节点的数据添加进去就可以了。

比如说:部门和人员的树结构

在自己定义的TreeData中的getTreeVO方法中:

public SuperVO[] getTreeVO() { 
        PsndocVO[] result = null; 
        DeptdocVO[] deptdocvos = null; 
        try { 
            BusinessDelegator business = new BusinessDelegator(); 
            String sql = " isnull(dr,0)=0"; 
 
            result = (PsndocVO[]) business 
                    .queryByCondition(PsndocVO.class, sql); 
            deptdocvos = (DeptdocVO[]) business 
                        .queryByCondition(DeptdocVO.class, null); 
             
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
        PsndocVO[] results = new PsndocVO[result.length + deptdocvos.length ]; 
        for (int i = 0; i < deptdocvos.length; i++) { 
            PsndocVO vo = new PsndocVO(); 
            vo.setPk_psndoc(deptdocvos[i].getPk_deptdoc()); 
            vo.setPsncode(""); 
            vo.setPsnname(deptdocvos[i].getDeptname()); 
            results[i] = vo; 
        } 
        for (int i = 0; i < result.length;  i++) { 
            results[deptdocvos.length + i] = result[i]; 
        } 
        return results; 
    } 

完整的TreeData代码:

public class TreeData implements IVOTreeDataByID { 
 
    public String getIDFieldName() { 
        return "pk_psndoc"; 
    } 
    public String getParentIDFieldName() { 
 
        return "pk_deptdoc"; 
    } 
 
    public String getShowFieldName() { 
 
        return "psncode,psnname"; 
    } 
 
    public SuperVO[] getTreeVO() { 
        PsndocVO[] result = null; 
       DeptdocVO[] deptdocvos = null; 
        try { 
           BusinessDelegator business = new BusinessDelegator(); 
           String sql = " isnull(dr,0)=0"; 

            result = (PsndocVO[]) business 
                    .queryByCondition(PsndocVO.class, sql); 
            deptdocvos = (DeptdocVO[]) business 
                        .queryByCondition(DeptdocVO.class, null); 
             
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
        PsndocVO[] results = new PsndocVO[result.length + deptdocvos.length ]; 
        for (int i = 0; i < deptdocvos.length; i++) { 
            PsndocVO vo = new PsndocVO(); 
            vo.setPk_psndoc(deptdocvos[i].getPk_deptdoc()); 
            vo.setPsncode(""); 
            vo.setPsnname(deptdocvos[i].getDeptname()); 
            results[i] = vo; 
        } 
        for (int i = 0; i < result.length;  i++) { 
            results[deptdocvos.length + i] = result[i]; 
        } 
        return results; 
    } 
 
} 

如果涉及到表增加,则只需按照添加部门那样增加一个for循环即可。同时把第一个循环中的parentid改为新增的表id。 在这里parentid指的是pk_deptdoc

  1. 从后台去掉自定义项引用

NC提供自定义项的引用,也就是备用字段的使用,但是引用完了以后不能修改,如果不想使用了又不能删除。只能从后 台解除引用。

bd_defdef 自定义项定义表,先从这个表中找到定义的自定义项记录pk_defdef

select pk_defdef from bd_defdef where defname='';

这里的名字即单据上显示的名称,然后从bd_defquote引用表中去掉pk_defdef内容而pk_defused表示表中字段

select bd_defquote.rowid,bd_defquote.* from bd_defquote where pk_defdef='';

注意在解除引用后,需要将被引用字段值置空,因为重新引用自定义项时,如果字段值不为空将引用失败,原因是自定义 项引用时默认会检查字段值是否为空。

  1. 显示自定义项
private void dealDefShow(){ 
        String [] strDefObjs=new String[] {"ARAP单据头"}; 
        String [] strPrefix=new String[] {"zyx"}; 
        try { 
            new ManageDefShowUtil(this.getBillCardPanel(), this.getBillListPanel()).showDefWhenRef(strDefObjs,strPrefix, true); 
        } catch (Exception e) { 
            Logger.error(e.getMessage(), e); 
        } 
    } 
  1. 后台获得登录日期
String date = InvocationInfoProxy.getInstance().getDate(); 
UFDate loginDate = new UFDate(Long.parseLong(date)); 
  1. NC主画面的头部信息位置。

1). 注销、快速切换、日志、帮助按钮的代码在 nc.ui.sm.desktop.SysFuncBtnPanel

2). 未读消息、代办事务、预警消息的代码在 nc.ui.sm.desktop.MsgCenterInfoPnl

3). 公司+用户+日期的代码在 nc.ui.sm.desktop.DesktopTopBar

4). 快捷码的代码在 nc.ui.sm.desktop.QuickCodePanel

5). 配置文件在nchome\modules\uap\META-INF\clientplugins\uap.plugin

  1. 参照相关的类

参照事件类:nc.ui.bd.ref.RefModelHandlerForClient

主要方法:getRefTableVO(String pk_corp)

参照显示的列标题:nc.vo.bd.ref.RefcolumnVO

获得名称方法:getFieldshowname()

系统参照查询:nc.bs.bd.ref.ReftableImpl

方法:findByNode(String refNodeName, String pk_corp)

  1. 查询模板设置默认值的系统变量。

#Sys_Account#,

#Sys_Year#,
#Sys_Month#,
#Sys_Date#,
#Sys_Operator#,
#Sys_department#,
#Sys_CurrCorp#

  1. getBillListPanel().setParentMultiSelect(true);设置多选即显示复选框
  2. 窗体间传值(窗体是通过获得功能节点打开的)
 PfLinkData pflink = new PfLinkData();
     new Thread(new Runnable() {
        public void run() {
       BannerDialog dialog = new BannerDialog(parent);
        dialog.setStartText(NCLangRes.getInstance().getStrByID("pfworkflow",
          "UPPpfworkflow-000473")/*
                 * @res "正在打开单据UI,请稍等..."
               */);
         try {
          dialog.start();
        Thread.sleep(100);
           FuncNodeStarter.openLinkedDialog(frVO, iLinkType, pflink, parent, false, true,
        null);
       } catch (Exception e) {
         Logger.error(e.getMessage(), e);
       } finally {
         dialog.end();
        }
        }
        }).start();
  FuncNodeStarter.openLinkedDialog(frVO, iLinkType, pflink, parent, false, true,null);
    //参数说明:     frVO:    FuncRegisterVO frVO = SFClientUtil.findFRVOFromMenuTree(customNode);// 功能节点VO
  iLinkType:int iLinkType = ILinkType.LINK_TYPE_MAINTAIN;
   pflink:PfLinkData,传值的中间载体
   parent:父容器
   
     //接收值:     需重写ILinkMaintain接口的public void doMaintainAction(ILinkMaintainData maintaindata);
 maintaindata即PfLinkData
  1. 点击按钮弹出参照画面
private boolean showTransRef() throws Exception {
   UIRefPane panel= new UIRefPane();
   MyRefModel = new MyRefModel ();//这里是你的参照类
   String billtype = ui.getUIControl().getBillType();
   refModel.setWhere(" parentbilltype='" + billtype + "'");
   panel.setRefModel(refModel);
   panel.setSize(400, 300);
   panel.setVisible(true);
   if (panel.getRef().showModal() == UIDialog.ID_OK) {
 	}
 }
  1. 服务端执行SQL语句的方法
//查询sql
import nc.bs.framework.common.NCLocator;
import nc.itf.uap.IUAPQueryBS;
import nc.jdbc.framework.SQLParameter;
import nc.jdbc.framework.processor.ColumnListProcessor;

...

IUAPQueryBS bs = NCLocator.getInstance().lookup(IUAPQueryBS.class);
SQLParameter params = new SQLParameter();

StringBuilder sb = new StringBuilder();
sb.append("select NAME from bd_balatype where pk_balatype = ? ");
params.addParam("SOMEPK");
List list = (List) bs.executeQuery(sb.toString(), params, new ColumnListProcessor());
if (list.size() > 0) {
	return (String) list.get(0);
}

//更新sql
import nc.bs.dao.BaseDAO;

...

new BaseDAO().executeUpdate("update xxx");

//删除行
//nc.ui.pubapp.billref.push.DestSaveAction 91行
this.getBillContext().getModel().deleteSelectData();
//获取选中的行:getSelectData();

原文出自:https://blog.csdn.net/u012003703/article/details/41042795

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值