You are on page 1of 12

*&---------------------------------------------------------------------* *& Report ZFI_RPT_STORAGE_LOC_PROFIT *& *&---------------------------------------------------------------------* *PROGRAM NAME: ZFI_RPT_STORAGE_LOC_PROFIT * *OBJECT ID: * *COMPANY: GALAXE SOLUTIONS INC.

* *DESCRIPTION: This report is to identify the Gross Profit of the * * Storage location. The Gross profit is derived based on * * deducting the Cost Price of inventory and any freight * * added from Gross Revenue * ************************************************************************ **** MODIFICATION HISTORY **** * * * DATE AUTHOR CORRECTION DESCRIPTION SCR# * * 07/06/2012 SREDDY1 Initial Code **** * *&---------------------------------------------------------------------* REPORT zfi_rpt_storage_loc_profit NO STANDARD PAGE HEADING MESSAGE-ID zfi. * Global Data Declarations TYPE-POOLS : slis. TABLES : vbrk,vbrp. *===========================================================* * SELECT OPTIONS AND PARAMETERS *==========================================================-* * Selection Screen Design SELECTION-SCREEN : BEGIN OF BLOCK value WITH FRAME TITLE text-001. SELECT-OPTIONS : s_date FOR vbrk-fkdat, s_monat FOR vbrk-poper, s_gjahr FOR vbrk-gjahr NO-EXTENSION NO INTERVALS. SELECTION-SCREEN : END OF BLOCK value. SELECTION-SCREEN : BEGIN OF BLOCK group WITH FRAME TITLE text-002. SELECT-OPTIONS: s_bukrs FOR vbrk-bukrs OBLIGATORY, s_werks FOR vbrp-werks, s_lgort FOR vbrp-lgort. SELECTION-SCREEN : END OF BLOCK group. * Ranges RANGES: r_date FOR vbrk-fkdat, r_werks FOR vbrp-werks, r_kschl FOR konv-kschl. * Storage location DATA: BEGIN OF it_lgort OCCURS 0, werks TYPE werks_d, lgort TYPE lgort_d, lgobe TYPE lgobe, END OF it_lgort. * Billing info TYPES: BEGIN OF ty_vbrk, vbeln TYPE vbeln_vf, knumv TYPE knumv, bukrs TYPE bukrs, netwr TYPE netwr, END OF ty_vbrk. DATA: it_vbrk TYPE TABLE OF ty_vbrk,

wa_vbrk TYPE ty_vbrk. TYPES: BEGIN OF ty_vbrp, vbeln TYPE vbeln_vf, posnr TYPE posnr_vf, fkimg TYPE fkimg, netwr TYPE netwr_fp, werks TYPE werks_d, lgort TYPE lgort_d, END OF ty_vbrp. DATA: it_vbrp TYPE TABLE OF ty_vbrp, wa_vbrp TYPE ty_vbrp. * Conditions - Price/Discount TYPES: BEGIN OF ty_konv, knumv TYPE knumv, kposn TYPE kposn, kschl TYPE kscha, kbetr TYPE kbetr, kwert TYPE kwert, END OF ty_konv. DATA: it_konv TYPE TABLE OF ty_konv, wa_konv TYPE ty_konv. * Output internal table. TYPES: BEGIN OF ty_output, bukrs TYPE bukrs, werks TYPE werks_d, lgort TYPE lgort_d, lgobe TYPE lgobe, sold_qty TYPE fkimg, gross_amt TYPE netwr, disc_amt TYPE netwr, net_amt TYPE netwr, std_cost TYPE netwr, gross_profit TYPE netwr, gp_perc TYPE kbetr, END OF ty_output. DATA: it_output TYPE TABLE OF ty_output, wa_output TYPE ty_output, wa_tmp TYPE ty_output, it_final TYPE TABLE OF ty_output, wa_final TYPE ty_output, it_fcat TYPE slis_t_fieldcat_alv, it_event TYPE slis_t_event. AT SELECTION-SCREEN. * Date Validation PERFORM validate_date_period. AT SELECTION-SCREEN ON s_bukrs. * Validate Company Code on the selection screen. PERFORM val_comp_code. AT SELECTION-SCREEN ON s_werks. * Validate Plant on the selection screen. PERFORM val_plant. AT SELECTION-SCREEN ON s_lgort. * Validate Storage Location on the selection screen. PERFORM val_stor_loc.

