Table of Contents:



REPORT zf_profitability_per_contract NO STANDARD PAGE HEADING
       MESSAGE-ID zz LINE-SIZE 250 LINE-COUNT 65.
*@----------------------------------------------------------------------
*@ Program id    : ZF_PROFITABILITY_PER_CONTRACT
*@ Program Desc  : Profitability Per Contract
*@ Transaction Code : ZDCM
*@ Input files   :
*@
*@ Output files  :
*@
*@ Tables Updated: Table - none
*@
*@ Author        : Becky Wang, LABK933883
*@ Date          : October 25, 2002
*@ Requested by  : Christina Tam
*@ Description   : Profitability Revenue or Direct Cost.  Can be
*@                 expanded to detailed GL account balance, and then
*@                 detailed FI document for each GL account, then
*@                 go to FB03 directly
*@----------------------------------------------------------------------
*@ Algorithm:
*@----------------------------------------------------------------------

INCLUDE zsmaster.
INCLUDE zsmacros.
INCLUDE .

*&-------------------
*& Tables
*&-------------------
TABLES: ce1anoc,
        bseg,
        t001.

*&-------------------
*& Types
*&-------------------

* type for detailed internal table
TYPES: BEGIN OF t_result,
         rev_cost_flg TYPE c,           "Revenue or Cost flag
         rev_cost_id LIKE zfrev_cost_defin-id,  "Revenue or Cost ID
         hkont LIKE bseg-hkont,         "GL account
         bukrs LIKE ce1anoc-bukrs,      "company
         rkaufnr LIKE ce1anoc-rkaufnr,      "Sales order number
         belnr LIKE bseg-belnr,         "document number
         buzei LIKE bseg-buzei,         "document Line number
         dmbtr LIKE bseg-dmbtr,         "amount in Local Currency
         pswsl LIKE bseg-pswsl,         "local currency
         dmbe2 LIKE bseg-dmbe2,         "amount in USD
         kvgr1 LIKE ce1anoc-kvgr1,      "job type
         kvgr2 LIKE ce1anoc-kvgr2,      "product line
         land1 LIKE ce1anoc-land1,      "country
         kndnr LIKE ce1anoc-kndnr,      "Customer number
         wwctr LIKE ce1anoc-wwctr,      "Contract number
         zuonr LIKE bseg-zuonr,         "assignment
         budat LIKE bkpf-budat,         "posting date
         usnam LIKE bkpf-usnam,         "posted by
         insp_geop_dmbtr LIKE bseg-dmbtr,
         insp_mfl_dmbtr LIKE bseg-dmbtr,
         insp_both_dmbtr LIKE bseg-dmbtr,
         intg_rep_dmbtr LIKE bseg-dmbtr,
         intg_intg_dmbtr LIKE bseg-dmbtr,
         insp_intg_geop_dmbtr LIKE bseg-dmbtr,
         insp_intg_mfl_dmbtr LIKE bseg-dmbtr,
         insp_intg_rep_dmbtr LIKE bseg-dmbtr,
         insp_intg_intg_dmbtr LIKE bseg-dmbtr,
         insp_intg_both_dmbtr LIKE bseg-dmbtr,
         insp_geop_dmbe2 LIKE bseg-dmbe2,
         insp_mfl_dmbe2 LIKE bseg-dmbe2,
         insp_both_dmbe2 LIKE bseg-dmbe2,
         intg_rep_dmbe2 LIKE bseg-dmbe2,
         intg_intg_dmbe2 LIKE bseg-dmbe2,
         insp_intg_geop_dmbe2 LIKE bseg-dmbe2,
         insp_intg_mfl_dmbe2 LIKE bseg-dmbe2,
         insp_intg_rep_dmbe2 LIKE bseg-dmbe2,
         insp_intg_intg_dmbe2 LIKE bseg-dmbe2,
         insp_intg_both_dmbe2 LIKE bseg-dmbe2,
         state TYPE c,
       END OF t_result.

* type for the summary table
TYPES: BEGIN OF t_summary,
         rev_cost_flg TYPE c,           "Revenue or Cost flag
         rev_cost_id LIKE zfrev_cost_defin-id,  "Revenue or Cost ID
         hkont LIKE bseg-hkont,         "GL account
         bukrs LIKE ce1anoc-bukrs,      "company
         insp_geop_dmbtr LIKE bseg-dmbtr,
         insp_mfl_dmbtr LIKE bseg-dmbtr,
         insp_both_dmbtr LIKE bseg-dmbtr,
         intg_rep_dmbtr LIKE bseg-dmbtr,
         intg_intg_dmbtr LIKE bseg-dmbtr,
         insp_intg_geop_dmbtr LIKE bseg-dmbtr,
         insp_intg_mfl_dmbtr LIKE bseg-dmbtr,
         insp_intg_rep_dmbtr LIKE bseg-dmbtr,
         insp_intg_intg_dmbtr LIKE bseg-dmbtr,
         insp_intg_both_dmbtr LIKE bseg-dmbtr,
         insp_geop_dmbtr_per LIKE bseg-dmbtr,
         insp_mfl_dmbtr_per LIKE bseg-dmbtr,
         insp_both_dmbtr_per LIKE bseg-dmbtr,
         intg_rep_dmbtr_per LIKE bseg-dmbtr,
         intg_intg_dmbtr_per LIKE bseg-dmbtr,
         insp_intg_geop_dmbtr_per LIKE bseg-dmbtr,
         insp_intg_mfl_dmbtr_per LIKE bseg-dmbtr,
         insp_intg_rep_dmbtr_per LIKE bseg-dmbtr,
         insp_intg_intg_dmbtr_per LIKE bseg-dmbtr,
         insp_intg_both_dmbtr_per LIKE bseg-dmbtr,
         insp_geop_dmbe2 LIKE bseg-dmbe2,
         insp_mfl_dmbe2 LIKE bseg-dmbe2,
         insp_both_dmbe2 LIKE bseg-dmbe2,
         intg_rep_dmbe2 LIKE bseg-dmbe2,
         intg_intg_dmbe2 LIKE bseg-dmbe2,
         insp_intg_geop_dmbe2 LIKE bseg-dmbe2,
         insp_intg_mfl_dmbe2 LIKE bseg-dmbe2,
         insp_intg_rep_dmbe2 LIKE bseg-dmbe2,
         insp_intg_intg_dmbe2 LIKE bseg-dmbe2,
         insp_intg_both_dmbe2 LIKE bseg-dmbe2,
         total_dmbe2 LIKE bseg-dmbe2,
         total_dmbtr LIKE bseg-dmbtr,
         insp_geop_dmbe2_per LIKE bseg-dmbe2,
         insp_mfl_dmbe2_per LIKE bseg-dmbe2,
         insp_both_dmbe2_per LIKE bseg-dmbe2,
         intg_rep_dmbe2_per LIKE bseg-dmbe2,
         intg_intg_dmbe2_per LIKE bseg-dmbe2,
         insp_intg_geop_dmbe2_per LIKE bseg-dmbe2,
         insp_intg_mfl_dmbe2_per LIKE bseg-dmbe2,
         insp_intg_rep_dmbe2_per LIKE bseg-dmbe2,
         insp_intg_intg_dmbe2_per LIKE bseg-dmbe2,
         insp_intg_both_dmbe2_per LIKE bseg-dmbe2,
         total_dmbe2_per LIKE bseg-dmbe2,
         total_dmbtr_per LIKE bseg-dmbtr,
         state TYPE c,
       END OF t_summary.

* type for the download internal table
TYPES: BEGIN OF t_down,
         bukrs LIKE ce1anoc-bukrs,      "company
         belnr LIKE bseg-belnr,         "document number
         buzei LIKE bseg-buzei,         "document Line number
         hkont LIKE bseg-hkont,         "GL account
         rkaufnr LIKE ce1anoc-rkaufnr,      "Sales order number
         kvgr2 LIKE ce1anoc-kvgr2,      "product line
         kvgr1 LIKE ce1anoc-kvgr1,      "job type
         land1 LIKE ce1anoc-land1,      "country
         kndnr LIKE ce1anoc-kndnr,      "Customer number
         wwctr LIKE ce1anoc-wwctr,      "Contract number
         rev_cost_id LIKE zfrev_cost_defin-id,  "Revenue or Cost ID
         dmbe2 LIKE bseg-dmbe2,         "amount in USD
         dmbtr LIKE bseg-dmbtr,         "amount in Local Currency
      END OF t_down.

*&-------------------
*& Global Data
*&-------------------
DATA: it_anoc LIKE ce1anoc OCCURS 0 WITH HEADER LINE,
      wa_bseg LIKE bseg,
      wa_bkpf LIKE bkpf,
      wa_rev_cost_defin LIKE zfrev_cost_defin,
      wa_rev_cost_descp LIKE zfrev_cost_descp,
      it_result TYPE t_result OCCURS 0 WITH HEADER LINE,
      it_doc TYPE t_result OCCURS 0 WITH HEADER LINE,
      it_summary TYPE t_summary OCCURS 0 WITH HEADER LINE,
      wa_summary TYPE t_summary,
      it_company LIKE t001 OCCURS 0 WITH HEADER LINE,
      it_temp_comp LIKE t001 OCCURS 0 WITH HEADER LINE,
      it_download TYPE t_down OCCURS 0 WITH HEADER LINE.

DATA: g_year LIKE bseg-gjahr,
      g_second_line(150) TYPE c,
      g_header(100) TYPE c,
      g_from_period(2) TYPE c,
      g_to_period(2) TYPE c,
      g_from_year(4) TYPE c,
      g_to_year(4) TYPE c,
      g_bukrs LIKE ce1anoc-bukrs,
      g_currency LIKE t001-waers,
      g_report(4) TYPE c,
      g_gl LIKE bseg-hkont.

DATA: g_fis_period TYPE mac_t_period,
      g_fis_year TYPE mac_t_year,
      g_fiscal LIKE ce1anoc-perio.
*&-------------------
*& Constants
*&-------------------
CONSTANTS: c_inspection LIKE ce1anoc-kvgr2 VALUE 'Z01',
           c_integrity LIKE ce1anoc-kvgr2 VALUE 'Z02',
           c_insp_intg LIKE ce1anoc-kvgr2 VALUE 'Z3'.

CONSTANTS: c_geopig LIKE ce1anoc-kvgr1 VALUE 'Z01',
           c_mfl LIKE ce1anoc-kvgr1 VALUE 'Z02',
           c_geop_mfl LIKE ce1anoc-kvgr1 VALUE 'Z03',
           c_integ LIKE ce1anoc-kvgr1 VALUE 'Z04',
           c_repair LIKE ce1anoc-kvgr1 VALUE 'Z05'.

CONSTANTS: c_country(4) TYPE c VALUE 'CNTY',
           c_customer(4) TYPE c VALUE 'CUST',
           c_9090 TYPE mac_t_bukrs VALUE '9090'.

CONSTANTS: c_close TYPE c VALUE 'C',
           c_open TYPE c VALUE 'O',
           c_nwsl LIKE skat-ktopl VALUE 'NWSL'.
*&-------------------
*& Ranges
*&-------------------
RANGES: r_prod_line FOR ce1anoc-kvgr2.

*&-------------------
*& Macros
*&-------------------
DEFINE mac_print_group1.
  write: /1 sy-vline no-gap,
          2(38) &1.
END-OF-DEFINITION.

DEFINE mac_print_group2.
  write: /1 sy-vline no-gap,
          3(38) &1.
END-OF-DEFINITION.

DEFINE mac_print_group3.
  write: /1 sy-vline no-gap,
          4(38) &1.
END-OF-DEFINITION.

DEFINE mac_print_group4.
  write: /1 sy-vline no-gap,
          5(38) &1.
END-OF-DEFINITION.

* for closed folder
DEFINE mac_print_group5.
  write: /1 sy-vline no-gap,
          4 icon_positive as icon hotspot no-gap,
          8(38) &1.
END-OF-DEFINITION.

* for openned folder
DEFINE mac_print_group6.
  write: /1 sy-vline no-gap,
          4 icon_negative as icon hotspot no-gap,
          8(38) &1.
END-OF-DEFINITION.

DEFINE mac_print_group7.
  write: /1 sy-vline no-gap,
          6 icon_positive as icon hotspot no-gap,
          10(30) &1.
END-OF-DEFINITION.

DEFINE mac_print_group8.
  write: /1 sy-vline no-gap,
          6 icon_negative as icon hotspot no-gap,
          10(30) &1.
END-OF-DEFINITION.

DEFINE mac_print_group9.
  write: /1 sy-vline no-gap,
          12(28) &1 hotspot.
END-OF-DEFINITION.

DEFINE mac_print_header.
  write: /1 sy-vline no-gap,
          40 sy-vline no-gap,
          41(56) &1 centered,                    "Pipeline Inspection
          97 sy-vline no-gap,
          98(37) &2 centered,                    "Pipeline Integrity
          135 sy-vline no-gap,
          136(94) &3 centered,                   "Inspection & integrity
          230 sy-vline no-gap,
          231(19) &4 centered,                   "Totals
          250 sy-vline.
END-OF-DEFINITION.

DEFINE mac_print_1.
  write:  40 sy-vline no-gap,
          41(11)   &1 right-justified decimals 0,      "geopig
          52 sy-vline no-gap,
          53(6)    &2 right-justified decimals 1,      "% of revenue
          59 sy-vline no-gap,
          60(11)   &3 right-justified decimals 0,      "MFL
          71 sy-vline no-gap,
          72(6)    &4 right-justified decimals 1,      "%
          78 sy-vline no-gap,
          79(11)   &5 right-justified decimals 0,      "geopig & MFL
          90 sy-vline no-gap,
          91(6)    &6 right-justified decimals 1,      "%
          97 sy-vline no-gap,
          98(11)   &7 right-justified decimals 0,      "repair work
          109 sy-vline no-gap,
          110(6)   &8 right-justified decimals 1,      "%
          116 sy-vline.
END-OF-DEFINITION.

DEFINE mac_print_2.
  write:  117(11)   &1 right-justified decimals 0,      "Integrity
          128  sy-vline no-gap,
          129(6)    &2 right-justified decimals 1,      "%
          135  sy-vline no-gap,
          136(11)   &3 right-justified decimals 0,      "geopig
          147 sy-vline no-gap,
          148(6)    &4 right-justified decimals 1,      "% of revenue
          154 sy-vline no-gap,
          155(11)   &5 right-justified decimals 0,      "MFL
          166 sy-vline no-gap,
          167(6)    &6 right-justified decimals 1,      "%
          173 sy-vline no-gap,
          174(11)   &7 right-justified decimals 0,      "geopig & MFL
          185 sy-vline no-gap,
          186(6)    &8 right-justified decimals 1,      "%0
          192 sy-vline.
END-OF-DEFINITION.

DEFINE mac_print_3.
  write:  193(11)   &1 right-justified decimals 0,      "Repair
          204 sy-vline no-gap,
          205(6)    &2 right-justified decimals 1,      "%
          211 sy-vline no-gap,
          212(11)   &3 right-justified decimals 0,      "Integrity
          223 sy-vline no-gap,
          224(6)    &4 right-justified decimals 1,      "%
          230 sy-vline no-gap,
          231(12)   &5 right-justified decimals 0,      "Totals
          243 sy-vline no-gap,
          244(6)    &6 right-justified decimals 1,      "%
          250 sy-vline no-gap.
END-OF-DEFINITION.

DEFINE mac_print_vline.
  write:  /1 sy-vline no-gap,
          40 sy-vline no-gap,
          52 sy-vline no-gap,
          59 sy-vline no-gap,
          71 sy-vline no-gap,
          78 sy-vline no-gap,
          90 sy-vline no-gap,
          97 sy-vline no-gap,
          109 sy-vline no-gap,
          116 sy-vline no-gap,
          128  sy-vline no-gap,
          135  sy-vline no-gap,
          147 sy-vline no-gap,
          154 sy-vline no-gap,
          166 sy-vline no-gap,
          173 sy-vline no-gap,
          185 sy-vline no-gap,
          192 sy-vline no-gap,
          204 sy-vline no-gap,
          211 sy-vline no-gap,
          223 sy-vline no-gap,
          230 sy-vline no-gap,
          243 sy-vline no-gap,
          250 sy-vline no-gap.
