对多种信息类型重用 RP_PROVIDE_FROM_LAST 宏?

jes*_*ert 2 abap sap-hr

我们使用 HR 宏从表中获取第一条或最后一条记录。其中之一是rp_provide_from_last。我需要从表中获取两个子类型 ( 0010, 0004) P0105

下面是我的代码。问题是在第二个宏之后,只有0004. 我怎样才能把它们抱在一起?

GET pernr.
rp_provide_from_last p0105 '0010' pn-begda pn-endda.
CHECK pnp-sw-found eq '1'.
rp_provide_from_last p0105 '0004' pn-begda pn-endda.
CHECK pnp-sw-found eq '1'.
Run Code Online (Sandbox Code Playgroud)

这是定义。

DEFINE rp_provide_from_last.

$PNNNN$ = &1. 
$SUBTY$ = &2.    
$BEGDA$ = &3.    
$ENDDA$ = &4.

pnp-sw-found = '0'.

clear pnp-sy-tabix.

loop at &1.  

 if &2 <> space.    
  check &1-subty = &2.    
 endif.    

 if &1-begda <= &4 and &1-endda >= &4.    
  pnp-sw-found = '1'.    
  exit.    
 endif.  

 if &1-begda <= &4 and &1-endda >= &3.    
  pnp-sy-tabix = sy-tabix.    
 endif.  

endloop. 

if pnp-sw-found = '0'.  

 if pnp-sy-tabix <> 0.    

  pnp-sw-found = '1'.   
  read table &1 index pnp-sy-tabix.    

 else.    
 clear &1.  

 endif.    
endif.

END-OF-DEFINITION.
Run Code Online (Sandbox Code Playgroud)

Phi*_*ipp 5

该宏中的代码的作用是获取带有您传递给它的标题行的表(p0105在您的情况下),搜索它,当它找到一个条目时,它:

  1. 将结果放入该表的标题行
  2. 将全局变量 pnp-sw-found 设置为 1
  3. 将全局变量 pnp-sy-tabix 设置为找到条目的行号

当您再次调用宏时,所有这些结果都会被覆盖。如果你想保留它们,那么你需要将它们存储在新的变量中。

DATA: ls_line_0010 TYPE p0105,
      ls_line_0004 TYPE p0105.

GET pernr.

rp_provide_from_last p0105 '0010' pn-begda pn-endda.
CHECK pnp-sw-found eq '1'.
ls_line_0010 = p0105.

rp_provide_from_last p0105 '0004' pn-begda pn-endda.
CHECK pnp-sw-found eq '1'.
ls_line_0004 = p0105.
Run Code Online (Sandbox Code Playgroud)

您现在有两个结构变量ls_line_0010ls_line_0004每个变量都包含表中不同行的数据。

顺便说一句:宏很讨厌。我真的会将该宏中的代码重构为 aFORM或 a METHOD,并以仅通过参数进行通信的方式进行操作,而不是通过设置全局变量。这将使您的生活以及以后必须维护该代码的每个人的生活变得更加轻松。另一个问题是该代码对带有标题行的表的依赖。它们已经过时了 20 多年,并且有充分的理由。当您必须使用带有标题行的表时,通常最好忽略这些标题行并将它们与工作区一起使用。