************************************************************************ * Start of Selection * ************************************************************************ START-OF-SELECTION. IF NOT s_date[] IS INITIAL. r_date[] = s_date[]. ENDIF. * Get dates when Period and Fiscal Year entered IF NOT s_monat IS INITIAL. PERFORM calculate_date. ENDIF. PERFORM data_selection. * Process data to output table PERFORM process_data. PERFORM display_report. *&---------------------------------------------------------------------* *& Form VALIDATE_DATE_PERIOD *&---------------------------------------------------------------------* * Validate date and period values *----------------------------------------------------------------------* FORM validate_date_period . IF ( s_date IS INITIAL AND s_gjahr IS INITIAL AND s_monat IS INITIAL ) OR ( NOT s_date IS INITIAL AND ( NOT s_monat[] IS INITIAL OR NOT s_gjahr[] IS INITIAL ) ) OR ( NOT s_date IS INITIAL AND NOT s_monat IS INITIAL AND s_gjahr IS INITIAL )

OR

( NOT s_date IS INITIAL AND s_monat IS INITIAL AND NOT s_gjahr IS INITIAL ). MESSAGE e077 WITH 'Enter either Date or Period and Fiscal Year'(101). ELSEIF ( s_date IS INITIAL AND s_monat IS INITIAL AND NOT s_gjahr IS INITIAL ) . MESSAGE e077 WITH 'Please enter the value for Period'(102). ELSEIF s_date IS INITIAL AND NOT s_monat IS INITIAL AND s_gjahr IS INITIAL. MESSAGE e077 WITH 'Please enter the value for Fiscal Year'(103). ENDIF. ENDFORM. " VALIDATE_DATE_PERIOD *&---------------------------------------------------------------------* *& Form VAL_COMP_CODE *&---------------------------------------------------------------------* * Validate Company Code on the selection screen *----------------------------------------------------------------------* FORM val_comp_code . * Local variable to store Company Code DATA lv_bukrs TYPE bukrs. "#EC NEEDED IF s_bukrs IS NOT INITIAL.

* Select Company Code from T001 SELECT bukrs " Company Code FROM t001 " Company Codes INTO lv_bukrs UP TO 1 ROWS WHERE bukrs IN s_bukrs. ENDSELECT. * Check sy-subrc value IF sy-subrc NE 0 . * Report an error message MESSAGE e077 WITH 'Please enter valid Company code'(104). "Please enter valid Company code. ENDIF. ENDIF. ENDFORM. " VAL_COMP_CODE *&---------------------------------------------------------------------* *& Form VAL_PLANT *&---------------------------------------------------------------------* * Validate Company Code on the selection screen *----------------------------------------------------------------------* FORM val_plant . * Local variable to store Plant DATA lv_werks TYPE werks. "#EC NEEDED r_werks[] = s_werks[]. IF s_werks IS NOT INITIAL. * Select Company Code from T001 SELECT SINGLE werks " Plant FROM t001w " Plants/Branches INTO lv_werks WHERE werks IN s_werks. * Check sy-subrc value IF sy-subrc NE 0 . * Report an error message MESSAGE e077 WITH 'Please enter valid Plant'(106). ELSE. CLEAR lv_werks. * Company Code/Plant validation from T001K SELECT SINGLE bukrs " Company Code FROM t001k " Company Codes INTO lv_werks WHERE bwkey IN s_werks AND bukrs IN s_bukrs. IF sy-subrc NE 0. * Report an error message MESSAGE e077 WITH 'Please enter valid Co.Code/Plant'(108). ENDIF. ENDIF. ENDIF. ENDFORM. " VAL_PLANT **&---------------------------------------------------------------------* **& Form VAL_STOR_LOC **&---------------------------------------------------------------------* ** Validate Storage Location **----------------------------------------------------------------------* FORM val_stor_loc . * Local variable to store Company Code DATA: lv_lgort TYPE lgort_d. "#EC NEEDED * Get Storage Location from T001L SELECT werks lgort lgobe