END-OF-DEFINITION.

*&-------------------
*& Selection Screen
*&-------------------
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_bukrs FOR ce1anoc-bukrs DEFAULT '9090',
                s_perio FOR ce1anoc-perio NO-EXTENSION,
                s_wwctr FOR ce1anoc-wwctr,
                s_land1 FOR ce1anoc-land1,
                s_kaufn FOR ce1anoc-rkaufnr,
                s_kndnr FOR ce1anoc-kndnr.
SELECTION-SCREEN SKIP 1.
PARAMETER: p_zero AS CHECKBOX DEFAULT ''.
* for debug use, When it is on, detailed data will be download to Excel
PARAMETER: p_debug TYPE c NO-DISPLAY DEFAULT ''.
SELECTION-SCREEN END OF BLOCK blk1.


************************ START OF MAIN PROGRAM *************************
*&------------------------
*& At selection-screen
*&------------------------

INITIALIZATION.

* initialize the selection screen
  mac_get_period_for_date c_9090 sy-datum g_fis_year g_fis_period.
  g_fiscal+0(4) = g_fis_year.
  g_fiscal+4(3) = g_fis_period.
  s_perio-low = g_fiscal.
  s_perio-high = g_fiscal.
  s_perio-sign = 'I'.
  s_perio-option = 'BT'.
  APPEND s_perio.


*&------------------------
*& at selection-screen
*&------------------------

AT SELECTION-SCREEN.
  CLEAR: it_company, it_temp_comp.
  REFRESH: it_company, it_temp_comp.
* validation
* check to make sure all of the companies selected have the
* same local currency
  IF NOT s_bukrs IS INITIAL.
    SELECT * FROM t001 INTO TABLE it_company
      WHERE bukrs IN s_bukrs.
    it_temp_comp[] = it_company[].

    LOOP AT it_company.
      LOOP AT it_temp_comp.
        IF it_temp_comp-waers <> it_company-waers.
          MESSAGE e001(zz) WITH 'Can not proceed.'
              'Companies selected do not have same Local Currency'.
        ENDIF.
      ENDLOOP.
    ENDLOOP.
  ENDIF.
*&------------------------
*& Start of Selection
*&------------------------

START-OF-SELECTION.

  SET PF-STATUS 'STATUS1'.

* Put product line code for Inspection, Integrity, Inspection &
* Integrity into a selection range
  PERFORM get_product_line_range.

* Create the report title
  g_from_period = s_perio-low+5(2).
  g_from_year = s_perio-low+0(4).

  CONCATENATE 'Period' g_from_period 'FY' g_from_year INTO
    g_second_line SEPARATED BY space.

  IF NOT s_perio-high IS INITIAL.
    g_to_period = s_perio-high+5(2).
    g_to_year = s_perio-high+0(4).
  CONCATENATE g_second_line 'To Period' g_to_period 'FY' g_to_year INTO
                                       g_second_line SEPARATED BY space.
  ENDIF.

  g_header =
    'BJ PIPELINE INSPECTION SERVICE - PROFITABILITY PER CONTRACT'.

* select records
  SELECT * FROM ce1anoc INTO TABLE it_anoc
    WHERE bukrs IN s_bukrs
    AND perio IN s_perio
    AND wwctr IN s_wwctr
    AND land1 IN s_land1
    AND rkaufnr IN s_kaufn
    AND kndnr IN s_kndnr
    AND kvgr2 IN r_prod_line.

  IF sy-subrc <> 0.
    WRITE: / 'No records found!'.
  ELSE.
    LOOP AT it_anoc.
      CLEAR: wa_bseg, g_year, wa_bkpf.
      g_year = it_anoc-perio+0(4).

      SELECT SINGLE * FROM bkpf INTO wa_bkpf
        WHERE bukrs = it_anoc-bukrs
        AND gjahr = g_year
        AND belnr = it_anoc-wwref.

*     for each selected records in ce1anoc, find the corresponding
*     record in bseg
      SELECT SINGLE * FROM bseg INTO wa_bseg
        WHERE bukrs = it_anoc-bukrs
        AND gjahr = g_year
        AND belnr = it_anoc-wwref
        AND buzei = it_anoc-wwitm.

      CHECK sy-subrc = 0.

*     determine credit or debit
      IF wa_bseg-shkzg = 'H'.
        wa_bseg-dmbtr = 0 - wa_bseg-dmbtr.
        wa_bseg-dmbe2 = 0 - wa_bseg-dmbe2.
      ENDIF.

*     get Revenue or Cost definition using the new table
      CLEAR: wa_rev_cost_defin.
      SELECT SINGLE * FROM zfrev_cost_defin
        INTO wa_rev_cost_defin
        WHERE options = 'EQ'
        AND acct_low = wa_bseg-hkont.
      IF sy-subrc <> 0.
        CLEAR: wa_rev_cost_defin.
        SELECT SINGLE * FROM zfrev_cost_defin
          INTO wa_rev_cost_defin
          WHERE options = 'BT'
          AND acct_low <= wa_bseg-hkont
          AND acct_high >= wa_bseg-hkont.
      ENDIF.

*     If the GL account number is found in the Revenue &
*     Cost definition table, store this record, otherwise
*     ignore it.
      IF sy-subrc = 0.
        it_result-bukrs = it_anoc-bukrs.         "company
        it_result-land1 = it_anoc-land1.         "country
        it_result-kndnr = it_anoc-kndnr.         "customer
        it_result-wwctr = it_anoc-wwctr.         "contract
        it_result-rkaufnr = it_anoc-rkaufnr.     "order
        it_result-belnr = wa_bseg-belnr.         "document number
        it_result-buzei = wa_bseg-buzei.         "document Line number
        it_result-zuonr = wa_bseg-zuonr.         "assignment
        it_result-budat = wa_bkpf-budat.         "posting date
        it_result-usnam = wa_bkpf-usnam.         "posted by
        it_result-hkont = wa_bseg-hkont.         "GL account
        it_result-dmbtr = wa_bseg-dmbtr.         "amount in Local Cur
        it_result-pswsl = wa_bseg-pswsl.         "Local currency
        it_result-dmbe2 = wa_bseg-dmbe2.         "amount in USD
        it_result-kvgr1 = it_anoc-kvgr1.         "job type
        it_result-kvgr2 = it_anoc-kvgr2.         "product line
        it_result-rev_cost_id = wa_rev_cost_defin-id.
        it_result-rev_cost_flg = wa_rev_cost_defin-id+0(1).
        it_result-state = c_close.
        APPEND it_result.

*       store these records in the download table
        MOVE-CORRESPONDING it_result TO it_download.
        IF it_result-rev_cost_flg = 'R'.
          it_download-dmbtr = 0 - it_download-dmbtr.
          it_download-dmbe2 = 0 - it_download-dmbe2.
        ENDIF.
        APPEND it_download.
      ENDIF.
    ENDLOOP.
  ENDIF.

* get all of the GL accounts for all of the Revenue and Direct Cost
* even if they don't have balance
  PERFORM get_all_gl_acct.

* put the amount into corresponding field of the internal table
* according to if it is revenue or cost, and it's job type
  PERFORM arrange_data.

* calculate summary for each revenue and cost and create the summary
* table
  PERFORM calculate_summary.

* write the report using default currency USD
  PERFORM write_report USING 'USD'.

* if debug is on, download the detailed records to Excel
  IF NOT p_debug IS INITIAL.
    PERFORM download_excel.
  ENDIF.

*&------------------------
*& At User Command
*&------------------------
AT USER-COMMAND.
  CASE sy-ucomm.
    WHEN 'LOCL'.
*     user want to display report in Local Currency
      SET PF-STATUS 'STATUS2'.
      PERFORM write_report USING 'LOCL'.
    WHEN 'USD'.
*     user want to display report in
      SET PF-STATUS 'STATUS1'.
      PERFORM write_report USING 'USD'.
    WHEN 'EXP'.
*     user want to expand all of the summarized Revenue and
*     direct cost.  Set the GUI according to the current
*     currency
      IF g_currency = 'USD'.
        SET PF-STATUS 'STATUS1'.
      ELSE.
        SET PF-STATUS 'STATUS2'.
      ENDIF.
      PERFORM expand_all.
      PERFORM write_report USING g_currency.
    WHEN 'COLP'.
*     user want to collapse all of the summarized Revenue and
*     direct cost.  Set the GUI according to the current
*     currency
      IF g_currency = 'USD'.
        SET PF-STATUS 'STATUS1'.
      ELSE.
        SET PF-STATUS 'STATUS2'.
      ENDIF.
      PERFORM collapse_all.
      PERFORM write_report USING g_currency.
  ENDCASE.

*&------------------------
*& At Line Selection
*&------------------------
AT LINE-SELECTION.
  sy-lsind = 0.
  CLEAR: wa_summary.

  IF NOT it_summary IS INITIAL.
*   when user clicked on a summary line, close or open the detailed
*   GL account line according to current stage
    wa_summary-state = it_summary-state.
    wa_summary-rev_cost_flg = it_summary-rev_cost_flg.
    wa_summary-rev_cost_id = it_summary-rev_cost_id.
    CLEAR: it_summary.

*   if current state is close, change it to open in order to open the
*   folder.  if current state is open, change it to close in order to
*   close the folder.
    IF wa_summary-state = c_close.
      wa_summary-state = c_open.
    ELSE.
      wa_summary-state = c_close.
    ENDIF.

*   modify the summary internal table.
    LOOP AT it_summary WHERE rev_cost_flg = wa_summary-rev_cost_flg
                         AND rev_cost_id = wa_summary-rev_cost_id.
      it_summary-state = wa_summary-state.
      MODIFY it_summary.
    ENDLOOP.
*   display the report
    PERFORM write_report USING g_currency.
  ELSEIF NOT it_doc IS INITIAL.
*   if clicked on document level, go to FB03 with the document number
*   and company code
    SET PARAMETER ID 'BLN' FIELD it_doc-belnr.
    SET PARAMETER ID 'BUK' FIELD it_doc-bukrs.
    CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
  ELSE.
*   if clicked on GL account level, close or open the detailed
*   FI documents belong to this GL account according to current stage
    LOOP AT it_result WHERE hkont = g_gl.

*   if current state is close, change it to open in order to open the
*   folder.  if current state is open, change it to close in order to
*   close the folder.
      IF it_result-state = c_close.
        it_result-state = c_open.
      ELSE.
        it_result-state = c_close.
      ENDIF.
      MODIFY it_result.
    ENDLOOP.
*   display the report
    PERFORM write_report USING g_currency.
  ENDIF.

*&------------------------
*& Top of Page
*&------------------------
TOP-OF-PAGE.
* Write report header and table header
  mac_generic_report_header g_header g_second_line
                            mac_c_true  mac_c_true .
  WRITE: / 'Display Currency: ' COLOR COL_POSITIVE,
           g_currency COLOR COL_POSITIVE.

  PERFORM write_header.

*&----------------------------------
*& Top of Page During Line selection
*&----------------------------------
TOP-OF-PAGE DURING LINE-SELECTION.
* Write report header and table header
  mac_generic_report_header g_header g_second_line
                            mac_c_true  mac_c_true .
  WRITE: / 'Display Currency: ' COLOR COL_POSITIVE,
           g_currency COLOR COL_POSITIVE.

  PERFORM write_header.


*&---------------------------------------------------------------------*
*&      Form  WRITE_HEADER
*&---------------------------------------------------------------------*
*&  write table column header
*&---------------------------------------------------------------------*
FORM write_header.

  FORMAT COLOR COL_HEADING.
  ULINE.
  mac_print_header 'Pipeline Inspection'
                   'Pipeline Integrity'
                   'Inspection and Integrity Combined'
                   'Totals'.
  ULINE.
  FORMAT RESET.
  FORMAT COLOR COL_HEADING INTENSIFIED OFF.
  mac_print_group1 ''.
  mac_print_1 '' '' '' '' 'geopig' '' '' ''.
  mac_print_2 'Repair' '' '' '' '' '' 'geopig' ''.
  mac_print_3 '' '' 'Repair' '' '' ''.

  mac_print_group1 ''.
  mac_print_1 'geopig' '%' 'MFL' '%' '& MFL' '%' 'Integrity' '%'.
  mac_print_2 'Work' '%' 'geopig' '%' 'MFL' '%' '&MFL' '%'.
  mac_print_3 'Integrity' '%' 'Work' '%' 'Amount' '%'.
  ULINE.
  FORMAT RESET.
  FORMAT INTENSIFIED OFF.
ENDFORM.                    " WRITE_HEADER

*&---------------------------------------------------------------------*
*&      Form  Calculate_Summary
*&---------------------------------------------------------------------*
*& Calculate Summary
*&---------------------------------------------------------------------*
FORM calculate_summary.

  DATA: l_totals_dmbe2 LIKE bseg-dmbe2,
        l_totals_dmbtr LIKE bseg-dmbtr,
        l_total_rev LIKE bseg-dmbe2,
        l_temp LIKE bseg-dmbe2,
        l_comp LIKE bseg-bukrs.

  DATA: wa_result LIKE it_result.

* sort the internal table
  SORT it_result BY rev_cost_flg DESCENDING
                    rev_cost_id ASCENDING.

  LOOP AT it_result.
    l_comp = it_result-bukrs.

    AT END OF rev_cost_id.
*     get total revenue for each job type for this revenue or
*     direct cost
      CLEAR: wa_result.
      PERFORM get_total_revenue USING it_result-bukrs
                                CHANGING wa_result.

      CLEAR: l_totals_dmbe2, l_totals_dmbtr.
      SUM.
*     calculate the total for this revenue or direct cost
      l_totals_dmbe2 =  it_result-insp_geop_dmbe2 +
                        it_result-insp_mfl_dmbe2 +
                        it_result-insp_both_dmbe2 +
                        it_result-intg_rep_dmbe2 +
                        it_result-intg_intg_dmbe2 +
                        it_result-insp_intg_geop_dmbe2 +
                        it_result-insp_intg_mfl_dmbe2 +
                        it_result-insp_intg_rep_dmbe2 +
                        it_result-insp_intg_intg_dmbe2 +
                        it_result-insp_intg_both_dmbe2.

      l_totals_dmbtr =  it_result-insp_geop_dmbtr +
                        it_result-insp_mfl_dmbtr +
                        it_result-insp_both_dmbtr +
                        it_result-intg_intg_dmbtr +
                        it_result-intg_rep_dmbtr +
                        it_result-insp_intg_geop_dmbtr +
                        it_result-insp_intg_mfl_dmbtr +
                        it_result-insp_intg_intg_dmbtr +
                        it_result-insp_intg_rep_dmbtr +
                        it_result-insp_intg_both_dmbtr.

      CLEAR: it_summary.
      MOVE-CORRESPONDING it_result TO it_summary.
      it_summary-total_dmbe2 = l_totals_dmbe2.
      it_summary-total_dmbtr = l_totals_dmbtr.
      it_summary-bukrs = l_comp.
      it_summary-state = c_close.

