Friday, June 4, 2010

Sample : ALV Report and Transfer to Excel with Macro defined on excel (make column lines)

Here's a report using simple ALV to display and transfer to Excel.
And it run macro also, to create column lines.
Place your excel template using tcode OAOR

for include program, please refer to this link:
ZGEN_EXCEL
ZAB_ALV
File Excel (contain macro)

This program also contains :
- how to get Material initial stock balance (MB5B) (include backposting - stock in transfer)
- how to get Material end stock balance
- how to get Quantity received or quantity required for MRP (MD04)
- outstanding PO Qty
- display the report using ALV and Excel


REPORT zmm_realisasi NO STANDARD PAGE HEADING LINE-SIZE 237.

TABLES : mara, t001w, makt, mbewh, mardh.
DATA : BEGIN OF t_mara OCCURS 0,
matnr LIKE mara-matnr,
meins LIKE mara-meins,
mtart LIKE mara-mtart,
maktx LIKE makt-maktx,
END OF t_mara,
BEGIN OF t_mbewh OCCURS 0,
matnr LIKE mbewh-matnr,
bwkey LIKE mbewh-bwkey,
lbkum LIKE mbewh-lbkum,
END OF t_mbewh,
BEGIN OF t_t_mbewh OCCURS 0,
matnr LIKE ekpo-matnr,
werks LIKE ekpo-werks,
END OF t_t_mbewh,
BEGIN OF t_mbew OCCURS 0,
matnr LIKE mbew-matnr,
bwkey LIKE mbew-bwkey,
lbkum LIKE mbew-lbkum,
lfgja LIKE mbew-lfgja,
lfmon LIKE mbew-lfmon,
END OF t_mbew,
BEGIN OF t_mardh OCCURS 0,
matnr LIKE mardh-matnr,
werks LIKE mardh-werks,
lgort LIKE mardh-lgort,
umlme LIKE mardh-umlme,
END OF t_mardh,
BEGIN OF t_qtypo OCCURS 0,
bedat LIKE ekko-bedat,
ebeln LIKE ekpo-ebeln,
ebelp LIKE ekpo-ebelp,
matnr LIKE ekpo-matnr,
werks LIKE ekpo-werks,
menge LIKE ekpo-menge,
elikz LIKE ekpo-elikz,
END OF t_qtypo,
BEGIN OF t_qtypo2 OCCURS 0,
matnr LIKE ekpo-matnr,
werks LIKE ekpo-werks,
menge LIKE ekpo-menge,
END OF t_qtypo2,
t_qtypooutst LIKE t_qtypo2 OCCURS 0 WITH HEADER LINE,
BEGIN OF t_io OCCURS 0,
budat LIKE mkpf-budat,
mblnr LIKE mseg-mblnr,
zeile LIKE mseg-zeile,
werks LIKE mseg-werks,
matnr LIKE mseg-matnr,
bwart LIKE mseg-bwart,
shkzg LIKE mseg-shkzg,
menge LIKE mseg-menge,
END OF t_io,
BEGIN OF t_outpo OCCURS 0,
bedat LIKE ekko-bedat,
matnr LIKE ekpo-matnr,
werks LIKE ekpo-werks,
ebeln LIKE ekpo-ebeln,
ebelp LIKE ekpo-ebelp,
belnr LIKE ekbe-belnr,
buzei LIKE ekbe-buzei,
bwart LIKE ekbe-bwart,
menge LIKE ekbe-menge,
END OF t_outpo,
* begin of t_outpo occurs 0,
* bedat like ekko-bedat,
* matnr like ekpo-matnr,
* werks like ekpo-werks,
* ebeln like ekpo-ebeln,
* ebelp like ekpo-ebelp,
* bwart like ekbe-bwart,
* menge like ekbe-menge,
* end of t_outpo,
* ekko~bedat
* ekpo~matnr ekpo~werks
* ekbe~ebeln ekbe~ebelp
* ekbe~bwart ekbe~menge
BEGIN OF t_input2 OCCURS 0,
matnr LIKE mseg-matnr,
werks LIKE mseg-werks,
menge LIKE mseg-menge,
END OF t_input2,
BEGIN OF t_rata2 OCCURS 0,
matnr LIKE mseg-matnr,
werks LIKE mseg-werks,
menge LIKE mseg-menge,
rbagi(1) TYPE p DECIMALS 0,
END OF t_rata2,
t_outpt2 LIKE t_input2 OCCURS 0 WITH HEADER LINE,
t_kumi2 LIKE t_input2 OCCURS 0 WITH HEADER LINE,
t_kumo2 LIKE t_input2 OCCURS 0 WITH HEADER LINE,
t_other LIKE t_input2 OCCURS 0 WITH HEADER LINE,
t_kumot LIKE t_input2 OCCURS 0 WITH HEADER LINE,
t_outstx LIKE t_input2 OCCURS 0 WITH HEADER LINE,
t_stockcur LIKE t_input2 OCCURS 0 WITH HEADER LINE,
t_io2 LIKE t_io OCCURS 0 WITH HEADER LINE,
t_iobck LIKE t_io OCCURS 0 WITH HEADER LINE.

DATA : BEGIN OF t_data OCCURS 0,
matnr LIKE mara-matnr,
maktx LIKE makt-maktx,
meins LIKE mara-meins,
werks LIKE t001w-werks,
awal LIKE mbewh-lbkum,
qtypo LIKE ekpo-menge,
input LIKE mseg-menge,
kumi LIKE mseg-menge,
outst LIKE ekpo-menge,
estpk LIKE ekpo-menge,
outpt LIKE mseg-menge,
kumo LIKE mseg-menge,
pctus LIKE ekpo-zwert,
other LIKE mseg-menge,
kumot LIKE mseg-menge,
akhir LIKE mbew-lbkum,
rata2 LIKE mseg-menge,
tod(8) TYPE p DECIMALS 0, " LIKE ekpo-zwert,

END OF t_data.

DATA : v_year LIKE mbewh-lfgja,
v_lastmo LIKE mbewh-lfmon,
v_tglawal LIKE sy-datum,
v_trata_b LIKE sy-datum,
v_trata_e LIKE sy-datum,
x TYPE i,
v_var(30),
v_bln(2).
DATA: w_msg(50).

INCLUDE zab_alv.
INCLUDE zgen_excel.

