Posted: Sat Oct 27, 2007 4:02 pm Post subject: Show the exchange rate for a given range of 7 years
Code:
*==================================================================
* Program Name : ZFR_FOREX_REV_ACCTG
* Author : Aris Hidalgo
* Date Created : August 3, 2006
* Description : Show the exchange rate for a given range of 7 years
*==================================================================
REPORT zfr_forex_rev_acctg
NO STANDARD PAGE HEADING
LINE-SIZE 500
LINE-COUNT 0
MESSAGE-ID zz.
*---------------------------------------------*
* Global Structure/s *
*---------------------------------------------*
TYPES: BEGIN OF t_bsis_bsas,
hkont TYPE bsis-hkont, "General ledger account
year_dum TYPE bsis-gjahr,
belnr TYPE bsis-belnr, "Accounting document number
bldat TYPE bsis-bldat, "Document date in document
waers TYPE bsis-waers, "Currency Key
dmbtr TYPE bsis-dmbtr, "Amount in local currency
wrbtr TYPE bsis-wrbtr, "Amount in document currency
shkzg TYPE bsis-shkzg, "Debit/credit indicator
zuonr TYPE bsis-zuonr, "Assignment number
gjahr TYPE bsis-gjahr, "Fiscal year
blart TYPE bsis-blart, "Document type
END OF t_bsis_bsas.
TYPES: BEGIN OF t_summary,
hkont TYPE bsis-hkont,
year_dum TYPE bsis-gjahr,
waers TYPE bsis-waers,
rate TYPE tcurr-ukurs,
wrbtr TYPE bsis-wrbtr,
dmbtr TYPE bsis-dmbtr,
gl_bal TYPE bsis-wrbtr,
unrealized TYPE bsis-wrbtr,
END OF t_summary.
TYPES: BEGIN OF t_exch,
year TYPE bsis-gjahr,
rate TYPE bapi1093_1-rate_type,
from_curr TYPE bapi1093_1-from_curr,
exch_rate TYPE bapi1093_0-exch_rate_v,
END OF t_exch.
*---------------------------------------------*
* Global Data *
*---------------------------------------------*
DATA: gv_hkont TYPE bsis-hkont,
it_bsis_bsas TYPE STANDARD TABLE OF t_bsis_bsas,
it_exch TYPE SORTED TABLE OF t_exch WITH UNIQUE
KEY year rate from_curr,
it_summary TYPE STANDARD TABLE OF t_summary,
wa_summary LIKE LINE OF it_summary,
wa_exch LIKE LINE OF it_exch,
t_rate_type TYPE bapi1093_1-rate_type VALUE 'ME',
t_from_curr TYPE bapi1093_1-from_curr,
t_to_curr TYPE bapi1093_1-to_currncy VALUE 'USD',
t_date TYPE bapi1093_2-trans_date,
t_date_out TYPE bapi1093_2-trans_date,
t_exch_rate TYPE bapi1093_0,
t_message TYPE bapireturn1.
FIELD-SYMBOLS: <fs_asof> TYPE bsis-gjahr,
<fs_bsis_bsas> LIKE LINE OF it_bsis_bsas.
*----------------------------------------------*
* Selection screen *
*----------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS: p_bukrs TYPE t001-bukrs OBLIGATORY,
p_asof TYPE bsis-budat OBLIGATORY,
p_year TYPE bsis-gjahr OBLIGATORY.
SELECT-OPTIONS: s_hkont FOR bsis-hkont NO INTERVALS OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.
*/ CLASS DEFINITIONS
*---------------------------------------------------------------------*
* CLASS lcl_main DEFINITION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
CLASS lcl_main DEFINITION.
PUBLIC SECTION.
METHODS: get_data,
get_diff,
display_subheader,
display_rate
IMPORTING
rate TYPE tcurr-ukurs
pos TYPE i,
display_header,
top_of_page,
get_rate_and_show
EXPORTING
ex_bsis_bsas LIKE it_bsis_bsas
ex_exch LIKE it_exch,
conversion
IMPORTING
year TYPE bsis-gjahr
rate_type TYPE bapi1093_1-rate_type
from_curr TYPE bapi1093_1-from_curr
to_curr TYPE bapi1093_1-to_currncy
EXPORTING
exch_rate TYPE bapi1093_0
t_date TYPE bapi1093_2-trans_date.
EVENTS: no_data EXPORTING value(hkont) TYPE bsis-hkont.
PRIVATE SECTION.
TYPES: BEGIN OF t_waers,
waers TYPE bsis-waers,
END OF t_waers.
TYPES: BEGIN OF t_local,
year TYPE bsis-gjahr,
rate TYPE tcurr-ukurs,
END OF t_local.
DATA: it_waers TYPE SORTED TABLE OF t_waers WITH UNIQUE
KEY waers,
it_local TYPE SORTED TABLE OF t_local WITH UNIQUE
KEY year,
wa_waers LIKE LINE OF it_waers,
wa_local LIKE LINE OF it_local,
lv_counter TYPE i,
lv_asof TYPE bsis-gjahr,
lv_year TYPE bsis-gjahr,
lv_check TYPE i,
lv_7years TYPE i,
lv_date TYPE pc226-endda,
lv_pos TYPE i,
lv_pos2 TYPE i,
lv_vline TYPE i,
lv_rate TYPE p DECIMALS 5,
lv_givendate TYPE syst-datum.
ENDCLASS.
*---------------------------------------------------------------------*
* CLASS lcl_summary DEFINITION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
CLASS lcl_summary DEFINITION INHERITING FROM lcl_main.
PUBLIC SECTION.
METHODS: display_summary_header,
display_summary
IMPORTING
im_bsis_bsas LIKE it_bsis_bsas
im_exch LIKE it_exch.
ENDCLASS.
*---------------------------------------------------------------------*
* CLASS lcl_handler DEFINITION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
CLASS lcl_handler DEFINITION.
PUBLIC SECTION.
METHODS handle_event FOR EVENT no_data OF lcl_main
IMPORTING hkont.
ENDCLASS.
*/ CLASS IMPLEMENTATIONS
*---------------------------------------------------------------------*
* CLASS lcl_main IMPLEMENTATION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
CLASS lcl_main IMPLEMENTATION.
*----------------------------------------------*
* METHOD get_data *
*----------------------------------------------*
METHOD get_data.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
* PERCENTAGE = 0
text = 'Getting data. Please wait...'
.
* get records from BSIS
SELECT hkont zuonr gjahr belnr waers bldat blart dmbtr wrbtr shkzg
FROM bsis
INTO CORRESPONDING FIELDS OF TABLE it_bsis_bsas
WHERE bukrs = p_bukrs
AND hkont IN s_hkont
AND budat <= p_asof.
* get records from BSAS
SELECT hkont zuonr gjahr belnr waers bldat blart dmbtr wrbtr shkzg
FROM bsas
APPENDING CORRESPONDING FIELDS OF TABLE it_bsis_bsas
WHERE bukrs = p_bukrs
AND hkont IN s_hkont
AND budat <p_asof> p_asof.
* if itab has no records, raise event
IF it_bsis_bsas[] IS INITIAL.
RAISE EVENT no_data EXPORTING hkont = s_hkont-low.
ENDIF.
ENDMETHOD.
*----------------------------------------------*
* METHOD get_diff *
*----------------------------------------------*
METHOD get_diff.
DATA: lv_sub7 TYPE i.
*----------------------------------------------*
* METHOD display_subheader *
*----------------------------------------------*
METHOD display_subheader.
DATA: lv_date(10) TYPE c,
lv_gdatu TYPE tcurr-gdatu,
lv_flag(1) TYPE c,
lv_pos_dum TYPE i.
FIELD-SYMBOLS: <fs_bsis_bsas> LIKE LINE OF it_bsis_bsas.
* pre-defined length of uline and vline depending on the
* number of years to be displayed
CASE lv_counter.
WHEN 1.
lv_pos = 24.
lv_pos2 = 37.
lv_vline = 126.
WHEN 2.
lv_pos = 45.
lv_pos2 = 58.
lv_vline = 147.
WHEN 3.
lv_pos = 66.
lv_pos2 = 79.
lv_vline = 168.
WHEN 4.
lv_pos = 87.
lv_pos2 = 100.
lv_vline = 189.
WHEN 5.
lv_pos = 108.
lv_pos2 = 121.
lv_vline = 210.
WHEN 6.
lv_pos = 128.
lv_pos2 = 141.
lv_vline = 230.
WHEN 7.
lv_pos = 148.
lv_pos2 = 161.
lv_vline = 250.
ENDCASE.
* get currency
IF NOT lv_check = 1.
LOOP AT it_bsis_bsas ASSIGNING <fs_bsis_bsas>.
MOVE <fs_bsis_bsas>-waers TO wa_waers.
INSERT wa_waers INTO TABLE it_waers.
<fs_bsis_bsas>-year_dum = <fs_bsis_bsas>-bldat+0(4).
ENDLOOP.
ENDIF.
ASSIGN lv_asof TO <fs_asof>.
IF NOT lv_check = 1.
SORT it_bsis_bsas BY hkont year_dum belnr bldat waers dmbtr wrbtr.
IF <fs_bsis_bsas> IS ASSIGNED.
UNASSIGN <fs_bsis_bsas>.
READ TABLE it_bsis_bsas INDEX 1 ASSIGNING <fs_bsis_bsas>.
IF sy-subrc = 0 AND <fs_bsis_bsas> IS ASSIGNED.
gv_hkont = <fs_bsis_bsas>-hkont.
ENDIF.
ENDIF.
ENDIF.
* write sub-header
DESCRIBE TABLE it_waers LINES sy-tfill.
LOOP AT it_waers INTO wa_waers.
IF sy-tfill = 1 AND wa_waers-waers = 'PHP'.
lv_flag = 1 .
ENDIF.
IF NOT lv_flag = 1.
IF lv_check IS INITIAL.
WRITE: AT /103 sy-uline(lv_pos),
AT /103 sy-vline.
ENDIF.
* write the years in the sub-header
IF NOT lv_check = 1.
lv_pos_dum = 110.
FORMAT COLOR COL_HEADING.
DO lv_counter TIMES.
IF sy-index = 6.
WRITE: AT lv_pos_dum(14) <fs_asof> RIGHT-JUSTIFIED.
ELSEIF sy-index = 7.
WRITE: AT lv_pos_dum(13) <fs_asof> RIGHT-JUSTIFIED.
ELSE.
WRITE: AT lv_pos_dum(15) <fs_asof> RIGHT-JUSTIFIED.
ENDIF.
ADD 21 TO lv_pos_dum.
SUBTRACT 1 FROM <fs_asof>.
ENDDO.
WRITE sy-vline.
FORMAT COLOR OFF.
ENDIF.
IF sy-tabix = 1 AND wa_waers-waers = 'PHP'.
WRITE: AT /90 sy-uline(lv_pos2).
ENDIF.
IF wa_waers-waers <> 'PHP'.
IF lv_check IS INITIAL.
WRITE: AT /90 sy-uline(lv_pos2).
WRITE: AT /90 sy-vline.
ELSE.
WRITE: AT /90 sy-vline.
ENDIF.
ENDIF.
FORMAT COLOR COL_NORMAL.
IF NOT wa_waers-waers = 'PHP'.
WRITE: AT 91(10) wa_waers-waers CENTERED. "write the currency
ENDIF.
ENDIF.
lv_asof = p_year + 6.
IF lv_asof > p_asof+0(4).
lv_asof = p_asof+0(4).
ENDIF.
* get exchange rate from PHP to USD
IF lv_check IS INITIAL.
t_from_curr = 'PHP'.
DO lv_counter TIMES.
* use BAPI to get exchange rate
CALL METHOD me->conversion EXPORTING
year = <fs_asof>
rate_type = t_rate_type
from_curr = t_from_curr
to_curr = t_to_curr
IMPORTING
exch_rate = t_exch_rate
t_date = t_date_out.
* if no exchange rate was fetched, get directly from TCURR
* using given date
IF t_exch_rate-exch_rate_v IS INITIAL.
WRITE t_date_out TO lv_date USING EDIT MASK '__/__/____'.
CALL FUNCTION 'CONVERSION_EXIT_INVDT_INPUT'
EXPORTING
input = lv_date
IMPORTING
output = lv_date.
SELECT SINGLE ukurs FROM tcurr
INTO t_exch_rate-exch_rate_v
WHERE kurst = 'ME'
AND fcurr = 'PHP'
AND tcurr = 'USD'
AND gdatu = lv_date.
ENDIF.
IF NOT t_exch_rate-exch_rate_v IS INITIAL.
t_exch_rate-exch_rate_v = abs( t_exch_rate-exch_rate_v ).
wa_local-year = <fs_asof>.
wa_local-rate = t_exch_rate-exch_rate_v.
INSERT wa_local INTO TABLE it_local.
ENDIF.
SUBTRACT 1 FROM <fs_asof>.
CLEAR: t_exch_rate, wa_local, t_date_out, lv_date.
ENDDO.
ENDIF.
lv_pos = 106.
* get exchange rate from itab to USD
CLEAR: t_exch_rate, lv_gdatu.
t_from_curr = wa_waers-waers.
lv_asof = p_year + 6.
IF lv_asof > p_asof+0(4).
lv_asof = p_asof+0(4).
ENDIF.
DO lv_counter TIMES.
IF t_from_curr = 'USD'.
READ TABLE it_local WITH KEY year = <fs_asof>
INTO wa_local TRANSPORTING rate.
lv_rate = wa_local-rate.
ELSEIF t_from_curr = 'PHP'.
READ TABLE it_local WITH KEY year = <fs_asof>
INTO wa_local TRANSPORTING rate.
lv_rate = wa_local-rate.
ELSE.
* use BAPI to get exchange rate for currencies that is
* not 'PHP' and 'USD'
CALL METHOD me->conversion EXPORTING
year = <fs_asof>
rate_type = t_rate_type
from_curr = t_from_curr
to_curr = t_to_curr
IMPORTING
exch_rate = t_exch_rate
t_date = t_date_out.
* if no exchange rate was fetched, get directly from TCURR
* using given date
IF t_exch_rate-exch_rate_v IS INITIAL.
WRITE t_date_out TO lv_date USING EDIT MASK '__/__/____'.
CALL FUNCTION 'CONVERSION_EXIT_INVDT_INPUT'
EXPORTING
input = lv_date
IMPORTING
output = lv_date.
SELECT SINGLE ukurs FROM tcurr
INTO t_exch_rate-exch_rate_v
WHERE kurst = 'ME'
AND fcurr = wa_waers-waers
AND tcurr = 'USD'
AND gdatu = lv_date.
ENDIF.
IF NOT t_exch_rate-exch_rate_v IS INITIAL.
READ TABLE it_local WITH KEY year = <fs_asof>
INTO wa_local TRANSPORTING rate.
IF sy-subrc = 0.
IF t_exch_rate-exch_rate_v <> wa_local-rate.
lv_rate = 1 / t_exch_rate-exch_rate_v * wa_local-rate.
ELSE.
lv_rate = t_exch_rate-exch_rate_v.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
IF NOT lv_rate IS INITIAL.
lv_rate = abs( lv_rate ).
wa_exch-year = <fs_asof>.
wa_exch-rate = t_rate_type.
wa_exch-from_curr = t_from_curr.
wa_exch-exch_rate = lv_rate.
INSERT wa_exch INTO TABLE it_exch.
IF NOT lv_flag = 1.
IF NOT wa_waers-waers = 'PHP'.
CALL METHOD me->display_rate
EXPORTING
rate = wa_exch-exch_rate
pos = lv_pos.
CLEAR wa_exch.
ENDIF.
ENDIF.
ENDIF.
ADD 21 TO lv_pos.
SUBTRACT 1 FROM <fs_asof>.
CLEAR: t_exch_rate, wa_local, t_date_out,
lv_date,lv_rate.
ENDDO.
IF NOT lv_flag = 1.
WRITE: AT lv_vline sy-vline.
ENDIF.
FORMAT COLOR OFF.
CLEAR lv_pos2.
CASE lv_counter.
WHEN 1.
lv_pos2 = 126.
WHEN 2.
lv_pos2 = 147.
WHEN 3.
lv_pos2 = 168.
WHEN 4.
lv_pos2 = 189.
WHEN 5.
lv_pos2 = 210.
WHEN 6.
lv_pos2 = 230.
WHEN 7.
lv_pos2 = 250.
ENDCASE.
DO lv_counter TIMES.
WRITE: AT lv_pos(14) <fs_asof> RIGHT-JUSTIFIED.
SUBTRACT 1 FROM <fs_asof>.
ADD 21 TO lv_pos.
ENDDO.
WRITE: AT lv_pos2 sy-vline,
/ sy-uline(lv_pos2).
FORMAT COLOR OFF.
ENDMETHOD.
*----------------------------------------------*
* METHOD top_of_page *
*----------------------------------------------*
METHOD top_of_page.
DATA: text1 TYPE string,
text2 TYPE string,
lv_asof TYPE bsis-budat,
lv_pageno(03) TYPE n,
lv_date(10) TYPE c.
* get company code description
SELECT SINGLE butxt FROM t001
INTO t001-butxt
WHERE bukrs = p_bukrs.
WRITE: / t001-butxt,
/ sy-title.
* write account code(HKONT)
CONCATENATE: gv_hkont '/' p_bukrs
INTO text1.
CONCATENATE: 'Account:' text1
INTO text2
SEPARATED BY space.
WRITE: / text2.
CLEAR: text1, text2.
* write as of date
WRITE p_asof TO lv_date USING EDIT MASK '__/__/____'.
CONCATENATE: 'As of' lv_date
INTO text1
SEPARATED BY space.
WRITE: / text1.
CLEAR: text1, lv_date.
* from year to as of year
lv_asof = p_asof+0(4).
CONCATENATE: 'Year:' p_year 'to' lv_asof
INTO text1
SEPARATED BY space.
WRITE: / text1.
CLEAR text1.
* page number
lv_pageno = sy-pagno.
CONCATENATE: 'Page No:' lv_pageno
INTO text1
SEPARATED BY space.
WRITE: / text1.
CLEAR text1.
SKIP 2.
ENDMETHOD.
*----------------------------------------------*
* METHOD get_rate_and_show *
*----------------------------------------------*
METHOD get_rate_and_show.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
* PERCENTAGE = 0
text = 'Combining data.Please wait... '
.
DATA: lv_amount(15) TYPE p DECIMALS 2,
lv_color(1) TYPE n VALUE 1,
lv_index1(15) TYPE p DECIMALS 2,
lv_index2(15) TYPE p DECIMALS 2,
lv_index3(15) TYPE p DECIMALS 2,
lv_index4(15) TYPE p DECIMALS 2,
lv_index5(15) TYPE p DECIMALS 2,
lv_index6(15) TYPE p DECIMALS 2,
lv_index7(15) TYPE p DECIMALS 2,
lv_total1(15) TYPE p DECIMALS 2,
lv_total2(15) TYPE p DECIMALS 2,
lv_total3(15) TYPE p DECIMALS 2,
lv_total4(15) TYPE p DECIMALS 2,
lv_total5(15) TYPE p DECIMALS 2,
lv_total6(15) TYPE p DECIMALS 2,
lv_total7(15) TYPE p DECIMALS 2,
lv_dmbtr(15) TYPE p DECIMALS 2,
lv_dmbtr_tot(15) TYPE p DECIMALS 2,
lv_old TYPE bsis-hkont,
lv_new TYPE bsis-hkont.
CLEAR lv_check.
ADD 1 TO lv_check.
SORT it_bsis_bsas BY hkont year_dum belnr bldat waers dmbtr wrbtr.
* write details
LOOP AT it_bsis_bsas ASSIGNING <fs_bsis_bsas>.
IF lv_color = 1.
lv_color = 2.
ELSE.
lv_color = 1.
ENDIF.
* if <fs_bsis_bsas>-shkzg = 'H', multiply WRBTR and
* DMBTR by -1
IF <fs_bsis_bsas>-shkzg = 'H'.
<fs_bsis_bsas>-wrbtr = <fs_bsis_bsas>-wrbtr * -1.
<fs_bsis_bsas>-dmbtr = <fs_bsis_bsas>-dmbtr * -1.
ENDIF.
* for every new account no.(HKONT), create a new page
lv_new = <fs_bsis_bsas>-hkont.
gv_hkont = <fs_bsis_bsas>-hkont.
IF lv_new <lv_old>display_subheader.
CALL METHOD me->display_header.
ENDIF.
lv_old = lv_new.
ADD <fs_bsis_bsas>-dmbtr TO: lv_dmbtr, lv_dmbtr_tot.
* write the converted amount for a given year
WHILE lv_check <= lv_counter.
IF <fs_asof> >= <fs_bsis_bsas>-bldat+0(4).
t_from_curr = <fs_bsis_bsas>-waers.
READ TABLE it_exch WITH KEY year = <fs_asof>
rate = t_rate_type
from_curr = t_from_curr
INTO wa_exch TRANSPORTING exch_rate.
IF sy-subrc = 0.
IF <fs_bsis_bsas>-waers = 'PHP'.
lv_amount = 1 / wa_exch-exch_rate * wa_exch-exch_rate.
lv_amount = <fs_bsis_bsas>-wrbtr * lv_amount.
ELSE.
lv_amount = <fs_bsis_bsas>-wrbtr * wa_exch-exch_rate.
ENDIF.
WRITE: (20) lv_amount RIGHT-JUSTIFIED.
CASE sy-index.
WHEN 1.
ADD lv_amount TO lv_index1.
ADD lv_amount TO lv_total1.
WHEN 2.
ADD lv_amount TO lv_index2.
ADD lv_amount TO lv_total2.
WHEN 3.
ADD lv_amount TO lv_index3.
ADD lv_amount TO lv_total3.
WHEN 4.
ADD lv_amount TO lv_index4.
ADD lv_amount TO lv_total4.
WHEN 5.
ADD lv_amount TO lv_index5.
ADD lv_amount TO lv_total5.
WHEN 6.
ADD lv_amount TO lv_index6.
ADD lv_amount TO lv_total6.
WHEN 7.
ADD lv_amount TO lv_index7.
ADD lv_amount TO lv_total7.
ENDCASE.
ENDIF.
ENDIF.
CLEAR: lv_amount, wa_exch.
SUBTRACT 1 FROM <fs_asof>.
ADD 1 TO lv_check.
ENDWHILE.
WRITE AT lv_pos2 sy-vline.
* write sub-total for every year for the same account code(HKONT)
AT END OF year_dum.
FORMAT COLOR COL_TOTAL.
WRITE: / sy-vline,
<fs_bsis_bsas>-year_dum,
'Sub-total:'.
IF NOT lv_dmbtr IS INITIAL.
WRITE: AT 76(20) lv_dmbtr RIGHT-JUSTIFIED.
ENDIF.
IF NOT lv_index1 IS INITIAL.
WRITE: (20) lv_index1 RIGHT-JUSTIFIED.
ENDIF.
IF NOT lv_index2 IS INITIAL.
WRITE (20) lv_index2 RIGHT-JUSTIFIED.
ENDIF.
IF NOT lv_index3 IS INITIAL.
WRITE (20) lv_index3 RIGHT-JUSTIFIED.
ENDIF.
IF NOT lv_index4 IS INITIAL.
WRITE (20) lv_index4 RIGHT-JUSTIFIED.
ENDIF.
IF NOT lv_index5 IS INITIAL.
WRITE (20) lv_index5 RIGHT-JUSTIFIED.
ENDIF.
IF NOT lv_index6 IS INITIAL.
WRITE: (20) lv_index6 RIGHT-JUSTIFIED.
ENDIF.
IF NOT lv_index7 IS INITIAL.
WRITE: (20) lv_index7 RIGHT-JUSTIFIED.
ENDIF.
WRITE: AT lv_pos2 sy-vline.
FORMAT COLOR OFF.
CLEAR: lv_index1, lv_index2, lv_index3,
lv_index4, lv_index5, lv_index6,
lv_index7, lv_dmbtr.
ENDAT.
* write total for a given account code(HKONT)
AT END OF hkont.
FORMAT COLOR COL_TOTAL INTENSIFIED.
WRITE: / sy-vline,
'Total', <fs_bsis_bsas>-hkont, 'GI'.
IF NOT lv_dmbtr_tot IS INITIAL.
WRITE: AT 76(20) lv_dmbtr_tot RIGHT-JUSTIFIED.
ENDIF.
IF NOT lv_total1 IS INITIAL.
WRITE: (20) lv_total1 RIGHT-JUSTIFIED.
ENDIF.
IF NOT lv_total2 IS INITIAL.
WRITE (20) lv_total2 RIGHT-JUSTIFIED.
ENDIF.
IF NOT lv_total3 IS INITIAL.
WRITE (20) lv_total3 RIGHT-JUSTIFIED.
ENDIF.
IF NOT lv_total4 IS INITIAL.
WRITE (20) lv_total4 RIGHT-JUSTIFIED.
ENDIF.
IF NOT lv_total5 IS INITIAL.
WRITE (20) lv_total5 RIGHT-JUSTIFIED.
ENDIF.
IF NOT lv_total6 IS INITIAL.
WRITE: (20) lv_total6 RIGHT-JUSTIFIED.
ENDIF.
IF NOT lv_total7 IS INITIAL.
WRITE: (20) lv_total7 RIGHT-JUSTIFIED.
ENDIF.
WRITE: AT lv_pos2 sy-vline.
FORMAT COLOR OFF.
CLEAR: lv_total1, lv_total2, lv_total3,
lv_total4, lv_total5, lv_total6,
lv_total7, lv_dmbtr_tot.
WRITE: / sy-uline(lv_pos2).
ENDAT.
lv_asof = p_year + 6.
IF lv_asof > p_asof+0(4).
lv_asof = p_asof+0(4).
ENDIF.
CLEAR lv_check.
ADD 1 TO lv_check.
FORMAT COLOR OFF.
ENDLOOP.
SKIP 5.
ex_bsis_bsas[] = it_bsis_bsas[].
ex_exch[] = it_exch[].
ENDMETHOD.
*----------------------------------------------*
* METHOD conversion *
*----------------------------------------------*
METHOD conversion.
IF year = p_asof+0(4).
* get last date of a given month and year
CALL FUNCTION 'LAST_DAY_OF_MONTHS'
EXPORTING
day_in = p_asof
IMPORTING
last_day_of_month = lv_givendate
* EXCEPTIONS
* DAY_IN_NO_DATE = 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.
ELSE.
* get last date of a given year
CALL FUNCTION 'HR_E_GET_FISC_YEAR_DATES'
EXPORTING
fisc_year = year
IMPORTING
* FISC_FECINI =
fisc_fecfin = lv_date
* EXCEPTIONS
* 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.
ENDIF.
IF lv_date IS INITIAL.
t_date = lv_givendate.
CLEAR lv_givendate.
ELSE.
t_date = lv_date.
CLEAR lv_date.
ENDIF.
* get exchange rate from a given currency to US dollars
CALL FUNCTION 'BAPI_EXCHANGERATE_GETDETAIL'
EXPORTING
rate_type = rate_type
from_curr = from_curr
to_currncy = to_curr
date = t_date
IMPORTING
exch_rate = t_exch_rate
* RETURN =
.
ENDMETHOD.
ENDCLASS.
*---------------------------------------------------------------------*
* CLASS lcl_summary IMPLEMENTATION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
CLASS lcl_summary IMPLEMENTATION.
*----------------------------------------------*
* METHOD display_summary *
*----------------------------------------------*
METHOD display_summary.
TYPES: BEGIN OF t_total,
hkont TYPE bsis-hkont,
waers TYPE bsis-waers,
wrbtr TYPE bsis-wrbtr,
dmbtr TYPE bsis-dmbtr,
gl_bal TYPE bsis-wrbtr,
unrealized TYPE bsis-wrbtr,
END OF t_total.
DATA: lv_balance TYPE bsis-wrbtr,
lv_date(10) TYPE c,
lv_color(1) TYPE n VALUE '1',
lv_wrbtr TYPE bsis-wrbtr,
lv_dmbtr TYPE bsis-dmbtr,
lv_gl_bal TYPE bsis-wrbtr,
lv_unrealized TYPE bsis-wrbtr,
lv_old_year TYPE bsis-gjahr,
lv_new_year TYPE bsis-gjahr,
lv_flag(1) TYPE n,
lt_bsis_bsas_dum TYPE STANDARD TABLE OF t_bsis_bsas,
lt_total TYPE STANDARD TABLE OF t_total,
wa_total LIKE LINE OF lt_total.
FIELD-SYMBOLS: <fs_dum> LIKE LINE OF lt_bsis_bsas_dum.
it_bsis_bsas[] = im_bsis_bsas[].
it_exch[] = im_exch[].
CLEAR wa_exch.
SORT it_bsis_bsas BY hkont year_dum DESCENDING waers.
lt_bsis_bsas_dum[] = it_bsis_bsas[].
LOOP AT it_bsis_bsas ASSIGNING <fs_bsis_bsas>.
AT NEW hkont.
MOVE <fs_bsis_bsas>-hkont TO wa_summary-hkont.
ENDAT.
AT NEW year_dum.
MOVE <fs_bsis_bsas>-year_dum TO wa_summary-year_dum.
ENDAT.
AT NEW waers.
MOVE <fs_bsis_bsas>-waers TO wa_summary-waers.
t_from_curr = wa_summary-waers.
READ TABLE it_exch WITH KEY year = wa_summary-year_dum
rate = t_rate_type
from_curr = t_from_curr
INTO wa_exch TRANSPORTING exch_rate.
IF sy-subrc = 0.
MOVE wa_exch-exch_rate TO wa_summary-rate.
ELSE.
CALL METHOD me->conversion
EXPORTING
year = wa_summary-year_dum
rate_type = t_rate_type
from_curr = t_from_curr
to_curr = t_to_curr
IMPORTING
exch_rate = t_exch_rate
t_date = t_date_out.
IF t_exch_rate-exch_rate_v IS INITIAL.
WRITE t_date_out TO lv_date USING EDIT MASK '__/__/____'.
CALL FUNCTION 'CONVERSION_EXIT_INVDT_INPUT'
EXPORTING
input = lv_date
IMPORTING
output = lv_date.
SELECT SINGLE ukurs FROM tcurr
INTO t_exch_rate-exch_rate_v
WHERE kurst = 'ME'
AND fcurr = 'PHP'
AND tcurr = 'USD'
AND gdatu = lv_date.
ENDIF.
IF NOT t_exch_rate-exch_rate_v IS INITIAL.
t_exch_rate-exch_rate_v = abs( t_exch_rate-exch_rate_v ).
MOVE t_exch_rate-exch_rate_v TO wa_summary-rate.
ENDIF.
ENDIF.
ENDAT.
LOOP AT lt_bsis_bsas_dum ASSIGNING <fs_dum>
WHERE hkont = wa_summary-hkont
AND year_dum = wa_summary-year_dum
AND waers = wa_summary-waers.
ADD <fs_dum>-wrbtr TO wa_summary-wrbtr.
ADD <fs_dum>-dmbtr TO wa_summary-dmbtr.
IF NOT wa_exch-exch_rate IS INITIAL.
IF <fs_dum>-waers = 'PHP'.
lv_balance = 1 / wa_exch-exch_rate * wa_exch-exch_rate.
lv_balance = <fs_dum>-wrbtr * lv_balance.
ADD lv_balance TO wa_summary-gl_bal.
ELSE.
lv_balance = <fs_dum>-wrbtr * wa_exch-exch_rate.
ADD lv_balance TO wa_summary-gl_bal.
ENDIF.
ENDIF.
CLEAR lv_balance.
DELETE lt_bsis_bsas_dum.
ENDLOOP.
DELETE it_bsis_bsas WHERE hkont = wa_summary-hkont
AND year_dum = wa_summary-year_dum
AND waers = wa_summary-waers.
wa_summary-unrealized = wa_summary-dmbtr - wa_summary-gl_bal.
APPEND wa_summary TO it_summary.
CLEAR wa_summary.
ENDLOOP.
IF NOT it_summary[] IS INITIAL.
CALL METHOD me->display_summary_header.
CLEAR wa_summary.
SORT it_summary BY hkont year_dum DESCENDING waers.
*/ WRITE SUMMARY
LOOP AT it_summary INTO wa_summary.
IF lv_color = 1.
lv_color = 2.
ELSE.
lv_color = 1.
ENDIF.
MOVE: wa_summary-hkont TO wa_total-hkont,
wa_summary-waers TO wa_total-waers.
READ TABLE lt_total WITH KEY hkont = wa_summary-hkont
waers = wa_summary-waers
INTO wa_total.
IF sy-subrc = 0.
ADD: wa_summary-wrbtr TO wa_total-wrbtr,
wa_summary-dmbtr TO wa_total-dmbtr,
wa_summary-gl_bal TO wa_total-gl_bal,
wa_summary-unrealized TO wa_total-unrealized.
MODIFY lt_total FROM wa_total TRANSPORTING
wrbtr dmbtr gl_bal unrealized
WHERE hkont = wa_summary-hkont
AND waers = wa_summary-waers.
CLEAR wa_total.
lv_flag = 1.
ELSE.
ADD: wa_summary-wrbtr TO wa_total-wrbtr,
wa_summary-dmbtr TO wa_total-dmbtr,
wa_summary-gl_bal TO wa_total-gl_bal,
wa_summary-unrealized TO wa_total-unrealized.
ENDIF.
* write sub-total for every end of a year
lv_new_year = wa_summary-year_dum.
IF lv_new_year <lv_old_year>top_of_page.
*----------------------------------------------*
* START-OF-SELECTION *
*----------------------------------------------*
START-OF-SELECTION.
DATA: o_main TYPE REF TO lcl_main,
o_handler TYPE REF TO lcl_handler,
o_summary TYPE REF TO lcl_summary,
it_bsis_bsas_dum TYPE STANDARD TABLE OF t_bsis_bsas,
it_exch_dum LIKE it_exch.
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You cannot download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.