*     calculate percentage for each job type in both USD and Local
*     Currency
      CLEAR: l_temp.
      l_temp = abs( wa_result-insp_geop_dmbe2 ).
      IF l_temp > 1.
        it_summary-insp_geop_dmbe2_per = it_summary-insp_geop_dmbe2 /
                                     wa_result-insp_geop_dmbe2 * 100.
      ENDIF.
      CLEAR: l_temp.
      l_temp = abs( wa_result-insp_mfl_dmbe2 ).
      IF l_temp > 1.
        it_summary-insp_mfl_dmbe2_per = it_summary-insp_mfl_dmbe2 /
                         wa_result-insp_mfl_dmbe2 * 100.
      ENDIF.
      CLEAR: l_temp.
      l_temp = abs( wa_result-insp_both_dmbe2 ).
      IF l_temp > 1.
        it_summary-insp_both_dmbe2_per = it_summary-insp_both_dmbe2 /
                          wa_result-insp_both_dmbe2 * 100.
      ENDIF.
      CLEAR: l_temp.
      l_temp = abs( wa_result-intg_rep_dmbe2 ).
      IF l_temp > 1.
        it_summary-intg_rep_dmbe2_per = it_summary-intg_rep_dmbe2 /
                         wa_result-intg_rep_dmbe2 * 100.
      ENDIF.
      CLEAR: l_temp.
      l_temp = abs( wa_result-intg_intg_dmbe2 ).
      IF l_temp > 1.
        it_summary-intg_intg_dmbe2_per = it_summary-intg_intg_dmbe2 /
                         wa_result-intg_intg_dmbe2 * 100.
      ENDIF.
      CLEAR: l_temp.
      l_temp = abs( wa_result-insp_intg_geop_dmbe2 ).
      IF l_temp > 1.
        it_summary-insp_intg_geop_dmbe2_per =
                               it_summary-insp_intg_geop_dmbe2 /
                               wa_result-insp_intg_geop_dmbe2 * 100.
      ENDIF.
      CLEAR: l_temp.
      l_temp = abs( wa_result-insp_intg_mfl_dmbe2 ).
      IF l_temp > 1.
        it_summary-insp_intg_mfl_dmbe2_per =
                              it_summary-insp_intg_mfl_dmbe2 /
                              wa_result-insp_intg_mfl_dmbe2 * 100.
      ENDIF.
      CLEAR: l_temp.
      l_temp = abs( wa_result-insp_intg_rep_dmbe2 ).
      IF l_temp > 1.
        it_summary-insp_intg_rep_dmbe2_per =
                              it_summary-insp_intg_rep_dmbe2 /
                              wa_result-insp_intg_rep_dmbe2 * 100.
      ENDIF.
      CLEAR: l_temp.
      l_temp = abs( wa_result-insp_intg_intg_dmbe2 ).
      IF l_temp > 1.
        it_summary-insp_intg_intg_dmbe2_per =
                              it_summary-insp_intg_intg_dmbe2 /
                              wa_result-insp_intg_intg_dmbe2 * 100.
      ENDIF.
      CLEAR: l_temp.
      l_temp = abs( wa_result-insp_intg_both_dmbe2 ).
      IF l_temp > 1.
        it_summary-insp_intg_both_dmbe2_per =
                               it_summary-insp_intg_both_dmbe2 /
                               wa_result-insp_intg_both_dmbe2 * 100.
      ENDIF.

      l_total_rev = wa_result-insp_geop_dmbe2 +
                    wa_result-insp_mfl_dmbe2 +
                    wa_result-insp_both_dmbe2 +
                    wa_result-intg_rep_dmbe2 +
                    wa_result-intg_intg_dmbe2 +
                    wa_result-insp_intg_geop_dmbe2 +
                    wa_result-insp_intg_mfl_dmbe2 +
                    wa_result-insp_intg_rep_dmbe2 +
                    wa_result-insp_intg_intg_dmbe2 +
                    wa_result-insp_intg_both_dmbe2.
      CLEAR: l_temp.
      l_temp = abs( l_total_rev ).
      IF l_temp > 1.
        it_summary-total_dmbe2_per = it_summary-total_dmbe2 /
                                 l_total_rev * 100.
      ENDIF.

      CLEAR: l_temp.
      l_temp = abs( wa_result-insp_geop_dmbtr ).
      IF l_temp > 1.
        it_summary-insp_geop_dmbtr_per = it_summary-insp_geop_dmbtr /
                                     wa_result-insp_geop_dmbtr * 100.
      ENDIF.
      CLEAR: l_temp.
      l_temp = abs( wa_result-insp_mfl_dmbtr ).
      IF l_temp > 1.
        it_summary-insp_mfl_dmbtr_per = it_summary-insp_mfl_dmbtr /
                         wa_result-insp_mfl_dmbtr * 100.
      ENDIF.
      CLEAR: l_temp.
      l_temp = abs( wa_result-insp_both_dmbtr ).
      IF l_temp > 1.
        it_summary-insp_both_dmbtr_per = it_summary-insp_both_dmbtr /
                          wa_result-insp_both_dmbtr * 100.
      ENDIF.
      CLEAR: l_temp.
      l_temp = abs( wa_result-intg_rep_dmbtr ).
      IF l_temp > 1.
        it_summary-intg_rep_dmbtr_per = it_summary-intg_rep_dmbtr /
                         wa_result-intg_rep_dmbtr * 100.
      ENDIF.
      CLEAR: l_temp.
      l_temp = abs( wa_result-intg_intg_dmbtr ).
      IF l_temp > 1.
        it_summary-intg_intg_dmbtr_per = it_summary-intg_intg_dmbtr /
                         wa_result-intg_intg_dmbtr * 100.
      ENDIF.
      CLEAR: l_temp.
      l_temp = abs( wa_result-insp_intg_geop_dmbtr ).
      IF l_temp > 1.
        it_summary-insp_intg_geop_dmbtr_per =
                               it_summary-insp_intg_geop_dmbtr /
                               wa_result-insp_intg_geop_dmbtr * 100.
      ENDIF.
      CLEAR: l_temp.
      l_temp = abs( wa_result-insp_intg_mfl_dmbtr ).
      IF l_temp > 1.
        it_summary-insp_intg_mfl_dmbe2_per =
                              it_summary-insp_intg_mfl_dmbtr /
                              wa_result-insp_intg_mfl_dmbtr * 100.
      ENDIF.
      CLEAR: l_temp.
      l_temp = abs( wa_result-insp_intg_rep_dmbtr ).
      IF l_temp > 1.
        it_summary-insp_intg_rep_dmbe2_per =
                              it_summary-insp_intg_rep_dmbtr /
                              wa_result-insp_intg_rep_dmbtr * 100.
      ENDIF.
      CLEAR: l_temp.
      l_temp = abs( wa_result-insp_intg_intg_dmbtr ).
      IF l_temp > 1.
        it_summary-insp_intg_intg_dmbtr_per =
                              it_summary-insp_intg_intg_dmbtr /
                              wa_result-insp_intg_intg_dmbtr * 100.
      ENDIF.
      CLEAR: l_temp.
      l_temp = abs( wa_result-insp_intg_both_dmbtr ).
      IF l_temp > 1.
        it_summary-insp_intg_both_dmbtr_per =
                               it_summary-insp_intg_both_dmbtr /
                               wa_result-insp_intg_both_dmbtr * 100.
      ENDIF.

      l_total_rev = wa_result-insp_geop_dmbtr +
                    wa_result-insp_mfl_dmbtr +
                    wa_result-insp_both_dmbtr +
                    wa_result-intg_rep_dmbtr +
                    wa_result-intg_intg_dmbtr +
                    wa_result-insp_intg_geop_dmbtr +
                    wa_result-insp_intg_mfl_dmbtr +
                    wa_result-insp_intg_rep_dmbtr +
                    wa_result-insp_intg_intg_dmbtr +
                    wa_result-insp_intg_both_dmbtr.
      CLEAR: l_temp.
      l_temp = abs( l_total_rev ).
      IF l_temp > 1.
        it_summary-total_dmbtr_per = it_summary-total_dmbtr /
                                 l_total_rev * 100.
      ENDIF.

*     append to the summary table
      APPEND it_summary.
    ENDAT.
  ENDLOOP.
ENDFORM.                    " calculate_summary


*&---------------------------------------------------------------------*
*&      Form  WRITE_REPORT
*&---------------------------------------------------------------------*
*& Write report
*&---------------------------------------------------------------------*
FORM write_report USING p_ucomm.

  DATA: l_country LIKE t005t-landx,
        l_customer LIKE kna1-name1.

  DATA: l_tot_rev_insp_geop LIKE bseg-dmbe2,
        l_tot_rev_insp_mfl  LIKE bseg-dmbe2,
        l_tot_rev_insp_both LIKE bseg-dmbe2,
        l_tot_rev_intg_rep LIKE bseg-dmbe2,
        l_tot_rev_intg_intg LIKE bseg-dmbe2,
        l_tot_rev_insp_intg_geop LIKE bseg-dmbe2,
        l_tot_rev_insp_intg_mfl  LIKE bseg-dmbe2,
        l_tot_rev_insp_intg_rep  LIKE bseg-dmbe2,
        l_tot_rev_insp_intg_intg  LIKE bseg-dmbe2,
        l_tot_rev_insp_intg_both LIKE bseg-dmbe2,
        l_tot_rev_totals LIKE bseg-dmbe2,

        l_tot_rev_insp_geop_per LIKE bseg-dmbe2,
        l_tot_rev_insp_mfl_per  LIKE bseg-dmbe2,
        l_tot_rev_insp_both_per LIKE bseg-dmbe2,
        l_tot_rev_intg_rep_per LIKE bseg-dmbe2,
        l_tot_rev_intg_intg_per LIKE bseg-dmbe2,
        l_tot_rev_insp_intg_geop_per LIKE bseg-dmbe2,
        l_tot_rev_insp_intg_mfl_per  LIKE bseg-dmbe2,
        l_tot_rev_insp_intg_rep_per  LIKE bseg-dmbe2,
        l_tot_rev_insp_intg_intg_per  LIKE bseg-dmbe2,
        l_tot_rev_insp_intg_both_per LIKE bseg-dmbe2,
        l_tot_rev_totals_per LIKE bseg-dmbe2.

  DATA: l_tot_cost_insp_geop LIKE bseg-dmbe2,
        l_tot_cost_insp_mfl  LIKE bseg-dmbe2,
        l_tot_cost_insp_both LIKE bseg-dmbe2,
        l_tot_cost_intg_rep LIKE bseg-dmbe2,
        l_tot_cost_intg_intg LIKE bseg-dmbe2,
        l_tot_cost_insp_intg_geop LIKE bseg-dmbe2,
        l_tot_cost_insp_intg_mfl  LIKE bseg-dmbe2,
        l_tot_cost_insp_intg_rep  LIKE bseg-dmbe2,
        l_tot_cost_insp_intg_intg  LIKE bseg-dmbe2,
        l_tot_cost_insp_intg_both LIKE bseg-dmbe2,
        l_tot_cost_totals LIKE bseg-dmbe2,

        l_tot_cost_insp_geop_per LIKE bseg-dmbe2,
        l_tot_cost_insp_mfl_per  LIKE bseg-dmbe2,
        l_tot_cost_insp_both_per LIKE bseg-dmbe2,
        l_tot_cost_intg_rep_per LIKE bseg-dmbe2,
        l_tot_cost_intg_intg_per LIKE bseg-dmbe2,
        l_tot_cost_insp_intg_geop_per LIKE bseg-dmbe2,
        l_tot_cost_insp_intg_mfl_per  LIKE bseg-dmbe2,
        l_tot_cost_insp_intg_rep_per  LIKE bseg-dmbe2,
        l_tot_cost_insp_intg_intg_per  LIKE bseg-dmbe2,
        l_tot_cost_insp_intg_both_per LIKE bseg-dmbe2,
        l_tot_cost_totals_per LIKE bseg-dmbe2.

  DATA: l_diff_insp_geop LIKE bseg-dmbe2,
        l_diff_insp_mfl  LIKE bseg-dmbe2,
        l_diff_insp_both LIKE bseg-dmbe2,
        l_diff_intg_rep LIKE bseg-dmbe2,
        l_diff_intg_intg LIKE bseg-dmbe2,
        l_diff_insp_intg_geop LIKE bseg-dmbe2,
        l_diff_insp_intg_mfl  LIKE bseg-dmbe2,
        l_diff_insp_intg_rep  LIKE bseg-dmbe2,
        l_diff_insp_intg_intg  LIKE bseg-dmbe2,
        l_diff_insp_intg_both LIKE bseg-dmbe2,
        l_diff_totals LIKE bseg-dmbe2,

        l_diff_insp_geop_per LIKE bseg-dmbe2,
        l_diff_insp_mfl_per  LIKE bseg-dmbe2,
        l_diff_insp_both_per LIKE bseg-dmbe2,
        l_diff_intg_rep_per LIKE bseg-dmbe2,
        l_diff_intg_intg_per LIKE bseg-dmbe2,
        l_diff_insp_intg_geop_per LIKE bseg-dmbe2,
        l_diff_insp_intg_mfl_per  LIKE bseg-dmbe2,
        l_diff_insp_intg_rep_per  LIKE bseg-dmbe2,
        l_diff_insp_intg_intg_per  LIKE bseg-dmbe2,
        l_diff_insp_intg_both_per LIKE bseg-dmbe2,
        l_diff_totals_per LIKE bseg-dmbe2.

  DATA: l_rev_cost LIKE zfrev_cost_descp-description,
        l_temp LIKE bseg-dmbe2,
        wa_result LIKE it_result,
        l_state TYPE c.

* sort the internal table
  SORT it_summary BY rev_cost_flg DESCENDING
                     rev_cost_id ASCENDING
                     hkont ASCENDING.

* set indicator that report is the highest level
  sy-lsind = 0.

  LOOP AT it_summary.
*   if the currency is not USD, get the local currency
*   from the system
    IF p_ucomm <> 'USD'.
      SELECT SINGLE waers FROM t001 INTO g_currency
        WHERE bukrs = it_summary-bukrs.
    ELSE.
      g_currency = p_ucomm.
    ENDIF.
    l_state = it_summary-state.

*   write subtitle Revenu or Direct Cost
    AT NEW rev_cost_flg.
      FORMAT INTENSIFIED OFF.

      IF it_summary-rev_cost_flg = 'R'.
        mac_print_group2 'REVENUE'.
      ELSE.
        mac_print_group2 'DIRECT COST'.
      ENDIF.
      mac_print_1 '' '' '' '' '' '' '' ''.
      mac_print_2 '' '' '' '' '' '' '' ''.
      mac_print_3 '' '' '' '' '' ''.
      mac_print_vline.
*     get total revenue for each job type for this revenue or
*     direct cost
      CLEAR: wa_result.
      PERFORM get_total_revenue USING it_summary-bukrs
                                CHANGING wa_result.

    ENDAT.

*   get description for each revenue or direct cost
    CLEAR: l_rev_cost.
    SELECT SINGLE description FROM zfrev_cost_descp INTO l_rev_cost
      WHERE id = it_summary-rev_cost_id.

*   if option of showing 0 balanced entries, then display all of the
*   revenue and direct cost
*   if option is not selected, then just display the ones with balances
    IF g_currency = 'USD'.
      IF ( NOT p_zero IS INITIAL ) OR
         ( p_zero IS INITIAL AND
           ( it_summary-insp_geop_dmbe2 <> 0 OR
             it_summary-insp_mfl_dmbe2 <> 0 OR
             it_summary-insp_both_dmbe2 <> 0 OR
             it_summary-intg_intg_dmbe2 <> 0 OR
             it_summary-intg_rep_dmbe2 <> 0 OR
             it_summary-insp_intg_geop_dmbe2 <> 0 OR
             it_summary-insp_intg_mfl_dmbe2 <> 0 OR
             it_summary-insp_intg_both_dmbe2 <> 0 OR
             it_summary-insp_intg_intg_dmbe2 <> 0 OR
             it_summary-insp_intg_rep_dmbe2 <> 0 OR
             it_summary-total_dmbe2 <> 0 ) ).
        IF it_summary-state = c_close.
          mac_print_group5 l_rev_cost.
        ELSEIF it_summary-state = c_open.
          mac_print_group6 l_rev_cost.
        ENDIF.
      ENDIF.
    ELSE.
      IF ( NOT p_zero IS INITIAL ) OR
        ( p_zero IS INITIAL AND
          ( it_summary-insp_geop_dmbtr <> 0 OR
            it_summary-insp_mfl_dmbtr <> 0 OR
            it_summary-insp_both_dmbtr <> 0 OR
            it_summary-intg_intg_dmbtr <> 0 OR
            it_summary-intg_rep_dmbtr <> 0 OR
            it_summary-insp_intg_geop_dmbtr <> 0 OR
            it_summary-insp_intg_mfl_dmbtr <> 0 OR
            it_summary-insp_intg_both_dmbtr <> 0 OR
            it_summary-insp_intg_intg_dmbtr <> 0 OR
            it_summary-insp_intg_rep_dmbtr <> 0 OR
            it_summary-total_dmbtr <> 0 ) ) .

        IF it_summary-state = c_close.
          mac_print_group5 l_rev_cost.
        ELSEIF it_summary-state = c_open.
          mac_print_group6 l_rev_cost.
        ENDIF.
      ENDIF.
    ENDIF.

