为多种信息类型重用 RP_PROVIDE_FROM_LAST 宏?
Reuse RP_PROVIDE_FROM_LAST macro for several info-types?
我们使用 HR 宏从 table 获取第一条或最后一条记录。其中之一是 rp_provide_from_last
。
我需要从 P0105
table:
中获取两个子类型 (0010
, 0004
)
下面是我的代码。问题是在第二个宏之后,只有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'.
这里是定义。
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.
这个宏的代码所做的是将 table 和 header 行传递给它(p0105
在你的例子中),搜索它,当它找到时一个条目,它:
- 将结果放入那个table
的header-line
- 设置全局变量pnp-sw-found为1
- 将全局变量 pnp-sy-tabix 设置为找到条目的 line-number
当您再次调用宏时,所有这些结果都会被覆盖。如果要保留它们,则需要将它们存储在新变量中。
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.
您现在有两个 structure-variables ls_line_0010
和 ls_line_0004
,每个包含 table.
不同行的数据
顺便说一句:宏很恶心。我真的会将该宏的代码重构为 FORM
或 METHOD
并以仅通过参数而不是通过设置全局变量进行通信的方式进行。这将使您的生活以及以后必须维护该代码的每个人的生活变得更加轻松。另一个问题是该代码依赖 tables with header 行。那些已经过时了 20 多年,并且有充分的理由。当您必须将 table 与 header-line 一起使用时,通常最好忽略那些 header-line 并将它们与 work-areas 一起使用。
我们使用 HR 宏从 table 获取第一条或最后一条记录。其中之一是 rp_provide_from_last
。
我需要从 P0105
table:
0010
, 0004
)
下面是我的代码。问题是在第二个宏之后,只有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'.
这里是定义。
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.
这个宏的代码所做的是将 table 和 header 行传递给它(p0105
在你的例子中),搜索它,当它找到时一个条目,它:
- 将结果放入那个table 的header-line
- 设置全局变量pnp-sw-found为1
- 将全局变量 pnp-sy-tabix 设置为找到条目的 line-number
当您再次调用宏时,所有这些结果都会被覆盖。如果要保留它们,则需要将它们存储在新变量中。
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.
您现在有两个 structure-variables ls_line_0010
和 ls_line_0004
,每个包含 table.
顺便说一句:宏很恶心。我真的会将该宏的代码重构为 FORM
或 METHOD
并以仅通过参数而不是通过设置全局变量进行通信的方式进行。这将使您的生活以及以后必须维护该代码的每个人的生活变得更加轻松。另一个问题是该代码依赖 tables with header 行。那些已经过时了 20 多年,并且有充分的理由。当您必须将 table 与 header-line 一起使用时,通常最好忽略那些 header-line 并将它们与 work-areas 一起使用。