***********************************************************************************FORM F_WH_ALV_GRID_DISPLAY USING FP_I_FINAL TYPE TY_T_FINAL.
DATA: L_WA_LAYOUT TYPE SLIS_LAYOUT_ALV,
L_I_EVENTS TYPE SLIS_T_EVENT,
l_wa_lips TYPE ty_lips,
l_wa_print TYPE slis_print_alv. "print control
CONSTANTS: L_C_A TYPE CHAR1 VALUE 'A',
L_C_X TYPE c VALUE 'X',
l_c_subtot(10) TYPE c VALUE 'Sub_total',
l_c_tot(10) TYPE c VALUE 'Total'.
* internal table for ALV display
TYPES: BEGIN OF l_ty_out,
matnr1 TYPE MATNR, "Material Number
maktx TYPE MAKTX, "Material Description
lfimg TYPE LFIMG, "Material Quantity
vrkme TYPE VRKME, "Sales Unit
btgew TYPE GSGEW, "Weight
END OF l_ty_out,
l_ty_t_out type STANDARD TABLE OF l_ty_out,
BEGIN OF l_ty_vbeln,
vbeln TYPE vbeln,
END OF l_ty_vbeln,
l_ty_t_vbeln type STANDARD TABLE OF l_ty_vbeln.
*For Subtotal And Total for each Material Quantity and Weight
TYPES: BEGIN OF ty_TOTAL,
index TYPE i,
qty TYPE lfimg,
weight TYPE GSGEW,
END OF ty_TOTAL,
ty_t_tot TYPE STANDARD TABLE OF ty_TOTAL.
DATA: l_i_final TYPE TY_T_FINAL,
l_wa_final TYPE TY_FINAL,
l_i_out0 TYPE l_ty_t_out, "Media table between i_final & l_i_out
l_wa_out0 TYPE l_ty_out,
l_i_out TYPE l_ty_t_out, "Final print table for Warehouse Team
l_wa_out TYPE l_ty_out,
l_i_vbeln TYPE l_ty_t_vbeln, "Store all Delivery Number
l_wa_vbeln TYPE l_ty_vbeln,
l_v_tot_qty TYPE lfimg,
l_v_tot_weight TYPE GSGEW,
l_i_tot TYPE ty_t_tot,
l_wa_subtot TYPE ty_TOTAL.
DATA : l_v_repid TYPE REPID,
l_v_index TYPE I,
l_v_count TYPE I.
l_v_repid = sy-repid.
l_i_final = FP_I_FINAL.
CLEAR: v_vbeln,
v_tot_qty,
v_tot_weight.
REFRESH :l_i_vbeln,
L_I_OUT0,
l_i_out.
*fill l_WA_out0 from Final table
LOOP AT l_i_final INTO L_WA_FINAL.
*get Delivery Item Weight
READ TABLE i_lips into l_wa_lips WITH KEY vbeln = L_WA_FINAL-vbeln
POSNR = L_WA_FINAL-POSNR
matnr = L_WA_FINAL-matnr1.
if sy-subrc = 0.
l_WA_out0-btgew = l_wa_lips-brgew.
ENDIF.
l_wa_vbeln-vbeln = L_WA_FINAL-vbeln.
APPEND l_wa_vbeln TO l_i_vbeln.
l_WA_out0-matnr1 = l_WA_final-matnr1.
l_WA_out0-maktx = l_WA_final-maktx.
l_WA_out0-lfimg = l_WA_final-lfimg.
l_WA_out0-vrkme = l_WA_final-vrkme.
APPEND l_WA_out0 TO L_I_OUT0.
CLEAR L_WA_FINAL.
ENDLOOP.
*Refine Delivery number & concatenate all
IF l_i_vbeln IS NOT INITIAL.
SORT l_i_vbeln BY VBELN DESCENDING.
ENDIF.
DELETE ADJACENT DUPLICATES FROM l_i_vbeln COMPARING vbeln.
LOOP AT l_i_vbeln into l_wa_vbeln.
*Bind all Delivery Numbers into one field seperated by ','
CONCATENATE l_wa_vbeln-vbeln v_vbeln into v_vbeln SEPARATED BY ','.
CLEAR l_wa_vbeln.
ENDLOOP.
IF l_i_out0[] is NOT INITIAL.
sort l_i_out0 by matnr1.
*move related fields data from l_i_out0 fill table l_i_out
LOOP AT l_i_out0 INTO l_wa_out0.
COLLECT l_wa_out0 into l_i_out.
CLEAR l_wa_out0.
ENDLOOP.
ENDIF. "IF l_i_out0[] is NOT INITIAL
*Build Catalog for ALV output
PERFORM f_create_catalog.
* Prepare the layout settings for Screen display
PERFORM F_REPORT_LAYOUT CHANGING L_WA_LAYOUT.
*Get events For the ALV list
PERFORM f_events_build CHANGING L_I_EVENTS.
*set print parameter for controling print
perform F_WH_PRINT_CONT changing L_WA_PRINT.
IF NOT L_I_OUT[] IS INITIAL.
SORT L_I_OUT[] BY vrkme matnr1.
READ TABLE L_I_OUT INTO l_wa_out0 INDEX 1.
IF sy-subrc = 0.
CLEAR: l_v_tot_qty,
l_v_tot_weight.
CLEAR l_v_index.
*Subtotal Quantity and Weight for Material with same Sales Unit
LOOP AT L_I_OUT INTO l_wa_out .
l_v_index = sy-tabix + 1.
READ TABLE L_I_OUT into l_wa_out0 INDEX l_v_index.
IF sy-subrc = 0.
if l_wa_out0-vrkme eq l_wa_out-vrkme.
l_v_tot_qty = l_v_tot_qty + l_wa_out-lfimg.
l_v_tot_weight = l_v_tot_weight + l_wa_out-btgew.
ELSE.
l_v_tot_qty = l_v_tot_qty + l_wa_out-lfimg.
l_v_tot_weight = l_v_tot_weight + l_wa_out-btgew.
l_wa_subtot-index = l_v_index.
l_wa_subtot-qty = l_v_tot_qty.
l_wa_subtot-weight = l_v_tot_weight.
APPEND l_wa_subtot to l_i_tot.
CLEAR: l_v_tot_qty,
l_v_tot_weight.
ENDIF.
ELSE.
l_v_tot_qty = l_v_tot_qty + l_wa_out-lfimg.
l_v_tot_weight = l_v_tot_weight + l_wa_out-btgew.
l_wa_subtot-index = l_v_index.
l_wa_subtot-qty = l_v_tot_qty.
l_wa_subtot-weight = l_v_tot_weight.
APPEND l_wa_subtot to l_i_tot.
EXIT.
ENDIF.
CLEAR: l_wa_out,
l_wa_out0.
ENDLOOP.
ENDIF. "IF sy-subrc = 0.
*populate Subtotal and Total for the
CLEAR : v_tot_qty,
v_tot_weight,
l_v_count.
LOOP at l_i_tot INTO l_wa_subtot.
CLEAR l_wa_out.
l_wa_subtot-index = l_wa_subtot-index + l_v_count.
l_wa_out-matnr1 = l_c_subtot.
l_wa_out-lfimg = l_wa_subtot-qty.
l_wa_out-btgew = l_wa_subtot-weight.
v_tot_qty = v_tot_qty + l_wa_subtot-qty.
v_tot_weight = v_tot_weight + l_wa_subtot-weight.
INSERT l_wa_out INTO L_I_OUT INDEX l_wa_subtot-index.
l_v_count = l_v_count + 1.
CLEAR: l_wa_out,
l_wa_subtot.
ENDLOOP.
l_wa_out-matnr1 = l_c_tot.
l_wa_out-lfimg = v_tot_qty.
l_wa_out-btgew = v_tot_weight.
APPEND l_wa_out to L_I_OUT.
*Display the data in ALV Mode
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = l_v_repid
I_CALLBACK_PF_STATUS_SET = 'F_SET_STATUS'
I_CALLBACK_USER_COMMAND = 'F_USER_COMMAND'
I_CALLBACK_TOP_OF_PAGE = 'F_WH_TOP_OF_PAGE'
IS_LAYOUT = L_WA_LAYOUT
IT_FIELDCAT = I_CAT
IT_EVENTS = L_I_EVENTS[]
I_SAVE = L_C_A
is_print = l_wa_print
TABLES
T_OUTTAB = L_I_OUT
.
IF SY-SUBRC <> 0.
MESSAGE I008.
LEAVE LIST-PROCESSING.
ENDIF.
ELSE.
MESSAGE I080.
ENDIF. "IF NOT L_I_OUT[] IS INITIAL
ENDFORM. " F_WH_ALV_GRID_DISPLAY
*&---------------------------------------------------------------------*
*& Form f_create_catalog
*&---------------------------------------------------------------------*
* Build catalog for WareHouse Team AlV output
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_create_catalog.
v_rcount = 1. " Record count in field catalogue table
REFRESH I_CAT.
* Insert records in field catalogue table
PERFORM f_insert_row USING: C_MATNR1 TEXT-066,
C_MAKTX2 TEXT-067,
C_LFIMG2 TEXT-068,
C_VRKME1 TEXT-069,
C_BTWEG TEXT-070.
ENDFORM. " f_create_catalog
*} INSERT
*{ INSERT D13K906695 3
*&---------------------------------------------------------------------*
*& Form f_insert_row
*&---------------------------------------------------------------------*
* Insert records in field catalogue table
*----------------------------------------------------------------------*
* -->fp_name text
* -->fp_desc text
*----------------------------------------------------------------------*
FORM f_insert_row USING fp_name TYPE slis_fieldname
fp_desc TYPE reptext.
DATA: l_wa_fieldcat TYPE slis_fieldcat_alv. " Work area for i_fieldcat
CONSTANTS : l_c_tabnm TYPE slis_tabname VALUE 'ZLCN_COM_STR_TPL'.
CLEAR L_wa_fieldcat.
l_wa_fieldcat-col_pos = v_rcount. " position of the column
l_wa_fieldcat-fieldname = fp_name. " fieldname
l_wa_fieldcat-tabname = l_c_tabnm. " tabname
l_wa_fieldcat-reptext_ddic = fp_desc. " heading
*quantity and unit field
if fp_name cs c_lfimg2.
l_wa_fieldcat-quantity = c_lfimg2.
l_wa_fieldcat-qfieldname = C_VRKME1. " fieldname
l_wa_fieldcat-qtabname = l_c_tabnm. " tabname
endif.
if fp_name cs C_VRKME1.
l_wa_fieldcat-quantity = c_lfimg2.
l_wa_fieldcat-qfieldname = C_VRKME1. " fieldname
l_wa_fieldcat-qtabname = l_c_tabnm. " tabname
endif.
IF fp_name = c_matnr1.
l_wa_fieldcat-no_zero = c_x.
ENDIF.
APPEND l_wa_fieldcat TO I_CAT.
v_rcount = v_rcount + 1.
ENDFORM. " f_insert_row
*&---------------------------------------------------------------------*
*& Form f_events_build
*&---------------------------------------------------------------------*
* get End_of_list events for ALV output
*----------------------------------------------------------------------*
* <--P_L_I_EVENTS text
*----------------------------------------------------------------------*
FORM f_events_build CHANGING fp_i_events TYPE SLIS_T_EVENT.
DATA: L_WA_EVENTS TYPE slis_alv_event.
REFRESH fp_i_events.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
I_LIST_TYPE = 0
IMPORTING
ET_EVENTS = fp_i_events
.
IF SY-SUBRC = 0.
IF fp_i_events IS NOT INITIAL.
READ TABLE fp_i_events WITH KEY name = 'END_OF_LIST'
INTO L_WA_EVENTS.
IF SY-SUBRC = 0.
MOVE 'F_WH_END_OF_PAGE' TO L_WA_EVENTS-FORM.
MODIFY fp_i_events FROM L_WA_EVENTS INDEX SY-TABIX TRANSPORTING FORM.
ENDIF.
ENDIF.
ENDIF. "IF SY-SUBRC = 0.
Another way of creating Event Table:
FORM f_populate_eventtab CHANGING fp_i_events TYPE slis_t_event. *----structure for events---* DATA: wa_struct_event TYPE slis_alv_event.
* Populate top of page event in event table CLEAR wa_struct_event. wa_struct_event-name = slis_ev_top_of_page. wa_struct_event-form = c_top_of_page. APPEND wa_struct_event TO fp_i_events.
ENDFORM. " f_populate_eventtab |
ENDFORM. " f_events_build
*&---------------------------------------------------------------------*
*& Form f_wh_top_of_page
*&---------------------------------------------------------------------*
* Display the header data of the ALV list for Warehouse Team
*----------------------------------------------------------------------*
* <--
*----------------------------------------------------------------------*
FORM f_wh_top_of_page.
DATA: L_I_HEADER TYPE STANDARD TABLE OF SLIS_LISTHEADER,
L_WA_HEADER TYPE SLIS_LISTHEADER,
l_wa_final TYPE ty_final.
CONSTANTS L_C_S TYPE CHAR1 VALUE 'S'. "For selection text
DATA: l_v_SERAG TYPE name1,
L_I_FINAL TYPE ty_t_final.
**get Service agent and Validating Service Agent.
IF S_KUNNR2 IS NOT INITIAL. "Service Agent is put
IF S_VBELN IS not INITIAL.
READ TABLE I_FINAL INTO l_wa_FINAL INDEX 1.
IF sy-subrc = 0.
l_V_SERAG = l_wa_FINAL-name2.
ENDIF.
ELSE.
l_i_final = I_FINAL.
SORT l_i_final BY name2.
DELETE ADJACENT DUPLICATES FROM l_i_final COMPARING name2.
READ TABLE l_i_final TRANSPORTING NO FIELDS INDEX 2.
IF sy-subrc = 0.
MESSAGE s139 DISPLAY LIKE 'E'.
SET SCREEN 0.
LEAVE SCREEN.
ENDIF.
READ TABLE l_i_final WITH KEY name2 = '' TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
MESSAGE s139 DISPLAY LIKE 'E'.
SET SCREEN 0.
LEAVE SCREEN.
ELSE.
READ TABLE I_FINAL INTO l_wa_FINAL INDEX 1.
IF sy-subrc = 0.
l_V_SERAG = l_wa_FINAL-name2.
ENDIF.
ENDIF.
ENDIF. "IF S_VBELN IS NOT INITIAL.
ELSE.
l_i_final = I_FINAL.
DELETE ADJACENT DUPLICATES FROM l_i_final COMPARING name2.
READ TABLE l_i_final TRANSPORTING NO FIELDS INDEX 2.
IF sy-subrc = 0.
MESSAGE s139 DISPLAY LIKE 'E'.
SET SCREEN 0.
LEAVE SCREEN.
ELSE.
READ TABLE l_i_final into l_wa_final index 1.
IF sy-subrc = 0 AND l_wa_final-name2 = ''.
MESSAGE s139 DISPLAY LIKE 'E'.
SET SCREEN 0.
LEAVE SCREEN.
ELSE.
READ TABLE I_FINAL INTO l_wa_FINAL INDEX 1.
IF sy-subrc = 0.
l_V_SERAG = l_wa_FINAL-name2.
ENDIF.
ENDIF. "IF sy-subrc = 0 AND l_wa_final-name2 = ''.
ENDIF. "IF sy-subrc = 0.
ENDIF. "if S_KUNNR2 IS NOT INITIAL.
REFRESH L_I_HEADER.
CLEAR L_WA_HEADER.
L_WA_HEADER-TYP = L_C_S.
L_WA_HEADER-KEY = TEXT-071.
L_WA_HEADER-INFO = l_V_SERAG. "Service Agent
APPEND L_WA_HEADER TO L_I_HEADER.
CLEAR L_WA_HEADER.
L_WA_HEADER-TYP = L_C_S.
L_WA_HEADER-KEY = TEXT-004.
L_WA_HEADER-INFO = S_WADAT-LOW. "Date From
APPEND L_WA_HEADER TO L_I_HEADER.
CLEAR L_WA_HEADER.
L_WA_HEADER-TYP = L_C_S.
L_WA_HEADER-KEY = TEXT-005. "Date To
L_WA_HEADER-INFO = S_WADAT-HIGH.
APPEND L_WA_HEADER TO L_I_HEADER.
*call function to write the top comment
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
IT_LIST_COMMENTARY = L_I_HEADER.
ENDFORM. " f_wh_top_of_page
*&---------------------------------------------------------------------*
*& Form f_wh_end_of_page
*&---------------------------------------------------------------------*
* Display the footer data of the ALV list for Warehouse Team
*----------------------------------------------------------------------*
* <--
*----------------------------------------------------------------------*
FORM f_wh_end_of_page.
DATA: L_I_HEADER TYPE STANDARD TABLE OF SLIS_LISTHEADER,"Top and Footer Comment
L_WA_HEADER TYPE SLIS_LISTHEADER,
l_v_slen TYPE I.
DATA : l_v_vbeln0 LIKE v_vbeln,
l_v_vbeln(60) TYPE C.
CONSTANTS: L_C_S TYPE CHAR1 VALUE 'S'. "For selection text
REFRESH L_I_HEADER.
CLEAR L_WA_HEADER.
* Store v_vbeln in local
l_v_vbeln0 = V_VBELN.
*if lengh of v_vbeln is greater than 60,
*split it into shorter segments with 60 lengh
IF strlen( l_v_vbeln0 ) gt 60.
CALL FUNCTION 'STRING_SPLIT_AT_POSITION'
EXPORTING
STRING = l_v_vbeln0
POS = 60
IMPORTING
STRING1 = l_v_vbeln
STRING2 = l_v_vbeln0
.
IF SY-SUBRC = 0.
CLEAR L_WA_HEADER.
L_WA_HEADER-TYP = L_C_S.
L_WA_HEADER-KEY = TEXT-074.
L_WA_HEADER-INFO = l_v_vbeln. "Delivery Number
APPEND L_WA_HEADER TO L_I_HEADER.
ENDIF.
**Each line of HEADER-INFO can be 60 letters long at most
**this function to split v_vbeln and diaplay them
while strlen( l_v_vbeln0 ) gt 60.
CALL FUNCTION 'STRING_SPLIT_AT_POSITION'
EXPORTING
STRING = l_v_vbeln0
POS = 60
IMPORTING
STRING1 = l_v_vbeln
STRING2 = l_v_vbeln0
.
IF SY-SUBRC = 0.
CLEAR L_WA_HEADER.
L_WA_HEADER-TYP = L_C_S.
L_WA_HEADER-INFO = l_v_vbeln. "Delivery Number
APPEND L_WA_HEADER TO L_I_HEADER.
ENDIF.
ENDWHILE. " while strlen( l_v_vbeln0 ) gt 60
if l_v_vbeln0 is NOT INITIAL.
l_v_slen = strlen( l_v_vbeln0 ) - 1.
l_v_vbeln = l_v_vbeln0(l_v_slen).
CLEAR L_WA_HEADER.
L_WA_HEADER-TYP = L_C_S.
L_WA_HEADER-INFO = l_v_vbeln. "Delivery Number
APPEND L_WA_HEADER TO L_I_HEADER.
ENDIF. "if l_v_vbeln0 is NOT INITIAL.
*if lengh of v_vbeln is less than or equal to 60,
*directly display it
ELSE.
l_v_slen = strlen( l_v_vbeln0 ) - 1.
l_v_vbeln = l_v_vbeln0(l_v_slen).
CLEAR L_WA_HEADER.
L_WA_HEADER-TYP = L_C_S.
L_WA_HEADER-KEY = TEXT-074.
L_WA_HEADER-INFO = l_v_vbeln. "Delivery Number
APPEND L_WA_HEADER TO L_I_HEADER.
ENDIF. "IF strlen( l_v_vbeln0 ) gt 60.
*call function to write the footer comment
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
IT_LIST_COMMENTARY = L_I_HEADER.
ENDFORM. " f_wh_end_of_page
*&---------------------------------------------------------------------*
*& Form F_Check_SerAgt
*&---------------------------------------------------------------------*
* Check if the selected Delivery number have another
* Service Agent except the one from the Selection Screen
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM F_Check_SerAgt .
TYPES:BEGIN OF L_TY_VBPA,
VBELN TYPE VBELN,
KUNNR TYPE KUNNR,
END OF L_TY_VBPA.
DATA: L_I_VBPA TYPE STANDARD TABLE OF L_TY_VBPA,
l_i_KUNNR2 LIKE S_KUNNR2.
CLEAR L_I_VBPA.
*limit the Service Agent to one only for Warehouse Team Usage.
if ( S_KUNNR2-low is not initial )
and ( S_KUNNR2-high is not initial )
and ( s_kunnr2-low ne s_kunnr2-high ).
MESSAGE e139.
ELSE.
READ TABLE S_KUNNR2 TRANSPORTING NO FIELDS INDEX 2.
if sy-subrc = 0.
MESSAGE e139.
ELSE.
IF S_VBELN IS NOT INITIAL.
*Check if the selected Delivery number have another
*Service Agent in DB
SELECT VBELN KUNNR
FROM VBPA
INTO TABLE L_I_VBPA
WHERE VBELN IN S_VBELN
AND PARVW EQ C_PZC.
*delete duplcates lines of group with combined Vbeln and Kunnr
DELETE ADJACENT DUPLICATES FROM L_I_VBPA COMPARING vbeln kunnr.
*if one Vbeln have one Kunnr only, the following statement won't
*excute successfully
DELETE ADJACENT DUPLICATES FROM L_I_VBPA COMPARING vbeln.
IF sy-subrc = 0.
MESSAGE e139.
ELSE.
* Service Agent shouldn't be empty
READ TABLE L_I_VBPA WITH KEY kunnr = '' TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
MESSAGE e139.
ENDIF.
ENDIF.
ENDIF.
ENDIF. " if sy-subrc = 0.
ENDIF. " if ( S_KUNNR2-low is not initial )
ENDFORM. " F_Check_SerAgt
4
*&---------------------------------------------------------------------*
*& Form F_WH_PRINT_CONT
*&---------------------------------------------------------------------*
* control the print output for Warehouse usage
*----------------------------------------------------------------------*
* <--P_L_WA_PRINT text
*----------------------------------------------------------------------*
FORM F_WH_PRINT_CONT CHANGING FP_WA_PRINT TYPE SLIS_PRINT_ALV.
FP_WA_PRINT-no_print_listinfos = c_x.
FP_WA_PRINT-no_new_page = c_x.
ENDFORM. " F_WH_PRINT_CONT
***********************************************************************************