SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Show the exchange rate for a given range of 7 years



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> FI
View previous topic :: View next topic  
Author Message
admin
Администратор
Администратор



Joined: 01 Sep 2007
Posts: 1640

PostPosted: Sat Oct 27, 2007 4:02 pm    Post subject: Show the exchange rate for a given range of 7 years Reply with quote

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.
 
*---------------------------------------------*
* Data dictionary table/s                     *
*---------------------------------------------*
TABLES: bsis,
        bsas,
        tcurr,
        t001.
 
*---------------------------------------------*
* 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.
 
    lv_asof = p_year + 6.
    IF lv_asof > p_asof+0(4).
      lv_asof = p_asof+0(4).
    ENDIF.
    lv_year = p_year.
 
*   determine how many years will be displayed
    lv_counter = lv_asof - lv_year.
    ADD 1 TO lv_counter.
 
    lv_sub7   = lv_asof - 6.
    lv_7years = lv_asof - lv_sub7.
    ADD 1 TO lv_7years.
  ENDMETHOD.
 
*----------------------------------------------*
* 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.
 
      lv_asof = p_year + 6.
      IF lv_asof > p_asof+0(4).
        lv_asof = p_asof+0(4).
      ENDIF.
      lv_check = 1.
      CLEAR lv_flag.
    ENDLOOP.
  ENDMETHOD.
 
*----------------------------------------------*
* METHOD display_rate                          *
*----------------------------------------------*
  METHOD display_rate.
    WRITE: AT pos(15) rate RIGHT-JUSTIFIED.
  ENDMETHOD.
 
*----------------------------------------------*
* METHOD display_header                        *
*----------------------------------------------*
  METHOD display_header.
    CLEAR lv_pos.
    lv_asof = p_year + 6.
    IF lv_asof > p_asof+0(4).
      lv_asof = p_asof+0(4).
    ENDIF.
 
    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.
 
    lv_pos = 110.
    FORMAT COLOR COL_HEADING.
    WRITE: /   sy-uline(lv_pos2),
           /   sy-vline,
         (18) 'Allocation'         CENTERED,
         (04) 'DT'                 CENTERED,
         (11) 'Doc. No.'           CENTERED,
         (11) 'Doc. Date'          LEFT-JUSTIFIED,
         (06) 'Cur.'               LEFT-JUSTIFIED,
         (20) 'Transaction Curr.'  CENTERED,
         (20) 'Local Curr. (PHP)'  CENTERED.
 
    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.
 
    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.
    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.
 
*     write details
      FORMAT INTENSIFIED OFF COLOR = lv_color.
      WRITE: /   sy-vline,
            (18) <fs_bsis_bsas>-zuonr   CENTERED,
            (04) <fs_bsis_bsas>-blart   CENTERED,
            (10) <fs_bsis_bsas>-belnr   CENTERED,
            (10) <fs_bsis_bsas>-bldat   RIGHT-JUSTIFIED,
            (05) <fs_bsis_bsas>-waers   RIGHT-JUSTIFIED,
            (20) <fs_bsis_bsas>-wrbtr   RIGHT-JUSTIFIED,
            (20) <fs_bsis_bsas>-dmbtr   RIGHT-JUSTIFIED.
 
      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.
 
  CREATE OBJECT: o_main, o_handler, o_summary.
 
  SET HANDLER o_handler->handle_event FOR ALL INSTANCES.
  CALL METHOD o_main->get_data.
  CALL METHOD o_main->get_diff.
  CALL METHOD o_main->display_subheader.
  CALL METHOD o_main->display_header.
  CALL METHOD o_main->get_rate_and_show
     IMPORTING
        ex_bsis_bsas = it_bsis_bsas_dum
        ex_exch      = it_exch_dum.
  CALL METHOD o_summary->display_summary
     EXPORTING
        im_bsis_bsas = it_bsis_bsas_dum
        im_exch      = it_exch_dum.
 
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> FI All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
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.