FROM t001l INTO TABLE it_lgort WHERE werks IN s_werks AND lgort IN s_lgort. * Check sy-subrc value IF sy-subrc NE 0 AND NOT s_lgort[] IS INITIAL. * Report an error message MESSAGE e077 WITH 'Please enter valid Plant/Storage Location'(105). ELSE. IF s_werks[] IS INITIAL AND NOT s_lgort[] IS INITIAL. * Plant is initial, collect all plants LOOP AT it_lgort. r_werks-sign = 'I'. r_werks-option = 'EQ'. r_werks-low = it_lgort-werks. APPEND r_werks. CLEAR r_werks. ENDLOOP. ENDIF. ENDIF. ENDFORM. " VAL_STOR_LOC *&---------------------------------------------------------------------* *& Form CALCULATE_DATE *&---------------------------------------------------------------------* * Calculate Date when Period and Fiscal Year * is entered on selection screen *----------------------------------------------------------------------* FORM calculate_date . * Local Variable Declarations DATA : lv_first_day TYPE sy-datum, lv_last_day TYPE sy-datum. * Date of first day determined for period and fiscal year CALL FUNCTION 'FIRST_DAY_IN_PERIOD_GET' EXPORTING i_gjahr = s_gjahr-low * I_MONMIT = 00 i_periv = 'SL' i_poper = s_monat-low IMPORTING e_date = lv_first_day EXCEPTIONS input_false = 1 t009_notfound = 2 t009b_notfound = 3 OTHERS = 4 . IF sy-subrc <> 0. MESSAGE i077 WITH 'Date could not be determined for Period and Fiscal Year'( 107). ENDIF. IF s_monat-high IS INITIAL. s_monat-high = s_monat-low. ENDIF. * Date of last day determined for period and fiscal year CALL FUNCTION 'LAST_DAY_IN_PERIOD_GET' EXPORTING

i_gjahr = s_gjahr-low I_MONMIT = 00 i_periv = 'SL' i_poper = s_monat-high IMPORTING e_date = lv_last_day EXCEPTIONS input_false = 1 t009_notfound = 2 t009b_notfound = 3 OTHERS = 4 . IF sy-subrc <> 0. MESSAGE i077 WITH 'Date could not be determined for Period and Fiscal Year'( 107). ENDIF. * * Append the first date and last date * into one range table IF lv_first_day IS NOT INITIAL AND lv_last_day IS NOT INITIAL. r_date-sign = 'I'. r_date-option = 'BT'. r_date-low = lv_first_day. r_date-high = lv_last_day. APPEND r_date. CLEAR r_date. ENDIF. CLEAR : lv_first_day, lv_last_day. ENDFORM. " CALCULATE_DATE *&---------------------------------------------------------------------* *& Form DATA_SELECTION *&---------------------------------------------------------------------* * Data Selection: VBRK/VBRP/KONV *----------------------------------------------------------------------* FORM data_selection . * Get billing header data for dates entered SELECT vbeln knumv bukrs netwr FROM vbrk INTO TABLE it_vbrk WHERE fkart = 'F2' AND fkdat IN r_date AND bukrs IN s_bukrs. IF NOT it_vbrk[] IS INITIAL. SORT it_vbrk BY vbeln. * Billing Item data based on header SELECT vbeln posnr fkimg netwr werks lgort FROM vbrp INTO TABLE it_vbrp FOR ALL ENTRIES IN it_vbrk WHERE vbeln = it_vbrk-vbeln AND werks IN s_werks AND lgort IN s_lgort. * Condition record data for price and discounts SORT it_vbrk BY knumv. SELECT knumv kposn kschl kbetr kwert FROM konv INTO TABLE it_konv FOR ALL ENTRIES IN it_vbrk

