之前有一个需求,客户使用的单位大多为采购单位,但是MB52中是物料主数据中的基本单位,所以需要对MB52进行处理。
相比于增强来说,使用submit去获取MB52的数据,然后在自己的报表中再去展示更好一点,也更加灵活。这里不仅仅限于MB52还有任何其他ALV报表都可以使用这个方法来做到客制的目的。
关键的代码是:
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来获取物料的库存单位和采购单位
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的选择界面
所以我们加上输入限制,这个点需要注意一下。
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