*     if the report currency is in USD
    IF ( g_currency = 'USD' ) AND
            ( ( NOT p_zero IS INITIAL ) OR
              ( p_zero IS INITIAL AND
              ( it_summary-insp_geop_dmbe2 <> 0 OR
                it_summary-insp_mfl_dmbe2 <> 0 OR
                it_summary-insp_both_dmbe2 <> 0 OR
                it_summary-intg_intg_dmbe2 <> 0 OR
                it_summary-intg_rep_dmbe2 <> 0 OR
                it_summary-insp_intg_geop_dmbe2 <> 0 OR
                it_summary-insp_intg_mfl_dmbe2 <> 0 OR
                it_summary-insp_intg_both_dmbe2 <> 0 OR
                it_summary-insp_intg_intg_dmbe2 <> 0 OR
                it_summary-insp_intg_rep_dmbe2 <> 0 OR
                it_summary-total_dmbe2 <> 0 ) ) ).

*       write amount for each column
      mac_print_1 it_summary-insp_geop_dmbe2
                  it_summary-insp_geop_dmbe2_per
                  it_summary-insp_mfl_dmbe2
                  it_summary-insp_mfl_dmbe2_per
                  it_summary-insp_both_dmbe2
                  it_summary-insp_both_dmbe2_per
                  it_summary-intg_intg_dmbe2
                  it_summary-intg_intg_dmbe2_per.

      mac_print_2 it_summary-intg_rep_dmbe2
                  it_summary-intg_rep_dmbe2_per
                  it_summary-insp_intg_geop_dmbe2
                  it_summary-insp_intg_geop_dmbe2_per
                  it_summary-insp_intg_mfl_dmbe2
                  it_summary-insp_intg_mfl_dmbe2_per
                  it_summary-insp_intg_both_dmbe2
                  it_summary-insp_intg_both_dmbe2_per.

      mac_print_3 it_summary-insp_intg_intg_dmbe2
                  it_summary-insp_intg_intg_dmbe2_per
                  it_summary-insp_intg_rep_dmbe2
                  it_summary-insp_intg_rep_dmbe2_per
                  it_summary-total_dmbe2
                  it_summary-total_dmbe2_per.

      HIDE: it_summary-rev_cost_flg, it_summary-rev_cost_id,
            it_summary-state.

*   write in local currency
    ELSEIF ( g_currency <> 'USD' ) AND
           ( ( NOT p_zero IS INITIAL ) OR
             ( p_zero IS INITIAL AND
             ( it_summary-insp_geop_dmbtr <> 0 OR
               it_summary-insp_mfl_dmbtr <> 0 OR
               it_summary-insp_both_dmbtr <> 0 OR
               it_summary-intg_intg_dmbtr <> 0 OR
               it_summary-intg_rep_dmbtr <> 0 OR
               it_summary-insp_intg_geop_dmbtr <> 0 OR
               it_summary-insp_intg_mfl_dmbtr <> 0 OR
               it_summary-insp_intg_both_dmbtr <> 0 OR
               it_summary-insp_intg_intg_dmbtr <> 0 OR
               it_summary-insp_intg_rep_dmbtr <> 0 OR
               it_summary-total_dmbtr <> 0 ) ) ).

*       write amount for each column
      mac_print_1 it_summary-insp_geop_dmbtr
                  it_summary-insp_geop_dmbtr_per
                  it_summary-insp_mfl_dmbtr
                  it_summary-insp_mfl_dmbtr_per
                  it_summary-insp_both_dmbtr
                  it_summary-insp_both_dmbtr_per
                  it_summary-intg_intg_dmbtr
                  it_summary-intg_intg_dmbtr_per.

      mac_print_2 it_summary-intg_rep_dmbtr
                  it_summary-intg_rep_dmbtr_per
                  it_summary-insp_intg_geop_dmbtr
                  it_summary-insp_intg_geop_dmbtr_per
                  it_summary-insp_intg_mfl_dmbtr
                  it_summary-insp_intg_mfl_dmbtr_per
                  it_summary-insp_intg_both_dmbtr
                  it_summary-insp_intg_both_dmbtr_per.

      mac_print_3 it_summary-insp_intg_intg_dmbtr
                  it_summary-insp_intg_intg_dmbtr_per
                  it_summary-insp_intg_rep_dmbtr
                  it_summary-insp_intg_rep_dmbtr_per
                  it_summary-total_dmbtr
                  it_summary-total_dmbtr_per.

      HIDE: it_summary-rev_cost_flg, it_summary-rev_cost_id,
            it_summary-state.
    ENDIF.

*   if the state of this summary line is open, display all
*   the detailed GL accounts
    IF it_summary-state = c_open.
      PERFORM write_gl_details USING it_summary wa_result.
    ENDIF.

*   Write subtotal
    AT END OF rev_cost_flg.
      FORMAT COLOR COL_TOTAL INTENSIFIED OFF.
      IF it_summary-rev_cost_flg = 'R'.
        mac_print_group2 'TOTAL REVENUE'.
      ELSE.
        mac_print_group2 'TOTAL DIRECT COST'.
      ENDIF.

      SUM.

*     write sub total in USD and store sub total for revenues
*     and direct cost
      IF g_currency = 'USD'.
*       store sub total for the difference calculation
        IF it_summary-rev_cost_flg = 'R'.
          CLEAR:l_tot_rev_insp_geop, l_tot_rev_insp_mfl,
                l_tot_rev_insp_both,
                l_tot_rev_intg_rep, l_tot_rev_intg_intg,
                l_tot_rev_insp_intg_geop, l_tot_rev_insp_intg_mfl,
                l_tot_rev_insp_intg_intg, l_tot_rev_insp_intg_rep,
                l_tot_rev_insp_intg_both,
                l_tot_rev_totals.

          CLEAR:l_tot_rev_insp_geop_per, l_tot_rev_insp_mfl_per,
                l_tot_rev_insp_both_per,
                l_tot_rev_intg_rep_per, l_tot_rev_intg_intg_per,
                l_tot_rev_insp_intg_geop_per,
                l_tot_rev_insp_intg_mfl_per,
                l_tot_rev_insp_intg_intg_per,
                l_tot_rev_insp_intg_rep_per,
                l_tot_rev_insp_intg_both_per,
                l_tot_rev_totals_per.

          l_tot_rev_insp_geop = it_summary-insp_geop_dmbe2.
          l_tot_rev_insp_mfl = it_summary-insp_mfl_dmbe2.
          l_tot_rev_insp_both = it_summary-insp_both_dmbe2.
          l_tot_rev_intg_intg = it_summary-intg_intg_dmbe2.
          l_tot_rev_intg_rep = it_summary-intg_rep_dmbe2.
          l_tot_rev_insp_intg_geop = it_summary-insp_intg_geop_dmbe2.
          l_tot_rev_insp_intg_mfl = it_summary-insp_intg_mfl_dmbe2.
          l_tot_rev_insp_intg_intg = it_summary-insp_intg_intg_dmbe2.
          l_tot_rev_insp_intg_rep = it_summary-insp_intg_rep_dmbe2.
          l_tot_rev_insp_intg_both = it_summary-insp_intg_both_dmbe2.
          l_tot_rev_totals = it_summary-total_dmbe2.

          l_tot_rev_totals_per = it_summary-total_dmbe2_per.
          l_tot_rev_insp_geop_per = it_summary-insp_geop_dmbe2_per.
          l_tot_rev_insp_mfl_per = it_summary-insp_mfl_dmbe2_per.
          l_tot_rev_insp_both_per = it_summary-insp_both_dmbe2_per.
          l_tot_rev_intg_intg_per = it_summary-intg_intg_dmbe2_per.
          l_tot_rev_intg_rep_per = it_summary-intg_rep_dmbe2_per.
          l_tot_rev_insp_intg_geop_per =
                              it_summary-insp_intg_geop_dmbe2_per.
          l_tot_rev_insp_intg_mfl_per =
                              it_summary-insp_intg_mfl_dmbe2_per.
          l_tot_rev_insp_intg_intg_per =
                              it_summary-insp_intg_intg_dmbe2_per.
          l_tot_rev_insp_intg_rep_per =
                              it_summary-insp_intg_rep_dmbe2_per.
          l_tot_rev_insp_intg_both_per =
                              it_summary-insp_intg_both_dmbe2_per.

        ELSE.
          CLEAR: l_tot_cost_insp_geop, l_tot_cost_insp_mfl,
                 l_tot_cost_insp_both,
                 l_tot_cost_intg_rep, l_tot_cost_intg_intg,
                 l_tot_cost_insp_intg_geop, l_tot_cost_insp_intg_mfl,
                 l_tot_cost_insp_intg_intg, l_tot_cost_insp_intg_rep,
                 l_tot_cost_insp_intg_both,
                 l_tot_cost_totals.

          CLEAR: l_tot_cost_insp_geop_per, l_tot_cost_insp_mfl_per,
                 l_tot_cost_insp_both_per,
                 l_tot_cost_intg_rep_per, l_tot_cost_intg_intg_per,
                 l_tot_cost_insp_intg_geop_per,
                 l_tot_cost_insp_intg_mfl_per,
                 l_tot_cost_insp_intg_intg_per,
                 l_tot_cost_insp_intg_rep_per,
                 l_tot_cost_insp_intg_both_per,
                 l_tot_cost_totals_per.


          l_tot_cost_insp_geop = it_summary-insp_geop_dmbe2.
          l_tot_cost_insp_mfl = it_summary-insp_mfl_dmbe2.
          l_tot_cost_insp_both = it_summary-insp_both_dmbe2.
          l_tot_cost_intg_intg = it_summary-intg_intg_dmbe2.
          l_tot_cost_intg_rep = it_summary-intg_rep_dmbe2.
          l_tot_cost_insp_intg_geop = it_summary-insp_intg_geop_dmbe2.
          l_tot_cost_insp_intg_mfl = it_summary-insp_intg_mfl_dmbe2.
          l_tot_cost_insp_intg_intg = it_summary-insp_intg_intg_dmbe2.
          l_tot_cost_insp_intg_rep = it_summary-insp_intg_rep_dmbe2.
          l_tot_cost_insp_intg_both = it_summary-insp_intg_both_dmbe2.
          l_tot_cost_totals = it_summary-total_dmbe2.

          l_tot_cost_totals_per = it_summary-total_dmbe2_per.
          l_tot_cost_insp_geop_per = it_summary-insp_geop_dmbe2_per.
          l_tot_cost_insp_mfl_per = it_summary-insp_mfl_dmbe2_per.
          l_tot_cost_insp_both_per = it_summary-insp_both_dmbe2_per.
          l_tot_cost_intg_intg_per = it_summary-intg_intg_dmbe2_per.
          l_tot_cost_intg_rep_per = it_summary-intg_rep_dmbe2_per.
          l_tot_cost_insp_intg_geop_per =
                                it_summary-insp_intg_geop_dmbe2_per.
          l_tot_cost_insp_intg_mfl_per =
                                it_summary-insp_intg_mfl_dmbe2_per.
          l_tot_cost_insp_intg_intg_per =
                                it_summary-insp_intg_intg_dmbe2_per.
          l_tot_cost_insp_intg_rep_per =
                                it_summary-insp_intg_rep_dmbe2_per.
          l_tot_cost_insp_intg_both_per =
                                it_summary-insp_intg_both_dmbe2_per.
        ENDIF.

*       write subtotal
        mac_print_1 it_summary-insp_geop_dmbe2
                    it_summary-insp_geop_dmbe2_per
                    it_summary-insp_mfl_dmbe2
                    it_summary-insp_mfl_dmbe2_per
                    it_summary-insp_both_dmbe2
                    it_summary-insp_both_dmbe2_per
                    it_summary-intg_intg_dmbe2
                    it_summary-intg_intg_dmbe2_per.

        mac_print_2 it_summary-intg_rep_dmbe2
                    it_summary-intg_rep_dmbe2_per
                    it_summary-insp_intg_geop_dmbe2
                    it_summary-insp_intg_geop_dmbe2_per
                    it_summary-insp_intg_mfl_dmbe2
                    it_summary-insp_intg_mfl_dmbe2_per
                    it_summary-insp_intg_both_dmbe2
                    it_summary-insp_intg_both_dmbe2_per.

        mac_print_3 it_summary-insp_intg_intg_dmbe2
                    it_summary-insp_intg_intg_dmbe2_per
                    it_summary-insp_intg_rep_dmbe2
                    it_summary-insp_intg_rep_dmbe2_per
                    it_summary-total_dmbe2 it_summary-total_dmbe2_per.

      ELSE.
