用友 NC65 参照开发常用知识总结
本文仅参考参照开发红皮书等资料对参照开发方法进行总结分享,官方红皮书中有诸多描述并不准确,文档也不完善,参照开发实际应用实践见下一篇文章。
什么是参照?
参照是用于在各类档案录入时提供选择参考信息的方法,用于避免手工录入造成的拼写错误、空格等问题。在各类系统中,我们通常可以见到下拉菜单、弹出窗口选择等形式的参照,它们可以为用户提供便利的输入。NC65中的参照可以提供定位、过滤、模糊查询等功能。
如下图所示,“入库业务员”就是一个带参照的文本框,点击放大镜即可打开人员参照按钮,这是系统预设好的人员档案参照,用户可在其中查询、选取人员,自动填充相关字段。
参照的结构
如下是参照的总体结构图(来自用友培训PPT)。
NC65提供了一些系统默认参照,开发者也可以根据需求开发自定义参照。
自定义参照关注两个部分:UI和Model,通常我们不需要对其UI进行定义,仅定义我们需要的参照Model即可。
三种参照类型的实现
在红皮书中提到了五种参照类型,包括下拉列表型、表型、树型、树表型、树表型大数据参照,它们都继承了UIDialog并实现了IRefUI60接口。我们一般需要关注的类型有三种:表型(AbstrarctRefModel)、树型(AbstractRefTreeModel)和树表型(AbstractRefGridTreeModel)。我从系统中分别找到了这三类参照类型的示例,在进行需求开发时,根据需要继承对应类型即可:
表型参照:
树型参照:
树表型参照:
接下来我分别列举三个参照类型Model定义属性,仅作参考应用,方法属性列举并不完整(虽然我想吐槽官方文档也写的不大好)。
参照的Model本质上是SQL语句拼接,抽象Model中的设定方法就是SQL语句的不同部分,参照会按照设定的SQL语句到数据库进行查询。
表型参照
基本定义项
// 设置参照标题栏显示的名称
setRefTitle("参照名称");
// FieldName为参照显示表头列名,应与FieldCode一一对应
setFieldName(new String[](“人员代码”,”姓名”,”部门名称”));
// FieldCode为SQL的Select子句,注意:上限为13
setFieldCode(new String[] { "bd_psndoc.psncode", "bd_psndoc.psnname","bd_deptdoc.deptname" });
// 设置隐藏字段:这些字段会参与查询,但不在参照中显示
setHiddenFieldCode(new String[]{"pk_corp"});
// 设定主键字段:这里的字段需在setFieldCode或setHideenFieldCode
setPkFieldCode("bd_psndoc.pk_psndoc");
// SQL语句的From子句
setTableName("bd_psndoc left outer join bd_deptdoc on bd_psndoc.pk_deptdoc=bd_deptdoc.pk_deptdoc ");
其它可选项
// SQL语句的Where子句
setWherePart(" bd_psndoc.pk_corp='" + _getPk_corp()_ + "'");
addWherePart(""); // 每次都从原where中追加,不允许连续追加where子句
// SQL语句的Order子句,默认为第一列
setOrderPart("");
// SQL语句的Group子句
setGroupPart("");
// 默认参照列表展示列,默认值为前2列
setDefaultFieldCount(2);
// 设定参照代码字段,默认为第一列
setRefCodeField("字段名");
// 设定参照名称字段,默认为第二列
setRefNameField("字段名");
// 设置助记码字段名
setMnecode("字段名数组");
树型参照
树型参照的基本定义项同表型参照一样,照例书写并定义即可。树形设置group子句无效。这里只列出树型参照的部分项目。
// 指定编码规则:如果为空,则按上下级关系构造树,须指定父子字段
setCodingRule("");
// 指定父字段名
setFatherField("字段名");
// 指定子字段名
setChildField("字段名");
// 指定根名(默认和参照名相同)
setRootName("根名");
树表型参照
树表型参照Model定义包括树和表的定义。
树的定义
// 指定根名
setRootName(根名);
setClassFieldName("表名");
setClassFieldCode("字段名数组");
setClassWherePart("where子句");
SetOrderPart("Order子句");
// 设置与表关联的字段名
SetClassJoinField("");
// 树节点显示字段,默认为2
SetClassDefaultFieldCount(2);
// 指定定编码规则:如果为空,按上下级关系
setCodingRule("");
// 指定父字段名
setFatherField(字段名);
// 指定子字段名
setChildField(字段名);
表的定义
注意:此处表型参照应有的基本属性也要定义,这里仅列出不同的部分。
// 设定和树节点数据关联的字段
setDocJoinField();
//设置精确匹配:默认精确匹配(树上选择一个节点后,查询表数据是否为精确匹配)
setExactOn(boolean);
//设定读表的树节点最小级次:默认1(末级节点一定会读表数据,其他情况要大于等于该值是才读数据)
setExpandLevel(int)
其它注意事项
覆盖参照抽象Model中的方法的注意事项
nc.ui.bd.ref.AbstractRefModel.getData();
参照默认是按照设定好的Sql语句到后台查询数据,如果想自定义取数,可以覆盖getData() 方法。返回自定义数据即可。但要注意,参照的数据默认情况下是有内存级缓存的,缓存的key为AbstractRefModel.getRefSql()的值,如果该值为null,那参照系统将不会缓存数据。如果要使用参照内存缓存,getRefSql()要有非null的值。
二开注意事项
- 参数区分大小写;
- 设置字段列表和字段时(主键、编码、名称等),注意保持一致。(同时加别名或不加别名);
- where语句开头不要包含where短语。
参考阅读
- 知识库查询关键字:参照开发红皮书、NC65参照、V6参照开发培训。