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

获取标准报表数据(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.

猜你喜欢

转载自www.cnblogs.com/jxzhu/p/12180517.html
今日推荐