WHERE knumv = it_vbrk-knumv AND kinak = ''. * Delete conditions records not meant for discount and Price DELETE it_konv WHERE kschl NOT IN r_kschl. ELSE. MESSAGE i077 WITH 'No Records found for the selection'(109). EXIT. ENDIF. SORT it_lgort BY lgort. ENDFORM. " DATA_SELECTION *&---------------------------------------------------------------------* *& Form PROCESS_DATA *&---------------------------------------------------------------------* * Process data to final internal table *----------------------------------------------------------------------* FORM process_data . DATA: v_vbrp_indx TYPE i, v_konv_indx TYPE i. LOOP AT it_vbrk INTO wa_vbrk. wa_output-bukrs = wa_vbrk-bukrs. v_vbrp_indx = 1. v_konv_indx = 1. LOOP AT it_vbrp INTO wa_vbrp FROM v_vbrp_indx. IF wa_vbrk-vbeln = wa_vbrp-vbeln. v_vbrp_indx = v_vbrp_indx + 1. wa_output-lgort = wa_vbrp-lgort. wa_output-werks = wa_vbrp-werks. wa_output-sold_qty = wa_vbrp-fkimg. * Storage location description READ TABLE it_lgort WITH KEY lgort = wa_vbrp-lgort BINARY SEARCH. IF sy-subrc EQ 0. wa_output-lgobe = it_lgort-lgobe. ENDIF. ELSE. EXIT. ENDIF. * Item conditions. LOOP AT it_konv INTO wa_konv FROM v_konv_indx. IF wa_vbrk-knumv = wa_konv-knumv AND wa_vbrp-posnr = wa_konv-kposn. v_konv_indx = v_konv_indx + 1. IF wa_konv-kschl = 'PR00'. wa_output-gross_amt = wa_konv-kwert. ELSEIF wa_konv-kschl = 'VPRS'.. wa_output-std_cost = wa_konv-kwert. ELSE. wa_output-disc_amt = wa_output-disc_amt + wa_konv-kwert. ENDIF. ELSE. EXIT. ENDIF. ENDLOOP. wa_output-net_amt = wa_vbrp-netwr.

wa_output-gross_profit = wa_output-net_amt - wa_output-std_cost. APPEND wa_output TO it_output. CLEAR wa_output. ENDLOOP. ENDLOOP. * Update the final internal table by summing up based on Storage location. SORT it_output BY bukrs werks lgort. LOOP AT it_output INTO wa_output. wa_tmp = wa_output. AT NEW lgort. wa_final-bukrs = wa_tmp-bukrs. wa_final-werks = wa_tmp-werks. wa_final-lgort = wa_tmp-lgort. wa_final-lgobe = wa_tmp-lgobe. ENDAT. wa_final-sold_qty = wa_final-sold_qty + wa_tmp-sold_qty. wa_final-disc_amt = wa_final-disc_amt + wa_tmp-disc_amt. wa_final-net_amt = wa_final-net_amt + wa_tmp-net_amt. wa_final-std_cost = wa_final-std_cost + wa_tmp-std_cost. wa_final-gross_profit = wa_final-gross_profit + wa_tmp-gross_profit. AT END OF lgort. IF wa_final-std_cost > 0. wa_final-gp_perc = ( wa_final-gross_profit / wa_final-std_cost ) * 100. ELSE. wa_final-gp_perc = ( wa_final-gross_profit / 1 ) * 100. ENDIF. APPEND wa_final TO it_final. CLEAR wa_final. ENDAT. ENDLOOP. ENDFORM. " PROCESS_DATA *&---------------------------------------------------------------------* *& Form DISPLAY_REPORT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM display_report . * Prepare the field catalog PERFORM fill_field_catalog_table. * Display the ALV Report Output PERFORM alv_display. ENDFORM. " DISPLAY_REPORT *&---------------------------------------------------------------------* *& Form FILL_FIELD_CATALOG_TABLE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM fill_field_catalog_table . *Local Data Declarations DATA : lw_fcat TYPE slis_fieldcat_alv. lw_fcat-fieldname lw_fcat-seltext_m lw_fcat-col_pos = APPEND lw_fcat TO = 'BUKRS'. = 'Company Code'. 1. it_fcat.

