****
****************************************************************************
***** Table Declarations
****************************************************************************
TABLES: mseg.
**** , dd02l
**** .
TABLES: mkpf.
****************************************************************************
* Type Declarations
************************************************************************
TYPES: BEGIN OF mseg_type
, mblnr TYPE mblnr
, mjahr TYPE mjahr
, zeile TYPE mblpo
, matnr TYPE matnr
, werks TYPE werks_d
, bwart TYPE bwart
, lgort TYPE lgort_d
, menge TYPE menge_d
, meins TYPE meins
, lifnr TYPE elifn
, sobkz TYPE sobkz "ZOSVE 18.11.
, umwrk TYPE umwrk
, umlgo TYPE umlgo
, END OF mseg_type
, BEGIN OF ty_mseg
, mblnr TYPE mblnr
, mjahr TYPE mjahr
, zeile TYPE mblpo
, archiveofs TYPE admi_offst
, budat TYPE budat
, matnr TYPE matnr
, werks TYPE werks_d
, bwart TYPE bwart
, lgort TYPE lgort_d
, shkzg TYPE shkzg
, dmbtr TYPE dmbtr
, menge TYPE menge_d
, meins TYPE meins
, lifnr TYPE elifn
, sobkz TYPE sobkz
, umwrk TYPE umwrk
, umlgo TYPE umlgo
, tot_con TYPE menge_d "X6SPOKUR
, END OF ty_mseg
, BEGIN OF mkpf_type
, mblnr TYPE mblnr
, mjahr TYPE mjahr
, budat TYPE budat
, bktxt TYPE bktxt
, END OF mkpf_type
, BEGIN OF z1m1as025_type
, mblnr TYPE mblnr
, matnr TYPE matnr
, werks TYPE werks_d
, lgort TYPE lgort_d
, zkey TYPE char26
, menge TYPE menge_d
, meins TYPE meins
, budat TYPE budat
, bktxt TYPE bktxt
, lifnr TYPE elifn
, END OF z1m1as025_type
, BEGIN OF t001w_type
, werks TYPE werks_d
, END OF t001w_type
, BEGIN OF ztabl_type
, matnr TYPE matnr
, werks TYPE werks_d
, lgort TYPE lgort_d
, labst TYPE labst
, END OF ztabl_type
,BEGIN OF ty_mseg_con
, matnr TYPE matnr
, werks TYPE werks_d
, lgort TYPE lgort_d
, tot_con TYPE menge_d
,END OF ty_mseg_con
, BEGIN OF ztabl1_type
, matnr TYPE matnr
, werks TYPE werks_d
, lgort TYPE lgort_d
, zkey TYPE char26
, menge TYPE menge_d
, meins TYPE meins
, budat TYPE budat
, labst TYPE labst
, bktxt TYPE bktxt
, lifnr TYPE elifn
, mblnr TYPE mblnr
, zeile TYPE mblpo
, bwart TYPE bwart "003
, sobkz TYPE sobkz "003
, END OF ztabl1_type
.
TYPES: BEGIN OF ztabl_n_type.
INCLUDE STRUCTURE z1m1as007.
TYPES: END OF ztabl_n_type
.
TYPES:BEGIN OF ty_final,
prctr TYPE prctr,
lgort TYPE lgort_d,
lgobe TYPE lgobe,
matnr TYPE matnr,
maktx TYPE maktx,
werks TYPE werks_d,
wname TYPE name1,
lt0ys TYPE menge_d,
lt1ys TYPE menge_d,
lt2ys TYPE menge_d,
lt3ys TYPE menge_d,
lt4ys TYPE menge_d,
lt5ys TYPE menge_d,
ov5ys TYPE menge_d,
tstock TYPE menge_d,
lt0yp TYPE dmbtr,
lt1yp TYPE dmbtr,
lt2yp TYPE dmbtr,
lt3yp TYPE dmbtr,
lt4yp TYPE dmbtr,
lt5yp TYPE dmbtr,
ov5yp TYPE dmbtr,
oprice TYPE dmbtr,
lt0yr TYPE calday,
lt1yr TYPE calday,
lt2yr TYPE calday,
lt3yr TYPE calday,
lt4yr TYPE calday,
lt5yr TYPE calday,
ov5yr TYPE calday,
oyears TYPE calday,
END OF ty_final.
TYPES:BEGIN OF ty_mbew,
matnr TYPE matnr,
bwkey TYPE bwkey,
verpr TYPE verpr,
END OF ty_mbew.
************************************************************************
* Internal tables.
************************************************************************
DATA: gt_mseg TYPE TABLE OF mseg_type "#EC NEEDE
, gt_mseg1 TYPE TABLE OF mseg_type "#EC NEEDED
, gt_mseg_ptab TYPE TABLE OF mseg_type "#EC NEEDED
, gt_mseg_1 TYPE TABLE OF ty_mseg "#EC NEEDED
, gt_mseg_2 TYPE TABLE OF ty_mseg "#EC NEEDED
, gt_mseg_ptab_2 TYPE TABLE OF ty_mseg "#EC NEEDED
, gt_mseg_d TYPE TABLE OF ty_mseg "#EC NEEDED
,gt_mseg_con TYPE TABLE OF ty_mseg "#EC NEEDED
,gt_mseg_con_ptab TYPE TABLE OF ty_mseg "#EC NEEDED
,gt_tot_con TYPE TABLE OF ty_mseg_con "#EC NEEDED
,gt_tot_gr TYPE TABLE OF ty_mseg_con "#EC NEEDED
, gt_mkpf TYPE HASHED TABLE OF mkpf_type "#EC NEEDED
WITH UNIQUE KEY mblnr
mjahr
,gt_zarixmm2 TYPE TABLE OF zarixmm2
, gt_mkpf_1 TYPE TABLE OF mkpf_type "#EC NEEDED
, gt_ztabl TYPE TABLE OF ztabl_type "#EC NEEDED
, gt_mard TYPE TABLE OF ztabl_type "#EC NEEDED
, gt_ztabl1 TYPE TABLE OF ztabl1_type "#EC NEEDED
, gt_ztabl11 TYPE TABLE OF ztabl1_type "#EC NEEDED
, gt_ztabl2 TYPE TABLE OF ztabl_n_type "#EC NEEDED
, gt_ztabl3 TYPE TABLE OF ztabl_n_type "#EC NEEDED
, gt_ztabl4 TYPE TABLE OF ztabl_n_type "#EC NEEDED
, gt_z1m1as025 TYPE TABLE OF z1m1as025_type "#EC NEEDED
, gt_mbew TYPE TABLE OF ty_mbew
, gt_final TYPE TABLE OF ty_final,
gt_fieldcat TYPE slis_t_fieldcat_alv.
************************************************************************
* Work areas.
************************************************************************
DATA: gs_ztabl1 TYPE ztabl1_type "#EC NEEDED
,gs_ztabl11 TYPE ztabl1_type "#EC NEEDED
, gs_ztabl2 TYPE ztabl_n_type "#EC NEEDED
, gs_ztabl3 TYPE ztabl_n_type "#EC NEEDED
, gs_ztabl4 TYPE ztabl_n_type "#EC NEEDED
, gs_mbew TYPE ty_mbew
, gs_final TYPE ty_final,
gs_tot_con TYPE ty_mseg_con,
gs_tot_gr TYPE ty_mseg_con,
gs_tot_gr_tmp TYPE ty_mseg_con,
gs_mseg_con TYPE ty_mseg,
gs_mseg_con_ptab TYPE ty_mseg,
gs_mseg_ptab_2 TYPE ty_mseg,
gs_mseg_con_tmp TYPE ty_mseg,
gs_mseg_gr TYPE ty_mseg,
gs_mseg_gr_tmp TYPE ty_mseg,
gs_fieldcat TYPE slis_fieldcat_alv,
gv_z4days TYPE calday,
gv_yr TYPE int1,
gv_quan TYPE menge_d,
gv_tquan TYPE menge_d,
gv_amnt TYPE dmbtr,
gs_mseg_new TYPE ty_mseg,
gs_mseg_301 TYPE ty_mseg.
DATA: ls_mseg1 TYPE mseg_type.
************************************************************************
* Variables.
************************************************************************
DATA: gv_qty TYPE lbkum "#EC NEEDED
, gv_count TYPE p "#EC NEEDED
, gv_stock TYPE labst "#EC NEEDED
, gv_flag TYPE flag "#EC NEEDED
, gv_append TYPE flag "#EC NEEDED
, gv_labst TYPE labst "#EC NEEDED
, gv_bktxt TYPE bktxt "#EC NEEDED
, gv_budat TYPE budat "#EC NEEDED
, gv_subrc TYPE sysubrc "#EC NEEDED
, gd_repid TYPE sy-repid,
gd_layout TYPE slis_layout_alv,
gv_con TYPE menge_d, "Sai
gv_con_tmp TYPE menge_d. "Sai
************************************************************************
* Field Symbols.
************************************************************************
FIELD-SYMBOLS: <fs_mseg> TYPE mseg_type "#EC NEEDED
, <fs_mkpf> TYPE mkpf_type "#EC NEEDED
, <fs_ztabl> TYPE ztabl_type "#EC NEEDED
, <fs_ztabl1> TYPE ztabl1_type "#EC NEEDED
, <fs_ztabl2> TYPE ztabl_n_type "#EC NEEDED
, <fs_ztabl3> TYPE ztabl_n_type "#EC NEEDED
, <fs_z1m1as025> TYPE z1m1as025_type "#EC NEEDED
, <fs_mseg_con> TYPE ty_mseg "Sai "#EC NEEDED
.
************************************************************************
* Constants.
************************************************************************
CONSTANTS: gc_gi_entry TYPE bwart VALUE '561'
, gc_debit TYPE shkzg VALUE 'S'
, gc_client141 TYPE mandt VALUE '141'
, gc_365days TYPE i VALUE 365
, gc_true TYPE flag VALUE 'X'
, gc_yes TYPE flag VALUE 'Y'
, gc_no TYPE flag VALUE 'N'
, gc_101 TYPE bwart VALUE '101'. "+004
****
************************************************************************
* Selection Screen
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE TEXT-tt1.
SELECT-OPTIONS: splnt FOR mseg-werks OBLIGATORY
, smtnr FOR mseg-matnr
.
SELECTION-SCREEN END OF BLOCK bl1.
FORM authorization_check.
AUTHORITY-CHECK OBJECT 'YS_DATAADM'
ID 'ACTVT' FIELD '16'
ID 'YSAE_APPLC' FIELD 'MM'
ID 'P_GROUP' DUMMY.
ENDFORM. " AUTHORITY_CHECK
START-OF-SELECTION.
* Get active data.
SELECT mblnr
mjahr
zeile
matnr
werks
bwart
lgort
menge
meins
lifnr
sobkz
umwrk
umlgo
INTO TABLE gt_mseg
FROM mseg
WHERE matnr IN smtnr
AND werks IN splnt.
* Populate active MKPF data into internal table
REFRESH gt_mkpf.
IF gt_mseg[] IS NOT INITIAL.
SELECT mblnr
mjahr
budat
bktxt
INTO TABLE gt_mkpf
FROM mkpf
FOR ALL ENTRIES IN gt_mseg
WHERE mblnr = gt_mseg-mblnr
AND mjahr = gt_mseg-mjahr.
ENDIF.
SORT gt_mseg.
DELETE ADJACENT DUPLICATES FROM gt_mseg.
LOOP AT gt_mseg ASSIGNING <fs_mseg>.
CLEAR: gs_ztabl1
, gv_budat
, gv_bktxt
.
* Try to get active data first
READ TABLE gt_mkpf ASSIGNING <fs_mkpf>
WITH TABLE KEY mblnr = <fs_mseg>-mblnr
mjahr = <fs_mseg>-mjahr.
IF sy-subrc = 0.
gv_budat = <fs_mkpf>-budat.
gv_bktxt = <fs_mkpf>-bktxt.
ENDIF.
gs_ztabl1-matnr = <fs_mseg>-matnr.
gs_ztabl1-werks = <fs_mseg>-werks.
gs_ztabl1-lgort = <fs_mseg>-lgort.
gs_ztabl1-meins = <fs_mseg>-meins.
gs_ztabl1-budat = gv_budat.
READ TABLE gt_ztabl ASSIGNING <fs_ztabl>
WITH KEY matnr = <fs_mseg>-matnr
werks = <fs_mseg>-werks
lgort = <fs_mseg>-lgort.
IF sy-subrc IS INITIAL AND <fs_ztabl> IS ASSIGNED.
gs_ztabl1-labst = <fs_ztabl>-labst.
ENDIF.
gs_ztabl1-bktxt = gv_bktxt.
gs_ztabl1-mblnr = <fs_mseg>-mblnr.
gs_ztabl1-zeile = <fs_mseg>-zeile.
gs_ztabl1-lifnr = <fs_mseg>-lifnr.
gs_ztabl1-bwart = <fs_mseg>-bwart.
gs_ztabl1-sobkz = <fs_mseg>-sobkz.
IF <fs_mseg>-bwart = gc_gi_entry AND
gv_budat =< '20120101'.
gs_ztabl1-menge = 0.
ELSE.
gs_ztabl1-menge = <fs_mseg>-menge.
ENDIF.
CONCATENATE <fs_mseg>-matnr
<fs_mseg>-werks
<fs_mseg>-lgort
INTO gs_ztabl1-zkey.
APPEND gs_ztabl1 TO gt_ztabl1.
ENDLOOP.
SORT gt_ztabl1 BY zkey budat DESCENDING.
LOOP AT gt_ztabl1 ASSIGNING <fs_ztabl1>.
AT NEW zkey.
gv_qty = 0.
gv_count = 0.
gv_flag = gc_no.
CLEAR gv_stock.
ENDAT.
gs_ztabl2-mandt = gc_client141.
gs_ztabl2-matnr = <fs_ztabl1>-matnr.
gs_ztabl2-werks = <fs_ztabl1>-werks.
gs_ztabl2-lgort = <fs_ztabl1>-lgort.
gs_ztabl2-menge = <fs_ztabl1>-menge.
gs_ztabl2-meins = <fs_ztabl1>-meins.
gs_ztabl2-budat = <fs_ztabl1>-budat.
gs_ztabl2-bktxt = <fs_ztabl1>-bktxt.
gs_ztabl2-lifnr = <fs_ztabl1>-lifnr.
gs_ztabl2-mblnr = <fs_ztabl1>-mblnr.
gs_ztabl2-bwart = <fs_ztabl1>-bwart. "003
gs_ztabl2-sobkz = <fs_ztabl1>-sobkz. "003
* gs_ztabl2-umwrk = <fs_ztabl1>-umwrk. "003
CONCATENATE <fs_ztabl1>-matnr
<fs_ztabl1>-zeile
<fs_ztabl1>-lgort
INTO gs_ztabl2-zkey.
gv_qty = gv_qty + <fs_ztabl1>-menge.
gs_ztabl2-z4qty = gv_qty.
gs_ztabl2-labst = <fs_ztabl1>-labst - gs_ztabl2-z4qty.
IF gs_ztabl2-labst > 0.
gs_ztabl2-aging = <fs_ztabl1>-menge.
gs_ztabl2-z4days = ( sy-datum - gs_ztabl2-budat ) / gc_365days.
PERFORM value_cal USING gs_ztabl2-matnr
gs_ztabl2-werks
gs_ztabl2-aging
CHANGING gs_ztabl2-waers
gs_ztabl2-value
gs_ztabl2-prctr.
APPEND gs_ztabl2 TO gt_ztabl2.
gv_stock = gs_ztabl2-labst.
gv_flag = gc_yes.
ELSE.
IF gv_count = 0.
IF gv_flag = gc_yes.
gs_ztabl2-aging = gv_stock.
ELSE.
gs_ztabl2-aging = <fs_ztabl1>-labst.
ENDIF.
gs_ztabl2-z4days = ( sy-datum - gs_ztabl2-budat ) / gc_365days.
PERFORM value_cal USING gs_ztabl2-matnr
gs_ztabl2-werks
gs_ztabl2-aging
CHANGING gs_ztabl2-waers
gs_ztabl2-value
gs_ztabl2-prctr.
APPEND gs_ztabl2 TO gt_ztabl2.
ENDIF.
gv_count = gv_count + 1.
ENDIF.
ENDLOOP.
**** Reset the value of ZKEY prior to SORT.
LOOP AT gt_ztabl2 ASSIGNING <fs_ztabl2>.
CONCATENATE <fs_ztabl2>-matnr
<fs_ztabl2>-werks
<fs_ztabl2>-lgort
INTO <fs_ztabl2>-zkey.
ENDLOOP.
*First entry will be the oldest record in GT_ZTABL2
SORT gt_ztabl2 BY zkey
budat
labst.
*If the oldest record's LABST is greater than 0, then store in internal
*table as a process target.
LOOP AT gt_ztabl2 ASSIGNING <fs_ztabl2>.
CLEAR gv_append.
gv_labst = <fs_ztabl2>-labst.
AT NEW zkey.
IF gv_labst > 0.
gv_append = gc_true.
ENDIF.
ENDAT.
IF gv_append = gc_true.
gs_ztabl3 = <fs_ztabl2>.
APPEND gs_ztabl3 TO gt_ztabl3.
ENDIF.
ENDLOOP.
SORT: gt_ztabl3 BY zkey budat DESCENDING.
* stock qty and stock days
LOOP AT gt_ztabl3 ASSIGNING <fs_ztabl3>.
AT NEW zkey.
gv_qty = 0.
gv_count = 0.
gv_flag = gc_no.
CLEAR gv_stock.
ENDAT.
IF gv_count = 0.
IF gv_flag = gc_yes.
gs_ztabl4-aging = gv_stock.
ELSE.
gs_ztabl4-aging = <fs_ztabl3>-labst.
ENDIF.
gs_ztabl4-z4days = ( sy-datum - gs_ztabl4-budat ) / gc_365days.
PERFORM value_cal USING gs_ztabl4-matnr
gs_ztabl4-werks
gs_ztabl4-aging
CHANGING gs_ztabl4-waers
gs_ztabl4-value
gs_ztabl4-prctr.
APPEND gs_ztabl4 TO gt_ztabl4.
ENDIF.
gv_count = gv_count + 1.
ENDLOOP.
IF gt_ztabl4 IS INITIAL AND gt_ztabl2 IS NOT INITIAL.
gt_ztabl4 = gt_ztabl2.
ELSEIF gt_ztabl4 IS NOT INITIAL AND gt_ztabl2 IS NOT INITIAL.
APPEND LINES OF gt_ztabl2 TO gt_ztabl4.
ENDIF.
SORT gt_ztabl4 BY werks lgort matnr.
SORT gt_ztabl4 BY budat matnr werks lgort ASCENDING.
DELETE ADJACENT DUPLICATES FROM gt_ztabl4 COMPARING werks lgort matnr.
IF gt_ztabl4 IS NOT INITIAL.
*Fetch Storage location Description
SELECT werks,
lgort,
lgobe
FROM t001l
INTO TABLE @DATA(gt_t001l)
FOR ALL ENTRIES IN @gt_ztabl4
WHERE werks = @gt_ztabl4-werks
AND lgort = @gt_ztabl4-lgort.
IF sy-subrc EQ 0 .
SORT gt_t001l BY werks lgort.
ENDIF.
*Fetch materila Description
SELECT matnr,
maktx
FROM makt
INTO TABLE @DATA(gt_makt)
FOR ALL ENTRIES IN @gt_ztabl4
WHERE matnr = @gt_ztabl4-matnr
AND spras = 'E'.
IF sy-subrc EQ 0.
SORT gt_makt BY matnr.
ENDIF.
*Fetch Plant Description
SELECT werks,
name1
FROM t001w
INTO TABLE @DATA(gt_t001w)
FOR ALL ENTRIES IN @gt_ztabl4
WHERE werks = @gt_ztabl4-werks.
IF sy-subrc EQ 0.
SORT gt_t001w BY werks.
ENDIF.
*Fetch total price of Material
SELECT matnr
bwkey
verpr
FROM mbew
INTO TABLE gt_mbew
FOR ALL ENTRIES IN gt_ztabl4
WHERE matnr = gt_ztabl4-matnr
AND bwkey = gt_ztabl4-werks.
IF sy-subrc EQ 0.
SORT gt_mbew BY matnr bwkey.
ENDIF.
*Fetch total Stock
SELECT matnr
werks
lgort
labst
INTO TABLE gt_mard
FROM mard
FOR ALL ENTRIES IN gt_ztabl4
WHERE matnr = gt_ztabl4-matnr
AND werks = gt_ztabl4-werks
AND lgort = gt_ztabl4-lgort
AND labst > 0.
IF sy-subrc EQ 0.
SORT gt_mard BY matnr werks lgort.
ENDIF.
* Get Material Docuemnt and Unit and each price data.
SELECT mblnr
mjahr
zeile
matnr
werks
bwart
lgort
shkzg
dmbtr
menge
meins
lifnr
sobkz
umwrk
umlgo
INTO CORRESPONDING FIELDS OF TABLE gt_mseg_1
FROM mseg
FOR ALL ENTRIES IN gt_ztabl4
WHERE bwart IN ( '101','701','602','292','552','262','202' )
AND matnr = gt_ztabl4-matnr
AND werks = gt_ztabl4-werks
AND lgort = gt_ztabl4-lgort.
IF sy-subrc EQ 0.
SORT gt_mseg_1 BY matnr werks lgort.
IF gt_mseg_1 IS NOT INITIAL.
* *Fetch Document date
SELECT mblnr
mjahr
budat
bktxt
INTO TABLE gt_mkpf_1
FROM mkpf
FOR ALL ENTRIES IN gt_mseg_1
WHERE mblnr = gt_mseg_1-mblnr
AND mjahr = gt_mseg_1-mjahr.
IF sy-subrc EQ 0.
SORT gt_mkpf_1 BY mblnr mjahr.
DELETE ADJACENT DUPLICATES FROM gt_mkpf_1 COMPARING ALL FIELDS.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
****Calcualte total consumtio for each material,plant and storage location
LOOP AT gt_mseg_con INTO gs_mseg_con.
gs_tot_con-matnr = gs_mseg_con-matnr.
gs_tot_con-werks = gs_mseg_con-werks.
gs_tot_con-lgort = gs_mseg_con-lgort.
gs_tot_con-tot_con = gs_mseg_con-menge.
COLLECT gs_tot_con INTO gt_tot_con.
CLEAR:gs_tot_con,gs_mseg_con.
ENDLOOP.
IF sy-subrc IS INITIAL.
SORT gt_mseg_2 BY matnr werks lgort.
DELETE ADJACENT DUPLICATES FROM gt_mseg_1 COMPARING ALL FIELDS.
ENDIF.
IF gt_mseg_2 IS NOT INITIAL.
gt_mseg_d = gt_mseg_2.
SORT gt_mseg_d BY bwart.
DELETE gt_mseg_d WHERE bwart NE '301'.
SORT gt_mseg_d BY matnr werks lgort.
IF gt_mseg_d IS NOT INITIAL .
SELECT
mblnr,
mjahr,
zeile,
matnr,
werks,
bwart,
lgort,
shkzg,
dmbtr,
menge,
meins,
lifnr,
sobkz,
umwrk,
umlgo
INTO CORRESPONDING FIELDS OF TABLE @gt_mseg_1
FROM mseg
FOR ALL ENTRIES IN @gt_mseg_d
WHERE bwart = '101'
AND shkzg = 'S'
AND matnr = @gt_mseg_d-matnr
AND werks = @gt_mseg_d-umwrk
AND lgort = @gt_mseg_d-lgort
AND umwrk = @gt_mseg_d-umwrk
AND umlgo = @gt_mseg_d-umlgo.
IF sy-subrc EQ 0.
SORT gt_mseg_1 BY matnr werks lgort.
* *Fetch Document date
SELECT mblnr
mjahr
budat
bktxt
INTO TABLE gt_mkpf_1
FROM mkpf
FOR ALL ENTRIES IN gt_mseg_1
WHERE mblnr = gt_mseg_1-mblnr
AND mjahr = gt_mseg_1-mjahr.
IF sy-subrc EQ 0.
SORT gt_mkpf_1 BY mblnr mjahr.
DELETE ADJACENT DUPLICATES FROM gt_mkpf_1 COMPARING ALL FIELDS.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
*Prepare final table for ALV output
DATA : lv_old_fr TYPE char4.
DATA : lv_new_fr TYPE char4.
LOOP AT gt_ztabl4 INTO gs_ztabl4.
gs_final-prctr = gs_ztabl4-prctr.
gs_final-lgort = gs_ztabl4-lgort.
READ TABLE gt_t001l INTO DATA(ls_t001l) WITH KEY werks = gs_ztabl4-werks
lgort = gs_ztabl4-lgort BINARY SEARCH.
IF sy-subrc EQ 0.
gs_final-lgobe = ls_t001l-lgobe.
ENDIF.
gs_final-matnr = gs_ztabl4-matnr.
READ TABLE gt_makt INTO DATA(ls_makt) WITH KEY matnr = gs_ztabl4-matnr BINARY SEARCH.
IF sy-subrc EQ 0.
gs_final-maktx = ls_makt-maktx.
ENDIF.
gs_final-werks = gs_ztabl4-werks.
READ TABLE gt_t001w INTO DATA(ls_t001w) WITH KEY werks = gs_ztabl4-werks BINARY SEARCH.
IF sy-subrc EQ 0.
gs_final-wname = ls_t001w-name1.
ENDIF.
*Fetch total stock of Material
READ TABLE gt_mard INTO DATA(ls_mard) WITH KEY matnr = gs_ztabl4-matnr
werks = gs_ztabl4-werks
lgort = gs_ztabl4-lgort BINARY SEARCH.
IF sy-subrc EQ 0.
gs_final-tstock = ls_mard-labst.
READ TABLE gt_mseg_1 INTO DATA(ls_mseg) WITH KEY matnr = gs_ztabl4-matnr
werks = gs_ztabl4-werks
lgort = gs_ztabl4-lgort.
* IF sy-subrc EQ 0.
*Loop for each material dcument to get Stock & Price of over the years
LOOP AT gt_mseg_1 FROM sy-tabix ASSIGNING FIELD-SYMBOL(<lfs_mseg>).
IF <lfs_mseg>-matnr <> gs_ztabl4-matnr OR <lfs_mseg>-werks <> gs_ztabl4-werks OR <lfs_mseg>-lgort <> gs_ztabl4-lgort.
EXIT.
ENDIF.
READ TABLE gt_mkpf_1 INTO DATA(ls_mkpf) WITH KEY mblnr = <lfs_mseg>-mblnr
mjahr = <lfs_mseg>-mjahr BINARY SEARCH.
IF sy-subrc EQ 0.
CLEAR : lv_new_fr,lv_old_fr.
CALL FUNCTION 'GM_GET_FISCAL_YEAR'
EXPORTING
i_date = ls_mkpf-budat
i_fyv = 'V3'
IMPORTING
e_fy = lv_old_fr
EXCEPTIONS
fiscal_year_does_not_exist = 1
not_defined_for_date = 2
OTHERS = 3.
IF sy-subrc EQ 0.
CALL FUNCTION 'GM_GET_FISCAL_YEAR'
EXPORTING
i_date = sy-datum
i_fyv = 'V3'
IMPORTING
e_fy = lv_new_fr
EXCEPTIONS
fiscal_year_does_not_exist = 1
not_defined_for_date = 2
OTHERS = 3.
ENDIF.
gv_z4days = ( sy-datum - ls_mkpf-budat ) / gc_365days.
gv_yr = lv_new_fr - lv_old_fr.
IF <lfs_mseg>-shkzg = 'S'.
gv_quan = gv_quan + <lfs_mseg>-menge.
gv_amnt = gv_amnt + <lfs_mseg>-dmbtr.
ELSEIF <lfs_mseg>-shkzg = 'H'.
gv_quan = gv_quan - <lfs_mseg>-menge.
gv_amnt = gv_amnt - <lfs_mseg>-dmbtr.
ENDIF.
* IF gv_z4days LE 1.
IF gv_yr EQ 0.
gs_final-lt0ys = gs_final-lt0ys + gv_quan.
gs_final-lt0yp = gs_final-lt0yp + gv_amnt.
gs_final-lt0yr = gv_z4days.
* ELSEIF ( gv_z4days GT 1 AND gv_z4days LE 2 ).
ELSEIF gv_yr EQ 1.
gs_final-lt1ys = gs_final-lt1ys + gv_quan.
gs_final-lt1yp = gs_final-lt1yp + gv_amnt.
gs_final-lt1yr = gv_z4days.
* ELSEIF ( gv_z4days GT 2 AND gv_z4days LE 3 ).
ELSEIF gv_yr EQ 2.
gs_final-lt2ys = gs_final-lt2ys + gv_quan.
gs_final-lt2yp = gs_final-lt2yp + gv_amnt.
gs_final-lt2yr = gv_z4days.
* ELSEIF ( gv_z4days GT 3 AND gv_z4days LE 4 ).
ELSEIF gv_yr EQ 3.
gs_final-lt3ys = gs_final-lt3ys + gv_quan.
gs_final-lt3yp = gs_final-lt3yp + gv_amnt.
gs_final-lt3yr = gv_z4days.
* ELSEIF ( gv_z4days GT 4 AND gv_z4days LE 5 ).
ELSEIF gv_yr EQ 4.
gs_final-lt4ys = gs_final-lt4ys + gv_quan.
gs_final-lt4yp = gs_final-lt4yp + gv_amnt.
gs_final-lt4yr = gv_z4days.
* ELSEIF gv_z4days GT 5.
ELSEIF gv_yr EQ 5.
gs_final-lt5ys = gs_final-lt5ys + gv_quan.
gs_final-lt5yp = gs_final-lt5yp + gv_amnt.
gs_final-lt5yr = gv_z4days.
ELSEIF gv_yr GT 5.
gs_final-ov5ys = gs_final-ov5ys + gv_quan.
gs_final-ov5yp = gs_final-ov5yp + gv_amnt.
gs_final-ov5yr = gv_z4days.
ENDIF.
CLEAR:gv_z4days,gv_quan,gv_amnt.
ENDIF.
ENDLOOP.
LOOP AT gt_mseg_2 INTO DATA(ls_mseg2) WHERE matnr = gs_ztabl4-matnr
AND werks = gs_ztabl4-werks
AND lgort = gs_ztabl4-lgort.
CLEAR : lv_new_fr,lv_old_fr.
CALL FUNCTION 'GM_GET_FISCAL_YEAR'
EXPORTING
i_date = ls_mseg2-budat
i_fyv = 'V3'
IMPORTING
e_fy = lv_old_fr
EXCEPTIONS
fiscal_year_does_not_exist = 1
not_defined_for_date = 2
OTHERS = 3.
IF sy-subrc EQ 0.
CALL FUNCTION 'GM_GET_FISCAL_YEAR'
EXPORTING
i_date = sy-datum
i_fyv = 'V3'
IMPORTING
e_fy = lv_new_fr
EXCEPTIONS
fiscal_year_does_not_exist = 1
not_defined_for_date = 2
OTHERS = 3.
ENDIF.
gv_z4days = ( sy-datum - ls_mseg2-budat ) / gc_365days.
gv_yr = lv_new_fr - lv_old_fr.
IF ls_mseg2-shkzg = 'S'.
gv_quan = gv_quan + ls_mseg2-menge.
gv_amnt = gv_amnt + ls_mseg2-dmbtr.
ELSEIF ls_mseg2-shkzg = 'H'.
gv_quan = gv_quan - ls_mseg2-menge.
gv_amnt = gv_amnt - ls_mseg2-dmbtr.
ENDIF.
IF gv_yr EQ 0.
gs_final-lt0ys = gs_final-lt0ys + gv_quan.
gs_final-lt0yp = gs_final-lt0yp + gv_amnt.
gs_final-lt0yr = gv_z4days.
ELSEIF gv_yr EQ 1.
gs_final-lt1ys = gs_final-lt1ys + gv_quan.
gs_final-lt1yp = gs_final-lt1yp + gv_amnt.
gs_final-lt1yr = gv_z4days.
ELSEIF gv_yr EQ 2.
gs_final-lt2ys = gs_final-lt2ys + gv_quan.
gs_final-lt2yp = gs_final-lt2yp + gv_amnt.
gs_final-lt2yr = gv_z4days.
ELSEIF gv_yr EQ 3.
gs_final-lt3ys = gs_final-lt3ys + gv_quan.
gs_final-lt3yp = gs_final-lt3yp + gv_amnt.
gs_final-lt3yr = gv_z4days.
ELSEIF gv_yr EQ 4.
gs_final-lt4ys = gs_final-lt4ys + gv_quan.
gs_final-lt4yp = gs_final-lt4yp + gv_amnt.
gs_final-lt4yr = gv_z4days.
ELSEIF gv_yr EQ 5.
gs_final-lt5ys = gs_final-lt5ys + gv_quan.
gs_final-lt5yp = gs_final-lt5yp + gv_amnt.
gs_final-lt5yr = gv_z4days.
ELSEIF gv_yr GT 5.
gs_final-ov5ys = gs_final-ov5ys + gv_quan.
gs_final-ov5yp = gs_final-ov5yp + gv_amnt.
gs_final-ov5yr = gv_z4days.
ENDIF.
CLEAR:gv_z4days,gv_quan,gv_amnt.
ENDLOOP.
gs_final-oyears = gs_final-lt0yr + gs_final-lt1yr + gs_final-lt2yr + gs_final-lt3yr + gs_final-lt4yr + gs_final-lt5yr + gs_final-ov5yr.
READ TABLE gt_mbew INTO gs_mbew WITH KEY matnr = gs_ztabl4-matnr bwkey = gs_ztabl4-werks BINARY SEARCH.
IF sy-subrc EQ 0.
gs_final-oprice = gs_mbew-verpr.
ENDIF.
*Minus consumption quantity from GR qty per
CLEAR:gs_tot_con.
READ TABLE gt_tot_con INTO gs_tot_con
WITH KEY matnr = <lfs_mseg>-matnr
werks = <lfs_mseg>-werks
lgort = <lfs_mseg>-lgort.
IF sy-subrc IS INITIAL.
***OT 5 years
gs_final-ov5ys = gs_final-ov5ys - gs_mseg_con-tot_con.
IF gs_final-ov5ys LE 0.
****LT 5 years
gs_final-lt5ys = gs_final-ov5ys + gs_final-lt5ys.
IF gs_final-lt5ys LE 0.
****LT 4 years
gs_final-lt4ys = gs_final-lt5ys + gs_final-lt4ys.
IF gs_final-lt4ys LE 0 .
****LT 3 years
gs_final-lt3ys = gs_final-lt4ys + gs_final-lt3ys.
IF gs_final-lt3ys LE 0 .
****LT 2 years
gs_final-lt2ys = gs_final-lt3ys + gs_final-lt2ys.
IF gs_final-lt2ys LE 0 .
****LT 1 years
gs_final-lt1ys = gs_final-lt2ys + gs_final-lt1ys.
IF gs_final-lt1ys LE 0 .
****LT 1 years
gs_final-lt0ys = gs_final-lt1ys + gs_final-lt1ys.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
APPEND gs_final TO gt_final.
CLEAR:gs_final.
* ENDIF.
ENDIF.
ENDLOOP.
*Compare stock with total stock and clear the Negative stock details
LOOP AT gt_final ASSIGNING FIELD-SYMBOL(<lfs_final>).
IF <lfs_final>-lt0ys = <lfs_final>-tstock.
CLEAR:<lfs_final>-lt1ys,<lfs_final>-lt2ys,<lfs_final>-lt3ys,<lfs_final>-lt4ys,<lfs_final>-lt5ys,<lfs_final>-ov5ys,gv_tquan.
CONTINUE.
ELSE.
gv_tquan = <lfs_final>-lt0ys + <lfs_final>-lt1ys.
ENDIF.
IF gv_tquan = <lfs_final>-tstock.
CLEAR:<lfs_final>-lt2ys,<lfs_final>-lt3ys,<lfs_final>-lt4ys,<lfs_final>-lt5ys,<lfs_final>-ov5ys,gv_tquan.
CONTINUE.
ELSE.
gv_tquan = gv_tquan + <lfs_final>-lt2ys.
ENDIF.
IF gv_tquan = <lfs_final>-tstock.
CLEAR:<lfs_final>-lt3ys,<lfs_final>-lt4ys,<lfs_final>-lt5ys,<lfs_final>-ov5ys,gv_tquan.
CONTINUE.
ELSE.
gv_tquan = gv_tquan + <lfs_final>-lt3ys.
ENDIF.
IF gv_tquan = <lfs_final>-tstock.
CLEAR:<lfs_final>-lt4ys,<lfs_final>-lt5ys,<lfs_final>-ov5ys,gv_tquan.
CONTINUE.
ELSE.
gv_tquan = gv_tquan + <lfs_final>-lt4ys.
ENDIF.
IF gv_tquan = <lfs_final>-tstock.
CLEAR:<lfs_final>-lt5ys,<lfs_final>-ov5ys,gv_tquan.
CONTINUE.
ELSE.
gv_tquan = gv_tquan + <lfs_final>-lt5ys.
ENDIF.
IF gv_tquan = <lfs_final>-tstock.
CLEAR:<lfs_final>-ov5ys,gv_tquan.
CONTINUE.
ENDIF.
CLEAR:gv_tquan.
ENDLOOP.
IF gt_final IS NOT INITIAL.
*Build field catalog
gs_fieldcat-fieldname = 'PRCTR'.
gs_fieldcat-seltext_l = 'Profit Center'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LGORT'.
gs_fieldcat-seltext_l = 'Storage location'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LGOBE'.
gs_fieldcat-seltext_l = 'Description of Storage location'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'MATNR'.
gs_fieldcat-seltext_l = 'Material No'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'MAKTX'.
gs_fieldcat-seltext_l = 'Material Description'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'WERKS'.
gs_fieldcat-seltext_l = 'Plant'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'WNAME'.
gs_fieldcat-seltext_l = 'Name of Plant'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LT0YS'.
gs_fieldcat-seltext_l = 'Current year Stock'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LT1YS'.
gs_fieldcat-seltext_l = 'Less than 1 year Stock'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LT2YS'.
gs_fieldcat-seltext_l = 'Less than 2 years Stock'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LT3YS'.
gs_fieldcat-seltext_l = 'Less than 3 years Stock'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LT4YS'.
gs_fieldcat-seltext_l = 'Less than 4 years Stock'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LT5YS'.
gs_fieldcat-seltext_l = 'Less than 5 years Stock'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'OV5YS'.
gs_fieldcat-seltext_l = 'Over than 5 years Stock'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'TSTOCK'.
gs_fieldcat-seltext_l = 'Overall Stock'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LT0YP'.
gs_fieldcat-seltext_l = 'Current year Value'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LT1YP'.
gs_fieldcat-seltext_l = 'Less than 1 year Value'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LT2YP'.
gs_fieldcat-seltext_l = 'Less than 2 years Value'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LT3YP'.
gs_fieldcat-seltext_l = 'Less than 3 years Value'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LT4YP'.
gs_fieldcat-seltext_l = 'Less than 4 years Value'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LT5YP'.
gs_fieldcat-seltext_l = 'Less than 5 years Value'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'OV5YP'.
gs_fieldcat-seltext_l = 'Over than 5 years Value'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'OPRICE'.
gs_fieldcat-seltext_l = 'Overall Value'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LT0YR'.
gs_fieldcat-seltext_l = 'Crrent year'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LT1YR'.
gs_fieldcat-seltext_l = 'No of years LT 1'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LT2YR'.
gs_fieldcat-seltext_l = 'No of years LT 2'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LT3YR'.
gs_fieldcat-seltext_l = 'No of years LT 3'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LT4YR'.
gs_fieldcat-seltext_l = 'No of years LT 4'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'LT5YR'.
gs_fieldcat-seltext_l = 'No of years LT 5'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'OV5YR'.
gs_fieldcat-seltext_l = 'Over than 5 Years'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
gs_fieldcat-fieldname = 'OYEARS'.
gs_fieldcat-seltext_l = 'Overall Result'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR:gs_fieldcat.
*ALV output
gd_layout-zebra = 'X'.
gd_repid = sy-repid.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = gd_repid
i_callback_top_of_page = 'TOP-OF-PAGE' "see FORM
is_layout = gd_layout
it_fieldcat = gt_fieldcat
i_save = 'X'
TABLES
t_outtab = gt_final
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc NE 0.
*
ENDIF.
ENDIF.
*End of change 004
*&--------------------------------------------------------------------*
*& Form VALUE_CAL
*&--------------------------------------------------------------------*
* Calculate values
*---------------------------------------------------------------------*
FORM value_cal USING p_matnr TYPE matnr
p_werks TYPE werks_d
p_aging TYPE labst
CHANGING p_waers TYPE waers
p_value TYPE verpr
p_prctr TYPE prctr.
DATA: l_verpr TYPE verpr
, l_bukrs TYPE bukrs
.
SELECT verpr
INTO l_verpr
FROM mbew UP TO 1 ROWS
WHERE matnr = p_matnr
AND bwkey = p_werks
ORDER BY PRIMARY KEY.
ENDSELECT.
IF sy-subrc = 0.
SELECT SINGLE bukrs
INTO l_bukrs
FROM t001k
WHERE bwkey = p_werks.
IF sy-subrc = 0.
SELECT SINGLE waers
INTO p_waers
FROM t001
WHERE bukrs = l_bukrs.
ENDIF.
p_value = p_aging * l_verpr.
ENDIF.
SELECT SINGLE prctr
INTO p_prctr
FROM marc
WHERE matnr = p_matnr
AND werks = p_werks.
ENDFORM. "VALUE_CAL
*-------------------------------------------------------------------*
* Form TOP-OF-PAGE *
*-------------------------------------------------------------------*
* ALV Report Header *
*-------------------------------------------------------------------*
FORM top-of-page.
*ALV Header declarations
DATA: lt_header TYPE slis_t_listheader,
ls_header TYPE slis_listheader.
* Title
ls_header-typ = 'H'.
ls_header-info = 'Stock Aging Report'.
APPEND ls_header TO lt_header.
CLEAR ls_header.
* Date
ls_header-typ = 'S'.
ls_header-key = 'Date: '.
CONCATENATE sy-datum+6(2) '.'
sy-datum+4(2) '.'
sy-datum(4) INTO ls_header-info. "todays date
APPEND ls_header TO lt_header.
CLEAR: ls_header.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = lt_header.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form VALUE_CAL_ZTABL3
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GS_ZTABL3_MATNR text
* -->P_GS_ZTABL3_WERKS text
* -->P_GS_ZTABL3_AGING text
* <--P_GS_ZTABL3_WAERS text
* <--P_GS_ZTABL3_VALUE text
* <--P_GS_ZTABL3_PRCTR text
*----------------------------------------------------------------------*
FORM value_cal_ztabl3 USING p_matnr TYPE matnr
p_werks TYPE werks_d
p_aging TYPE labst
CHANGING p_waers TYPE waers
p_value TYPE verpr
p_prctr TYPE prctr.
DATA: l_verpr TYPE verpr
, l_bukrs TYPE bukrs
.
SELECT verpr
INTO l_verpr
FROM mbew UP TO 1 ROWS
WHERE matnr = p_matnr
AND bwkey = p_werks
ORDER BY PRIMARY KEY.
ENDSELECT.
IF sy-subrc = 0.
SELECT SINGLE bukrs
INTO l_bukrs
FROM t001k
WHERE bwkey = p_werks.
IF sy-subrc = 0.
SELECT SINGLE waers
INTO p_waers
FROM t001
WHERE bukrs = l_bukrs.
ENDIF.
p_value = p_aging * l_verpr.
ENDIF.
SELECT SINGLE prctr
INTO p_prctr
FROM marc
WHERE matnr = p_matnr
AND werks = p_werks.
ENDFORM.
* Field Symbols.
ReplyDelete************************************************************************
FIELD-SYMBOLS: TYPE matdoc_type
, TYPE acdoca_type
, TYPE ztabl_type
, TYPE ztabl1_type
, TYPE z1m1as025_type
, TYPE ty_matdoc.
***** ************************************************************************
* Constants.
************************************************************************
CONSTANTS: gc_gi_entry TYPE bwart VALUE '561'
, gc_debit TYPE shkzg VALUE 'S'
, gc_client141 TYPE mandt VALUE '141'
, gc_365days TYPE i VALUE 365
, gc_true TYPE flag VALUE 'X'
, gc_yes TYPE flag VALUE 'Y'
, gc_no TYPE flag VALUE 'N'
, gc_101 TYPE bwart VALUE '101'.
* * Selection Screen
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE TEXT-tt1.
SELECT-OPTIONS: s_plnt FOR matdoc-werks OBLIGATORY
, s_mtnr FOR matdoc-matnr
.
SELECTION-SCREEN END OF BLOCK bl1.
FORM authorization_check.
AUTHORITY-CHECK OBJECT 'YS_DATAADM'
ID 'ACTVT' FIELD '16'
ID 'YSAE_APPLC' FIELD 'MM'
ID 'P_GROUP' DUMMY.
ENDFORM. " AUTHORITY_CHECK
START-OF-SELECTION.
* Get active data.
SELECT mblnr
mjahr
zeile
matnr
werks
menge
meins
lifnr
sobkz
umwrk
umlgo
FROM matdoc
INTO TABLE gt_matdoc
WHERE matnr IN s_mtnr
AND werks IN s_plnt.
REFRESH gt_acdoca.
if gt_matdoc[] is NOT INITIAL.
SELECT matnr
budat
INTO TABLE gt_acdoca
FROM acdoca
FOR ALL ENTRIES IN gt_matdoc
WHERE mblnr = gt_matdoc-mblnr
AND mjahr = gt_matdoc-mjahr.
ENDIF.
SORT gt_matdoc.
DELETE ADJACENT DUPLICATES FROM gt_matdoc.
REPORT z_display_po_release.
ReplyDeleteTABLES: ekko, ekpo.
DATA: lt_po TYPE TABLE OF ekpo,
ls_po TYPE ekpo,
lt_alv TYPE TABLE OF ty_alv,
lr_alv TYPE REF TO cl_salv_table,
lt_fieldcat TYPE slis_t_fieldcat_alv,
lv_repid TYPE sy-repid,
lt_release_codes TYPE STANDARD TABLE OF ccm_value,
lt_release_groups TYPE STANDARD TABLE OF ekko-bstyp,
lt_vendors TYPE STANDARD TABLE OF lfa1-lifnr,
lt_plants TYPE STANDARD TABLE OF mkpf-werks.
PARAMETERS: p_release_code TYPE ccm_value OBLIGATORY,
p_release_group TYPE ekko-bstyp,
p_vendor TYPE lfa1-lifnr,
p_supplying_plant TYPE mkpf-werks.
TYPES: BEGIN OF ty_alv,
ebeln TYPE ekko-ebeln, " PO Number
ebelp TYPE ekpo-ebelp, " Item
matnr TYPE ekpo-matnr, " Material Number
menge TYPE ekpo-menge, " Quantity
netpr TYPE ekpo-netpr, " Net Price
price_per_unit TYPE ekpo-netpr, " Price per unit
rel_status TYPE char1, " Release Status
END OF ty_alv.
SELECT ebeln ebelp matnr menge netpr FROM ekpo
INTO TABLE lt_po
WHERE bukrs = 'YOUR_COMPANY_CODE'
AND bsart = 'YOUR_PO_TYPE'
AND loekz = '' " Exclude Deleted POs
AND release_code = p_release_code " Add release code filter
AND ( p_release_group = '' OR bstyp IN p_release_group ) " Add release group filter
AND ( p_vendor = '' OR lifnr IN p_vendor ) " Add vendor filter
AND ( p_supplying_plant = '' OR werks IN p_supplying_plant ). " Add supplying plant filter
LOOP AT lt_po INTO ls_po.
CLEAR lt_alv.
lt_alv-ebeln = ls_po-ebeln.
lt_alv-ebelp = ls_po-ebelp.
lt_alv-matnr = ls_po-matnr.
lt_alv-menge = ls_po-menge.
lt_alv-netpr = ls_po-netpr.
lt_alv-price_per_unit = ls_po-netpr / ls_po-menge. " Calculate price per unit
" Implement your logic to determine release status based on e.g., BAPI or custom checks
" Store release status in lt_alv-rel_status
APPEND lt_alv TO lt_alv.
ENDLOOP.
TRY.
lv_repid = sy-repid.
cl_salv_table=>factory(
EXPORTING
list_display = abap_false
IMPORTING
r_salv_table = lr_alv
CHANGING
t_table = lt_alv
).
" Add the release button to the ALV toolbar
DATA: lr_functions TYPE REF TO cl_salv_functions_list.
lr_functions = lr_alv->get_functions( ).
lr_functions->set_all( abap_false ).
lr_functions->set_function( function = 'RELEASE'
position = 1
icon = icon_execute
text = 'Release' ).
SET HANDLER handle_toolbar FOR lr_alv.
lr_alv->set_screen_status(
pfstatus = 'STANDARD'
report = lv_repid
).
lr_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_salv_msg).
WRITE: / 'Error displaying ALV:', lx_salv_msg->get_text( ).
ENDTRY.
FORM handle_toolbar.
ReplyDeleteDATA: lr_event TYPE REF TO cl_salv_event_table,
lt_selected_cells TYPE cl_salv_event_table=>tt_selected_cells,
lv_ebeln TYPE ekko-ebeln.
FIELD-SYMBOLS: TYPE ty_alv.
lr_event ?= cl_salv_event=>get_event( ).
CASE lr_event->function_id.
WHEN 'RELEASE'.
lt_selected_cells = lr_event->selected_cells.
LOOP AT lt_selected_cells ASSIGNING FIELD-SYMBOL().
ASSIGN COMPONENT 'EBELN' OF STRUCTURE -value TO .
IF IS ASSIGNED.
lv_ebeln = .
PERFORM release_po USING lv_ebeln.
ENDIF.
ENDLOOP.
WHEN 'ME23N'.
lt_selected_cells = lr_event->selected_cells.
LOOP AT lt_selected_cells ASSIGNING FIELD-SYMBOL().
ASSIGN COMPONENT 'EBELN' OF STRUCTURE -value TO .
IF IS ASSIGNED.
lv_ebeln = .
PERFORM jump_to_me23n USING lv_ebeln.
ENDIF.
ENDLOOP.
WHEN 'ME28'.
lt_selected_cells = lr_event->selected_cells.
LOOP AT lt_selected_cells ASSIGNING FIELD-SYMBOL().
ASSIGN COMPONENT 'EBELN' OF STRUCTURE -value TO .
IF IS ASSIGNED.
lv_ebeln = .
PERFORM jump_to_me28 USING lv_ebeln.
ENDIF.
ENDLOOP.
ENDCASE.
ENDFORM.
FORM release_po USING p_ebeln TYPE ekko-ebeln.
DATA: lv_retcode TYPE sy-subrc,
lv_url TYPE string.
" Implement your logic to release the PO using BAPI or custom code
" Store the result in lv_retcode
" Generate the URL for transaction ME23n with the PO number
CONCATENATE '/UI2/FLP?application=ME23N&PO_NUMBER=' p_ebeln INTO lv_url.
" Update the database table with the release status
MODIFY lt_alv TRANSPORTING rel_status WHERE ebeln = p_ebeln.
IF lv_retcode = 0.
MESSAGE 'PO Released successfully' TYPE 'S'.
" Open the URL in a new browser window
CALL FUNCTION 'WEB_BROWSER'
EXPORTING
url = lv_url
EXCEPTIONS
others = 1.
ELSE.
MESSAGE 'Error releasing PO' TYPE 'E'.
ENDIF.
ENDFORM.
FORM jump_to_me23n USING p_ebeln TYPE ekko-ebeln.
DATA: lv_url TYPE string.
" Generate the URL for transaction ME23n with the PO number
CONCATENATE '/sap/bc/gui/sap/its/webgui?~transaction=ME23N&EBELN=' p_ebeln INTO lv_url.
" Open the URL in a new browser window