Anda di halaman 1dari 9

*&---------------------------------------------------------------------*

*& Report YPP_TESTKEY2


*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ypp_testkey2

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.

maktx LIKE makt-maktx,


END OF wa_material.
DATA: ht_material LIKE HASHED TABLE OF wa_material
WITH UNIQUE KEY matnr
WITH HEADER LINE.
** result table
DATA: BEGIN OF wa_lst, "
budat LIKE mkpf-budat,
mblnr LIKE mseg-mblnr,
lifnr LIKE mseg-lifnr,
name1 LIKE lfa1-name1,
xblnr LIKE mkpf-xblnr,
zeile LIKE mseg-zeile,
charg LIKE mseg-charg,
matnr LIKE mseg-matnr,
maktx LIKE makt-maktx,
erfmg LIKE mseg-erfmg,
erfme LIKE mseg-erfme,
mjahr LIKE mseg-mjahr,
END OF wa_lst.
DATA: ht_lst LIKE HASHED TABLE OF wa_lst
WITH UNIQUE KEY mblnr mjahr zeile
WITH HEADER LINE.
DATA: BEGIN OF wa_lst1, " sumary by material
matnr LIKE mseg-matnr,
maktx LIKE makt-maktx,
erfmg LIKE mseg-erfmg,
erfme LIKE mseg-erfme,
color_line(4) TYPE c,
" Line color
color_cell
TYPE lvc_t_scol, " Cell color
celltab TYPE lvc_t_styl,
END OF wa_lst1.
DATA: ht_lst1 LIKE HASHED TABLE OF wa_lst1
WITH UNIQUE KEY matnr
WITH HEADER LINE.
** structures for alv grid display.
** itabs
TYPE-POOLS: slis.
DATA: it_lst
LIKE STANDARD TABLE OF wa_lst WITH HEADER LINE,
it_fieldcat_lst TYPE slis_t_fieldcat_alv WITH HEADER LINE,
it_sort_lst
TYPE slis_t_sortinfo_alv,
it_lst1
LIKE STANDARD TABLE OF wa_lst1 WITH HEADER LINE,
it_fieldcat_lst1 TYPE slis_t_fieldcat_alv WITH HEADER LINE,
it_sort_lst1
TYPE slis_t_sortinfo_alv.
** structures
DATA: wa_sort
TYPE slis_sortinfo_alv,
ls_layout
TYPE slis_layout_alv.
** color management.
DATA : wa_color
TYPE lvc_s_scol.
* Internal table for color management.
DATA : it_color
TYPE TABLE
OF lvc_s_scol.
* itab for input enabling.
DATA: lt_celltab TYPE lvc_t_styl. "

** 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.

APPEND wa_color TO it_color.


ht_lst1-color_cell[] = it_color[].
CLEAR ht_lst1-color_line.
ENDIF.
INSERT table ht_lst1.
ELSE." a record was found.
" collect erfmg. To do so, fill in the unique key and add
" the numeric fields.
ht_lst1-matnr = ht_mseg-matnr.
ADD ht_mseg-erfmg TO ht_lst1-erfmg.
MODIFY TABLE ht_lst1 TRANSPORTING erfmg.
ENDIF.
ENDLOOP.
ENDFORM.
"fill_ht_lst1
** implementation of cache for lfa1.
FORM read_lfa1 USING p_lifnr CHANGING p_name1.
READ TABLE ht_lfa1 WITH TABLE KEY lifnr = p_lifnr
TRANSPORTING name1.
IF sy-subrc <> 0.
CLEAR ht_lfa1.
ht_lfa1-lifnr = p_lifnr.
SELECT SINGLE name1
INTO ht_lfa1-name1
FROM lfa1
WHERE lifnr = p_lifnr.
IF sy-subrc <> 0. ht_lfa1-name1 = 'n/a in lfa1'. ENDIF.
INSERT table ht_lfa1.
ENDIF.
p_name1 = ht_lfa1-name1.
ENDFORM.
"read_lfa1
** implementation of cache for material data
FORM read_material USING p_matnr CHANGING p_maktx.
READ TABLE ht_material WITH TABLE KEY matnr = p_matnr
TRANSPORTING maktx.
IF sy-subrc <> 0.
ht_material-matnr = p_matnr.
SELECT SINGLE maktx INTO ht_material-maktx
FROM makt
WHERE spras = sy-langu

AND matnr = p_matnr.


IF sy-subrc <> 0. ht_material-maktx = 'n/a in makt'. ENDIF.
INSERT table ht_material.
ENDIF.
p_maktx = ht_material-maktx.
ENDFORM.
"read_material
*&---------------------------------------------------------------------*
*&
Form show_data
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
FORM show_data.
IF gp_hier = 'X'. "no anda.
*
perform show_hierarchicalALV.
ELSE.
IF gp_bymat = ' '.
PERFORM show_ht_lst.
ELSE.
PERFORM show_ht_lst1.
ENDIF.
ENDIF.
ENDFORM.
"show_data
*&---------------------------------------------------------------------*
*&
Form show_hierarchicalALV
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
FORM show_hierarchicalalv.
st_mkpf[] = ht_mkpf[].
st_mseg[] = ht_mseg[].
CALL FUNCTION 'REUSE_ALV_HIERSEQ_LIST_DISPLAY'
* exporting
* I_INTERFACE_CHECK
= ' '
* I_CALLBACK_PROGRAM
=
* I_CALLBACK_PF_STATUS_SET
= ' '
* I_CALLBACK_USER_COMMAND
= ' '
* IS_LAYOUT
=
* IT_FIELDCAT
=
* IT_EXCLUDING
=
* IT_SPECIAL_GROUPS
=
* IT_SORT
=
* IT_FILTER
=
* IS_SEL_HIDE
=
* I_SCREEN_START_COLUMN
= 0
* I_SCREEN_START_LINE
= 0
* I_SCREEN_END_COLUMN
= 0
* I_SCREEN_END_LINE
= 0
* I_DEFAULT
= 'X'
* I_SAVE
= ' '
* IS_VARIANT
=
* IT_EVENTS
=
* IT_EVENT_EXIT
=
*
i_tabname_header
=
*
i_tabname_item
=
* I_STRUCTURE_NAME_HEADER
=
* I_STRUCTURE_NAME_ITEM
=
*
is_keyinfo
=
* IS_PRINT
=
* IS_REPREP_ID
=
* I_BUFFER_ACTIVE
=

* 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

Anda mungkin juga menyukai