背景:
会计凭证中的参考凭证行项目(ACDOCA~AWITEM)需要和物料凭证的行项目(MSEG~ZEILE)进行关联。
不同长度的表字段关联,在ECC中我们会建立一张中间表来进行不同长度字段间的表连接,在S4/HANA中为我们提供了便捷的实现方式,通过以下4种方式来实现:
代码实现:
*&---------------------------------------------------------------------*
*& Report YZB_DEMO_01
*&---------------------------------------------------------------------*
***$ 功能描述:
** 1. 表关联时使用不同长度的字段进行JOIN
***$ 关键字:
** 1. CONCAT
** 2. RIGHT
** 3. LPAD
** 4. SUBSTRING
*--------------------------------------------------------------------*
REPORT yzb_demo_01.
DATA: go_alv TYPE REF TO cl_salv_table.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-001.
PARAMETERS: r_concat RADIOBUTTON GROUP g1,
r_right RADIOBUTTON GROUP g1,
r_lpad RADIOBUTTON GROUP g1,
r_substr RADIOBUTTON GROUP g1.
SELECTION-SCREEN END OF BLOCK b2.
INITIALIZATION.
%_r_concat_%_app_%-text = 'concat'.
%_r_right_%_app_%-text = 'right'.
%_r_lpad_%_app_%-text = 'lpad'.
%_r_substr_%_app_%-text = 'substring'.
START-OF-SELECTION.
CASE abap_true.
WHEN r_concat.
*--------------------------------------------------------------------*
****** 第一种实现方式:concat
***$取数:
SELECT
a~rldnr
,a~rbukrs
,a~gjahr
,a~belnr
,a~docln
,a~awref
,a~awitem
,m~mblnr
,m~zeile
FROM acdoca AS a
INNER JOIN mseg AS m ON a~gjahr EQ m~gjahr
AND a~awref EQ m~mblnr
AND a~awitem EQ concat( '00',m~zeile )
INTO TABLE @DATA(lt_acdoca).
WHEN r_right.
*--------------------------------------------------------------------*
***** 第二种实现方式:right
***$取数:
SELECT
a~rldnr
,a~rbukrs
,a~gjahr
,a~belnr
,a~docln
,a~awref
,a~awitem
,m~mblnr
,m~zeile
FROM acdoca AS a
INNER JOIN mseg AS m ON a~gjahr EQ m~gjahr
AND a~awref EQ m~mblnr
AND right( a~awitem,4 ) EQ m~zeile
INTO TABLE @lt_acdoca.
WHEN r_lpad.
*--------------------------------------------------------------------*
****** 第三种实现方式:lpad
***$取数:
SELECT
a~rldnr
,a~rbukrs
,a~gjahr
,a~belnr
,a~docln
,a~awref
,a~awitem
,m~mblnr
,m~zeile
FROM acdoca AS a
INNER JOIN mseg AS m ON a~gjahr EQ m~gjahr
AND a~awref EQ m~mblnr
AND a~awitem EQ lpad( m~zeile,6,'0' )
INTO TABLE @lt_acdoca.
WHEN r_substr.
*--------------------------------------------------------------------*
****** 第四种实现方式:substring
***$取数:
SELECT
a~rldnr
,a~rbukrs
,a~gjahr
,a~belnr
,a~docln
,a~awref
,a~awitem
,m~mblnr
,m~zeile
FROM acdoca AS a
INNER JOIN mseg AS m ON a~gjahr EQ m~gjahr
AND a~awref EQ m~mblnr
AND substring( a~awitem,2,4 ) EQ m~zeile
INTO TABLE @lt_acdoca.
WHEN OTHERS.
ENDCASE.
*--------------------------------------------------------------------*
***$显示:
TRY .
cl_salv_table=>factory(
IMPORTING
r_salv_table = go_alv
CHANGING
t_table = lt_acdoca ).
CATCH cx_salv_msg.
ENDTRY.
go_alv->display( ).