**************************************
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME.
SELECT-OPTIONS : s_matnr FOR mara-matnr .
SELECT-OPTIONS : s_werks FOR t001w-werks OBLIGATORY.
PARAMETERS: p_mtart LIKE mara-mtart OBLIGATORY.
PARAMETERS: p_date LIKE sy-datum OBLIGATORY.



SELECTION-SCREEN END OF BLOCK blk1.
SELECTION-SCREEN BEGIN OF BLOCK blc2 WITH FRAME TITLE text-s20.
PARAMETERS : rb_chk1 RADIOBUTTON GROUP a DEFAULT 'X',
rb_chk2 RADIOBUTTON GROUP a.
SELECTION-SCREEN END OF BLOCK blc2.
***************************************
INITIALIZATION.
* ALV init
PERFORM f_alv_init.

AT SELECTION-SCREEN.
PERFORM authority_check CHANGING w_msg.
IF NOT w_msg IS INITIAL.
MESSAGE e398(00) WITH w_msg.
EXIT.
ENDIF.
*--

START-OF-SELECTION.
PERFORM f_getdata.
IF rb_chk1 = 'X'.
PERFORM f_displayalv.
ELSE.
WRITE:/ 'Transfer to excel complete !.'.
WRITE:/ 'Please save excel file before closing this page'.
PERFORM f_to_excel.
ENDIF.

*-----------------------------------------------------------------------
FORM authority_check CHANGING msg.
DATA: BEGIN OF lit_t001w OCCURS 0,
werks LIKE t001w-werks,
END OF lit_t001w.
CLEAR msg.
SELECT werks
FROM t001w
INTO TABLE lit_t001w
WHERE werks IN s_werks.
IF lit_t001w[] IS INITIAL.
w_msg = 'Plant Not Found'.
ELSE.
LOOP AT lit_t001w.
AUTHORITY-CHECK OBJECT 'M_BEST_WRK'
ID 'ACTVT' FIELD '03'
ID 'WERKS' FIELD lit_t001w-werks.
IF sy-subrc <> 0.
CONCATENATE 'Not Authorized to Plant' lit_t001w-werks
INTO w_msg
SEPARATED BY space.
EXIT.
ENDIF.
ENDLOOP. "lit_t001w
ENDIF.
ENDFORM. "authority_check

*&---------------------------------------------------------------------*
*& Form F_GETDATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_getdata.
DATA : v_estimasi_a LIKE mdps-mng01.

SELECT a~matnr a~meins a~mtart b~maktx
INTO CORRESPONDING FIELDS OF TABLE t_mara
FROM mara AS a INNER JOIN makt AS b
ON a~matnr = b~matnr
WHERE a~matnr IN s_matnr
AND a~mtart = p_mtart.


* TGL UTK RATA2 OUTPUT, AMBIL 4 BULAN KEBELAKANG, CURRENT TDK TRMSK.
CALL FUNCTION 'HR_PT_ADD_MONTH_TO_DATE'
EXPORTING
dmm_datin = p_date
dmm_count = '4'
dmm_oper = '-'
dmm_pos = space
IMPORTING
dmm_daout = v_trata_b.
v_trata_b+6(2) = '01'.

CALL FUNCTION 'HR_PT_ADD_MONTH_TO_DATE'
EXPORTING
dmm_datin = p_date
dmm_count = '1'
dmm_oper = '-'
dmm_pos = space
IMPORTING
dmm_daout = v_trata_e.
CALL FUNCTION 'LAST_DAY_OF_MONTHS'
EXPORTING
day_in = v_trata_e
IMPORTING
last_day_of_month = v_trata_e.

v_year = v_trata_e(4).
v_lastmo = v_trata_e+4(2).

v_tglawal = p_date.
v_tglawal+6(2) = '01'.


IF NOT t_mara[] IS INITIAL.
* STOCK AWAL
SELECT * FROM mbewh
INTO CORRESPONDING FIELDS OF TABLE t_mbewh
FOR ALL ENTRIES IN t_mara
WHERE matnr = t_mara-matnr
AND bwkey IN s_werks
AND lfgja = v_year
AND lfmon = v_lastmo.
* stock awal - stock in transfer
SELECT * FROM mardh
INTO CORRESPONDING FIELDS OF TABLE t_mardh
FOR ALL ENTRIES IN t_mara
WHERE matnr = t_mara-matnr
AND werks IN s_werks
AND lfgja = v_year
AND lfmon = v_lastmo
AND umlme > 0.

* STOCK AKHIR
SELECT * FROM mbew
INTO CORRESPONDING FIELDS OF TABLE t_mbew
FOR ALL ENTRIES IN t_mara
WHERE matnr = t_mara-matnr
AND bwkey IN s_werks.
* AND lfgja = p_date(4)
* AND lfmon = p_date+4(2).


* QTY PO
SELECT ekko~bedat
ekpo~ebeln ekpo~ebelp ekpo~werks ekpo~matnr ekpo~menge ekpo~elikz
FROM ekko AS ekko
INNER JOIN ekpo AS ekpo ON ekko~ebeln = ekpo~ebeln
INTO CORRESPONDING FIELDS OF TABLE t_qtypo
FOR ALL ENTRIES IN t_mara
* WHERE ekko~bedat >= v_tglawal AND ekko~bedat <= p_date
WHERE ekko~bedat <= p_date
AND ekpo~werks IN s_werks
AND ekpo~matnr = t_mara-matnr
AND ekpo~loekz NE 'L'.
* COLLECT QTY PO
LOOP AT t_qtypo.
IF t_qtypo-bedat >= v_tglawal.
* qty po kolom F
* COLLECT t_qtypo INTO t_qtypo2.
READ TABLE t_qtypo2 WITH KEY matnr = t_qtypo-matnr.
IF sy-subrc = 0.
t_qtypo2-menge = t_qtypo2-menge + t_qtypo-menge.
MODIFY t_qtypo2 INDEX sy-tabix.
ELSE.
t_qtypo2-matnr = t_qtypo-matnr.
t_qtypo2-menge = t_qtypo-menge.
t_qtypo2-werks = t_qtypo-werks.
APPEND t_qtypo2.
ENDIF.
ENDIF.
* qty all outstanding po per material
IF t_qtypo-elikz NE 'X'.
READ TABLE t_qtypooutst WITH KEY matnr = t_qtypo-matnr.
IF sy-subrc = 0.
t_qtypooutst-menge = t_qtypooutst-menge + t_qtypo-menge.
MODIFY t_qtypooutst INDEX sy-tabix.
ELSE.
t_qtypooutst-matnr = t_qtypo-matnr.
t_qtypooutst-menge = t_qtypo-menge.
t_qtypooutst-werks = t_qtypo-werks.
APPEND t_qtypooutst.
ENDIF.
ENDIF.


