用友NC二次开发一些经验以及处理的问题
SQL数据结构UI
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类
2. 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 //设置界面默认数据
3. 多表的树结构(比如说,显示部门下的人员)
NC的树结构一般都是单表,那么parentid在数据表里也是对应的主键值。那么多表的时候只需在返回数据vo的时候, 手动把父节点的数据添加进去就可以了。
比如说:部门和人员的树结构
在自己定义的TreeData中的getTreeVO方法中:
Java代码
1. public SuperVO[] getTreeVO() { 2. PsndocVO[] result = null;
3. DeptdocVO[] deptdocvos = null; 4. try {
5. BusinessDelegator business = new BusinessDelegator();
6. String sql = \7.
8. result = (PsndocVO[]) business
9. .queryByCondition(PsndocVO.class, sql); 10. deptdocvos = (DeptdocVO[]) business
11. .queryByCondition(DeptdocVO.class, null);
12.
13. } catch (Exception e) { 14. e.printStackTrace(); 15. }
16. PsndocVO[] results = new PsndocVO[result.length + deptdocvos.length ];
17. for (int i = 0; i < deptdocvos.length; i++) { 18. PsndocVO vo = new PsndocVO();
19. vo.setPk_psndoc(deptdocvos[i].getPk_deptdoc()); 20. vo.setPsncode(\
21. vo.setPsnname(deptdocvos[i].getDeptname()); 22. results[i] = vo; 23. }
24. for (int i = 0; i < result.length; i++) {
25. results[deptdocvos.length + i] = result[i]; 26. }
27. return results; 28. }
完整的TreeData代码:
Java代码
1. public class TreeData implements IVOTreeDataByID { 2.
3. public String getIDFieldName() { 4. return \5. }
6. public String getParentIDFieldName() { 7.
8. return \9. }
10.
11. public String getShowFieldName() { 12.
13. return \14. } 15.
16. public SuperVO[] getTreeVO() { 17. PsndocVO[] result = null;
18. DeptdocVO[] deptdocvos = null; 19. try {
20. BusinessDelegator business = new BusinessDelegator();
21. String sql = \22.
23. result = (PsndocVO[]) business
24. .queryByCondition(PsndocVO.class, sql); 25. deptdocvos = (DeptdocVO[]) business
26. .queryByCondition(DeptdocVO.class, null);
27.
28. } catch (Exception e) { 29. e.printStackTrace(); 30. }
31. PsndocVO[] results = new PsndocVO[result.length + deptdocvos.length ];
32. for (int i = 0; i < deptdocvos.length; i++) { 33. PsndocVO vo = new PsndocVO();
34. vo.setPk_psndoc(deptdocvos[i].getPk_deptdoc()); 35. vo.setPsncode(\
36. vo.setPsnname(deptdocvos[i].getDeptname()); 37. results[i] = vo; 38. }
39. for (int i = 0; i < result.length; i++) {
40. results[deptdocvos.length + i] = result[i]; 41. }
42. return results; 43. } 44. 45.}
如果涉及到表增加,则只需按照添加部门那样增加一个for循环即可。同时把第一个循环中的parentid改为新增的表id。 在这里parentid指的是pk_deptdoc
4. 从后台去掉自定义项引用
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='';
注意在解除引用后,需要将被引用字段值置空,因为重新引用自定义项时,如果字段值不为空将引用失败,原因是自定义 项引用时默认会检查字段值是否为空。
5. 显示自定义项
Java代码
1. private void dealDefShow(){
2. String [] strDefObjs=new String[] {\单据头\
3. String [] strPrefix=new String[] {\4. try {
5. new ManageDefShowUtil(this.getBillCardPanel(), this.getBillListPanel()).showDefWhenRef(strDefObjs,strPrefix, true);
6. } catch (Exception e) {
7. Logger.error(e.getMessage(), e); 8. } 9. }