多次调用RP_PROVIDE_FROM_LAST宏如何保留P0105多子类型记录
SAP HR宏rp_provide_from_last查询多子类型结果覆盖问题解决方案
问题根因
rp_provide_from_last宏的逻辑是直接操作你传入的P0105表头工作区:找到符合子类型和时间条件的记录时,会把结果写入该工作区;如果没找到符合条件的记录,还会直接清空该工作区。你两次调用宏都用了同一个P0105工作区,第二次查询0004子类型的结果自然覆盖了第一次查询的0010子类型结果。
解决方案
最通用的做法是每次查询完一个子类型后,立即把结果转存到自定义的单独工作区,避免被后续宏调用覆盖,示例代码如下:
- 先定义独立存储用的工作区
* 两个工作区分别存储两个子类型的查询结果 DATA: ls_p0105_0010 TYPE p0105, ls_p0105_0004 TYPE p0105.
- 修改原有查询逻辑,每次查完立即转存结果
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
相关产品推荐
相关产品推荐