ENDLOOP.

* INPUT HARI INI (P_DATE) DAN KUMULATIF (AWAL S/D P_DATE)
* SELECT mkpf~budat mseg~matnr mseg~bwart mseg~menge
* FROM mkpf AS mkpf
* INNER JOIN mseg AS mseg
* ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
* INTO CORRESPONDING FIELDS OF TABLE t_io
* FOR ALL ENTRIES IN t_mara
* WHERE mkpf~budat >= v_tglawal AND mkpf~budat <= p_date
* AND mseg~matnr = t_mara-matnr
* AND mseg~werks IN s_werks
* AND mseg~bwart IN ('101', '102', '261', '262' ).

SELECT mkpf~budat mseg~mblnr mseg~zeile mseg~werks mseg~matnr
mseg~bwart mseg~shkzg mseg~menge
FROM mkpf AS mkpf
INNER JOIN mseg AS mseg
ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
INTO CORRESPONDING FIELDS OF TABLE t_io
FOR ALL ENTRIES IN t_mara
WHERE mkpf~budat >= v_trata_b AND mkpf~budat <= p_date
AND mseg~matnr = t_mara-matnr
AND mseg~werks IN s_werks
AND mseg~xauto EQ space.
* AND mseg~bwart IN ('101', '102', '261', '262' ).

* all outstanding po, utk material2 selected di mbewh
IF NOT t_mbewh[] IS INITIAL.
LOOP AT t_mbewh.
t_t_mbewh-matnr = t_mbewh-matnr.
t_t_mbewh-werks = t_mbewh-bwkey.
APPEND t_t_mbewh.
ENDLOOP.
SELECT ekko~bedat
ekpo~ebeln ekpo~ebelp
ekpo~matnr ekpo~werks
ekbe~belnr ekbe~buzei ekbe~bwart ekbe~menge
FROM ekko AS ekko
INNER JOIN ekpo AS ekpo ON ekko~ebeln = ekpo~ebeln
INNER JOIN ekbe AS ekbe ON ekpo~ebeln = ekbe~ebeln
AND ekpo~ebelp = ekbe~ebelp
INTO CORRESPONDING FIELDS OF TABLE t_outpo
FOR ALL ENTRIES IN t_t_mbewh
WHERE ( ekpo~elikz EQ space AND ekpo~loekz EQ space )
AND ekko~bedat <= p_date
AND ekpo~matnr = t_t_mbewh-matnr
AND ekpo~werks = t_t_mbewh-werks
AND ekbe~budat <= p_date.


* calculate var pengurang total qty all po outst per mat
LOOP AT t_outpo.
IF t_outpo-bwart = '101' OR t_outpo-bwart = '123'.
READ TABLE t_outstx WITH KEY matnr = t_outpo-matnr
werks = t_outpo-werks.
IF sy-subrc = 0.
t_outstx-menge = t_outstx-menge + t_outpo-menge.
MODIFY t_outstx INDEX sy-tabix.
ELSE.
t_outstx-matnr = t_outpo-matnr.
t_outstx-menge = t_outpo-menge.
t_outstx-werks = t_outpo-werks.
APPEND t_outstx.
ENDIF.
ELSEIF t_outpo-bwart = '102' OR t_outpo-bwart = '122'.
READ TABLE t_outstx WITH KEY matnr = t_outpo-matnr
werks = t_outpo-werks.
IF sy-subrc = 0.
t_outstx-menge = t_outstx-menge - t_outpo-menge.
MODIFY t_outstx INDEX sy-tabix.
ELSE.
t_outstx-matnr = t_outpo-matnr.
t_outstx-menge = t_outpo-menge * - 1.
t_outstx-werks = t_outpo-werks.
APPEND t_outstx.
ENDIF.

