12. 递归

明细递归的2种实现方法

1.需求

我们以环节的完成日期递归计算为例。
如下图,明细中通过“上一环节”确定环节之间的上下关系,每个环节所需的时长=环节周期+上一环节间隔天,只需填写最后一个环节的完成日期,则自动计算出每个环节的完成日期。
注:每个环节的“下一环节间隔天”与下一个环节的“上一环节间隔天”相等
图1

2.实现方法

有2种实现方法:★辅助序号  ★辅助环节+定时器

2.1 辅助序号

①增加辅助数据项“辅助序号”,用来匹配环节;
②给辅助序号赋值,需要给多少条明细记录赋值就需要赋值多少次,调用数据接口-序号列表(关于序号列表的使用详见数据源-模板数据接口-序号列表)。
如图1,给第4条记录填写“完成日期”时,则需要给环节序号=3,2,1的环节分别赋值,本表单.明细.环节序号=4,序号列表从1 到 (本表单.明细.序号-1) =3,辅助序号被赋值3次,分别为 3,2,1 。
②从明细中获取“下一环节”的数据作为数据源,对当前环节的“完成日期”更新。执行条件为 辅助序号>0, “辅助序号”的值为需要更新的环节序号,则下一环节序号= 辅助序号+1,作为数据源的过滤条件,对目标表明细中“环节序号”=“辅助序号”的记录执行更新。
“完成日期”利用“日期加减”函数完成,减去天数= 数据源.环节周期+数据源.上一环节间隔,并勾选“不触发值变化”。

2.2 辅助环节+定时器

实现时,容易出现“明细.完成日期”赋值的死循环;
实现思路如下:在基本信息中增加“本环节”相关的信息,操作明细具体的某一行时,将明细的环节信息同步更新到本环节中,当“本环节”的值发生变化时,启动定时器,进入定时器中,计算明细的“下一环节”的完成日期;
①基本信息中增加“本环节”相关的信息;  
②操作明细具体的某一行时,将明细的环节信息同步更新到本环节中。添加“本表单.明细.完成日期”的值变化事件,当上一环节存在且完成日期不为空时,给“本环节”相关的信息赋值;
③添加定时器,并在“本环节”被赋值时,启动定时器;
添加定时器;
当“本环节”发生值变化时,启动定期器。添加“本环节”的值变化事件,并在对话框底部单击【添加公式】,选择“设置控件属性”操作;
启动定时器。设置公式名称为“设置控件属性_定时器”,在设置控件属性中单击【+】,在下拉菜单中选择“定时器”,选中上方已添加的“定时器1”,将“运行”属性设置为“常量.是”;
④运行定时器下的操作,赋值“完成日期”。选中“定时器1”,添加“赋值”公式,将公式重命名为“赋值_完成日期”,当“本环节”有值的时候才运行,更新明细中“下一环节”名称与“本环节”名称相同行的完成日期。通过“日期加减”函数,根据“本环节完成日期”,间隔天数“本环节周期+上一环节间隔天数”,计算完成日期。
2022-09-23
38 37