前言
假定现在有一个SELECT-OPTIONS内表S_MATNR,需要将它其中的值全部复制到另外一个内表 lt_rsparams,类型为 rsparams。
另外需要将 内表lt_rsparams每一行中的 selname字段设置为' S_MATNR
',kind字段设置为'S',先思考一下,如果是你会怎么做呢?
方法一 LOOP
最基础的方法自然是LOOP了,见示例代码
RANGES: s_asort FOR wlk1-filia.RANGES: s_matnr FOR wlk1-artnr.DATA: lt_rsparams TYPE TABLE OF rsparams, ls_rsparams TYPE rsparams, ls_asort LIKE LINE OF s_asort, ls_matnr LIKE LINE OF s_matnr.s_asort[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'W100' ) ( sign = 'I' option = 'EQ' low = 'W200' ) ( sign = 'I' option = 'EQ' low = 'W300' ) ).
s_matnr[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'M00001' ) ( sign = 'I' option = 'EQ' low = 'M00002' ) ( sign = 'I' option = 'EQ' low = 'M00003' ) ).*方法1LOOP AT s_asort. APPEND VALUE #( selname = 'S_ASORT' kind = 'S' sign = s_asort-sign option = s_asort-option low = s_asort-low high = s_asort-high ) TO lt_rsparams.ENDLOOP.LOOP AT s_matnr. APPEND VALUE #( selname = 'S_MATNR' kind = 'S' sign = s_matnr-sign option = s_matnr-option low = s_matnr-low high = s_matnr-high ) TO lt_rsparams.ENDLOOP.cl_demo_output=>display( lt_rsparams ).结果为
方法二 SQL
在S4版本中内表可以当成数据库表一样去查询,所以也可以这样写
RANGES: s_asort FOR wlk1-filia.RANGES: s_matnr FOR wlk1-artnr.DATA: lt_rsparams TYPE TABLE OF rsparams, ls_rsparams TYPE rsparams, ls_asort LIKE LINE OF s_asort, ls_matnr LIKE LINE OF s_matnr.s_asort[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'W100' ) ( sign = 'I' option = 'EQ' low = 'W200' ) ( sign = 'I' option = 'EQ' low = 'W300' ) ).
s_matnr[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'M00001' ) ( sign = 'I' option = 'EQ' low = 'M00002' ) ( sign = 'I' option = 'EQ' low = 'M00003' ) ).*方法2"from @s_asort 报错,不允许使用带表头行的表DATA(lt_asort) = s_asort[].SELECT 'S_ASORT' AS selname, 'S' AS kind, sign, option, low, high FROM @lt_asort AS a APPENDING TABLE @lt_rsparams.DATA(lt_matnr) = s_matnr[].SELECT 'S_MATNR' AS selname, 'S' AS kind, sign, option, low, high FROM @lt_matnr AS a APPENDING TABLE @lt_rsparams.cl_demo_output=>display( lt_rsparams ).结果同方法一是一样的
方法三 CORRESPONDING
直接上示例代码
RANGES: s_asort FOR wlk1-filia.RANGES: s_matnr FOR wlk1-artnr.DATA: lt_rsparams TYPE TABLE OF rsparams, ls_rsparams TYPE rsparams, ls_asort LIKE LINE OF s_asort, ls_matnr LIKE LINE OF s_matnr.s_asort[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'W100' ) ( sign = 'I' option = 'EQ' low = 'W200' ) ( sign = 'I' option = 'EQ' low = 'W300' ) ).
s_matnr[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'M00001' ) ( sign = 'I' option = 'EQ' low = 'M00002' ) ( sign = 'I' option = 'EQ' low = 'M00003' ) ).*方法3APPEND LINES OF VALUE rsparams_tt( FOR wa_asort IN s_asort ( CORRESPONDING #( BASE ( VALUE #( selname = 'S_ASORT' kind = 'S' ) ) wa_asort ) ) ) TO lt_rsparams.APPEND LINES OF VALUE rsparams_tt( FOR wa_matnr IN s_matnr ( CORRESPONDING #( BASE ( VALUE #( selname = 'S_MATNR' kind = 'S' ) ) wa_matnr ) ) ) TO lt_rsparams.ls_asort = s_asort[ 1 ].ls_matnr = s_matnr[ 1 ].ls_rsparams = CORRESPONDING #( BASE ( VALUE #( selname = 'S_ASORT' kind = 'S' low = 'W400' ) ) ls_asort EXCEPT low ) .APPEND ls_rsparams TO lt_rsparams.ls_rsparams = CORRESPONDING #( BASE ( VALUE #( selname = 'S_MATNR' kind = 'S' option = 'CP' low = |{ ls_matnr-low }*| ) ) ls_matnr EXCEPT option low ) .APPEND ls_rsparams TO lt_rsparams.cl_demo_output=>display( lt_rsparams ).结果如下:
总结
CORRESPONDING加BASE的使用,可以一行搞定内表到内表的转换。
SQL也是一种很方便的方法,也是我平时常用的方法。