You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

滚动层级变更时同步字段值(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:15:40