ABAP随笔-获取标准报表数据(MB52)数据进行客制ALV

2022-06-23 15:24:36 浏览数 (2)

获取标准报表数据(MB52)数据进行客制ALV

之前有一个需求,客户使用的单位大多为采购单位,但是MB52中是物料主数据中的基本单位,所以需要对MB52进行处理。

相比于增强来说,使用submit去获取MB52的数据,然后在自己的报表中再去展示更好一点,也更加灵活。这里不仅仅限于MB52还有任何其他ALV报表都可以使用这个方法来做到客制的目的。

关键的代码是:

代码语言:javascript复制
 1 DATA lw_mb52 TYPE ty_mb52.
 2   DATA lt_mb52 TYPE TABLE OF ty_mb52.
 3   DATA ls_mb52 TYPE REF TO data.
 4 
 5 “设置执行时不显示,只获取ALV数据
 6 cl_salv_bs_runtime_info=>set(
 7     display = abap_false
 8     metadata = abap_false
 9     data  = abap_true ).
10 
11   RANGES:lr_mtart FOR mara-mtart,
12          lr_matkl FOR mara-matkl,
13          lr_ekgrp FOR marc-ekgrp.
14 
15 “MB52的程序
16   SUBMIT rm07mlbs
17   WITH matnr IN s_matnr
18   WITH werks IN s_werks
19   WITH lgort IN s_lgort
20   WITH charg IN s_charg
21   WITH mtart IN lr_mtart
22   WITH matkl IN lr_matkl
23   WITH ekgrp IN lr_ekgrp
24   WITH negativ = ''
25   WITH pa_sond = ''
26   WITH xmchb = 'X'
27   WITH nozero = 'X'
28   WITH novalues = ''
29   WITH pa_hsq = ''
30   WITH pa_flt = 'X'
31   WITH p_vari = ''
32   AND RETURN.
33 
34   TRY .“可以获取MB52
35       cl_salv_bs_runtime_info=>get_data_ref(
36         IMPORTING r_data = ls_mb52 ).
37 
38       ASSIGN ls_mb52->* TO <lt_mb52>.
39 
40     CATCH  cx_salv_bs_sc_runtime_info.
41       MESSAGE '无法获取ALV数据'  TYPE  'E'.
42   ENDTRY.
43 
44   cl_salv_bs_runtime_info=>clear_all( ).

我们可以通过DEBUG看一下:

<lt_mb52>为我们获取的内表数据,这个就是MB52非层次显示时候展示的数据

这样就可以将MB52获取的数据转移到内表中,供自己写ALV展示出来

通过MARM来获取物料的库存单位和采购单位

代码语言:javascript复制
 1   IF  lt_mawk_tmp[] IS NOT INITIAL.
 2     SELECT a~matnr a~bstme b~umrez AS umrez1 b~umren AS umren1 m~ausme AS wausm c~umrez AS umrez2 c~umren AS umren2
 3      INTO TABLE lt_marm
 4      FROM mara AS a
 5      INNER JOIN marc AS m ON m~matnr = a~matnr
 6      LEFT OUTER JOIN marm AS b ON b~matnr = a~matnr AND b~meinh = a~bstme
 7      LEFT OUTER JOIN marm AS c ON c~matnr = m~matnr AND c~meinh = m~ausme
 8      FOR ALL ENTRIES IN lt_mawk_tmp[]
 9      WHERE a~matnr = lt_mawk_tmp-matnr
10        AND m~werks = lt_mawk_tmp-werks .
11   ENDIF.

然后用基本单位数量 * 分母 / 分子来计算采购单位数量

效果如下图所示:根据不同单位显示不同数量

注意:

因为MB52不输入任何条件直接执行时,会报警告

若我们在自己的界面不加以限制输入,则执行之后会停留在MB52的选择界面

所以我们加上输入限制,这个点需要注意一下。

代码语言:javascript复制
1   IF s_werks IS INITIAL AND s_matnr IS INITIAL AND s_lgort IS INITIAL AND s_charg IS INITIAL.
2     MESSAGE s000(zmm) WITH '请输入任一条件' DISPLAY LIKE 'E'.
3     RETURN.
4   ENDIF.

整体代码(避免影响篇幅,点击阅读原文查看)

创建好 STATUS就可以使用了

END

0 人点赞