*       same as above but in local currency
        IF it_summary-rev_cost_flg = 'R'.
          CLEAR:l_tot_rev_insp_geop, l_tot_rev_insp_mfl,
                l_tot_rev_insp_both,
                l_tot_rev_intg_rep, l_tot_rev_intg_intg,
                l_tot_rev_insp_intg_geop, l_tot_rev_insp_intg_mfl,
                l_tot_rev_insp_intg_intg, l_tot_rev_insp_intg_rep,
                l_tot_rev_insp_intg_both,
                l_tot_rev_totals.

          CLEAR:l_tot_rev_insp_geop_per, l_tot_rev_insp_mfl_per,
                l_tot_rev_insp_both_per,
                l_tot_rev_intg_rep_per, l_tot_rev_intg_intg_per,
                l_tot_rev_insp_intg_geop_per,
                l_tot_rev_insp_intg_mfl_per,
                l_tot_rev_insp_intg_intg_per,
                l_tot_rev_insp_intg_rep_per,
                l_tot_rev_insp_intg_both_per,
                l_tot_rev_totals_per.

          l_tot_rev_insp_geop = it_summary-insp_geop_dmbtr.
          l_tot_rev_insp_mfl = it_summary-insp_mfl_dmbtr.
          l_tot_rev_insp_both = it_summary-insp_both_dmbtr.
          l_tot_rev_intg_intg = it_summary-intg_intg_dmbtr.
          l_tot_rev_intg_rep = it_summary-intg_rep_dmbtr.
          l_tot_rev_insp_intg_geop = it_summary-insp_intg_geop_dmbtr.
          l_tot_rev_insp_intg_mfl = it_summary-insp_intg_mfl_dmbtr.
          l_tot_rev_insp_intg_intg = it_summary-insp_intg_intg_dmbtr.
          l_tot_rev_insp_intg_rep = it_summary-insp_intg_rep_dmbtr.
          l_tot_rev_insp_intg_both = it_summary-insp_intg_both_dmbtr.
          l_tot_rev_totals = it_summary-total_dmbtr.

          l_tot_rev_totals_per = it_summary-total_dmbtr_per.
          l_tot_rev_insp_geop_per = it_summary-insp_geop_dmbtr_per.
          l_tot_rev_insp_mfl_per = it_summary-insp_mfl_dmbtr_per.
          l_tot_rev_insp_both_per = it_summary-insp_both_dmbtr_per.
          l_tot_rev_intg_intg_per = it_summary-intg_intg_dmbtr_per.
          l_tot_rev_intg_rep_per = it_summary-intg_rep_dmbtr_per.
          l_tot_rev_insp_intg_geop_per =
                                  it_summary-insp_intg_geop_dmbtr_per.
          l_tot_rev_insp_intg_mfl_per =
                                  it_summary-insp_intg_mfl_dmbtr_per.
          l_tot_rev_insp_intg_intg_per =
                                  it_summary-insp_intg_intg_dmbtr_per.
          l_tot_rev_insp_intg_rep_per =
                                  it_summary-insp_intg_rep_dmbtr_per.
          l_tot_rev_insp_intg_both_per =
                                  it_summary-insp_intg_both_dmbtr_per.

        ELSE.
          CLEAR: l_tot_cost_insp_geop, l_tot_cost_insp_mfl,
                 l_tot_cost_insp_both,
                 l_tot_cost_intg_rep, l_tot_cost_intg_intg,
                 l_tot_cost_insp_intg_geop, l_tot_cost_insp_intg_mfl,
                 l_tot_cost_insp_intg_intg, l_tot_cost_insp_intg_rep,
                 l_tot_cost_insp_intg_both,
                 l_tot_cost_totals.

          CLEAR: l_tot_cost_insp_geop_per, l_tot_cost_insp_mfl_per,
                 l_tot_cost_insp_both_per,
                 l_tot_cost_intg_rep_per, l_tot_cost_intg_intg_per,
                 l_tot_cost_insp_intg_geop_per,
                 l_tot_cost_insp_intg_mfl_per,
                 l_tot_cost_insp_intg_intg_per,
                 l_tot_cost_insp_intg_rep_per,
                 l_tot_cost_insp_intg_both_per,
                 l_tot_cost_totals_per.

          l_tot_cost_insp_geop = it_summary-insp_geop_dmbtr.
          l_tot_cost_insp_mfl = it_summary-insp_mfl_dmbtr.
          l_tot_cost_insp_both = it_summary-insp_both_dmbtr.
          l_tot_cost_intg_intg = it_summary-intg_intg_dmbtr.
          l_tot_cost_intg_rep = it_summary-intg_rep_dmbtr.
          l_tot_cost_insp_intg_geop = it_summary-insp_intg_geop_dmbtr.
          l_tot_cost_insp_intg_mfl = it_summary-insp_intg_mfl_dmbtr.
          l_tot_cost_insp_intg_intg = it_summary-insp_intg_intg_dmbtr.
          l_tot_cost_insp_intg_rep = it_summary-insp_intg_rep_dmbtr.
          l_tot_cost_insp_intg_both = it_summary-insp_intg_both_dmbtr.
          l_tot_cost_totals = it_summary-total_dmbtr.

          l_tot_cost_totals_per = it_summary-total_dmbtr_per.
          l_tot_cost_insp_geop_per = it_summary-insp_geop_dmbtr_per.
          l_tot_cost_insp_mfl_per = it_summary-insp_mfl_dmbtr_per.
          l_tot_cost_insp_both_per = it_summary-insp_both_dmbtr_per.
          l_tot_cost_intg_intg_per = it_summary-intg_intg_dmbtr_per.
          l_tot_cost_intg_rep_per = it_summary-intg_rep_dmbtr_per.
          l_tot_cost_insp_intg_geop_per =
                                  it_summary-insp_intg_geop_dmbtr_per.
          l_tot_cost_insp_intg_mfl_per =
                                  it_summary-insp_intg_mfl_dmbtr_per.
          l_tot_cost_insp_intg_intg_per =
                                  it_summary-insp_intg_intg_dmbtr_per.
          l_tot_cost_insp_intg_rep_per =
                                  it_summary-insp_intg_rep_dmbtr_per.
          l_tot_cost_insp_intg_both_per =
                                  it_summary-insp_intg_both_dmbtr_per.

        ENDIF.
        mac_print_1 it_summary-insp_geop_dmbtr
                    it_summary-insp_geop_dmbtr_per
                    it_summary-insp_mfl_dmbtr
                    it_summary-insp_mfl_dmbtr_per
                    it_summary-insp_both_dmbtr
                    it_summary-insp_both_dmbtr_per
                    it_summary-intg_intg_dmbtr
                    it_summary-intg_intg_dmbtr_per.
        mac_print_2 it_summary-intg_rep_dmbtr
                    it_summary-intg_rep_dmbtr_per
                    it_summary-insp_intg_geop_dmbtr
                    it_summary-insp_intg_geop_dmbtr_per
                    it_summary-insp_intg_mfl_dmbtr
                    it_summary-insp_intg_mfl_dmbtr_per
                    it_summary-insp_intg_both_dmbtr
                    it_summary-insp_intg_both_dmbtr_per.
        mac_print_3 it_summary-insp_intg_intg_dmbtr
                    it_summary-insp_intg_intg_dmbtr_per
                    it_summary-insp_intg_rep_dmbtr
                    it_summary-insp_intg_rep_dmbtr_per
                    it_summary-total_dmbtr it_summary-total_dmbtr_per.

      ENDIF.
      FORMAT RESET.
      mac_print_vline.
    ENDAT.

    AT LAST.
*     at the end calculate the difference between
*     total cost and total revenue
      FORMAT COLOR COL_TOTAL INTENSIFIED ON.
      mac_print_group1 'DIRECT CONTRIBUTION MARGIN'.

      CLEAR: l_diff_insp_geop, l_diff_insp_mfl, l_diff_insp_both,
             l_diff_intg_intg, l_diff_intg_rep,
             l_diff_insp_intg_geop, l_diff_insp_intg_mfl,
             l_diff_insp_intg_intg, l_diff_insp_intg_rep,
             l_diff_insp_intg_both,
             l_diff_totals.

      CLEAR: l_diff_insp_geop_per, l_diff_insp_mfl_per,
             l_diff_insp_both_per,
             l_diff_intg_intg_per, l_diff_intg_rep_per,
             l_diff_insp_intg_geop_per, l_diff_insp_intg_mfl_per,
             l_diff_insp_intg_intg_per, l_diff_insp_intg_rep_per,
             l_diff_insp_intg_both_per,
             l_diff_totals_per.

      l_diff_insp_geop = l_tot_rev_insp_geop - l_tot_cost_insp_geop.
      l_diff_insp_mfl  = l_tot_rev_insp_mfl  - l_tot_cost_insp_mfl.
      l_diff_insp_both = l_tot_rev_insp_both - l_tot_cost_insp_both.
      l_diff_intg_intg = l_tot_rev_intg_intg - l_tot_cost_intg_intg.
      l_diff_intg_rep = l_tot_rev_intg_rep - l_tot_cost_intg_rep.
      l_diff_insp_intg_geop = l_tot_rev_insp_intg_geop -
                                  l_tot_cost_insp_intg_geop.
      l_diff_insp_intg_mfl = l_tot_rev_insp_intg_mfl -
                                 l_tot_cost_insp_intg_mfl.
      l_diff_insp_intg_intg = l_tot_rev_insp_intg_intg -
                                  l_tot_cost_insp_intg_intg.
      l_diff_insp_intg_rep = l_tot_rev_insp_intg_rep -
                                  l_tot_cost_insp_intg_rep.
      l_diff_insp_intg_both = l_tot_rev_insp_intg_both -
                                  l_tot_cost_insp_intg_both.
      l_diff_totals = l_tot_rev_totals - l_tot_cost_totals.

      l_diff_totals_per = l_tot_rev_totals_per
                            - l_tot_cost_totals_per.
      l_diff_insp_geop_per = l_tot_rev_insp_geop_per -
                              l_tot_cost_insp_geop_per.
      l_diff_insp_mfl_per  = l_tot_rev_insp_mfl_per  -
                              l_tot_cost_insp_mfl_per.
      l_diff_insp_both_per = l_tot_rev_insp_both_per -
                              l_tot_cost_insp_both_per.
      l_diff_intg_intg_per = l_tot_rev_intg_intg_per -
                              l_tot_cost_intg_intg_per.
      l_diff_intg_rep_per = l_tot_rev_intg_rep_per -
                              l_tot_cost_intg_rep_per.
      l_diff_insp_intg_geop_per = l_tot_rev_insp_intg_geop_per -
                                  l_tot_cost_insp_intg_geop_per.
      l_diff_insp_intg_mfl_per = l_tot_rev_insp_intg_mfl_per -
                                 l_tot_cost_insp_intg_mfl_per.
      l_diff_insp_intg_intg_per = l_tot_rev_insp_intg_intg_per -
                                  l_tot_cost_insp_intg_intg_per.
      l_diff_insp_intg_rep_per = l_tot_rev_insp_intg_rep_per -
                                  l_tot_cost_insp_intg_rep_per.
      l_diff_insp_intg_both_per = l_tot_rev_insp_intg_both_per -
                                  l_tot_cost_insp_intg_both_per.

      mac_print_1 l_diff_insp_geop l_diff_insp_geop_per
                  l_diff_insp_mfl l_diff_insp_mfl_per
                  l_diff_insp_both l_diff_insp_both_per
                  l_diff_intg_intg l_diff_intg_intg_per.
      mac_print_2 l_diff_intg_rep l_diff_intg_rep_per
                  l_diff_insp_intg_geop l_diff_insp_intg_geop_per
                  l_diff_insp_intg_mfl l_diff_insp_intg_mfl_per
                  l_diff_insp_intg_both l_diff_insp_intg_both_per.
      mac_print_3 l_diff_insp_intg_intg l_diff_insp_intg_intg_per
                  l_diff_insp_intg_rep l_diff_insp_intg_rep_per
                  l_diff_totals l_diff_totals_per.
      FORMAT RESET.
      ULINE.

*     clear all local variables
      CLEAR:l_tot_rev_insp_geop, l_tot_rev_insp_mfl,
            l_tot_rev_insp_both,
            l_tot_rev_intg_rep, l_tot_rev_intg_intg,
            l_tot_rev_insp_intg_geop, l_tot_rev_insp_intg_mfl,
            l_tot_rev_insp_intg_rep, l_tot_rev_insp_intg_intg,
            l_tot_rev_insp_intg_both,
            l_tot_rev_totals.

      CLEAR:l_tot_cost_insp_geop, l_tot_cost_insp_mfl,
            l_tot_cost_insp_both,
            l_tot_cost_intg_rep, l_tot_cost_intg_intg,
            l_tot_cost_insp_intg_geop, l_tot_cost_insp_intg_mfl,
            l_tot_cost_insp_intg_rep, l_tot_cost_insp_intg_intg,
            l_tot_cost_insp_intg_both,
            l_tot_cost_totals.

      CLEAR:l_diff_insp_geop, l_diff_insp_mfl, l_diff_insp_both,
            l_diff_intg_rep, l_diff_intg_intg,
            l_diff_insp_intg_geop, l_diff_insp_intg_mfl,
            l_diff_insp_intg_rep, l_diff_insp_intg_intg,
            l_diff_insp_intg_both,
            l_diff_totals.

      CLEAR:l_tot_rev_insp_geop_per, l_tot_rev_insp_mfl_per,
            l_tot_rev_insp_both_per,
            l_tot_rev_intg_rep_per, l_tot_rev_intg_intg_per,
            l_tot_rev_insp_intg_geop_per, l_tot_rev_insp_intg_mfl_per,
            l_tot_rev_insp_intg_rep_per, l_tot_rev_insp_intg_intg_per,
            l_tot_rev_insp_intg_both_per,
            l_tot_rev_totals_per.

      CLEAR:l_tot_cost_insp_geop_per, l_tot_cost_insp_mfl_per,
            l_tot_cost_insp_both_per,
            l_tot_cost_intg_rep_per, l_tot_cost_intg_intg_per,
            l_tot_cost_insp_intg_geop_per, l_tot_cost_insp_intg_mfl_per,
            l_tot_cost_insp_intg_rep_per, l_tot_cost_insp_intg_intg_per,
            l_tot_cost_insp_intg_both_per,
            l_tot_cost_totals_per.

      CLEAR:l_diff_insp_geop_per, l_diff_insp_mfl_per,
            l_diff_insp_both_per,
            l_diff_intg_rep_per, l_diff_intg_intg_per,
            l_diff_insp_intg_geop_per, l_diff_insp_intg_mfl_per,
            l_diff_insp_intg_rep_per, l_diff_insp_intg_intg_per,
            l_diff_insp_intg_both_per,
            l_diff_totals_per.

    ENDAT.
    CLEAR: it_summary.
  ENDLOOP.

* display the selection options at the end of the report
  PERFORM display_selection_options.

ENDFORM.                    " WRITE_REPORT

*&---------------------------------------------------------------------*
*&      Form  WRITE_GL_DETAILS
*&---------------------------------------------------------------------*
*&  Display detailed GL account lines
*&---------------------------------------------------------------------*
FORM write_gl_details USING    p_summary STRUCTURE it_summary
                               p_result STRUCTURE it_result.
  DATA: l_state TYPE c,
        l_gl_temp LIKE bseg-hkont,
        l_total_rev LIKE bseg-dmbtr,
        l_temp LIKE bseg-dmbtr,
        l_gl_descript LIKE skat-txt50.

  DATA: l_insp_geop_dmbtr LIKE bseg-dmbtr,
        l_insp_mfl_dmbtr LIKE bseg-dmbtr,
        l_insp_both_dmbtr LIKE bseg-dmbtr,
        l_intg_rep_dmbtr LIKE bseg-dmbtr,
        l_intg_intg_dmbtr LIKE bseg-dmbtr,
        l_insp_intg_geop_dmbtr LIKE bseg-dmbtr,
        l_insp_intg_mfl_dmbtr LIKE bseg-dmbtr,
        l_insp_intg_rep_dmbtr LIKE bseg-dmbtr,
        l_insp_intg_intg_dmbtr LIKE bseg-dmbtr,
        l_insp_intg_both_dmbtr LIKE bseg-dmbtr,
        l_insp_geop_dmbtr_per LIKE bseg-dmbtr,
        l_insp_mfl_dmbtr_per LIKE bseg-dmbtr,
        l_insp_both_dmbtr_per LIKE bseg-dmbtr,
        l_intg_rep_dmbtr_per LIKE bseg-dmbtr,
        l_intg_intg_dmbtr_per LIKE bseg-dmbtr,
        l_insp_intg_geop_dmbtr_per LIKE bseg-dmbtr,
        l_insp_intg_mfl_dmbtr_per LIKE bseg-dmbtr,
        l_insp_intg_rep_dmbtr_per LIKE bseg-dmbtr,
        l_insp_intg_intg_dmbtr_per LIKE bseg-dmbtr,
        l_insp_intg_both_dmbtr_per LIKE bseg-dmbtr,
        l_insp_geop_dmbe2 LIKE bseg-dmbe2,
        l_insp_mfl_dmbe2 LIKE bseg-dmbe2,
        l_insp_both_dmbe2 LIKE bseg-dmbe2,
        l_intg_rep_dmbe2 LIKE bseg-dmbe2,
        l_intg_intg_dmbe2 LIKE bseg-dmbe2,
        l_insp_intg_geop_dmbe2 LIKE bseg-dmbe2,
        l_insp_intg_mfl_dmbe2 LIKE bseg-dmbe2,
        l_insp_intg_rep_dmbe2 LIKE bseg-dmbe2,
        l_insp_intg_intg_dmbe2 LIKE bseg-dmbe2,
        l_insp_intg_both_dmbe2 LIKE bseg-dmbe2,
        l_total_dmbe2 LIKE bseg-dmbe2,
        l_total_dmbtr LIKE bseg-dmbtr,
        l_insp_geop_dmbe2_per LIKE bseg-dmbe2,
        l_insp_mfl_dmbe2_per LIKE bseg-dmbe2,
        l_insp_both_dmbe2_per LIKE bseg-dmbe2,
        l_intg_rep_dmbe2_per LIKE bseg-dmbe2,
        l_intg_intg_dmbe2_per LIKE bseg-dmbe2,
        l_insp_intg_geop_dmbe2_per LIKE bseg-dmbe2,
        l_insp_intg_mfl_dmbe2_per LIKE bseg-dmbe2,
        l_insp_intg_rep_dmbe2_per LIKE bseg-dmbe2,
        l_insp_intg_intg_dmbe2_per LIKE bseg-dmbe2,
        l_insp_intg_both_dmbe2_per LIKE bseg-dmbe2,
        l_total_dmbe2_per LIKE bseg-dmbe2,
        l_total_dmbtr_per LIKE bseg-dmbtr.

  SORT it_result BY rev_cost_flg DESCENDING
                    rev_cost_id ASCENDING
                    hkont ASCENDING.

  CLEAR: g_gl.

  LOOP AT it_result WHERE rev_cost_flg = p_summary-rev_cost_flg
                      AND rev_cost_id = p_summary-rev_cost_id.

    IF g_gl IS INITIAL.
      g_gl = it_result-hkont.
      l_state = it_result-state.
      CLEAR: l_gl_descript.