CLEAR lw_fcat. lw_fcat-fieldname lw_fcat-seltext_m lw_fcat-col_pos = APPEND lw_fcat TO CLEAR lw_fcat. lw_fcat-fieldname lw_fcat-seltext_m lw_fcat-col_pos = APPEND lw_fcat TO CLEAR lw_fcat. lw_fcat-fieldname lw_fcat-seltext_m lw_fcat-col_pos = APPEND lw_fcat TO CLEAR lw_fcat. lw_fcat-fieldname lw_fcat-seltext_m lw_fcat-do_sum lw_fcat-col_pos = APPEND lw_fcat TO CLEAR lw_fcat. lw_fcat-fieldname lw_fcat-seltext_m lw_fcat-do_sum lw_fcat-col_pos = APPEND lw_fcat TO CLEAR lw_fcat. lw_fcat-fieldname lw_fcat-seltext_m lw_fcat-do_sum lw_fcat-col_pos = APPEND lw_fcat TO CLEAR lw_fcat. lw_fcat-fieldname lw_fcat-seltext_m lw_fcat-do_sum lw_fcat-col_pos = APPEND lw_fcat TO CLEAR lw_fcat. lw_fcat-fieldname lw_fcat-seltext_m lw_fcat-do_sum lw_fcat-col_pos = APPEND lw_fcat TO CLEAR lw_fcat. lw_fcat-fieldname lw_fcat-seltext_m lw_fcat-do_sum lw_fcat-col_pos = = 'WERKS'. = 'Plant'. 2. it_fcat. = 'LGORT'. = 'Storage Location'. 3. it_fcat. = 'LGOBE'. = 'Storage Location - Name'. 4. it_fcat. = 'SOLD_QTY'. = 'Sold Qty.'. = 'X'. 5. it_fcat. = 'GROSS_AMT'. = 'Gross Amount(HK$)'. = 'X'. 6. it_fcat. = 'NET_AMT'. = 'Net Amount(HK$)'. = 'X'. 7. it_fcat. = 'DISC_AMT'. = 'Discount(HK$)'. = 'X'. 8. it_fcat. = 'STD_COST'. = 'Sold Cost(HK$)'. = 'X'. 9. it_fcat.

= 'GROSS_PROFIT'. = 'Gross Profit(HK$)'. = 'X'. 10.

APPEND lw_fcat TO it_fcat. CLEAR lw_fcat. lw_fcat-fieldname lw_fcat-seltext_m lw_fcat-do_sum lw_fcat-col_pos = APPEND lw_fcat TO CLEAR lw_fcat. = 'GP_PERC'. = 'Grs. Profit %'. = 'C'. 11. it_fcat.

