获取标准报表数据(MB52)数据进行客制ALV
之前有一个需求,客户使用的单位大多为采购单位,但是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就可以使用了
1 *&---------------------------------------------------------------------*
2 *& Report ZTEST_JXZHU_MB52
3 *&---------------------------------------------------------------------*
4 *&
5 *&---------------------------------------------------------------------*
6 REPORT ztest_jxzhu_mb52.
7
8 TABLES:mard,mcha .
9
10 "类型
11 TYPES:BEGIN OF ty_data,
12 light TYPE icon_d,
13 werks TYPE marc-werks,
14 lgort TYPE mard-lgort,
15 matnr TYPE marc-matnr,
16 maktx TYPE makt-maktx,
17 meins TYPE mara-meins, "
18 menge TYPE mard-labst, "基本单位数量
19 bstme TYPE mara-bstme, "采购订单位
20 bstmg TYPE mseg-bstmg, "采购单位数量
21 wausm TYPE maw1-wausm, "发货单位
22 lfimg TYPE lips-lfimg,
23 menge_quality TYPE mard-labst,
24 bstmg_quality TYPE mseg-bstmg,
25 lfimg_quality TYPE lips-lfimg,
26 charg TYPE mchb-charg,
27 lifnr TYPE mcha-lifnr,
28 name1 TYPE lfa1-name1,
29 hsdat TYPE mcha-hsdat,
30 mhdhb TYPE mara-mhdhb, "总货架寿命--保质期
31 mhdrz TYPE mara-mhdrz, "剩余货架寿命
32 vfdat TYPE mcha-vfdat, "到期日
33 END OF ty_data.
34
35 TYPES:BEGIN OF ty_mb52,
36 matnr TYPE mara-matnr,
37 maktx TYPE makt-maktx,
38 werks TYPE marc-werks,
39 lgort TYPE mard-lgort,
40 lvorm TYPE mard-lvorm,
41 charg TYPE mchb-charg,
42 meins TYPE mara-meins,
43 labst TYPE mard-labst, "非限制使用的估价的库存
44 umlme TYPE mard-umlme, "在运库存 (从一库存地到另一库存地)
45 insme TYPE mard-insme, "在检库存
46 END OF ty_mb52.
47
48 DATA:gt_data TYPE TABLE OF ty_data.
49
50 FIELD-SYMBOLS:<lt_mb52> TYPE ANY TABLE,
51 <l_mb52> TYPE any.
52
53
54 "alv
55 DATA:gt_fieldcat TYPE lvc_t_fcat, "定义列标题(属性信息)
56 gs_layout TYPE lvc_s_layo,
57 gs_fieldcat TYPE lvc_s_fcat, "定义对象
58
59 wa_repid LIKE sy-repid, "当前程序
60 gs_title TYPE lvc_title.
61 DATA : lv_jg TYPE vtbbewe-atage.
62 DATA :lv_lqts TYPE c LENGTH 3.
63
64 SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-t01.
65 SELECT-OPTIONS:s_werks FOR mard-werks,
66 s_matnr FOR mard-matnr,
67 s_lgort FOR mard-lgort,
68 s_charg FOR mcha-charg.
69 SELECTION-SCREEN END OF BLOCK blk1.
70
71
72
73
74 START-OF-SELECTION.
75 "
76 IF s_werks IS INITIAL AND s_matnr IS INITIAL AND s_lgort IS INITIAL AND s_charg IS INITIAL.
77 MESSAGE s000(zmm) WITH '请输入任一条件' DISPLAY LIKE 'E'.
78 RETURN.
79 ENDIF.
80
81 PERFORM start_of_selection.
82
83
84 END-OF-SELECTION.
85 PERFORM end_of_selection.
86
87 *&---------------------------------------------------------------------*
88 *& Form START_OF_SELECTION
89 *&---------------------------------------------------------------------*
90 *& text
91 *&---------------------------------------------------------------------*
92 *& --> p1 text
93 *& <-- p2 text
94 *&---------------------------------------------------------------------*
95 FORM start_of_selection .
96 DATA lw_mb52 TYPE ty_mb52.
97 DATA lt_mb52 TYPE TABLE OF ty_mb52.
98 DATA ls_mb52 TYPE REF TO data.
99
100 DATA:BEGIN OF lt_mara OCCURS 0,
101 matnr TYPE mara-matnr,
102 mhdhb TYPE mara-mhdhb, "总货架寿命
103 mhdrz TYPE mara-mhdrz, "剩余货架寿命
104 END OF lt_mara.
105 DATA lt_mara_tmp LIKE TABLE OF lt_mara WITH HEADER LINE.
106
107 DATA:BEGIN OF lt_mcha OCCURS 0,
108 matnr TYPE mcha-matnr,
109 werks TYPE mcha-werks,
110 charg TYPE mcha-charg,
111 lifnr TYPE mcha-lifnr,
112 name1 TYPE lfa1-name1,
113 hsdat TYPE mcha-hsdat,
114 vfdat TYPE mcha-vfdat,
115 END OF lt_mcha.
116 DATA lt_mcha_tmp LIKE TABLE OF lt_mcha WITH HEADER LINE.
117
118 DATA :BEGIN OF lt_mawk OCCURS 0,
119 werks TYPE mcha-werks,
120 matnr TYPE mcha-matnr,
121 END OF lt_mawk.
122 DATA lt_mawk_tmp LIKE TABLE OF lt_mcha WITH HEADER LINE.
123
124 DATA:BEGIN OF lt_marm OCCURS 0,
125 matnr TYPE marm-matnr,
126 bstme TYPE mara-bstme,
127 umrez1 TYPE marm-umrez,
128 umren1 TYPE marm-umren,
129 wausm TYPE maw1-wausm,
130 umrez2 TYPE marm-umrez,
131 umren2 TYPE marm-umren,
132 END OF lt_marm.
133
134
135 cl_salv_bs_runtime_info=>set(
136 display = abap_false
137 metadata = abap_false
138 data = abap_true ).
139
140 RANGES:lr_mtart FOR mara-mtart,
141 lr_matkl FOR mara-matkl,
142 lr_ekgrp FOR marc-ekgrp.
143
144 SUBMIT rm07mlbs
145 WITH matnr IN s_matnr
146 WITH werks IN s_werks
147 WITH lgort IN s_lgort
148 WITH charg IN s_charg
149 WITH mtart IN lr_mtart
150 WITH matkl IN lr_matkl
151 WITH ekgrp IN lr_ekgrp
152 WITH negativ = ''
153 WITH pa_sond = ''
154 WITH xmchb = 'X'
155 WITH nozero = 'X'
156 WITH novalues = ''
157 WITH pa_hsq = ''
158 WITH pa_flt = 'X'
159 WITH p_vari = ''
160 AND RETURN.
161
162 TRY .
163 cl_salv_bs_runtime_info=>get_data_ref(
164 IMPORTING r_data = ls_mb52 ).
165
166 ASSIGN ls_mb52->* TO <lt_mb52>.
167
168 CATCH cx_salv_bs_sc_runtime_info.
169 MESSAGE '无法获取ALV数据' TYPE 'E'.
170 ENDTRY.
171
172 cl_salv_bs_runtime_info=>clear_all( ).
173
174 IF <lt_mb52> IS ASSIGNED.
175 LOOP AT <lt_mb52> ASSIGNING <l_mb52>.
176 MOVE-CORRESPONDING <l_mb52> TO lw_mb52.
177 "物料工厂
178 lt_mawk_tmp-matnr = lw_mb52-matnr.
179 lt_mawk_tmp-werks = lw_mb52-werks.
180 APPEND lt_mawk_tmp.
181 CLEAR lt_mawk_tmp.
182 "物料
183 lt_mara_tmp-matnr = lw_mb52-matnr.
184 APPEND lt_mara_tmp.
185 CLEAR lt_mara_tmp.
186 "批次mcha
187 IF lw_mb52-charg IS NOT INITIAL.
188 lt_mcha_tmp-matnr = lw_mb52-matnr.
189 lt_mcha_tmp-werks = lw_mb52-werks.
190 lt_mcha_tmp-charg = lw_mb52-charg.
191 APPEND lt_mcha_tmp.
192 CLEAR lt_mcha_tmp.
193 ENDIF.
194 APPEND lw_mb52 TO lt_mb52.
195 CLEAR lw_mb52.
196 ENDLOOP.
197 ENDIF.
198
199 "取 物料描述 供应商 和 供应商描述
200 SORT lt_mara_tmp[] BY matnr.
201 SORT lt_mawk_tmp[] BY werks matnr.
202 SORT lt_mcha_tmp[] BY werks matnr charg.
203
204 DELETE ADJACENT DUPLICATES FROM lt_mara_tmp COMPARING matnr.
205 DELETE ADJACENT DUPLICATES FROM lt_mawk_tmp COMPARING werks matnr.
206 DELETE ADJACENT DUPLICATES FROM lt_mcha_tmp COMPARING werks matnr charg.
207
208 IF lt_mara_tmp[] IS NOT INITIAL.
209 SELECT a~matnr a~mhdhb a~mhdrz INTO TABLE lt_mara
210 FROM mara AS a
211 FOR ALL ENTRIES IN lt_mara_tmp[]
212 WHERE a~matnr = lt_mara_tmp-matnr.
213 ENDIF.
214
215 IF lt_mawk_tmp[] IS NOT INITIAL.
216 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
217 INTO TABLE lt_marm
218 FROM mara AS a
219 INNER JOIN marc AS m ON m~matnr = a~matnr
220 LEFT OUTER JOIN marm AS b ON b~matnr = a~matnr AND b~meinh = a~bstme
221 LEFT OUTER JOIN marm AS c ON c~matnr = m~matnr AND c~meinh = m~ausme
222 FOR ALL ENTRIES IN lt_mawk_tmp[]
223 WHERE a~matnr = lt_mawk_tmp-matnr
224 AND m~werks = lt_mawk_tmp-werks .
225 ENDIF.
226
227 IF lt_mcha_tmp[] IS NOT INITIAL.
228 SELECT a~matnr a~werks a~charg a~lifnr b~name1 a~hsdat a~vfdat INTO TABLE lt_mcha
229 FROM mcha AS a
230 LEFT OUTER JOIN lfa1 AS b ON b~lifnr = a~lifnr
231 FOR ALL ENTRIES IN lt_mcha_tmp[]
232 WHERE a~matnr = lt_mcha_tmp-matnr AND a~werks = lt_mcha_tmp-werks AND a~charg = lt_mcha_tmp-charg.
233 ENDIF.
234
235 DATA ls_data TYPE ty_data.
236 SORT lt_mara[] BY matnr.
237 SORT lt_mcha[] BY werks matnr charg.
238 SORT lt_marm[] BY matnr.
239
240 LOOP AT lt_mb52 ASSIGNING FIELD-SYMBOL(<fs1>).
241 ls_data-werks = <fs1>-werks.
242 ls_data-lgort = <fs1>-lgort.
243 ls_data-matnr = <fs1>-matnr.
244 ls_data-maktx = <fs1>-maktx.
245 READ TABLE lt_mara WITH KEY matnr = <fs1>-matnr BINARY SEARCH.
246 IF sy-subrc EQ 0.
247 * ls_data-maktx = lt_mara-maktx.
248 ls_data-mhdhb = lt_mara-mhdhb.
249 ls_data-mhdrz = lt_mara-mhdrz.
250 ENDIF.
251 ls_data-meins = <fs1>-meins.
252 ls_data-menge = <fs1>-labst + <fs1>-umlme.
253 ls_data-menge_quality = <fs1>-insme.
254 "采购订单
255 READ TABLE lt_marm WITH KEY matnr = <fs1>-matnr BINARY SEARCH.
256 IF sy-subrc EQ 0.
257 IF lt_marm-bstme IS NOT INITIAL.
258 ls_data-bstme = lt_marm-bstme.
259 ls_data-bstmg = ls_data-menge * lt_marm-umren1 / lt_marm-umrez1.
260 ls_data-bstmg_quality = ls_data-menge_quality * lt_marm-umren1 / lt_marm-umrez1.
261 ELSE.
262 ls_data-bstme = ls_data-meins.
263 ls_data-bstmg = ls_data-menge.
264 ls_data-bstmg_quality = ls_data-menge_quality.
265 ENDIF.
266 "交货
267 IF lt_marm-wausm IS NOT INITIAL.
268 ls_data-wausm = lt_marm-wausm.
269 ls_data-lfimg = ls_data-menge * lt_marm-umren2 / lt_marm-umrez2.
270 ls_data-lfimg_quality = ls_data-menge_quality * lt_marm-umren2 / lt_marm-umrez2.
271 ELSE.
272 ls_data-wausm = ls_data-meins.
273 ls_data-lfimg = ls_data-menge.
274 ls_data-lfimg_quality = ls_data-menge_quality.
275 ENDIF.
276 ENDIF.
277
278 READ TABLE lt_mcha WITH KEY werks = <fs1>-werks matnr = <fs1>-matnr charg = <fs1>-charg BINARY SEARCH.
279 IF sy-subrc EQ 0.
280 ls_data-charg = <fs1>-charg.
281 ls_data-lifnr = lt_mcha-lifnr.
282 ls_data-name1 = lt_mcha-name1.
283 ls_data-hsdat = lt_mcha-hsdat.
284 ls_data-vfdat = lt_mcha-vfdat.
285 ENDIF.
286
287
288 IF ls_data-vfdat IS NOT INITIAL.
289 IF ls_data-vfdat <= sy-datum.
290 ls_data-light = icon_red_light.
291 ENDIF.
292 ELSE.
293 ls_data-light = icon_green_light.
294 ENDIF.
295
296 APPEND ls_data TO gt_data.
297 CLEAR ls_data.
298 ENDLOOP.
299
300
301 ENDFORM.
302 *&---------------------------------------------------------------------*
303 *& Form END_OF_SELECTION
304 *&---------------------------------------------------------------------*
305 *& text
306 *&---------------------------------------------------------------------*
307 *& --> p1 text
308 *& <-- p2 text
309 *&---------------------------------------------------------------------*
310 FORM end_of_selection .
311 gs_layout-zebra = 'X'. "ALV表格按斑马线条纹显示
312 gs_layout-cwidth_opt = 'X'. "将ALV字段宽度设置为最优化
313 gs_layout-no_merging = 'X'.
314 wa_repid = sy-repid.
315
316 PERFORM frm_fcat_build.
317
318 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
319 EXPORTING
320 * I_INTERFACE_CHECK = ' '
321 * I_BYPASSING_BUFFER =
322 * I_BUFFER_ACTIVE =
323 i_callback_program = wa_repid
324 i_callback_pf_status_set = 'PF_STATUS_SET' "USER_COMMAND
325 * i_callback_user_command = 'USER_COMMAND'
326 * I_CALLBACK_TOP_OF_PAGE = ' '
327 * I_CALLBACK_HTML_TOP_OF_PAGE = ' '
328 * I_CALLBACK_HTML_END_OF_LIST = ' '
329 * I_STRUCTURE_NAME =
330 * I_BACKGROUND_ID = ' '
331 i_grid_title = gs_title
332 * I_GRID_SETTINGS =
333 is_layout_lvc = gs_layout
334 it_fieldcat_lvc = gt_fieldcat[]
335 * IT_EXCLUDING =
336 * IT_SPECIAL_GROUPS_LVC =
337 * IT_SORT_LVC =
338 * IT_FILTER_LVC =
339 * IT_HYPERLINK =
340 * IS_SEL_HIDE =
341 i_default = ''
342 i_save = 'U'
343 * IS_VARIANT =
344 * IT_EVENTS =
345 * IT_EVENT_EXIT =
346 * IMPORTING
347 * E_EXIT_CAUSED_BY_CALLER =
348 * ES_EXIT_CAUSED_BY_USER =
349 TABLES
350 t_outtab = gt_data[]
351 EXCEPTIONS
352 program_error = 1
353 OTHERS = 2.
354 IF sy-subrc <> 0.
355 MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
356 WITH sy-msgv1 sy-msgv2.
357 EXIT.
358 ENDIF.
359 ENDFORM.
360 *&---------------------------------------------------------------------*
361 *& Form PF_STATUS_SET
362 *&---------------------------------------------------------------------*
363 * 用户命令
364 *----------------------------------------------------------------------*
365 * --> p1 text
366 * <-- p2 text
367 *----------------------------------------------------------------------*
368 FORM pf_status_set USING pi_rt_extab TYPE slis_t_extab.
369 SET PF-STATUS 'STANDARD_FULLSCREEN'.
370 ENDFORM.
371
372 *&---------------------------------------------------------------------*
373 *& Form FRM_FCAT_BUILD
374 *&---------------------------------------------------------------------*
375 *& text
376 *&---------------------------------------------------------------------*
377 *& --> p1 text
378 *& <-- p2 text
379 *&---------------------------------------------------------------------*
380 FORM frm_fcat_build .
381 DATA lv_pos TYPE i .
382 REFRESH gt_fieldcat.
383 CLEAR gs_fieldcat.
384 CLEAR lv_pos.
385 DEFINE %%append_fieldcat.
386 lv_pos = lv_pos + 1.
387 gs_fieldcat-col_pos = lv_pos.
388 gs_fieldcat-fieldname = &1."字段名
389 gs_fieldcat-coltext = &2."文本
390 gs_fieldcat-no_zero = &3."去掉前导零
391 gs_fieldcat-ref_field = &4.
392 gs_fieldcat-ref_table = &5.
393 APPEND gs_fieldcat TO gt_fieldcat.
394 CLEAR gs_fieldcat.
395 END-OF-DEFINITION.
396 %%append_fieldcat:
397 'LIGHT' '指示灯' '' ' ' 'ICON_D',
398 'WERKS' '工厂' '' 'WERKS' 'MARC',
399 'LGORT' '仓库地点' '' 'LGORT' 'MARD',
400 'MATNR' '物料编号' 'X' 'MARD' 'MATNR',
401 'MAKTX' '物料描述' '' 'MAKT' 'MAKTX',
402 'MEINS' '基本单位' '' 'MEINS' 'MARA',
403 'MENGE' '基本单位数量-非限制' '' 'MENGE' 'MSEG',
404 'MENGE_QUALITY' '基本单位数量-质检' '' 'MENGE' 'MSEG',
405 'BSTME' '采购单位' '' 'BSTME' 'MARA',
406 'BSTMG' '采购单位数量-非限制' '' 'BSTMG' 'MSEG',
407 'BSTMG_QUALITY' '采购单位数量-质检' '' 'BSTMG' 'MSEG',
408 'WAUSM' '发货单位' '' 'WAUSM' 'MAW1',
409 'LFIMG' '发货单位数量-非限制' '' 'LFIMG' 'LIPS',
410 'LFIMG_QUALITY' '发货单位数量-质检' '' 'LFIMG' 'LIPS',
411 'CHARG' '批次' '' 'CHARG' 'MCHA',
412 'LIFNR' '供应商' '' 'LIFNR' 'LFA1',
413 'NAME1' '名称' '' 'NAME1' 'LFA1',
414 'HSDAT' '生产日期' '' 'HSDAT' 'MCHA',
415 'VFDAT' '到期日' '' 'VFDAT' 'MCHA',
416 'MHDHB' '总货架寿命' '' 'MHDHB' 'MARA',
417 'MHDRZ' '剩余货架寿命' '' 'MHDRZ' 'MARA'.
418
419 ENDFORM.