*     for each different GL account get the description for it
      SELECT SINGLE txt20 INTO l_gl_descript FROM skat
        WHERE spras = sy-langu
        AND ktopl = c_nwsl
        AND saknr = g_gl.

*     display GL account number and description  together
      l_gl_temp = g_gl.
      SHIFT l_gl_temp LEFT DELETING LEADING '0'.
      CONCATENATE l_gl_temp l_gl_descript INTO l_gl_descript
          SEPARATED BY space.
    ENDIF.


*   at the end of each GL account, calculate percentages, and
*   total
    IF ( g_gl <> it_result-hkont ).
      IF g_currency = 'USD'.
        l_total_dmbe2 =  l_insp_geop_dmbe2 +
                          l_insp_mfl_dmbe2 +
                          l_insp_both_dmbe2 +
                          l_intg_rep_dmbe2 +
                          l_intg_intg_dmbe2 +
                          l_insp_intg_geop_dmbe2 +
                          l_insp_intg_mfl_dmbe2 +
                          l_insp_intg_rep_dmbe2 +
                          l_insp_intg_intg_dmbe2 +
                          l_insp_intg_both_dmbe2.

*     calculate percentage for each job type
        CLEAR: l_temp.
        l_temp = abs( p_result-insp_geop_dmbe2 ).
        IF l_temp > 1.
          l_insp_geop_dmbe2_per = l_insp_geop_dmbe2 /
                                  p_result-insp_geop_dmbe2 * 100.
        ENDIF.
        CLEAR: l_temp.
        l_temp = abs( p_result-insp_mfl_dmbe2 ).
        IF l_temp > 1.
          l_insp_mfl_dmbe2_per = l_insp_mfl_dmbe2 /
                           p_result-insp_mfl_dmbe2 * 100.
        ENDIF.
        CLEAR: l_temp.
        l_temp = abs( p_result-insp_both_dmbe2 ).
        IF l_temp > 1.
          l_insp_both_dmbe2_per = l_insp_both_dmbe2 /
                            p_result-insp_both_dmbe2 * 100.
        ENDIF.
        CLEAR: l_temp.
        l_temp = abs( p_result-intg_rep_dmbe2 ).
        IF l_temp > 1.
          l_intg_rep_dmbe2_per = l_intg_rep_dmbe2 /
                           p_result-intg_rep_dmbe2 * 100.
        ENDIF.
        CLEAR: l_temp.
        l_temp = abs( p_result-intg_intg_dmbe2 ).
        IF l_temp > 1.
          l_intg_intg_dmbe2_per = l_intg_intg_dmbe2 /
                           p_result-intg_intg_dmbe2 * 100.
        ENDIF.
        CLEAR: l_temp.
        l_temp = abs( p_result-insp_intg_geop_dmbe2 ).
        IF l_temp > 1.
          l_insp_intg_geop_dmbe2_per =
                                 l_insp_intg_geop_dmbe2 /
                                 p_result-insp_intg_geop_dmbe2 * 100.
        ENDIF.
        CLEAR: l_temp.
        l_temp = abs( p_result-insp_intg_mfl_dmbe2 ).
        IF l_temp > 1.
          l_insp_intg_mfl_dmbe2_per =
                                l_insp_intg_mfl_dmbe2 /
                                p_result-insp_intg_mfl_dmbe2 * 100.
        ENDIF.
        CLEAR: l_temp.
        l_temp = abs( p_result-insp_intg_rep_dmbe2 ).
        IF l_temp > 1.
          l_insp_intg_rep_dmbe2_per =
                                l_insp_intg_rep_dmbe2 /
                                p_result-insp_intg_rep_dmbe2 * 100.
        ENDIF.
        CLEAR: l_temp.
        l_temp = abs( p_result-insp_intg_intg_dmbe2 ).
        IF l_temp > 1.
          l_insp_intg_intg_dmbe2_per =
                                l_insp_intg_intg_dmbe2 /
                                p_result-insp_intg_intg_dmbe2 * 100.
        ENDIF.
        CLEAR: l_temp.
        l_temp = abs( p_result-insp_intg_both_dmbe2 ).
        IF l_temp > 1.
          l_insp_intg_both_dmbe2_per =
                                 l_insp_intg_both_dmbe2 /
                                 p_result-insp_intg_both_dmbe2 * 100.
        ENDIF.

        l_total_rev = p_result-insp_geop_dmbe2 +
                      p_result-insp_mfl_dmbe2 +
                      p_result-insp_both_dmbe2 +
                      p_result-intg_rep_dmbe2 +
                      p_result-intg_intg_dmbe2 +
                      p_result-insp_intg_geop_dmbe2 +
                      p_result-insp_intg_mfl_dmbe2 +
                      p_result-insp_intg_rep_dmbe2 +
                      p_result-insp_intg_intg_dmbe2 +
                      p_result-insp_intg_both_dmbe2.
        CLEAR: l_temp.
        l_temp = abs( l_total_rev ).
        IF l_temp > 1.
          l_total_dmbe2_per = l_total_dmbe2 / l_total_rev * 100.
        ENDIF.

*       if show 0 balance option is selected, display all GL accounts
*       else, only show the GL accounts with balances
        IF ( NOT p_zero IS INITIAL ) OR
           ( p_zero IS INITIAL AND
             ( l_insp_geop_dmbe2 <> 0 OR
               l_insp_mfl_dmbe2 <> 0 OR
               l_insp_both_dmbe2 <> 0 OR
               l_intg_intg_dmbe2 <> 0 OR
               l_intg_rep_dmbe2 <> 0 OR
               l_insp_intg_geop_dmbe2 <> 0 OR
               l_insp_intg_mfl_dmbe2 <> 0 OR
               l_insp_intg_both_dmbe2 <> 0 OR
               l_insp_intg_intg_dmbe2 <> 0 OR
               l_insp_intg_rep_dmbe2 <> 0 OR
               l_total_dmbe2 <> 0 ) ).

          IF l_state = c_close.
            mac_print_group7 l_gl_descript.
          ELSE.
            mac_print_group8 l_gl_descript.
          ENDIF.

          mac_print_1 l_insp_geop_dmbe2
                      l_insp_geop_dmbe2_per
                      l_insp_mfl_dmbe2
                      l_insp_mfl_dmbe2_per
                      l_insp_both_dmbe2
                      l_insp_both_dmbe2_per
                      l_intg_intg_dmbe2
                      l_intg_intg_dmbe2_per.

          mac_print_2 l_intg_rep_dmbe2
                      l_intg_rep_dmbe2_per
                      l_insp_intg_geop_dmbe2
                      l_insp_intg_geop_dmbe2_per
                      l_insp_intg_mfl_dmbe2
                      l_insp_intg_mfl_dmbe2_per
                      l_insp_intg_both_dmbe2
                      l_insp_intg_both_dmbe2_per.

          mac_print_3 l_insp_intg_intg_dmbe2
                      l_insp_intg_intg_dmbe2_per
                      l_insp_intg_rep_dmbe2
                      l_insp_intg_rep_dmbe2_per
                      l_total_dmbe2
                      l_total_dmbe2_per.
          HIDE: g_gl.

        ENDIF.

      ELSE.
*       do calculation in local currency
        l_total_dmbtr =  l_insp_geop_dmbtr +
                          l_insp_mfl_dmbtr +
                          l_insp_both_dmbtr +
                          l_intg_intg_dmbtr +
                          l_intg_rep_dmbtr +
                          l_insp_intg_geop_dmbtr +
                          l_insp_intg_mfl_dmbtr +
                          l_insp_intg_intg_dmbtr +
                          l_insp_intg_rep_dmbtr +
                          l_insp_intg_both_dmbtr.
        CLEAR: l_temp.
        l_temp = abs( p_result-insp_geop_dmbtr ).
        IF l_temp > 1.
          l_insp_geop_dmbtr_per = l_insp_geop_dmbtr /
                                       p_result-insp_geop_dmbtr * 100.
        ENDIF.
        CLEAR: l_temp.
        l_temp = abs( p_result-insp_mfl_dmbtr ).
        IF l_temp > 1.
          l_insp_mfl_dmbtr_per = l_insp_mfl_dmbtr /
                           p_result-insp_mfl_dmbtr * 100.
        ENDIF.
        CLEAR: l_temp.
        l_temp = abs( p_result-insp_both_dmbtr ).
        IF l_temp > 1.
          l_insp_both_dmbtr_per = l_insp_both_dmbtr /
                            p_result-insp_both_dmbtr * 100.
        ENDIF.
        CLEAR: l_temp.
        l_temp = abs( p_result-intg_rep_dmbtr ).
        IF l_temp > 1.
          l_intg_rep_dmbtr_per = l_intg_rep_dmbtr /
                           p_result-intg_rep_dmbtr * 100.
        ENDIF.
        CLEAR: l_temp.
        l_temp = abs( p_result-intg_intg_dmbtr ).
        IF l_temp > 1.
          l_intg_intg_dmbtr_per = l_intg_intg_dmbtr /
                           p_result-intg_intg_dmbtr * 100.
        ENDIF.
        CLEAR: l_temp.
        l_temp = abs( p_result-insp_intg_geop_dmbtr ).
        IF l_temp > 1.
          l_insp_intg_geop_dmbtr_per =
                                 l_insp_intg_geop_dmbtr /
                                 p_result-insp_intg_geop_dmbtr * 100.
        ENDIF.
        CLEAR: l_temp.
        l_temp = abs( p_result-insp_intg_mfl_dmbtr ).
        IF l_temp > 1.
          l_insp_intg_mfl_dmbe2_per =
                                l_insp_intg_mfl_dmbtr /
                                p_result-insp_intg_mfl_dmbtr * 100.
        ENDIF.
        CLEAR: l_temp.
        l_temp = abs( p_result-insp_intg_rep_dmbtr ).
        IF l_temp > 1.
          l_insp_intg_rep_dmbe2_per =
                                l_insp_intg_rep_dmbtr /
                                p_result-insp_intg_rep_dmbtr * 100.
        ENDIF.
        CLEAR: l_temp.
        l_temp = abs( p_result-insp_intg_intg_dmbtr ).
        IF l_temp > 1.
          l_insp_intg_intg_dmbtr_per =
                                l_insp_intg_intg_dmbtr /
                                p_result-insp_intg_intg_dmbtr * 100.
        ENDIF.
        CLEAR: l_temp.
        l_temp = abs( p_result-insp_intg_both_dmbtr ).
        IF l_temp > 1.
          l_insp_intg_both_dmbtr_per =
                                 l_insp_intg_both_dmbtr /
                                 p_result-insp_intg_both_dmbtr * 100.
        ENDIF.

        l_total_rev = p_result-insp_geop_dmbtr +
                      p_result-insp_mfl_dmbtr +
                      p_result-insp_both_dmbtr +
                      p_result-intg_rep_dmbtr +
                      p_result-intg_intg_dmbtr +
                      p_result-insp_intg_geop_dmbtr +
                      p_result-insp_intg_mfl_dmbtr +
                      p_result-insp_intg_rep_dmbtr +
                      p_result-insp_intg_intg_dmbtr +
                      p_result-insp_intg_both_dmbtr.
        CLEAR: l_temp.
        l_temp = abs( l_total_rev ).
        IF l_temp > 1.
          l_total_dmbtr_per = l_total_dmbtr / l_total_rev * 100.
        ENDIF.

*       display all GL accounts if show 0 balance option is selected
*       else only show the ones with balance
        IF ( NOT p_zero IS INITIAL ) OR
           ( p_zero IS INITIAL AND
             ( l_insp_geop_dmbtr <> 0 OR
               l_insp_mfl_dmbtr <> 0 OR
               l_insp_both_dmbtr <> 0 OR
               l_intg_intg_dmbtr <> 0 OR
               l_intg_rep_dmbtr <> 0 OR
               l_insp_intg_geop_dmbtr <> 0 OR
               l_insp_intg_mfl_dmbtr <> 0 OR
               l_insp_intg_both_dmbtr <> 0 OR
               l_insp_intg_intg_dmbtr <> 0 OR
               l_insp_intg_rep_dmbtr <> 0 OR
               l_total_dmbtr <> 0 ) ).

          IF l_state = c_close.
            mac_print_group7 l_gl_descript.
          ELSE.
            mac_print_group8 l_gl_descript.
          ENDIF.

          mac_print_1 l_insp_geop_dmbtr
                      l_insp_geop_dmbtr_per
                      l_insp_mfl_dmbtr
                      l_insp_mfl_dmbtr_per
                      l_insp_both_dmbtr
                      l_insp_both_dmbtr_per
                      l_intg_intg_dmbtr
                      l_intg_intg_dmbtr_per.

          mac_print_2 l_intg_rep_dmbtr
                      l_intg_rep_dmbtr_per
                      l_insp_intg_geop_dmbtr
                      l_insp_intg_geop_dmbtr_per
                      l_insp_intg_mfl_dmbtr
                      l_insp_intg_mfl_dmbtr_per
                      l_insp_intg_both_dmbtr
                      l_insp_intg_both_dmbtr_per.

          mac_print_3 l_insp_intg_intg_dmbtr
                      l_insp_intg_intg_dmbtr_per
                      l_insp_intg_rep_dmbtr
                      l_insp_intg_rep_dmbtr_per
                      l_total_dmbtr
                      l_total_dmbtr_per.
          HIDE: g_gl.
        ENDIF.
      ENDIF.

      IF l_state = c_open.
        PERFORM write_document_detail.
      ENDIF.

*     clear all the variables and move to the next GL account
      g_gl = it_result-hkont.
      l_state = it_result-state.

      CLEAR: l_gl_descript.
      SELECT SINGLE txt20 INTO l_gl_descript FROM skat
        WHERE spras = sy-langu
        AND ktopl = c_nwsl
        AND saknr = g_gl.

      l_gl_temp = g_gl.
      SHIFT l_gl_temp LEFT DELETING LEADING '0'.
      CONCATENATE l_gl_temp l_gl_descript INTO l_gl_descript
          SEPARATED BY space.

      CLEAR: l_insp_geop_dmbtr, l_insp_geop_dmbtr_per,
             l_insp_mfl_dmbtr,l_insp_mfl_dmbtr_per,
             l_insp_both_dmbtr, l_insp_both_dmbtr_per,
             l_intg_intg_dmbtr, l_intg_intg_dmbtr_per,
             l_intg_rep_dmbtr, l_intg_rep_dmbtr_per,
             l_insp_intg_geop_dmbtr, l_insp_intg_geop_dmbtr_per,
             l_insp_intg_mfl_dmbtr, l_insp_intg_mfl_dmbtr_per,
             l_insp_intg_intg_dmbtr, l_insp_intg_intg_dmbtr_per,
             l_insp_intg_rep_dmbtr, l_insp_intg_rep_dmbtr_per,
             l_insp_intg_both_dmbtr, l_insp_intg_both_dmbtr,
             l_total_dmbtr, l_total_dmbtr_per.

      CLEAR: l_insp_geop_dmbe2, l_insp_geop_dmbe2_per,
             l_insp_mfl_dmbe2,l_insp_mfl_dmbe2_per,
             l_insp_both_dmbe2, l_insp_both_dmbe2_per,
             l_intg_intg_dmbe2, l_intg_intg_dmbe2_per,
             l_intg_rep_dmbe2, l_intg_rep_dmbe2_per,
             l_insp_intg_geop_dmbe2, l_insp_intg_geop_dmbe2_per,
             l_insp_intg_mfl_dmbe2, l_insp_intg_mfl_dmbe2_per,
             l_insp_intg_intg_dmbe2, l_insp_intg_intg_dmbe2_per,
             l_insp_intg_rep_dmbe2, l_insp_intg_rep_dmbe2_per,
             l_insp_intg_both_dmbe2, l_insp_intg_both_dmbe2,
             l_total_dmbe2, l_total_dmbe2_per.

    ENDIF.