ENDIF.
ENDLOOP.
ENDIF.
DATA : v_tglx LIKE sy-datum,
var_menge LIKE mseg-menge.
SORT t_io BY budat werks mblnr matnr.
LOOP AT t_io.
*---
IF t_io-budat = p_date.
* I/O HARI INI
IF t_io-bwart = '101'.
READ TABLE t_input2 WITH KEY matnr = t_io-matnr
werks = t_io-werks.
IF sy-subrc = 0.
t_input2-menge = t_input2-menge + t_io-menge.
MODIFY t_input2 INDEX sy-tabix.
ELSE.
t_input2-matnr = t_io-matnr.
t_input2-menge = t_io-menge.
t_input2-werks = t_io-werks.
APPEND t_input2.
ENDIF.
ELSEIF t_io-bwart = '102'.
READ TABLE t_input2 WITH KEY matnr = t_io-matnr
werks = t_io-werks.
IF sy-subrc = 0.
t_input2-menge = t_input2-menge - t_io-menge.
MODIFY t_input2 INDEX sy-tabix.
ELSE.
t_input2-matnr = t_io-matnr.
t_input2-menge = t_io-menge * -1.
t_input2-werks = t_io-werks.
APPEND t_input2.
ENDIF.
ELSEIF t_io-bwart = '261'.
READ TABLE t_outpt2 WITH KEY matnr = t_io-matnr
werks = t_io-werks.
IF sy-subrc = 0.
t_outpt2-menge = t_outpt2-menge + t_io-menge.
MODIFY t_outpt2 INDEX sy-tabix.
ELSE.
t_outpt2-matnr = t_io-matnr.
t_outpt2-menge = t_io-menge.
t_outpt2-werks = t_io-werks.
APPEND t_outpt2.
ENDIF.
ELSEIF t_io-bwart = '262'.
READ TABLE t_outpt2 WITH KEY matnr = t_io-matnr
werks = t_io-werks.
IF sy-subrc = 0.
t_outpt2-menge = t_outpt2-menge - t_io-menge.
MODIFY t_outpt2 INDEX sy-tabix.
ELSE.
t_outpt2-matnr = t_io-matnr.
t_outpt2-menge = t_io-menge * -1.
t_outpt2-werks = t_io-werks.
APPEND t_outpt2.
ENDIF.
ELSE.
*---
* OTHERS - H = MINUS
IF t_io-shkzg = 'H'. t_io-menge = t_io-menge * -1. ENDIF.
READ TABLE t_other WITH KEY matnr = t_io-matnr
werks = t_io-werks.
IF sy-subrc = 0.
t_other-menge = t_other-menge + t_io-menge.
MODIFY t_other INDEX sy-tabix.
ELSE.
t_other-matnr = t_io-matnr.
t_other-menge = t_io-menge.
t_other-werks = t_io-werks.
APPEND t_other.
ENDIF.
* balikin lagi qty nya
IF t_io-shkzg = 'H'.
t_io-menge = t_io-menge * -1.
ENDIF.
ENDIF.
ENDIF.
*---
* I/O KUM DAN OTHER KUM
IF t_io-budat >= v_tglawal AND t_io-budat <= p_date.
IF t_io-bwart = '101'.
READ TABLE t_kumi2 WITH KEY matnr = t_io-matnr
werks = t_io-werks.
IF sy-subrc = 0.
t_kumi2-menge = t_kumi2-menge + t_io-menge.
MODIFY t_kumi2 INDEX sy-tabix.
ELSE.
t_kumi2-matnr = t_io-matnr.
t_kumi2-menge = t_io-menge.
t_kumi2-werks = t_io-werks.
APPEND t_kumi2.
ENDIF.
ELSEIF t_io-bwart = '102'.
READ TABLE t_kumi2 WITH KEY matnr = t_io-matnr
werks = t_io-werks.
IF sy-subrc = 0.
t_kumi2-menge = t_kumi2-menge - t_io-menge.
MODIFY t_kumi2 INDEX sy-tabix.
ELSE.
t_kumi2-matnr = t_io-matnr.
t_kumi2-menge = t_io-menge * -1.
t_kumi2-werks = t_io-werks.
APPEND t_kumi2.
ENDIF.
ELSEIF t_io-bwart = '261'.
READ TABLE t_kumo2 WITH KEY matnr = t_io-matnr
werks = t_io-werks.
IF sy-subrc = 0.
t_kumo2-menge = t_kumo2-menge + t_io-menge.
MODIFY t_kumo2 INDEX sy-tabix.
ELSE.
t_kumo2-matnr = t_io-matnr.
t_kumo2-menge = t_io-menge.
t_kumo2-werks = t_io-werks.
APPEND t_kumo2.
ENDIF.
ELSEIF t_io-bwart = '262'.
READ TABLE t_kumo2 WITH KEY matnr = t_io-matnr
werks = t_io-werks.
IF sy-subrc = 0.
t_kumo2-menge = t_kumo2-menge - t_io-menge.
MODIFY t_kumo2 INDEX sy-tabix.
ELSE.
t_kumo2-matnr = t_io-matnr.
t_kumo2-menge = t_io-menge * -1.
t_kumo2-werks = t_io-werks.
APPEND t_kumo2.
ENDIF.
ELSE.
*---
* KUMULATIF OTHERS - H = MINUS
IF t_io-shkzg = 'H'. t_io-menge = t_io-menge * -1. ENDIF.
READ TABLE t_kumot WITH KEY matnr = t_io-matnr
werks = t_io-werks.
IF sy-subrc = 0.
t_kumot-menge = t_kumot-menge + t_io-menge.
MODIFY t_kumot INDEX sy-tabix.
ELSE.
t_kumot-matnr = t_io-matnr.
t_kumot-menge = t_io-menge.
t_kumot-werks = t_io-werks.
APPEND t_kumot.
ENDIF.
* balikin lagi qty nya
IF t_io-shkzg = 'H'. t_io-menge = t_io-menge * -1. ENDIF.


ENDIF.
*---
* hitung stock current di mseg, S = MINUS
IF t_io-shkzg = 'S'. t_io-menge = t_io-menge * -1. ENDIF.
READ TABLE t_stockcur WITH KEY matnr = t_io-matnr
werks = t_io-werks.
IF sy-subrc = 0.
t_stockcur-menge = t_stockcur-menge - t_io-menge.
MODIFY t_stockcur INDEX sy-tabix.
ELSE.
t_stockcur-matnr = t_io-matnr.
t_stockcur-menge = t_io-menge * -1.
t_stockcur-werks = t_io-werks.
APPEND t_stockcur.
ENDIF.
* balikin lagi qty nya
IF t_io-shkzg = 'S'. t_io-menge = t_io-menge * -1. ENDIF.

ENDIF.
*---
* RATA2 OUTPUT
IF t_io-budat >= v_trata_b
AND t_io-budat <= v_trata_e
AND ( t_io-bwart = '261' OR t_io-bwart = '262' ) .
IF t_io-bwart = '261'.
READ TABLE t_rata2 WITH KEY matnr = t_io-matnr
werks = t_io-werks.
IF sy-subrc = 0.
IF v_bln = t_io-budat+4(2).
ELSE.
t_rata2-rbagi = t_rata2-rbagi + 1.
v_bln = t_io-budat+4(2).
ENDIF.
t_rata2-menge = t_rata2-menge + t_io-menge.
MODIFY t_rata2 INDEX sy-tabix.
ELSE.
t_rata2-matnr = t_io-matnr.
t_rata2-menge = t_io-menge.
t_rata2-werks = t_io-werks.
t_rata2-rbagi = 1.
v_bln = t_io-budat+4(2).
APPEND t_rata2.
ENDIF.
ELSEIF t_io-bwart = '262'.
READ TABLE t_rata2 WITH KEY matnr = t_io-matnr
werks = t_io-werks.
IF sy-subrc = 0.
IF v_bln = t_io-budat+4(2).
ELSE.
t_rata2-rbagi = t_rata2-rbagi + 1.
v_bln = t_io-budat+4(2).
ENDIF.
t_rata2-menge = t_rata2-menge - t_io-menge.
MODIFY t_rata2 INDEX sy-tabix.
ELSE.
t_rata2-matnr = t_io-matnr.
t_rata2-menge = t_io-menge * -1.
t_rata2-werks = t_io-werks.
t_rata2-rbagi = 1.
v_bln = t_io-budat+4(2).
APPEND t_rata2.
ENDIF.

