关于重复表单的关系映射定义

可以通过关系映射定义字段定义两个重复表单(子表单和父表单)之间的关系。实现关系定义可减少使用使用聚合函数的规则运行的线程数量,这些函数用于从其他表单实例获取数据,并提高系统性能。

注:

仅当规则目标位于重复表单上时,此字段才可用。

您必须从父重复表单和子重复表单中至少声明一个变量(任何问题),以建立父子关系的可能性。如果规则未引用两个重复表单,并且设置了关系映射定义,则在保存规则时会引发错误。

请考虑以下内容来设置关系映射定义:
  • 您必须选择与规则目标(子表单)在同一重复表单中存在的关系项(定义为规则可变项)。
  • 选择作为关系映射定义的项必须包含与相关父表的实例编号对应的值。预期格式为整数。

    这意味着,鉴于在子表单中每行都与父表中的给定行相关,因此在子表单中必须有一个字段,您可以在其中输入与父表单相关的实例/行号。子表单中的此字段(包含父表单中的实例编号)必须用于关系映射定义。

  • 在规则表达式中,您仍需要使用聚合函数从父表获取数据。

    例如:date of change (form1) 必须早于或等于 date of recovery (form2) 的规则中,使用 form1 中的事件编号在 form2 中查找相应的恢复日期。

    变量:
    var advnum        // event number - item in child table (rule traget form) which will be the relation item and contains the instance number of parent table
    var intdat        // date of change in form 1 (child form)- item to be used in rule logic
    var recdat        // date of recovery in form 2 - item from parent table to be used in rule logic, when updated it will trigger rule execution in child form
    关系映射定义:
    Parent Form Instance Number <=> advnum
    表达式:
    var aenum = advnum;
    var rfdata = getRFValues(aenum, ["recdat"] );                              // aggregate function that retrieves 'recdat' variable from parent form where instance number equals the value entered in 'advnum'/'aenum'
    var recdt = rfdata.exists && rfdata.recdat ? rfdata.recdat : null;         // null check and local variable value assignation
    
    if(recdt !== null && partialDateDiff(recdt,true,intdat,true,'Day') < 0)    //evaluates if difference with given date is < 0 (if recdt happens before given date)
    {   
        return false;                                                          //triggers query
    }
    else
    {
        return true;        
    }
关系映射定义的结果:
  • 如果用户更新父表单上的规则变量项:
    • 规则执行逻辑加载关系项的数据,并在子表中生成需要评估和更新的实例列表。这些实例是关系项值与父表中更新的起始实例的实例编号相同的实例。
    • 仅评估和更新子表单的相应实例。
  • 如果用户更新子表单上的规则变量项,则该规则仅对当前实例运行。
  • 如果用户更新影响规则的任何其他表单上的规则变量项,则该规则将针对所有目标表单实例运行,因为它在没有映射定义的情况下发生。