*   start to add up the values for the GL account
    IF g_currency <> 'USD'.
      l_insp_geop_dmbtr = l_insp_geop_dmbtr + it_result-insp_geop_dmbtr.
      l_insp_mfl_dmbtr = l_insp_mfl_dmbtr + it_result-insp_mfl_dmbtr.
      l_insp_both_dmbtr = l_insp_both_dmbtr + it_result-insp_both_dmbtr.
      l_intg_rep_dmbtr = l_intg_rep_dmbtr + it_result-intg_rep_dmbtr.
      l_intg_intg_dmbtr = l_intg_intg_dmbtr + it_result-intg_intg_dmbtr.
      l_insp_intg_geop_dmbtr = l_insp_intg_geop_dmbtr +
                               it_result-insp_intg_geop_dmbtr.
      l_insp_intg_mfl_dmbtr = l_insp_intg_mfl_dmbtr +
                               it_result-insp_intg_mfl_dmbtr.
      l_insp_intg_intg_dmbtr = l_insp_intg_intg_dmbtr +
                               it_result-insp_intg_intg_dmbtr.
      l_insp_intg_rep_dmbtr = l_insp_intg_rep_dmbtr +
                               it_result-insp_intg_rep_dmbtr.
      l_insp_intg_both_dmbtr = l_insp_intg_both_dmbtr +
                               it_result-insp_intg_both_dmbtr.
    ELSE.
      l_insp_geop_dmbe2 = l_insp_geop_dmbe2 + it_result-insp_geop_dmbe2.
      l_insp_mfl_dmbe2 = l_insp_mfl_dmbe2 + it_result-insp_mfl_dmbe2.
      l_insp_both_dmbe2 = l_insp_both_dmbe2 + it_result-insp_both_dmbe2.
      l_intg_rep_dmbe2 = l_intg_rep_dmbe2 + it_result-intg_rep_dmbe2.
      l_intg_intg_dmbe2 = l_intg_intg_dmbe2 + it_result-intg_intg_dmbe2.
      l_insp_intg_geop_dmbe2 = l_insp_intg_geop_dmbe2 +
                               it_result-insp_intg_geop_dmbe2.
      l_insp_intg_mfl_dmbe2 = l_insp_intg_mfl_dmbe2 +
                               it_result-insp_intg_mfl_dmbe2.
      l_insp_intg_intg_dmbe2 = l_insp_intg_intg_dmbe2 +
                               it_result-insp_intg_intg_dmbe2.
      l_insp_intg_rep_dmbe2 = l_insp_intg_rep_dmbe2 +
                               it_result-insp_intg_rep_dmbe2.
      l_insp_intg_both_dmbe2 = l_insp_intg_both_dmbe2 +
                               it_result-insp_intg_both_dmbe2.
    ENDIF.

  ENDLOOP.

* write the last GL account information
  IF g_currency = 'USD'.
    l_total_dmbe2 =  l_insp_geop_dmbe2 +
                      l_insp_mfl_dmbe2 +
                      l_insp_both_dmbe2 +
                      l_intg_rep_dmbe2 +
                      l_intg_intg_dmbe2 +
                      l_insp_intg_geop_dmbe2 +
                      l_insp_intg_mfl_dmbe2 +
                      l_insp_intg_rep_dmbe2 +
                      l_insp_intg_intg_dmbe2 +
                      l_insp_intg_both_dmbe2.

*     calculate percentage for each job type
    CLEAR: l_temp.
    l_temp = abs( p_result-insp_geop_dmbe2 ).
    IF l_temp > 1.
      l_insp_geop_dmbe2_per = l_insp_geop_dmbe2 /
                              p_result-insp_geop_dmbe2 * 100.
    ENDIF.
    CLEAR: l_temp.
    l_temp = abs( p_result-insp_mfl_dmbe2 ).
    IF l_temp > 1.
      l_insp_mfl_dmbe2_per = l_insp_mfl_dmbe2 /
                       p_result-insp_mfl_dmbe2 * 100.
    ENDIF.
    CLEAR: l_temp.
    l_temp = abs( p_result-insp_both_dmbe2 ).
    IF l_temp > 1.
      l_insp_both_dmbe2_per = l_insp_both_dmbe2 /
                        p_result-insp_both_dmbe2 * 100.
    ENDIF.
    CLEAR: l_temp.
    l_temp = abs( p_result-intg_rep_dmbe2 ).
    IF l_temp > 1.
      l_intg_rep_dmbe2_per = l_intg_rep_dmbe2 /
                       p_result-intg_rep_dmbe2 * 100.
    ENDIF.
    CLEAR: l_temp.
    l_temp = abs( p_result-intg_intg_dmbe2 ).
    IF l_temp > 1.
      l_intg_intg_dmbe2_per = l_intg_intg_dmbe2 /
                       p_result-intg_intg_dmbe2 * 100.
    ENDIF.
    CLEAR: l_temp.
    l_temp = abs( p_result-insp_intg_geop_dmbe2 ).
    IF l_temp > 1.
      l_insp_intg_geop_dmbe2_per =
                             l_insp_intg_geop_dmbe2 /
                             p_result-insp_intg_geop_dmbe2 * 100.
    ENDIF.
    CLEAR: l_temp.
    l_temp = abs( p_result-insp_intg_mfl_dmbe2 ).
    IF l_temp > 1.
      l_insp_intg_mfl_dmbe2_per =
                            l_insp_intg_mfl_dmbe2 /
                            p_result-insp_intg_mfl_dmbe2 * 100.
    ENDIF.
    CLEAR: l_temp.
    l_temp = abs( p_result-insp_intg_rep_dmbe2 ).
    IF l_temp > 1.
      l_insp_intg_rep_dmbe2_per =
                            l_insp_intg_rep_dmbe2 /
                            p_result-insp_intg_rep_dmbe2 * 100.
    ENDIF.
    CLEAR: l_temp.
    l_temp = abs( p_result-insp_intg_intg_dmbe2 ).
    IF l_temp > 1.
      l_insp_intg_intg_dmbe2_per =
                            l_insp_intg_intg_dmbe2 /
                            p_result-insp_intg_intg_dmbe2 * 100.
    ENDIF.
    CLEAR: l_temp.
    l_temp = abs( p_result-insp_intg_both_dmbe2 ).
    IF l_temp > 1.
      l_insp_intg_both_dmbe2_per =
                             l_insp_intg_both_dmbe2 /
                             p_result-insp_intg_both_dmbe2 * 100.
    ENDIF.

    l_total_rev = p_result-insp_geop_dmbe2 +
                  p_result-insp_mfl_dmbe2 +
                  p_result-insp_both_dmbe2 +
                  p_result-intg_rep_dmbe2 +
                  p_result-intg_intg_dmbe2 +
                  p_result-insp_intg_geop_dmbe2 +
                  p_result-insp_intg_mfl_dmbe2 +
                  p_result-insp_intg_rep_dmbe2 +
                  p_result-insp_intg_intg_dmbe2 +
                  p_result-insp_intg_both_dmbe2.
    CLEAR: l_temp.
    l_temp = abs( l_total_rev ).
    IF l_temp > 1.
      l_total_dmbe2_per = l_total_dmbe2 / l_total_rev * 100.
    ENDIF.

    IF ( NOT p_zero IS INITIAL ) OR
       ( p_zero IS INITIAL AND
         ( l_insp_geop_dmbe2 <> 0 OR
           l_insp_mfl_dmbe2 <> 0 OR
           l_insp_both_dmbe2 <> 0 OR
           l_intg_intg_dmbe2 <> 0 OR
           l_intg_rep_dmbe2 <> 0 OR
           l_insp_intg_geop_dmbe2 <> 0 OR
           l_insp_intg_mfl_dmbe2 <> 0 OR
           l_insp_intg_both_dmbe2 <> 0 OR
           l_insp_intg_intg_dmbe2 <> 0 OR
           l_insp_intg_rep_dmbe2 <> 0 OR
           l_total_dmbe2 <> 0 ) ).


      IF l_state = c_close.
        mac_print_group7 l_gl_descript.
      ELSE.
        mac_print_group8 l_gl_descript.
      ENDIF.
      mac_print_1 l_insp_geop_dmbe2
                  l_insp_geop_dmbe2_per
                  l_insp_mfl_dmbe2
                  l_insp_mfl_dmbe2_per
                  l_insp_both_dmbe2
                  l_insp_both_dmbe2_per
                  l_intg_intg_dmbe2
                  l_intg_intg_dmbe2_per.

      mac_print_2 l_intg_rep_dmbe2
                  l_intg_rep_dmbe2_per
                  l_insp_intg_geop_dmbe2
                  l_insp_intg_geop_dmbe2_per
                  l_insp_intg_mfl_dmbe2
                  l_insp_intg_mfl_dmbe2_per
                  l_insp_intg_both_dmbe2
                  l_insp_intg_both_dmbe2_per.

      mac_print_3 l_insp_intg_intg_dmbe2
                  l_insp_intg_intg_dmbe2_per
                  l_insp_intg_rep_dmbe2
                  l_insp_intg_rep_dmbe2_per
                  l_total_dmbe2
                  l_total_dmbe2_per.

      HIDE: g_gl.
    ENDIF.
  ELSE.
    l_total_dmbtr =  l_insp_geop_dmbtr +
                      l_insp_mfl_dmbtr +
                      l_insp_both_dmbtr +
                      l_intg_intg_dmbtr +
                      l_intg_rep_dmbtr +
                      l_insp_intg_geop_dmbtr +
                      l_insp_intg_mfl_dmbtr +
                      l_insp_intg_intg_dmbtr +
                      l_insp_intg_rep_dmbtr +
                      l_insp_intg_both_dmbtr.
    CLEAR: l_temp.
    l_temp = abs( p_result-insp_geop_dmbtr ).
    IF l_temp > 1.
      l_insp_geop_dmbtr_per = l_insp_geop_dmbtr /
                                   p_result-insp_geop_dmbtr * 100.
    ENDIF.
    CLEAR: l_temp.
    l_temp = abs( p_result-insp_mfl_dmbtr ).
    IF l_temp > 1.
      l_insp_mfl_dmbtr_per = l_insp_mfl_dmbtr /
                       p_result-insp_mfl_dmbtr * 100.
    ENDIF.
    CLEAR: l_temp.
    l_temp = abs( p_result-insp_both_dmbtr ).
    IF l_temp > 1.
      l_insp_both_dmbtr_per = l_insp_both_dmbtr /
                        p_result-insp_both_dmbtr * 100.
    ENDIF.
    CLEAR: l_temp.
    l_temp = abs( p_result-intg_rep_dmbtr ).
    IF l_temp > 1.
      l_intg_rep_dmbtr_per = l_intg_rep_dmbtr /
                       p_result-intg_rep_dmbtr * 100.
    ENDIF.
    CLEAR: l_temp.
    l_temp = abs( p_result-intg_intg_dmbtr ).
    IF l_temp > 1.
      l_intg_intg_dmbtr_per = l_intg_intg_dmbtr /
                       p_result-intg_intg_dmbtr * 100.
    ENDIF.
    CLEAR: l_temp.
    l_temp = abs( p_result-insp_intg_geop_dmbtr ).
    IF l_temp > 1.
      l_insp_intg_geop_dmbtr_per =
                             l_insp_intg_geop_dmbtr /
                             p_result-insp_intg_geop_dmbtr * 100.
    ENDIF.
    CLEAR: l_temp.
    l_temp = abs( p_result-insp_intg_mfl_dmbtr ).
    IF l_temp > 1.
      l_insp_intg_mfl_dmbe2_per =
                            l_insp_intg_mfl_dmbtr /
                            p_result-insp_intg_mfl_dmbtr * 100.
    ENDIF.
    CLEAR: l_temp.
    l_temp = abs( p_result-insp_intg_rep_dmbtr ).
    IF l_temp > 1.
      l_insp_intg_rep_dmbe2_per =
                            l_insp_intg_rep_dmbtr /
                            p_result-insp_intg_rep_dmbtr * 100.
    ENDIF.
    CLEAR: l_temp.
    l_temp = abs( p_result-insp_intg_intg_dmbtr ).
    IF l_temp > 1.
      l_insp_intg_intg_dmbtr_per =
                            l_insp_intg_intg_dmbtr /
                            p_result-insp_intg_intg_dmbtr * 100.
    ENDIF.
    CLEAR: l_temp.
    l_temp = abs( p_result-insp_intg_both_dmbtr ).
    IF l_temp > 1.
      l_insp_intg_both_dmbtr_per =
                             l_insp_intg_both_dmbtr /
                             p_result-insp_intg_both_dmbtr * 100.
    ENDIF.

    l_total_rev = p_result-insp_geop_dmbtr +
                  p_result-insp_mfl_dmbtr +
                  p_result-insp_both_dmbtr +
                  p_result-intg_rep_dmbtr +
                  p_result-intg_intg_dmbtr +
                  p_result-insp_intg_geop_dmbtr +
                  p_result-insp_intg_mfl_dmbtr +
                  p_result-insp_intg_rep_dmbtr +
                  p_result-insp_intg_intg_dmbtr +
                  p_result-insp_intg_both_dmbtr.
    CLEAR: l_temp.
    l_temp = abs( l_total_rev ).
    IF l_temp > 1.
      l_total_dmbtr_per = l_total_dmbtr / l_total_rev * 100.
    ENDIF.

    IF ( NOT p_zero IS INITIAL ) OR
       ( p_zero IS INITIAL AND
         ( l_insp_geop_dmbtr <> 0 OR
           l_insp_mfl_dmbtr <> 0 OR
           l_insp_both_dmbtr <> 0 OR
           l_intg_intg_dmbtr <> 0 OR
           l_intg_rep_dmbtr <> 0 OR
           l_insp_intg_geop_dmbtr <> 0 OR
           l_insp_intg_mfl_dmbtr <> 0 OR
           l_insp_intg_both_dmbtr <> 0 OR
           l_insp_intg_intg_dmbtr <> 0 OR
           l_insp_intg_rep_dmbtr <> 0 OR
           l_total_dmbtr <> 0 ) ).

      IF l_state = c_close.
        mac_print_group7 l_gl_descript.
      ELSE.
        mac_print_group8 l_gl_descript.
      ENDIF.
      mac_print_1 l_insp_geop_dmbtr
                  l_insp_geop_dmbtr_per
                  l_insp_mfl_dmbtr
                  l_insp_mfl_dmbtr_per
                  l_insp_both_dmbtr
                  l_insp_both_dmbtr_per
                  l_intg_intg_dmbtr
                  l_intg_intg_dmbtr_per.

      mac_print_2 l_intg_rep_dmbtr
                  l_intg_rep_dmbtr_per
                  l_insp_intg_geop_dmbtr
                  l_insp_intg_geop_dmbtr_per
                  l_insp_intg_mfl_dmbtr
                  l_insp_intg_mfl_dmbtr_per
                  l_insp_intg_both_dmbtr
                  l_insp_intg_both_dmbtr_per.

      mac_print_3 l_insp_intg_intg_dmbtr
                  l_insp_intg_intg_dmbtr_per
                  l_insp_intg_rep_dmbtr
                  l_insp_intg_rep_dmbtr_per
                  l_total_dmbtr
                  l_total_dmbtr_per.
      HIDE: g_gl.
    ENDIF.
  ENDIF.
  IF l_state = c_open.
    PERFORM write_document_detail.
  ENDIF.

