MESSAGE-ID
TABLES: mkpf,
mseg,
lfa1,
makt.
** global hashed tables used
*
DATA: BEGIN OF wa_mkpf, "header
mblnr LIKE mkpf-mblnr,
mjahr LIKE mkpf-mjahr,
budat LIKE mkpf-budat,
xblnr LIKE mkpf-xblnr,
END OF wa_mkpf.
DATA: ht_mkpf LIKE HASHED TABLE OF wa_mkpf
WITH UNIQUE KEY mblnr mjahr
WITH HEADER LINE.
DATA: st_mkpf LIKE STANDARD TABLE OF wa_mkpf
WITH HEADER LINE.
*
DATA: BEGIN OF wa_mseg, " line items
mblnr LIKE mseg-mblnr,
mjahr LIKE mseg-mjahr,
zeile LIKE mseg-zeile,
bwart LIKE mseg-bwart,
charg LIKE mseg-charg,
matnr LIKE mseg-matnr,
lifnr LIKE mseg-lifnr,
erfmg LIKE mseg-erfmg,
erfme LIKE mseg-erfme,
END OF wa_mseg.
DATA ht_mseg LIKE HASHED TABLE OF wa_mseg
WITH UNIQUE KEY mblnr mjahr zeile
WITH HEADER LINE.
DATA st_mseg LIKE STANDARD TABLE OF wa_mseg
WITH HEADER LINE.
** cache structure for lfa1 records
DATA: BEGIN OF wa_lfa1,
lifnr LIKE lfa1-lifnr,
name1 LIKE lfa1-name1,
END OF wa_lfa1.
DATA ht_lfa1 LIKE HASHED TABLE OF wa_lfa1
WITH UNIQUE KEY lifnr
WITH HEADER LINE.
** cache structure for material related data
DATA: BEGIN OF wa_material,
matnr LIKE makt-matnr,
zmsgs.
** global varialbes
DATA: g_lines TYPE i.
DATA: g_repid LIKE sy-repid,
ok_code
LIKE sy-ucomm.
** selection-screen
"text: Dates:
SELECT-OPTIONS: so_budat FOR mkpf-budat DEFAULT sy-datum.
"text: Material numbers.
SELECT-OPTIONS: so_matnr FOR mseg-matnr.
SELECTION-SCREEN ULINE.
SELECTION-SCREEN SKIP 1.
"Text: show summary by material.
PARAMETERS: gp_bymat AS CHECKBOX DEFAULT ''.
PARAMETERS: gp_hier AS CHECKBOX DEFAULT 'X'.
START-OF-SELECTION.
PERFORM get_data.
PERFORM show_data.
END-OF-SELECTION.
*---------------------------------------------------------------------*
*
FORM get_data
*
*---------------------------------------------------------------------*
*
........
*
*---------------------------------------------------------------------*
FORM get_data.
SELECT mblnr mjahr budat xblnr
INTO TABLE ht_mkpf
FROM mkpf
WHERE budat IN so_budat. " make use of std index.
** have we retrieved data from mkpf?
DESCRIBE TABLE ht_mkpf LINES g_lines.
IF g_lines > 0.
** if true then retrieve all related records from mseg.
** Doing this way we make sure that the access is by primary key
** of mseg.
** The reason is that is faster to filter them in memory
** than to allow the db server to do it.
SELECT mblnr mjahr zeile bwart charg
matnr lifnr erfmg erfme
INTO TABLE ht_mseg
FROM mseg
FOR ALL ENTRIES IN ht_mkpf
WHERE mblnr = ht_mkpf-mblnr
AND mjahr = ht_mkpf-mjahr.
ENDIF.
** fill t_lst or t_lst1 according to user's choice.
IF gp_bymat = ' '.
PERFORM fill_ht_lst.
ELSE.
PERFORM fill_ht_lst1.
ENDIF.
ENDFORM.
"get_data
*&---------------------------------------------------------------------*
*&
Form fill_ht_lst
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
FORM fill_ht_lst.
REFRESH ht_lst.
** Example: how to discard unwanted data in an efficient way.
LOOP AT ht_mseg.
* filter unwanted data
CHECK ht_mseg-bwart = '101' OR ht_mseg-bwart = '901'.
CHECK ht_mseg-matnr IN so_matnr.
* read header line.
READ TABLE ht_mkpf WITH TABLE KEY mblnr = ht_mseg-mblnr
mjahr = ht_mseg-mjahr.
CLEAR ht_lst.
* * note : this may be faster if you specify field by field.
MOVE-CORRESPONDING ht_mkpf TO ht_lst.
MOVE-CORRESPONDING ht_mseg TO ht_lst.
PERFORM read_lfa1 USING ht_mseg-lifnr CHANGING ht_lst-name1.
PERFORM read_material USING ht_mseg-matnr CHANGING ht_lst-maktx.
INSERT table ht_lst.
ENDLOOP.
ENDFORM.
"fill_ht_lst
*&---------------------------------------------------------------------*
*&
Form fill_ht_lst1
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
FORM fill_ht_lst1.
DATA: colorear.
REFRESH ht_lst1.
** Example: how to discard unwanted data in an efficient way.
**
hot to simulate a collect in a faster way
LOOP AT ht_mseg.
* filter unwanted data
CHECK ht_mseg-bwart = '101' OR ht_mseg-bwart = '901'.
CHECK ht_mseg-matnr IN so_matnr.
* * note : this may be faster if you specify field by field.
READ TABLE ht_lst1 WITH TABLE KEY matnr = ht_mseg-matnr
TRANSPORTING erfmg.
IF sy-subrc <> 0. " if matnr doesn't exist in sumary table
" insert a new record
CLEAR ht_lst1.
ht_lst1-matnr = ht_mseg-matnr.
PERFORM read_material USING ht_mseg-matnr CHANGING ht_lst1-maktx.
ht_lst1-erfmg = ht_mseg-erfmg.
ht_lst1-erfme = ht_mseg-erfme.
IF colorear = ''.
colorear = 'X'.
REFRESH it_color.
ht_lst1-color_cell[] = it_color[].
MOVE 'C410' TO ht_lst1-color_line.
ELSE.
colorear = ' '.
REFRESH it_color. CLEAR it_color.
MOVE 'MATNR' TO
MOVE '6'
MOVE '1'
MOVE '1'
APPEND wa_color
MOVE 'MAKTX' TO
MOVE '3'
MOVE '1'
MOVE '1'
APPEND wa_color
MOVE
MOVE
MOVE
MOVE
wa_color-fname.
TO wa_color-color-col.
TO wa_color-color-int.
TO wa_color-color-inv.
TO it_color.
wa_color-fname.
TO wa_color-color-col.
TO wa_color-color-int.
TO wa_color-color-inv.
TO it_color.
'ERFMG' TO wa_color-fname.
'5'
TO wa_color-color-col.
'1'
TO wa_color-color-int.
'1'
TO wa_color-color-inv.
* I_BYPASSING_BUFFER
=
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER
=
* ES_EXIT_CAUSED_BY_USER
=
TABLES
t_outtab_header
= st_mkpf
t_outtab_item
= st_mseg
* EXCEPTIONS
* PROGRAM_ERROR
= 1
* OTHERS
= 2
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM.
"show_hierarchicalALV
*&---------------------------------------------------------------------*
*&
Form show_ht_lst
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
FORM show_ht_lst.
"needed because the FM can't use a hashed table.
it_lst[] = ht_lst[].
PERFORM fill_layout USING 'full display'
CHANGING ls_layout.
PERFORM fill_columns_lst.
* perform sort_lst.
g_repid = sy-repid.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program
= g_repid
i_callback_pf_status_set = 'SET_PF_STATUS'
is_layout
= ls_layout
it_fieldcat
= it_fieldcat_lst[]
*
it_sort
= it_sort_lst
TABLES
t_outtab
= it_lst
EXCEPTIONS
program_error
= 1
OTHERS
= 2.
ENDFORM.
"show_ht_lst
*&---------------------------------------------------------------------*
*&
Form show_ht_lst1
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
FORM show_ht_lst1.
"needed because the FM can't use a hashed table.
it_lst1[] = ht_lst1[].
PERFORM fill_layout USING 'Sumary by matnr'
CHANGING ls_layout.
PERFORM fill_columns_lst1.
* perform sort_lst.
g_repid = sy-repid.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program
= g_repid
i_callback_pf_status_set = 'SET_PF_STATUS'
is_layout
= ls_layout
it_fieldcat
= it_fieldcat_lst1[]
*
it_sort
= it_sort_lst
TABLES
t_outtab
= it_lst1
EXCEPTIONS
program_error
= 1
OTHERS
= 2.
ENDFORM.
"show_ht_lst1
*&---------------------------------------------------------------------*
*&
Form fill_layout
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
*
-->P_WINDOW_TITLEBAR text
*
-->CS_LAYO
text
*----------------------------------------------------------------------*
FORM fill_layout USING p_window_titlebar
CHANGING cs_layo TYPE slis_layout_alv.
CLEAR cs_layo.
cs_layo-window_titlebar
= p_window_titlebar.
cs_layo-edit
= 'X'.
cs_layo-edit_mode
= space.
MOVE 'COLOR_LINE' TO cs_layo-info_fieldname.
* Field that identify cell color in inetrnal table
MOVE 'COLOR_CELL' TO cs_layo-coltab_fieldname.
* move 'CELLTAB' TO cs_layo-stylefname.
ENDFORM.
" armar_layout_stock
*&---------------------------------------------------------------------*
*&
Form set_pf_status
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
*
-->RT_EXTAB text
*----------------------------------------------------------------------*
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
** create a new status
** and then select extras -> adjust template -> listviewer
SET PF-STATUS 'VISTA'.
ENDFORM.
"set_pf_status
DEFINE add_lst.
clear it_fieldcat_lst.
it_fieldcat_lst-fieldname
= &1.
it_fieldcat_lst-outputlen
= &2.
it_fieldcat_lst-ddictxt
= 'L'.
it_fieldcat_lst-seltext_l
= &1.
it_fieldcat_lst-seltext_m
= &1.
it_fieldcat_lst-seltext_m
= &1.
if &1 = 'MATNR'.
it_fieldcat_lst-emphasize = 'C111'.
endif.
append it_fieldcat_lst.
END-OF-DEFINITION.
DEFINE add_lst1.
clear it_fieldcat_lst.
it_fieldcat_lst1-fieldname
it_fieldcat_lst1-outputlen
it_fieldcat_lst1-ddictxt
it_fieldcat_lst1-seltext_l
it_fieldcat_lst1-seltext_m
it_fieldcat_lst1-seltext_m
append it_fieldcat_lst1.
END-OF-DEFINITION.
= &1.
= &2.
= 'L'.
= &1.
= &1.
= &1.
*&---------------------------------------------------------------------*
*&
Form fill_columns_lst
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
FORM fill_columns_lst.
* set columns for output.
REFRESH it_fieldcat_lst.
*
add_lst 'BUDAT' 10.
add_lst 'MBLNR' 10.
add_lst 'LIFNR' 10.
add_lst 'NAME1' 35.
add_lst 'XBLNR' 15.
add_lst
'ZEILE' 5.
add_lst
'CHARG' 10.
add_lst 'MATNR' 18.
add_lst 'MAKTX' 30.
add_lst 'ERFMG' 17.
add_lst 'ERFME' 5.
add_lst 'MJAHR' 4.
ENDFORM.
"fill_columns_lst
*&---------------------------------------------------------------------*
*&
Form fill_columns_lst1
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
FORM fill_columns_lst1.
* set columns for output.
REFRESH it_fieldcat_lst1.
add_lst1
add_lst1
add_lst1
add_lst1
ENDFORM.
'MATNR'
'MAKTX'
'ERFMG'
'ERFME'
18.
30.
17.
5..
"fill_columns_lst1