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

多次调用RP_PROVIDE_FROM_LAST宏如何保留P0105多子类型记录

SAP HR宏rp_provide_from_last查询多子类型结果覆盖问题解决方案

问题根因

rp_provide_from_last宏的逻辑是直接操作你传入的P0105表头工作区:找到符合子类型和时间条件的记录时,会把结果写入该工作区;如果没找到符合条件的记录,还会直接清空该工作区。你两次调用宏都用了同一个P0105工作区,第二次查询0004子类型的结果自然覆盖了第一次查询的0010子类型结果。

解决方案

最通用的做法是每次查询完一个子类型后,立即把结果转存到自定义的单独工作区,避免被后续宏调用覆盖,示例代码如下:

  1. 先定义独立存储用的工作区
* 两个工作区分别存储两个子类型的查询结果
DATA: ls_p0105_0010 TYPE p0105,
      ls_p0105_0004 TYPE p0105.
  1. 修改原有查询逻辑,每次查完立即转存结果
GET pernr.
* 查询子类型0010的最新有效记录
rp_provide_from_last p0105 '0010' pn-begda pn-endda.
CHECK pnp-sw-found EQ '1'.
ls_p0105_0010 = p0105.

* 查询子类型0004的最新有效记录
rp_provide_from_last p0105 '0004' pn-begda pn-endda.
CHECK pnp-sw-found EQ '1'.
ls_p0105_0004 = p0105.

后续直接使用ls_p0105_0010和ls_p0105_0004两个工作区即可获取两个子类型的记录。

如果需要查询的子类型数量较多,也可以自行写逻辑从P0105内表直接筛选,无需多次调用宏,运行效率更高:

GET pernr.
SORT p0105 BY subty endda DESCENDING.
LOOP AT p0105 INTO DATA(ls_p0105) WHERE subty IN ('0010', '0004')
                                  AND begda <= pn-endda
                                  AND endda >= pn-begda.
  AT NEW subty.
    CASE ls_p0105-subty.
      WHEN '0010'. ls_p0105_0010 = ls_p0105.
      WHEN '0004'. ls_p0105_0004 = ls_p0105.
    ENDCASE.
  ENDAT.
ENDLOOP.
CHECK ls_p0105_0010 IS NOT INITIAL AND ls_p0105_0004 IS NOT INITIAL.

内容的提问来源于stack exchange,提问作者jesuismert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:36:04