ENDIF.
* count jumlah bulan utk variable pembagi rata2
* if v_bln = t_io-budat+4(2).
*
* else.
* v_monthr = v_monthr + 1.
* v_bln = t_io-budat+4(2).
* endif.

ENDIF.
ENDLOOP.


ENDIF.


* COMBINE ALL DATA INTO 1 TABLE.
SORT t_mara BY matnr.
SORT t_mbewh BY matnr bwkey.
SORT t_mbew BY matnr bwkey.
SORT t_qtypo BY matnr werks.
SORT t_input2 BY matnr werks.
SORT t_outpt2 BY matnr werks.
SORT t_kumi2 BY matnr werks.
SORT t_kumo2 BY matnr werks.
SORT t_rata2 BY matnr werks.
SORT t_other BY matnr werks.
SORT t_kumot BY matnr werks.
* HEADER EXCEL
CONCATENATE 'Tgl. ' p_date+6(2) '-' p_date+4(2) '-' p_date(4)
INTO v_var SEPARATED BY space.
PERFORM modify_to_cell USING 9 2 v_var.

x = 7.
LOOP AT t_mbewh.
CLEAR t_data.
v_estimasi_a = 0.
* MATERIAL DATA
t_data-matnr = t_mbewh-matnr.
READ TABLE t_mara WITH KEY matnr = t_mbewh-matnr.
t_data-maktx = t_mara-maktx.
t_data-meins = t_mara-meins.
t_data-werks = t_mbewh-bwkey.

* STOCK AWAL
t_data-awal = t_mbewh-lbkum.
var_menge = 0.
* stock awal v.4 - ditambahkan dengan transaksi back-posting.
SELECT mkpf~budat mseg~mblnr mseg~zeile mseg~werks mseg~matnr
mseg~bwart mseg~shkzg mseg~menge
FROM mkpf AS mkpf
INNER JOIN mseg AS mseg
ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
INTO CORRESPONDING FIELDS OF TABLE t_iobck
WHERE mkpf~budat <= v_trata_e AND mkpf~bldat > v_trata_e
AND mseg~matnr = t_data-matnr
AND mseg~werks = t_data-werks.
IF NOT t_iobck[] IS INITIAL.
LOOP AT t_iobck.
IF t_iobck-bwart EQ '321' OR t_iobck-bwart EQ '322' OR
t_iobck-bwart EQ '343' OR t_iobck-bwart EQ '344' OR
t_iobck-bwart EQ '349' OR t_iobck-bwart EQ '350' .
ELSE.
IF t_iobck-shkzg = 'H'.
t_iobck-menge = t_iobck-menge * -1.
ENDIF.
var_menge = var_menge + t_iobck-menge.
ENDIF.
ENDLOOP.
t_data-awal = t_data-awal + var_menge.
ENDIF.
* stock awal v.4 - dikurangi dengan stock in transfer
LOOP AT t_mardh WHERE matnr = t_data-matnr AND werks = t_data-werks.
t_data-awal = t_data-awal - t_mardh-umlme.
ENDLOOP.


* QTY PO
READ TABLE t_qtypo2 WITH KEY matnr = t_mbewh-matnr
werks = t_mbewh-bwkey.
IF sy-subrc = 0.
t_data-qtypo = t_qtypo2-menge.
ENDIF.
* INPUT HARI INI
READ TABLE t_input2 WITH KEY matnr = t_mbewh-matnr
werks = t_mbewh-bwkey.
IF sy-subrc = 0.
t_data-input = t_input2-menge.
ENDIF.
* KUM INPUT
READ TABLE t_kumi2 WITH KEY matnr = t_mbewh-matnr
werks = t_mbewh-bwkey.
IF sy-subrc = 0.
t_data-kumi = t_kumi2-menge.
ENDIF.

* OUTSTANDING PO QTY, ALL PO QTY DARI SEJAK LIVE - EKBE(BWART 101,102,
*123,122)
t_data-outst = 0.
READ TABLE t_qtypooutst WITH KEY matnr = t_mbewh-matnr
werks = t_mbewh-bwkey.
IF sy-subrc = 0.
READ TABLE t_outstx WITH KEY matnr = t_mbewh-matnr
werks = t_mbewh-bwkey.
IF sy-subrc = 0.
t_data-outst = t_qtypooutst-menge - t_outstx-menge.
ELSE.
t_data-outst = t_qtypooutst-menge.
ENDIF.
ENDIF.


* OUTPUT HARI INI
READ TABLE t_outpt2 WITH KEY matnr = t_mbewh-matnr
werks = t_mbewh-bwkey.
IF sy-subrc = 0.
t_data-outpt = t_outpt2-menge.
ENDIF.
* KUM OUTPUT
READ TABLE t_kumo2 WITH KEY matnr = t_mbewh-matnr
werks = t_mbewh-bwkey.
IF sy-subrc = 0.
t_data-kumo = t_kumo2-menge.
ENDIF.


* ESTIMASI PAKAI
PERFORM f_get_md01 USING v_tglawal t_mbewh-matnr t_mbewh-bwkey
CHANGING v_estimasi_a.
t_data-estpk = v_estimasi_a + t_data-kumo.


* PERSEN USAGE
IF t_data-estpk = 0.
t_data-pctus = 0.
ELSE.
t_data-pctus = ( t_data-kumo / t_data-estpk ) * 100.
ENDIF.

* OTHERS
READ TABLE t_other WITH KEY matnr = t_mbewh-matnr
werks = t_mbewh-bwkey.
IF sy-subrc = 0.
t_data-other = t_other-menge.
ENDIF.

* KUM OTHER
READ TABLE t_kumot WITH KEY matnr = t_mbewh-matnr
werks = t_mbewh-bwkey.
IF sy-subrc = 0.
t_data-kumot = t_kumot-menge.
ENDIF.

** STOCK AKHIR, v.2
t_data-akhir = 0.
IF p_date = sy-datum.
* kalau hari ini, brati ambil dari mbew lfgja dan lfmon = now.
READ TABLE t_mbew WITH KEY matnr = t_mbewh-matnr
bwkey = t_mbewh-bwkey
lfgja = sy-datum(4)
lfmon = sy-datum+4(2).
IF sy-subrc = 0 AND t_mbew-lbkum > 0.
t_data-akhir = t_mbew-lbkum.
ENDIF.
ENDIF.
IF t_data-akhir = 0.
* stock awal + transaksi (stock cur)
READ TABLE t_stockcur WITH KEY matnr = t_data-matnr
werks = t_data-werks.
IF sy-subrc = 0.
t_data-akhir = t_data-awal + t_stockcur-menge.
ELSE.
t_data-akhir = t_data-awal .
ENDIF.

