滚动层级变更时同步字段值(PeopleSoft)及报错排查
解决PeopleSoft行集行号无效报错及EFF_STATUS同步问题
问题背景
- 页面结构:3层级页面,层级0、层级1基于同一记录
K_OFFNSV_REC,层级2基于另一记录K_OFFNSV_REC_EX - 需求:当层级1新增生效行且
EFF_STATUS变更为Active/Inactive时,同步更新层级2对应记录的EFF_STATUS字段 - 当前报错:
Invalid row number 2 for class Rowset method GetRow. (2,263) K_OFFNSV_REC_EX.EFF_STATUS.SaveEdit PCPC:267 Statement:8
报错原因
核心问题是行号上下文不匹配:你的代码写在了层级2字段K_OFFNSV_REC_EX.EFF_STATUS的SaveEdit事件中,此时CurrentRowNumber()返回的是层级2的当前行号(比如第2行),但你用这个行号去获取层级1的行集(&Level1(&I)),而层级1可能只有1行,自然触发“无效行号”的错误。
解决方案
分两种场景处理:
场景1:将代码移至层级1的EFF_STATUS字段事件(推荐)
既然需求是层级1字段变更时同步层级2,直接把代码放在层级1K_OFFNSV_REC.EFF_STATUS的FieldChange或SaveEdit事件里,此时CurrentRowNumber()获取的是层级1的行号,完全匹配层级1的行集范围。
修正后代码:
If %Component = Component.K_OFFNSV_CMP Then Local Rowset &LEVEL0, &Level1, &Level2; Local Row &L1Row, &L2Row; Local number &I, &J; &LEVEL0 = GetLevel0(); &Level1 = &LEVEL0(1).GetRowset(Scroll.K_OFFNSV_REC); &I = CurrentRowNumber(); // 此时返回层级1的行号,匹配&Level1的行范围 &L1Row = &Level1(&I); // 仅当新增行且EFF_STATUS为目标状态时执行同步 If &L1Row.IsNew And (&L1Row.K_OFFNSV_REC.EFF_STATUS.Value = "A" Or &L1Row.K_OFFNSV_REC.EFF_STATUS.Value = "I") Then &L1Row.K_OFFNSV_REC.LASTUPDDTTM.Value = %Date; &L1Row.K_OFFNSV_REC.OPRID.Value = %UserId; &Level2 = &L1Row.GetRowset(Scroll.K_OFFNSV_REC_EX); For &J = 1 To &Level2.ActiveRowCount &L2Row = &Level2(&J); &L2Row.K_OFFNSV_REC_EX.EFFDT.Value = %Date; &L2Row.K_OFFNSV_REC_EX.EFF_STATUS.Value = &L1Row.K_OFFNSV_REC.EFF_STATUS.Value; End-For; End-If; End-If;
场景2:必须保留在层级2的事件中
如果代码必须放在层级2的事件里,不要用CurrentRowNumber()取层级1的行,而是通过层级2的行直接获取其父行(层级1的行):
修正后代码:
If %Component = Component.K_OFFNSV_CMP Then Local Rowset &Level2; Local Row &L1Row, &L2Row; Local number &J; &L2Row = GetCurrentRow(); // 获取当前层级2的行 &L1Row = &L2Row.GetParentRow(Scroll.K_OFFNSV_REC); // 直接获取父行(层级1) If &L1Row.IsNew And (&L1Row.K_OFFNSV_REC.EFF_STATUS.Value = "A" Or &L1Row.K_OFFNSV_REC.EFF_STATUS.Value = "I") Then &L1Row.K_OFFNSV_REC.LASTUPDDTTM.Value = %Date; &L1Row.K_OFFNSV_REC.OPRID.Value = %UserId; &Level2 = &L1Row.GetRowset(Scroll.K_OFFNSV_REC_EX); For &J = 1 To &Level2.ActiveRowCount &L2Row = &Level2(&J); &L2Row.K_OFFNSV_REC_EX.EFFDT.Value = %Date; &L2Row.K_OFFNSV_REC_EX.EFF_STATUS.Value = &L1Row.K_OFFNSV_REC.EFF_STATUS.Value; End-For; End-If; End-If;
内容的提问来源于stack exchange,提问作者Ashley
相关产品推荐
相关产品推荐

