15.全路径

1.需求

当分类下有子分类(如下图所示),顶级分类的全路径为当前分类的名称,子级分类的全路径为 父分类的全路径.当前分类的名称 (若父分类的全路径为 水利.上级专款,当前分类名称为 乡级资金,则当前分类的全路径为 水利.上级专款.乡级资金),且全路径为系统自动填写,如何实现呢?
图1

2.模板

2.1 样式及数据项

模板如下,分类信息在明细中,其中编号、名称、ID3个数据项必填;明细的分类ID是主键唯一标识,可让系统系统填写,用自动编号编写明细ID,并去掉“保存表单时才产生”,让明细的“ID”在填写一条明细记录时自动生成(还未保存表单),可在表单中隐藏“ID”和“父ID”;
基本信息中,手动“添加数据项”-“ID”,并利用“自动编号”填写该数据项,让“ID”在“新建表单时自动生成”,去掉设置“保存表单时才生成”
该模板只有一份表单,打开总表时显示仅有的一张表单,如图1所示。在模板设计界面,单击“模板属性”,勾选“只有一份表单”。

2.2 树型显示

设置明细的树型显示控制,在“数据定义管理”对话框中,打开“树型及排序”选项卡,设置(自我繁殖)树型显示控制,“节点数据项”是树形的唯一标识,设置为“ID”,“父节点数据项”此时为“父ID”,“树显示列数据项”是树的显示数据项,设置为“名称”,设置后,在表单中明细自动以树形显示;

2.3 工具栏

分类在明细中,分类有上级级关系,管理分类时需要可通过6个按钮“添加同级节点”、“添加子节点”、“升级节点”、“降级节点”、“上移节点”、“下移节点”控制,系统自动填写“父ID”信息;
在设计界面,单击【填表公式】,打开“填表公式管理”对话框,找到“工具栏按钮单击”事件,添加6个按钮,按钮标题如下,并在按钮下添加对应的公式(针对明细树形控制的6个公式:添加同级节点、添加子节点、升级节点、降级节点、上移节点、下移节点),这些操作的目标表选择“明细”;
删除多余的按钮,如 新建、上一张、下一张、打印、打印预览、锁定。

3.实现

有2种实现方式:填表公式和业务公式

3.1 填表公式

实现思路:读取明细的每个节点,获取它的父节点全路径,在父节点的全路径上加上本节点的名称,即为该节点的全路径,若节点为根节点,则全路径直接为本节点的名称;
①添加辅助数据项,基本信息中添加2个辅助数据项“辅ID”和“辅父ID”,用于判断。
②填写明细的“名称”时,给辅助数据项赋值。在“明细.名称”值变化事件下添加“赋值_辅助项”的公式,数据源为“明细”,明细中有多少条记录,将驱动操作执行多少次(详见 数据源-明细 的使用),将明细中所有的节点都执行一次赋值,将“数据源.ID”赋值给“辅ID”,“数据源.父ID”赋值给“辅父ID”;
③当“辅ID”发生值变化时,赋值“根节点全路径”。如何判断节点是否是根节点呢?根节点的“父ID”为空,因此执行条件为 本表单.辅父ID = 常量.空 或者 本表单.辅父ID = "" ,满足这个条件时,给该节点的“全路径”直接更新为“名称”;
④当“辅ID”发生值变化时,且该节点不是根节点时,先找到父节点,更新子节点的“全路径”,子节点的全路径为  数据源.全路径(父节点的全路径)+"."+该节点的名称 ;
⑤应用效果。选中节点“02”,在工具栏单击【添加子节点】,填写“编号”和“名称”移动光标后,该节点“全路径”自动填写“2.24”;修改任意节点“名称”,相关联节点的“全路径”自动更新;

3.2 业务公式

实现思路:在“保存表单后事件”下针对本模板添加业务公式,利用“子数据源”获取明细,然后再通过子数据源获取父节点的全路径,填写本节点的全路径。全路径=父节点的全路径+“.”+本节点.名称;
在设计界面,单击【业务公式】,在“保存表单后事件”下,添加针对本模板自己的业务公式;
我们以“更新时”子事件(本表单更新保存时)为例来进行讲解,“新建时”子事件的公式与其相同。
①由于目标模板(本模板)有2个目标对象,针对明细信息操作时,必须先针对基本信息操作,先找到表单。目标对象选择“全路径”,对目标对象执行“更新表单”操作,匹配条件为  全路径.ID =本表单.ID
②再针对明细信息操作,目标对象为“明细”,数据源为“本表单”,利用子数据源“明细列表”查询该表单所有的明细(该子数据源有多条记录,勾选多记录),利用子数据源“获取父节点”获取它的父节点信息。当“获取父节点”<> 常量.空 时,根据匹配条件 全路径.明细.ID =明细列表.ID ,更新目标对象的全路径为 获取父节点.父全路径+“.”+明细列表.名称 
针对全路径还有2种情况,若节点有父节点时,全路径=父节点.全路径+节点.名称;若节点没有父节点时,直接将 全路径=名称。打开条件表达式填写如下:
③子数据源-明细列表(表单ID),为模板数据接口,在本模板中设计数据接口
数据源为“本模板.明细”;数据列添加 ID、名称、父ID 3个数据项。
过滤条件中添加参数 表单ID,条件为 本模板.ID =自定义参数.表单ID ;
④子数据源-获取父节点(表单ID,父ID),为模板数据接口,在本模板中设计数据接口
数据源为“本模板.明细”和“本模板.明细”(别名 全路径2),这2个数据源的关联关系为“交集”,本模板.明细.父ID = 全路径2.明细.ID ,即左侧数据源是右侧数据源的子信息;
数据列中只需要获取父节点(全路径2).明细.全路径;
过滤条件中添加2个参数,表单ID和父ID,先找到表单,再根据 父ID 找到父节点。
⑤在“保存表单后事件”的“新建时”子事件下同样设置以上的业务公式,满足新建保存时也同步生成。
⑥应用效果。选中“04”节点,单击“添加子节点”,填写“编号”和“名称”,单击“保存”,该节点的“全路径”自动生成。

3.2 拓展

使用填表公式实现时,每填写一个节点,该节点的“全路径”自动生成;
使用业务公式实现时,单击【保存】按钮时,可一次给多个节点同时赋值“全路径”;
2022-12-20
44 42