ENDIF.
* kalau masih 0 juga, pake cara trakhir.
IF t_data-akhir = 0.
DATA : temp_mbewh LIKE mbewh OCCURS 0 WITH HEADER LINE,
v_mbewh(6), var_ok(1).
* CARI DATA DARI T_MBEWH TRAKHIR YG LBKUM > 0.
SELECT * FROM mbewh
INTO CORRESPONDING FIELDS OF TABLE temp_mbewh
* FOR ALL ENTRIES IN t_mara
WHERE matnr = t_mbewh-matnr
AND bwkey = t_mbewh-bwkey
AND lbkum > 0 ORDER BY lfgja DESCENDING lfmon DESCENDING.
* ditambah dgn transaksi dari awal bulan selanjutnya - tgl yg diinput
CLEAR : var_ok.
LOOP AT temp_mbewh.
CONCATENATE temp_mbewh-lfgja temp_mbewh-lfmon INTO v_mbewh.
var_ok = 'N'.
IF v_mbewh < p_date(6).
var_ok = 'Y'.
EXIT.
ENDIF.
ENDLOOP.
IF var_ok NE 'Y'.
CLEAR temp_mbewh.
t_data-akhir = 0.
ELSE.
v_tglx = '00000000'.
* ambil transaksi dari awal bulan temp_mbewh-lfmon + 1 smp p_date
CONCATENATE temp_mbewh-lfgja temp_mbewh-lfmon '01' INTO v_tglx.

var_menge = 0.
CLEAR t_io2.
REFRESH t_io2.
CALL FUNCTION 'HR_PT_ADD_MONTH_TO_DATE'
EXPORTING
dmm_datin = v_tglx
dmm_count = '1'
dmm_oper = '+'
dmm_pos = space
IMPORTING
dmm_daout = v_tglx.

SELECT mkpf~budat mseg~mblnr mseg~zeile mseg~werks mseg~matnr
mseg~bwart mseg~shkzg mseg~menge
FROM mkpf AS mkpf
INNER JOIN mseg AS mseg
ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
INTO CORRESPONDING FIELDS OF TABLE t_io2
WHERE mkpf~budat >= v_tglx AND mkpf~budat <= p_date
AND mseg~matnr = t_data-matnr
AND mseg~werks = t_data-werks.
LOOP AT t_io2.
IF t_io2-bwart EQ '321' OR t_io2-bwart EQ '322' OR
t_io2-bwart EQ '343' OR t_io2-bwart EQ '344' OR
t_io2-bwart EQ '349' OR t_io2-bwart EQ '350' .
ELSE.
IF t_io2-shkzg = 'H'. t_io2-menge = t_io2-menge * -1. ENDIF.
var_menge = var_menge + t_io2-menge.
ENDIF.
ENDLOOP.
t_data-akhir = temp_mbewh-lbkum + var_menge.
ENDIF.
ENDIF.
* RATA2 OUTPUT
READ TABLE t_rata2 WITH KEY matnr = t_mbewh-matnr
werks = t_mbewh-bwkey.
IF sy-subrc = 0.
t_data-rata2 = t_rata2-menge / t_rata2-rbagi.
ENDIF.

* T O D
IF t_data-akhir = 0 OR t_data-rata2 = 0.
t_data-tod = 0.
ELSE.
t_data-tod = t_data-akhir / ( t_data-rata2 / 25 ) .
ENDIF.

* filter yg 0 ga usah di add.
IF t_data-awal = 0
AND t_data-qtypo = 0
AND t_data-input = 0
AND t_data-kumi = 0
AND t_data-outst = 0
AND t_data-estpk = 0
AND t_data-kumo = 0
AND t_data-pctus = 0
AND t_data-other = 0
AND t_data-kumot = 0
AND t_data-akhir = 0
AND t_data-rata2 = 0
AND t_data-tod = 0.
ELSE.
APPEND t_data.


* PREPARE EXCEL
PERFORM modify_to_cell USING 1 x t_data-matnr.
PERFORM modify_to_cell USING 2 x t_data-maktx.
PERFORM modify_to_cell USING 3 x t_data-meins.
PERFORM modify_to_cell USING 4 x t_data-werks.
PERFORM append_to_cell USING 'C' 5 x t_data-awal.
PERFORM append_to_cell USING 'C' 6 x t_data-qtypo.
PERFORM append_to_cell USING 'C' 7 x t_data-input.
PERFORM append_to_cell USING 'C' 8 x t_data-kumi.
PERFORM append_to_cell USING 'C' 9 x t_data-outst.
PERFORM append_to_cell USING 'C' 10 x t_data-estpk.
PERFORM append_to_cell USING 'C' 11 x t_data-outpt.
PERFORM append_to_cell USING 'C' 12 x t_data-kumo.
PERFORM append_to_cell USING 'C' 13 x t_data-pctus.
PERFORM append_to_cell USING 'C' 14 x t_data-other.
PERFORM append_to_cell USING 'C' 15 x t_data-kumot.
PERFORM append_to_cell USING 'C' 16 x t_data-akhir.
PERFORM append_to_cell USING 'C' 17 x t_data-rata2.
PERFORM append_to_cell USING 'C' 18 x t_data-tod.

x = x + 1.
ENDIF.



ENDLOOP.

x = x - 7.
PERFORM modify_to_cell USING 1 1 x.


ENDFORM. " F_GETDATA





*&---------------------------------------------------------------------*
*& Form f_get_md01
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_V_TGLAWAL text
* -->P_V_MATNR text
* -->P_V_WERKS text
* <--P_V_ESTIMASI_A text
*----------------------------------------------------------------------*
FORM f_get_md01 USING p_v_tglawal
p_v_matnr
p_v_werks
CHANGING p_v_estimasi_a.

TYPES:
BEGIN OF m61x_mdlg_r,
sign(1),
option(2),
low LIKE mdlg-lgort,
high LIKE mdlg-lgort,
END OF m61x_mdlg_r.