ENDFORM. " FILL_FIELD_CATALOG_TABLE *&---------------------------------------------------------------------* *& Form ALV_DISPLAY *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM alv_display . DATA : lw_layout TYPE slis_layout_alv, lw_event TYPE slis_alv_event. lw_layout-zebra = 'X'. CLEAR lw_event. MOVE 'TOP_OF_PAGE' TO lw_event-name. MOVE 'TOP_OF_PAGE' TO lw_event-form. APPEND lw_event TO it_event. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = sy-repid is_layout = lw_layout it_fieldcat = it_fcat it_events = it_event TABLES t_outtab = it_final 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. REFRESH : it_fcat, it_final. ENDFORM. " ALV_DISPLAY *&---------------------------------------------------------------------* *& Form get_event *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM get_event USING p_it_event TYPE slis_t_event. DATA : lw_event TYPE slis_alv_event. CALL FUNCTION 'REUSE_ALV_EVENTS_GET' EXPORTING i_list_type = 0 IMPORTING et_events = it_event.

READ TABLE it_event WITH KEY name = slis_ev_top_of_page INTO lw_event. IF sy-subrc = 0. MOVE 'TOP_OF_PAGE' TO lw_event-form. APPEND lw_event TO it_event. CLEAR lw_event. ENDIF. ENDFORM. " get_event *---------------------------------------------------------------------* * FORM TOP_OF_PAGE. *---------------------------------------------------------------------* * event TOP_OF_PAGE *---------------------------------------------------------------------* FORM top_of_page. * *ALV Header declarations DATA: it_header TYPE slis_t_listheader, lw_header TYPE slis_listheader, lv_text1(150) TYPE c, lv_date(10), lv_time(8), lv_plow(5), lv_phi(5). lw_header-typ = 'S'. MOVE 'Sales by Location' TO lv_text1. lw_header-info = lv_text1. APPEND lw_header TO it_header. CLEAR: lw_header. CLEAR lv_text1. IF s_date IS INITIAL. * Selection details lw_header-typ = 'S'. CONCATENATE 'Period:' s_gjahr-low INTO lv_text1 SEPARATED BY space. CONCATENATE 'P' s_monat-low INTO lv_plow. IF s_monat-high = ''. CONCATENATE 'P' s_monat-low INTO lv_phi. ELSE. CONCATENATE 'P' s_monat-high INTO lv_phi. ENDIF. CONCATENATE lv_text1 lv_plow lv_phi INTO lv_text1 SEPARATED BY space. lw_header-info = lv_text1. APPEND lw_header TO it_header. CLEAR: lw_header. CLEAR lv_text1. ELSE. lw_header-typ = 'S'. CONCATENATE 'Date:' s_date-low INTO lv_text1 SEPARATED BY space. IF s_date-high = ''. CONCATENATE lv_text1 'to' s_date-low INTO lv_text1 SEPARATED BY space. ELSE. CONCATENATE lv_text1 'to' s_date-high INTO lv_text1 SEPARATED BY space. ENDIF.

lw_header-info = lv_text1. APPEND lw_header TO it_header. CLEAR: lw_header. CLEAR lv_text1. ENDIF. * Run information lw_header-typ = 'S'. CONCATENATE 'Run By: ' sy-uname INTO lv_text1 SEPARATED BY ' '. lw_header-info = lv_text1. APPEND lw_header TO it_header. CLEAR: lw_header. CLEAR lv_text1. lw_header-typ = 'S'. CONCATENATE sy-datum+4(2) '/' sy-datum+6(2) '/' sy-datum+0(4) INTO lv_date. CONCATENATE 'Run On: ' lv_date INTO lv_text1 SEPARATED BY ' '. lw_header-info = lv_text1. APPEND lw_header TO it_header. CLEAR: lw_header. CLEAR lv_text1. lw_header-typ = 'S'. CONCATENATE sy-uzeit+0(2) ':' sy-uzeit+2(2) ':' sy-uzeit+4(2) INTO lv_time. CONCATENATE 'Run At: ' lv_time INTO lv_text1 SEPARATED BY ' '. lw_header-info = lv_text1. APPEND lw_header TO it_header. CLEAR: lw_header. CLEAR lv_text1. CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE' EXPORTING it_list_commentary = it_header. ENDFORM. "TOP_OF_PAGE-ALV

You might also like