ENDFORM.                    " WRITE_GL_DETAILS



*&---------------------------------------------------------------------*
*&      Form  GET_PRODUCT_LINE_RANGE
*&---------------------------------------------------------------------*
*&  Put product line code for Inspection, Integrity, Inspection &
*&  integrity combined into a selection range for record selection use
*&---------------------------------------------------------------------*
FORM get_product_line_range.

  r_prod_line-sign = 'I'.
  r_prod_line-option = 'BT'.
  r_prod_line-low = 'Z01'.
  r_prod_line-high = 'Z03'.
  APPEND r_prod_line.

ENDFORM.                    " GET_PRODUCT_LINE_RANGE

*&---------------------------------------------------------------------*
*&      Form  ARRANGE_DATA
*&---------------------------------------------------------------------*
*&  according to Produect Line and Job Type put the amount into
*&  corresponding column of the internal table for report display use
*&---------------------------------------------------------------------*
FORM arrange_data.

  LOOP AT it_result.
    IF it_result-rev_cost_flg = 'R'.
      it_result-dmbtr = 0 - it_result-dmbtr.
      it_result-dmbe2 = 0 - it_result-dmbe2.
    ENDIF.

    IF it_result-kvgr2 = c_inspection.
      IF it_result-kvgr1 = c_geopig.
        it_result-insp_geop_dmbtr = it_result-dmbtr.
        it_result-insp_geop_dmbe2 = it_result-dmbe2.
      ELSEIF it_result-kvgr1 = c_mfl.
        it_result-insp_mfl_dmbtr = it_result-dmbtr.
        it_result-insp_mfl_dmbe2 = it_result-dmbe2.
      ELSEIF it_result-kvgr1 = c_geop_mfl.
        it_result-insp_both_dmbtr = it_result-dmbtr.
        it_result-insp_both_dmbe2 = it_result-dmbe2.
      ENDIF.
    ELSEIF it_result-kvgr2 = c_integrity.
      IF it_result-kvgr1 = c_repair.
        it_result-intg_rep_dmbtr = it_result-dmbtr.
        it_result-intg_rep_dmbe2 = it_result-dmbe2.
      ELSEIF it_result-kvgr1 = c_integ.
        it_result-intg_intg_dmbtr = it_result-dmbtr.
        it_result-intg_intg_dmbe2 = it_result-dmbe2.
      ENDIF.
    ELSEIF it_result-kvgr2 = c_insp_intg.
      IF it_result-kvgr1 = c_geopig.
        it_result-insp_intg_geop_dmbtr = it_result-dmbtr.
        it_result-insp_intg_geop_dmbe2 = it_result-dmbe2.
      ELSEIF it_result-kvgr1 = c_mfl.
        it_result-insp_intg_mfl_dmbtr = it_result-dmbtr.
        it_result-insp_intg_mfl_dmbe2 = it_result-dmbe2.
      ELSEIF it_result-kvgr1 = c_geop_mfl.
        it_result-insp_intg_both_dmbtr = it_result-dmbtr.
        it_result-insp_intg_both_dmbe2 = it_result-dmbe2.
      ELSEIF it_result-kvgr1 = c_repair.
        it_result-insp_intg_rep_dmbtr = it_result-dmbtr.
        it_result-insp_intg_rep_dmbe2 = it_result-dmbe2.
      ELSEIF it_result-kvgr1 = c_integ.
        it_result-insp_intg_intg_dmbtr = it_result-dmbtr.
        it_result-insp_intg_intg_dmbe2 = it_result-dmbe2.
      ENDIF.
    ENDIF.
    MODIFY it_result.
  ENDLOOP.

ENDFORM.                    " ARRANGE_DATA

*&---------------------------------------------------------------------*
*&      Form  GET_TOTAL_REVENUE
*&---------------------------------------------------------------------*
*& Calculate the total Revenue for each Job Type in each product line
*&---------------------------------------------------------------------*
FORM get_total_revenue USING    p_bukrs
                       CHANGING p_temp STRUCTURE it_result.

  DATA: l_result TYPE t_result OCCURS 0 WITH HEADER LINE.
  l_result[] = it_result[].

  LOOP AT l_result WHERE rev_cost_flg = 'R'.
    IF l_result-kvgr2 = c_inspection.
      IF l_result-kvgr1 = c_geopig.
        p_temp-insp_geop_dmbtr = p_temp-insp_geop_dmbtr +
                                  l_result-insp_geop_dmbtr.
        p_temp-insp_geop_dmbe2 = p_temp-insp_geop_dmbe2 +
                                  l_result-insp_geop_dmbe2.
      ELSEIF l_result-kvgr1 = c_mfl.
        p_temp-insp_mfl_dmbtr = p_temp-insp_mfl_dmbtr +
                                  l_result-insp_mfl_dmbtr.
        p_temp-insp_mfl_dmbe2 = p_temp-insp_mfl_dmbe2 +
                                  l_result-insp_mfl_dmbe2.
      ELSEIF l_result-kvgr1 = c_geop_mfl.
        p_temp-insp_both_dmbtr = p_temp-insp_both_dmbtr +
                                  l_result-insp_both_dmbtr.
        p_temp-insp_both_dmbe2 = p_temp-insp_both_dmbe2 +
                                  l_result-insp_both_dmbe2.
      ENDIF.
    ELSEIF l_result-kvgr2 = c_integrity.
      IF l_result-kvgr1 = c_repair.
        p_temp-intg_rep_dmbtr = p_temp-intg_rep_dmbtr +
                                  l_result-intg_rep_dmbtr.
        p_temp-intg_rep_dmbe2 = p_temp-intg_rep_dmbe2 +
                                  l_result-intg_rep_dmbe2.
      ENDIF.
    ELSEIF l_result-kvgr2 = c_insp_intg.
      IF l_result-kvgr1 = c_geopig.
        p_temp-insp_intg_geop_dmbtr = p_temp-insp_intg_geop_dmbtr +
                                       l_result-insp_intg_geop_dmbtr.
        p_temp-insp_intg_geop_dmbe2 = p_temp-insp_intg_geop_dmbe2 +
                                       l_result-insp_intg_geop_dmbe2.
      ELSEIF l_result-kvgr1 = c_mfl.
        p_temp-insp_intg_mfl_dmbtr = p_temp-insp_intg_mfl_dmbtr +
                                      l_result-insp_intg_mfl_dmbtr.
        p_temp-insp_intg_mfl_dmbe2 = p_temp-insp_intg_mfl_dmbe2 +
                                      l_result-insp_intg_mfl_dmbe2.
      ELSEIF l_result-kvgr1 = c_geop_mfl.
        p_temp-insp_intg_both_dmbtr = p_temp-insp_intg_both_dmbtr +
                                      l_result-insp_intg_both_dmbtr.
        p_temp-insp_intg_both_dmbe2 = p_temp-insp_intg_both_dmbe2 +
                                      l_result-insp_intg_both_dmbe2.
      ENDIF.
    ENDIF.

  ENDLOOP.
ENDFORM.                    " GET_TOTAL_REVENUE


*&---------------------------------------------------------------------*
*&      Form  DISPLAY_SELECTION_OPTIONS
*&---------------------------------------------------------------------*

FORM display_selection_options.

  RESERVE 19 LINES.

  SKIP 2.
  WRITE: /1(160) '----------- Selection Criteria -----------' CENTERED.

  mac_select_options_display2 s_bukrs 'Company          :' 'All' 50.
  mac_select_options_display2 s_perio 'Fiscal Period    :' 'All' 50.
  mac_select_options_display2 s_wwctr 'Contract         :' 'All' 50.
  mac_select_options_display2 s_land1 'Country          :' 'All' 50.
  mac_select_options_display2 s_kaufn 'Order Number     :' 'All' 50.
  mac_select_options_display2 s_kndnr 'Customer         :' 'All' 50.

  IF p_zero IS INITIAL.
    WRITE: / 'Show Zero Balance G/L Account:', ' ON'.
  ELSE.
    WRITE: / 'Show Zero Balance G/L Account:', ' OFF'.
  ENDIF.

ENDFORM.                    " DISPLAY_SELECTION_OPTIONS

*&---------------------------------------------------------------------*
*&      Form  EXPAND_ALL
*&---------------------------------------------------------------------*
*& set all of the summary record's state to open
*&---------------------------------------------------------------------*
FORM expand_all.

  LOOP AT it_summary.
    it_summary-state = c_open.
    MODIFY it_summary.
  ENDLOOP.

  LOOP AT it_result.
    it_result-state = c_open.
    MODIFY it_result.
  ENDLOOP.
ENDFORM.                    " EXPAND_ALL

*&---------------------------------------------------------------------*
*&      Form  COLLAPSE_ALL
*&---------------------------------------------------------------------*
*& set all of the summary record's state to close
*&---------------------------------------------------------------------*
FORM collapse_all.
  LOOP AT it_summary.
    it_summary-state = c_close.
    MODIFY it_summary.
  ENDLOOP.

  LOOP AT it_result.
    it_result-state = c_close.
    MODIFY it_result.
  ENDLOOP.
ENDFORM.                    " COLLAPSE_ALL

*&---------------------------------------------------------------------*
*&      Form  GET_ALL_GL_ACCT
*&---------------------------------------------------------------------*
*&  Get all of the GL accounts for each Revenue or Direct Cost even they
*&  do not have a balance
*&---------------------------------------------------------------------*
FORM get_all_gl_acct.
  DATA: l_it_gl LIKE ska1 OCCURS 0 WITH HEADER LINE,
        l_gl LIKE it_result-hkont,
        l_gl_range LIKE zfrev_cost_defin OCCURS 0 WITH HEADER LINE,
        l_temp LIKE zfrev_cost_defin OCCURS 0 WITH HEADER LINE,
        wa_gl_range LIKE zfrev_cost_defin.

  CLEAR: l_gl_range.
  REFRESH: l_gl_range.

* get all of the Revenue and Direct Cost definitions
  SELECT * FROM zfrev_cost_defin INTO TABLE l_gl_range.
  l_temp[] = l_gl_range[].
  READ TABLE s_bukrs INDEX 1.

  LOOP AT l_gl_range.

*   if the definition is a single value, check if this gl account
*   is already in our internal table.  If not, add it.
    IF l_gl_range-options = 'EQ'.
      READ TABLE it_result WITH KEY hkont = l_gl_range-acct_low.
      IF sy-subrc <> 0.
        CLEAR: it_result.
        it_result-rev_cost_flg = l_gl_range-id+0(1).
        it_result-rev_cost_id = l_gl_range-id.
        it_result-hkont = l_gl_range-acct_low.
        it_result-bukrs = s_bukrs-low.
        it_result-state = c_close.
        APPEND it_result.
      ENDIF.
    ELSE.

*     if the definition is a range of values, get all of the GL account
*     between this range.
      CLEAR: l_it_gl.
      REFRESH: l_it_gl.
      SELECT * FROM ska1 INTO TABLE l_it_gl
        WHERE ktopl = c_nwsl
        AND saknr >= l_gl_range-acct_low
        AND saknr <= l_gl_range-acct_high.

      LOOP AT l_it_gl.
*      check each of the GL account number in this range to see if we
*      already have it in the internal table.  If it is not in the
*      internal table, check the Revenue and Cost definition table to
*      see if it is a single value entry for a different Revenue or
*      direct cost.  If not, add it to the internal table.  If it is
*      a single value entry in the definition table, it should be taken
*      care of when we check for the single values.
        READ TABLE it_result WITH KEY hkont = l_it_gl-saknr.
        IF sy-subrc <> 0.
          CLEAR: wa_gl_range, l_temp.
          READ TABLE l_temp WITH KEY acct_low = l_it_gl-saknr
                                     options = 'EQ'.
          IF sy-subrc <> 0.
            CLEAR: it_result.
            it_result-rev_cost_flg = l_gl_range-id+0(1).
            it_result-rev_cost_id = l_gl_range-id.
            it_result-hkont = l_it_gl-saknr.
            it_result-bukrs = s_bukrs-low.
            it_result-state = c_close.
            APPEND it_result.
          ENDIF.
        ENDIF.
      ENDLOOP.
    ENDIF.

  ENDLOOP.


ENDFORM.                    " GET_ALL_GL_ACCT

*&---------------------------------------------------------------------*
*&      Form  DOWNLOAD_EXCEL
*&---------------------------------------------------------------------*
*& if the debug flag is on, download the detailed internal table to
*& Excel for testing
*&---------------------------------------------------------------------*
FORM download_excel.
  DATA: l_filename TYPE mac_t_filename.
  DATA: BEGIN OF l_title OCCURS 0,
          colm_head(30) TYPE c,
        END OF l_title.

* set header to each column
  l_title-colm_head = 'Company'.
  APPEND l_title.
  l_title-colm_head = 'Document Number'.
  APPEND l_title.
  l_title-colm_head = 'Line Number'.
  APPEND l_title.
  l_title-colm_head = 'GL Account'.
  APPEND l_title.
  l_title-colm_head = 'Order Number'.
  APPEND l_title.
  l_title-colm_head = 'Product Line'.
  APPEND l_title.
  l_title-colm_head = 'Job Type'.
  APPEND l_title.
  l_title-colm_head = 'Country'.
  APPEND l_title.
  l_title-colm_head = 'Customer'.
  APPEND l_title.
  l_title-colm_head = 'Contract'.
  APPEND l_title.
  l_title-colm_head = 'Revenue or Cost ID'.
  APPEND l_title.
  l_title-colm_head = 'Amt in USD'.
  APPEND l_title.
  l_title-colm_head = 'Amt in Local Currency'.
  APPEND l_title.

* download the table with column header
* the function will ask for the file name
  CALL FUNCTION 'DOWNLOAD'
       EXPORTING
            filetype     = 'DAT'
       IMPORTING
            act_filename = l_filename
       TABLES
            data_tab     = it_download
            fieldnames   = l_title.

ENDFORM.                    " DOWNLOAD_EXCEL

*&---------------------------------------------------------------------*
*&      Form  WRITE_DOCUMENT_DETAIL
*&---------------------------------------------------------------------*
*& write document level detail
*&---------------------------------------------------------------------*
FORM write_document_detail.
  DATA: l_amt LIKE bseg-dmbtr,
        l_doc(20) TYPE c,
        l_line(3) TYPE c,
        l_flag TYPE c.

  it_doc[] = it_result[].
  CLEAR: l_flag.

  SORT it_doc BY hkont belnr buzei.

* for the GL account that is click on, display all the documents belongs
* to this GL account.
  LOOP AT it_doc WHERE hkont = g_gl
                      AND belnr <> ''
                      AND buzei <> ''.
    CLEAR: l_amt, l_doc, l_line.
    IF g_currency = 'USD'.
      l_amt = it_doc-dmbe2.
    ELSE.
      l_amt = it_doc-dmbtr.
    ENDIF.

    SHIFT it_doc-belnr LEFT DELETING LEADING '0'.
    l_line = it_doc-buzei.
    CONCATENATE it_doc-belnr l_line INTO l_doc
      SEPARATED BY ' - '.

    mac_print_group9 l_doc.
    mac_print_1 l_amt ''
                it_doc-budat ''
                it_doc-usnam ''
                it_doc-zuonr ''.

    mac_print_2 '' '' '' ''
                '' '' '' ''.

    mac_print_3 '' '' '' '' '' ''.
    l_flag = 'X'.
    HIDE: it_doc.
    CLEAR: it_doc.
  ENDLOOP.

  IF NOT l_flag IS INITIAL.
    mac_print_vline.
  ENDIF.

ENDFORM.                    " WRITE_DOCUMENT_DETAIL