TYPES:
BEGIN OF m61x_mdll_r,
sign(1),
option(2),
low LIKE mdll-lbear,
high LIKE mdll-lbear,
END OF m61x_mdll_r.

TYPES:
m61x_mdlg_range TYPE m61x_mdlg_r OCCURS 0,
m61x_mdll_range TYPE m61x_mdll_r OCCURS 0.
DATA: BEGIN OF v_cm61b,
disfg LIKE t000md-disfg,
dbxxx TYPE c,
berid LIKE mdlv-berid,
berty LIKE mdlv-berty,
bertx LIKE mdlv-bertx,
werzg LIKE mdlv-werzg,
ortzg LIKE mdlv-ortzg,
lbear LIKE mdll-lbear,
mdlgx_range TYPE m61x_mdlg_range, " OCCURS 0,
mdlgy_range TYPE m61x_mdlg_range, " OCCURS 0,
mdlly_range TYPE m61x_mdll_range,
sobsl LIKE mdma-sobsl,
disgr LIKE mdma-disgr,
END OF v_cm61b.

DATA v_mt61d LIKE mt61d.
DATA v_cm61x LIKE cm61x.
DATA v_cm61w LIKE cm61w.
DATA v_t399d LIKE t399d.
DATA v_mdkp LIKE mdkp .
DATA v_cm61m LIKE cm61m .

*MRP table used in MD04
DATA i_mdpsx LIKE mdps OCCURS 0 WITH HEADER LINE.

DATA :
p_v_tglakhir LIKE sy-datum.
*get akhir bulan

CALL FUNCTION 'LAST_DAY_OF_MONTHS'
EXPORTING
day_in = p_v_tglawal
IMPORTING
last_day_of_month = p_v_tglakhir.


CALL FUNCTION 'MD_READ_MATERIAL'
EXPORTING
ewerks = p_v_werks
ematnr = p_v_matnr
IMPORTING
imt61d = v_mt61d
icm61b = v_cm61b
EXCEPTIONS
error = 1
OTHERS = 2.
*if no record found, write out error
IF sy-subrc <> 0.
* MESSAGE e000(vz) WITH 'MD_READ_MATERIAL failed on' v_matnr v_werks.
ENDIF.

CALL FUNCTION 'MD_READ_PLANT'
EXPORTING
ewerks = p_v_werks
IMPORTING
icm61w = v_cm61w
it399d = v_t399d
EXCEPTIONS
error = 01.

*CONSTRUCT MDPSX ANNOUNCEMENTS
CALL FUNCTION 'AUFBAUEN_MDPSX_ANZEIGEN'
EXPORTING
ecm61w = v_cm61w
ecm61x = v_cm61x
emt61d = v_mt61d
et399d = v_t399d
ecm61b = v_cm61b
IMPORTING
icm61m = v_cm61m
imdkp = v_mdkp
TABLES
mdpsx = i_mdpsx.

*if no record, write out error
IF sy-subrc <> 0.
* MESSAGE e000(vz) WITH 'MD04 read failed' v_matnr v_werks.
ELSE .
CALL FUNCTION 'PRUEFEN_UMTERMINIERUNG'
EXPORTING
ecm61m = v_cm61m
ecm61w = v_cm61w
emdkp = v_mdkp
et399d = v_t399d
TABLES
mdpsx = i_mdpsx.
LOOP AT i_mdpsx.
IF i_mdpsx-dat00 >= p_v_tglawal AND i_mdpsx-dat00 <= p_v_tglakhir
AND i_mdpsx-plumi = '-'.
* IF i_mdpsx-plumi = '+'.
* i_mdpsx-mng01 = i_mdpsx-mng01 * -1.
* ENDIF.
p_v_estimasi_a = p_v_estimasi_a + i_mdpsx-mng01.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM. " f_get_md01
*&---------------------------------------------------------------------*
*& Form f_displayalv
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_displayalv.
* ALV Layout
PERFORM f_alv_build_layout USING :
'ZEBRA' 'X',
'NO_COLHEAD' '',
'GROUP_CHANGE_EDIT' 'X',
'F2CODE' 'F2'.
* Sort Field
* perform f_alv_sort using:
* 'T_DATA' 'ERDAT' 'X' '' ''.
* print setup
PERFORM f_build_print USING d_alv_print.
PERFORM f_create_header.
PERFORM f_alv_build_event USING:
slis_ev_top_of_page 'F_TOP_OF_PAGE', "c_top_of_page_alv,
slis_ev_user_command c_user_command.

* ALV Fieldcat
PERFORM f_build_fieldcat.
* Execute ALV Function
d_alv_varnt-variant = p_vari.
* PERFORM f_alv_grid_display TABLES t_data.
* clear t_header.
* PERFORM f_top_of_page_alv.
PERFORM f_alv_grid_display TABLES t_data.
** using '' d_alv_save.
* perform f_alv_list_display tables t_data
* using '' d_alv_save.

ENDFORM. " f_displayalv
*&---------------------------------------------------------------------*
*& Form f_build_fieldcat
*&---------------------------------------------------------------------*
* Build Fieldcat ALV
*----------------------------------------------------------------------*
FORM f_build_fieldcat .
PERFORM f_alv_build_catalog USING :
t_alv_fctlg 'T_DATA' 'MATNR' 'Material' '' ''
'' '10' '' 'X' '' '1' '1' '' '' '',
t_alv_fctlg 'T_DATA' 'MAKTX' 'Material Desc' '' ''
'' '30' '' 'X' '' '1' '2' '' '' '',
t_alv_fctlg 'T_DATA' 'MEINS' 'BaseUnit' '' ''
'' '8' '' 'X' '' '1' '3' '' '' '',
t_alv_fctlg 'T_DATA' 'WERKS' 'Plant' '' ''
'' '6' '' 'X' '' '1' '4' '' '' ''.

