本文仅参考参照开发红皮书等资料对参照开发方法进行总结分享,官方红皮书中有诸多描述并不准确,文档也不完善,参照开发实际应用实践见下一篇文章。

什么是参照?

参照是用于在各类档案录入时提供选择参考信息的方法,用于避免手工录入造成的拼写错误、空格等问题。在各类系统中,我们通常可以见到下拉菜单、弹出窗口选择等形式的参照,它们可以为用户提供便利的输入。NC65中的参照可以提供定位、过滤、模糊查询等功能。

如下图所示,“入库业务员”就是一个带参照的文本框,点击放大镜即可打开人员参照按钮,这是系统预设好的人员档案参照,用户可在其中查询、选取人员,自动填充相关字段。

参照文本框-bixtooea.png

参照的结构

如下是参照的总体结构图(来自用友培训PPT)。

总体结构图-lwfzbctf.png

NC65提供了一些系统默认参照,开发者也可以根据需求开发自定义参照。
自定义参照关注两个部分:UI和Model,通常我们不需要对其UI进行定义,仅定义我们需要的参照Model即可。

三种参照类型的实现

在红皮书中提到了五种参照类型,包括下拉列表型、表型、树型、树表型、树表型大数据参照,它们都继承了UIDialog并实现了IRefUI60接口。我们一般需要关注的类型有三种:表型(AbstrarctRefModel)、树型(AbstractRefTreeModel)和树表型(AbstractRefGridTreeModel)。我从系统中分别找到了这三类参照类型的示例,在进行需求开发时,根据需要继承对应类型即可:
表型参照:

表型参照-pdeyjleu.png

树型参照:

树型参照-xmizidec.png

树表型参照:

树表型参照-mfcaanvk.png

接下来我分别列举三个参照类型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的值。

二开注意事项

  1. 参数区分大小写;
  2. 设置字段列表和字段时(主键、编码、名称等),注意保持一致。(同时加别名或不加别名);
  3. where语句开头不要包含where短语。

参考阅读

  • 知识库查询关键字:参照开发红皮书、NC65参照、V6参照开发培训。