PERFORM f_alv_build_catalog_qty USING:
t_alv_fctlg 'T_DATA' 'AWAL' 'Stock Awal'
'MBEWH' 'LBKUM' '' '16' '' '' '' 'MEINS' '' '1' '5',
t_alv_fctlg 'T_DATA' 'QTYPO' 'QTY Po'
'EKPO' 'MENGE' '' '16' '' '' '' 'MEINS' '' '1' '6',
t_alv_fctlg 'T_DATA' 'INPUT' 'Input - HariIni'
'MSEG' 'MENGE' '' '16' '' '' '' 'MEINS' '' '1' '7',
t_alv_fctlg 'T_DATA' 'KUMI' 'Input - Kumulatif'
'MSEG' 'MENGE' '' '16' '' '' '' 'MEINS' '' '1' '8',
t_alv_fctlg 'T_DATA' 'OUTST' 'Outstanding PO'
'EKPO' 'MENGE' '' '16' '' '' '' 'MEINS' '' '1' '9',
t_alv_fctlg 'T_DATA' 'ESTPK' 'Estimasi Pakai'
'EKPO' 'MENGE' '' '16' '' '' '' 'MEINS' '' '1' '10',
t_alv_fctlg 'T_DATA' 'OUTPT' 'Output - HariIni'
'MSEG' 'MENGE' '' '16' '' '' '' 'MEINS' '' '1' '11',
t_alv_fctlg 'T_DATA' 'KUMO' 'Output - Kumulatif'
'MSEG' 'MENGE' '' '16' '' '' '' 'MEINS' '' '1' '12'.

PERFORM f_alv_build_catalog_crncy USING:
t_alv_fctlg 'T_DATA' 'PCTUS' '% Usage'
'EKPO' 'ZWERT' '16' '' '' 'WAERS' '' '' '1' '13' ''.

PERFORM f_alv_build_catalog_qty USING:
t_alv_fctlg 'T_DATA' 'OTHER' 'Other - Hari ini'
'EKPO' 'MENGE' '' '16' '' '' '' 'MEINS' '' '1' '14',
t_alv_fctlg 'T_DATA' 'KUMOT' 'Other - Kumulatif'
'MSEG' 'MENGE' '' '16' '' '' '' 'MEINS' '' '1' '15',
t_alv_fctlg 'T_DATA' 'AKHIR' 'Stock Akhir'
'MBEW' 'LBKUM' '' '16' '' '' '' 'MEINS' '' '1' '16',
t_alv_fctlg 'T_DATA' 'RATA2' 'Rata-rata Output'
'MSEG' 'MENGE' '' '16' '' '' '' 'MEINS' '' '1' '17'.

PERFORM f_alv_build_catalog_qty USING:
t_alv_fctlg 'T_DATA' 'TOD' 'T O D'
'EKPO' 'UMREZ' '' '16' '' '' '' 'MEINS' '' '1' '18'.

* perform f_alv_build_catalog_crncy using:
* t_alv_fctlg 'T_DATA' 'TOD' 'T O D'
* 'EKPO' 'UMREZ' '16' '' '' 'WAERS' '' '' '1' '17' ''.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_to_excel
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_to_excel.
CALL SCREEN 8999.
ENDFORM. " f_to_excel
*&---------------------------------------------------------------------*
*& Module STATUS_8999 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_8999 OUTPUT.
SET PF-STATUS '8999'.
SET TITLEBAR '8999'.

ENDMODULE. " STATUS_8999 OUTPUT
*&---------------------------------------------------------------------*
*& Module m_init OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE m_init OUTPUT.
DATA : w_para TYPE i.
PERFORM connect_to_excel USING '' "Excel in SAP
'ZMM' "Object Name
'ZMM' "Object ID
'TEMP_ZMM_REALISASI' "Descr
'' "Status Logo
''. "Logo
PERFORM select_new_sheet USING 'Sheet1'.
PERFORM formatting_rangesdef_tab.
PERFORM set_data.

*--
PERFORM run_macro_param USING 'kotak_ok'
w_para 'Sheet1'
'' '' '' '' '' '' '' '' '' '' ''.

PERFORM close_excel_link.
LEAVE TO SCREEN 0.
ENDMODULE. " m_init OUTPUT

*&---------------------------------------------------------------------*
*& Form f_create_header
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_create_header.
DATA: l_wa_listheader TYPE slis_listheader,
lv_date1(10),
lv_date2(10).

l_wa_listheader-typ = 'H'.
l_wa_listheader-key = 'LAPORAN REALISASI HARIAN'.
l_wa_listheader-info = 'LAPORAN REALISASI HARIAN'.
APPEND l_wa_listheader TO t_header.

l_wa_listheader-typ = 'A'.
l_wa_listheader-key = 'LAPORAN REALISASI HARIAN'.
CONCATENATE p_date+6(2) p_date+4(2) p_date(4) INTO
l_wa_listheader-info
SEPARATED BY '/'.
CONCATENATE 'Tgl. :' l_wa_listheader-info INTO
l_wa_listheader-info SEPARATED BY space.
APPEND l_wa_listheader TO t_header.
ENDFORM. " f_create_header

*---------------------------------------------------------------------*
* FORM F_TOP_OF_PAGE *
*---------------------------------------------------------------------*
* TOP-OF-PAGE *
*---------------------------------------------------------------------*
FORM f_top_of_page.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = t_header.
ENDFORM. "F_TOP_OF_PAGE
*---------------------------------------------------------------------*
* FORM append_to_cell *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> P_CT *
* --> P_COLS *
* --> P_ROWS *
* --> P_VALUE *
*---------------------------------------------------------------------*
FORM append_to_cell USING p_ct p_cols p_rows
CHANGING p_value.
DATA : lv_value(18).
lv_value = p_value.
IF p_ct = 'C'.
PERFORM f_format_xx USING p_value CHANGING lv_value.
ENDIF.
struc_generic-column = p_cols.
struc_generic-row = p_rows.
struc_generic-value = lv_value.
APPEND struc_generic TO tcontents.
ENDFORM. " append_to_cell
*---------------------------------------------------------------------*
* FORM f_format_xx *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> FV_AMO *
* --> FV_AMOUNT *
*---------------------------------------------------------------------*
FORM f_format_xx USING fv_amo CHANGING fv_amount TYPE format_amount.
DATA : p_val TYPE p DECIMALS 2,
y TYPE i, x TYPE i.
p_val = fv_amo.
IF p_val < 0.
p_val = p_val * -1.
WRITE p_val TO fv_amount CURRENCY 'USD'.
CONCATENATE '-' fv_amount INTO fv_amount.
ELSE.
WRITE p_val TO fv_amount CURRENCY 'USD'.
ENDIF.
CONDENSE fv_amount NO-GAPS.
ENDFORM. " f_format_xx

No comments: