日均月均余额报表

 之前招行开发的

TABLES:bkpf,isellist,faglflext.
*-----------excel
DATA: lv_excel    TYPE ole2_object,
      lv_sheet    TYPE ole2_object,
      lv_cell     TYPE ole2_object,
      lv_workbook TYPE ole2_object,
      lv_xlsname  TYPE string,
      lv_line     TYPE i      VALUE 1, "行号
      lv_cols     TYPE i      VALUE 0. "行号

INCLUDE ole2incl.

TYPES: data1(3500) TYPE c,
       ty_data     TYPE TABLE OF data1.
DATA l_rc TYPE i.
DATA:gt_sheet1 TYPE ty_data WITH HEADER LINE.

DATA:gt_fieldcat_lvc TYPE lvc_t_fcat,
     gw_fieldcat_lvc TYPE lvc_s_fcat.
DATA:dy_table TYPE REF TO data,
     dy_line  TYPE REF TO data.
FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE, "
               <dyn_wa>,
               <dyn_field>.
DATA:gs_layout TYPE lvc_s_layo."
DATA:gt_event TYPE slis_t_event WITH HEADER LINE.
DATA:ref_grid TYPE REF TO cl_gui_alv_grid.
DATA:BEGIN OF gt_budat OCCURS 0,"日期
       budat TYPE budat,
     END OF gt_budat.

DATA:BEGIN OF gt_period OCCURS 0,"期间
       ymonth LIKE isellist-month,
     END OF gt_period.

DATA:BEGIN OF gt_pswsl OCCURS 0,"币种
       pswsl LIKE bseg-pswsl,
     END OF gt_pswsl.

DATA:BEGIN OF gt_hkont OCCURS 0,"科目
       hkont TYPE hkont,
     END OF gt_hkont.

DATA:BEGIN OF gt_qjmx_bwb OCCURS 0,"期间明细本位币
       gjahr  TYPE gjahr,
       ymonth LIKE isellist-month,
       racct  TYPE racct,
       rtcur  LIKE faglflext-rtcur,
       dmbtr  LIKE faglflext-hslvt,
     END OF gt_qjmx_bwb.

DATA:BEGIN OF gt_qjmx_yb OCCURS 0,"期间明细原币
       gjahr  TYPE gjahr,
       ymonth LIKE isellist-month,
       racct  TYPE racct,
       rtcur  LIKE faglflext-rtcur,
       wrbtr  LIKE faglflext-tslvt,
     END OF gt_qjmx_yb.

DATA:BEGIN OF gt_qjhz OCCURS 0,"期间汇总
       gjahr  TYPE gjahr,
       ymonth LIKE isellist-month,
       rtcur  LIKE faglflext-rtcur,
       dmbtr  LIKE faglflext-hslvt,
       wrbtr  LIKE faglflext-tslvt,
     END OF gt_qjhz.

DATA:BEGIN OF gt_qjhj OCCURS 0,"期间合计
       racct TYPE racct,
       rtcur LIKE faglflext-rtcur,
       dmbtr LIKE faglflext-hslvt,
       wrbtr LIKE faglflext-tslvt,
     END OF gt_qjhj.
DATA:gv_time TYPE i.

DATA:BEGIN OF gt_rqmx_bwb OCCURS 0,"日期明细本位币
       gjahr TYPE gjahr,
       budat TYPE budat,
       hkont TYPE hkont,
       pswsl LIKE bseg-pswsl,
       dmbtr LIKE bseg-dmbtr,
     END OF gt_rqmx_bwb.

DATA:BEGIN OF gt_rqmx_yb OCCURS 0,"日期明细原币
       gjahr TYPE gjahr,
       budat TYPE budat,
       hkont TYPE hkont,
       pswsl LIKE bseg-pswsl,
       wrbtr LIKE bseg-wrbtr,
     END OF gt_rqmx_yb.

DATA:BEGIN OF gt_rqhz OCCURS 0,"日期汇总  汇总金额
       budat TYPE budat,
       pswsl LIKE bseg-pswsl,
       wrbtr LIKE bseg-wrbtr,
       dmbtr LIKE bseg-dmbtr,
     END OF gt_rqhz.

DATA:BEGIN OF gt_rqqcmx OCCURS 0,"日期期初明细->最后汇总到日期明细本位币/日期明细原币
       racct TYPE racct,
       rtcur LIKE faglflext-rtcur,
       hsl   LIKE faglflext-hslvt,
       tsl   LIKE faglflext-tslvt,
     END OF gt_rqqcmx.

DATA:BEGIN OF gt_rqqcmxhz OCCURS 0,"日期期初汇总->最后汇总到日期汇总
       rtcur LIKE faglflext-rtcur,
       hsl   LIKE faglflext-hslvt,
       tsl   LIKE faglflext-tslvt,
     END OF gt_rqqcmxhz.

DATA:BEGIN OF gt_rqhj OCCURS 0,"日期合计
       racct TYPE racct,
       rtcur LIKE faglflext-rtcur,
       dmbtr LIKE faglflext-hslvt,
       wrbtr LIKE faglflext-tslvt,
     END OF gt_rqhj.

DATA:gv_xlsname TYPE string.

SELECTION-SCREEN:BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  PARAMETERS:p_bukrs TYPE faglflext-rbukrs OBLIGATORY DEFAULT '1000'.
  SELECT-OPTIONS:s_jzrq FOR bkpf-budat MODIF ID m1 NO-EXTENSION,
                 s_jzqj FOR isellist-month MODIF ID m2 NO-EXTENSION,
                 s_racct FOR faglflext-racct.
SELECTION-SCREEN:END OF BLOCK b1.

SELECTION-SCREEN:BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
  PARAMETERS:p_bwb RADIOBUTTON GROUP g1 DEFAULT 'X' USER-COMMAND xsbz,
             p_yb  RADIOBUTTON GROUP g1.
  PARAMETERS:p_mx RADIOBUTTON GROUP g2 DEFAULT 'X' USER-COMMAND xsfs,
             p_hz RADIOBUTTON GROUP g2.
SELECTION-SCREEN:END OF BLOCK b2.

SELECTION-SCREEN:BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-003.
  PARAMETERS:p_alv   RADIOBUTTON GROUP g3 DEFAULT 'X' USER-COMMAND xsfs,
             p_excel RADIOBUTTON GROUP g3.
SELECTION-SCREEN:END OF BLOCK b3.

INITIALIZATION.
  s_racct-low = 'I'.
  s_racct-option = 'BT'.
  s_racct-low = '1001000000'.
  s_racct-high = '1002999999'.
  APPEND s_racct.

*SELECTION-SCREEN:BEGIN OF BLOCK b4 WITH FRAME TITLE TEXT-004.
*  PARAMETERS: p_file        TYPE rlgrap-filename.
*SELECTION-SCREEN:END OF  BLOCK b4.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_jzqj-low.
  PERFORM frm_select_data_low.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_jzqj-high.
  PERFORM frm_select_data_high.

*AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
*  PERFORM frm_select_file..

START-OF-SELECTION.
  break yangtao.
  PERFORM frm_check_data.
  PERFORM frm_get_data.
  PERFORM frm_set_fieldcat_lvc.
  PERFORM frm_creat_dyn_table.
  IF p_alv = 'X'.
    PERFORM frm_set_alv_dyn_data.
    PERFORM frm_output_data.
  ELSEIF p_excel = 'X'.
    PERFORM frm_download_excel CHANGING gv_xlsname..
    PERFORM frm_set_excel.
    PERFORM frm_set_excel_dyn_data.
  ENDIF.

*&---------------------------------------------------------------------*
*& Form FRM_CHECK_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_check_data .
  IF s_jzrq[] IS NOT INITIAL AND s_jzqj[] IS NOT INITIAL.
    MESSAGE '若输入记账日期,则不允许输入记账期间,若输入记账期间,则不允许数据记账日期' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING .
  ELSEIF s_jzrq[] IS  INITIAL AND s_jzqj[] IS INITIAL.
    MESSAGE '记账日期和记账期间至少输入一个' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING .
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_select_data_low
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_select_data_low .
  CALL FUNCTION 'POPUP_TO_SELECT_MONTH'
    EXPORTING
      actual_month   = sy-datum+0(6)
    IMPORTING
      selected_month = s_jzqj-low.
  IF sy-subrc <> 0.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_select_data_high
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_select_data_high .
  CALL FUNCTION 'POPUP_TO_SELECT_MONTH'
    EXPORTING
      actual_month   = sy-datum+0(6)
    IMPORTING
      selected_month = s_jzqj-high.
  IF sy-subrc <> 0.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data  .
  DATA:lr_ryear TYPE RANGE OF faglflext-ryear.
  DATA:lr_budat TYPE RANGE OF bkpf-budat WITH HEADER LINE.
  DATA:lv_endat TYPE datum,
       lv_bedat TYPE datum,
       lv_qzdat TYPE datum.
  DATA:lt_bseg      TYPE TABLE OF bseg WITH HEADER LINE,
       lt_bkpf_temp TYPE TABLE OF bkpf WITH HEADER LINE.
  DATA:lv_field    TYPE string,
       lv_hsl      TYPE faglflext-hslvt,
       lv_hsl_temp TYPE faglflext-hslvt,
       lv_tsl      TYPE faglflext-hslvt,
       lv_tsl_temp TYPE faglflext-hslvt,
       lv_hsl_h    TYPE faglflext-hslvt,
       lv_num_char TYPE char2.
  DATA:lv_num_end TYPE char2,
       lv_num     TYPE char2,
       lv_hslvt   TYPE faglflext-hslvt,
       lv_tslvt   TYPE faglflext-hslvt.
  DATA:lv_year TYPE char4.

  FIELD-SYMBOLS:<fs> TYPE any.


  IF s_jzqj[] IS NOT INITIAL.
    LOOP AT s_jzqj INTO DATA(lw_jzqj).
      IF lw_jzqj-low IS NOT INITIAL AND lw_jzqj-high IS NOT INITIAL.
        lv_bedat = lw_jzqj-low && '01'.

        DO.
          gt_period-ymonth = lv_bedat+0(6).
          APPEND gt_period.

          IF lv_bedat+0(6) = lw_jzqj-high+0(6).
            EXIT.
          ENDIF.

          PERFORM frm_change_date USING lv_bedat 0 1 '+' 0 CHANGING lv_endat.
          lv_bedat = lv_endat.
        ENDDO.

        IF lw_jzqj-low+0(4) <> lw_jzqj-high+0(4).
          INSERT VALUE #( sign = 'I' option = 'BT' low = lw_jzqj-low+0(4) high = lw_jzqj-high+0(4) ) INTO TABLE lr_ryear.
        ELSE.
          INSERT VALUE #( sign = 'I' option = 'EQ' low = lw_jzqj-low+0(4) ) INTO TABLE lr_ryear.
        ENDIF.
      ELSEIF lw_jzqj-low IS NOT INITIAL AND lw_jzqj-high IS  INITIAL.
        gt_period-ymonth = lw_jzqj-low+0(6).
        APPEND gt_period.

        INSERT VALUE #( sign = 'I' option = 'EQ' low = lw_jzqj-low+0(4) ) INTO TABLE lr_ryear.
      ELSEIF  lw_jzqj-low IS  INITIAL AND lw_jzqj-high IS NOT INITIAL.
        gt_period-ymonth = lw_jzqj-high+0(6).
        APPEND gt_period.

        INSERT VALUE #( sign = 'I' option = 'EQ' low = lw_jzqj-high+0(4) ) INTO TABLE lr_ryear.
      ENDIF.
    ENDLOOP.

    SELECT * INTO TABLE @DATA(lt_faglflext)
      FROM faglflext
      WHERE rbukrs EQ @p_bukrs AND
            racct IN @s_racct AND
            ryear IN @lr_ryear.

    SORT gt_period BY ymonth.
    SORT lt_faglflext BY ryear.

    "获取每个月份对应的区间金额
    LOOP AT gt_period.
      IF sy-tabix = 1.
        lv_year = gt_period+0(4).
      ENDIF.

      LOOP AT lt_faglflext INTO DATA(lw_faglflext) WHERE ryear = gt_period+0(4).
        READ TABLE gt_pswsl WITH KEY pswsl = lw_faglflext-rtcur.
        IF sy-subrc NE 0.
          IF p_bwb = 'X' AND lw_faglflext-rtcur = 'CNY'.
            gt_pswsl-pswsl = lw_faglflext-rtcur.
            APPEND gt_pswsl.
          ELSEIF p_yb = 'X' AND lw_faglflext-rtcur <> 'CNY'.
            gt_pswsl-pswsl = lw_faglflext-rtcur.
            APPEND gt_pswsl.
          ENDIF.
        ENDIF.

        READ TABLE gt_hkont WITH KEY hkont = lw_faglflext-racct.
        IF sy-subrc NE 0.
          gt_hkont-hkont = lw_faglflext-racct.
          APPEND gt_hkont.
        ENDIF.

        CLEAR:lv_num_end,lv_num,lv_hsl,lv_tsl,lv_hsl_temp,lv_tsl_temp,lv_hslvt,lv_tslvt.

        lv_num_end = gt_period-ymonth+4(2).
        lv_num = '01'.

        IF lv_year = gt_period+0(4)."若存在跨年,则只取第一年的年初数HSLVT或TSLVT
          lv_hslvt = lw_faglflext-hslvt.
          lv_tslvt = lw_faglflext-tslvt.
        ENDIF.

        DO.
          IF lv_num > lv_num_end.
            EXIT.
          ENDIF.
          CLEAR:lv_hsl_temp.

          lv_num = |{ lv_num ALPHA = IN }|.

          IF p_bwb = 'X'.
            CONCATENATE  'LW_FAGLFLEXT-HSL' lv_num INTO lv_field.
            UNASSIGN <fs>.
            ASSIGN (lv_field) TO <fs>.
            IF <fs> IS ASSIGNED.
              lv_hsl_temp  = <fs>.
              lv_hsl = lv_hsl + lv_hsl_temp.
            ENDIF.
          ELSEIF p_yb = 'X'.
            CONCATENATE  'LW_FAGLFLEXT-TSL' lv_num INTO lv_field.
            UNASSIGN <fs>.
            ASSIGN (lv_field) TO <fs>.
            IF <fs> IS ASSIGNED.
              lv_tsl_temp  = <fs>.
              lv_tsl = lv_tsl + lv_tsl_temp.
            ENDIF.
          ENDIF.

          lv_num = lv_num + 1.
          lv_num = |{ lv_num ALPHA = IN }|.
          CLEAR:lv_tsl_temp,lv_hsl_temp.
        ENDDO.
        lv_hsl = lv_hslvt + lv_hsl.
        lv_tsl = lv_tslvt + lv_tsl.

        IF p_bwb = 'X'.
          gt_qjhz = VALUE #( gjahr  = gt_period+0(4)
                             ymonth = gt_period-ymonth
                             rtcur  = lw_faglflext-rtcur
                             dmbtr  = lv_hsl ).

          gt_qjmx_bwb = VALUE #( gjahr  = gt_period+0(4)
                                 ymonth = gt_period-ymonth
                                 racct  = lw_faglflext-racct
                                 rtcur  = lw_faglflext-rtcur
                                 dmbtr  = lv_hsl ).
          COLLECT gt_qjmx_bwb.
        ELSEIF p_yb = 'X'.
          gt_qjhz = VALUE #( gjahr  = gt_period+0(4)
                             ymonth = gt_period-ymonth
                             rtcur  = lw_faglflext-rtcur
                             wrbtr  = lv_tsl ).

          gt_qjmx_yb = VALUE #( gjahr  = gt_period+0(4)
                                ymonth = gt_period-ymonth
                                racct  = lw_faglflext-racct
                                rtcur  = lw_faglflext-rtcur
                                wrbtr  = lv_tsl ).
          COLLECT gt_qjmx_yb.
        ENDIF.

        COLLECT gt_qjhz.

        IF p_mx = 'X'.
          gt_qjhj = VALUE #( racct = lw_faglflext-racct
                           rtcur = lw_faglflext-rtcur
                           dmbtr = lv_hsl
                           wrbtr = lv_tsl ).
        ELSEIF p_hz = 'X'.
          gt_qjhj = VALUE #( rtcur = lw_faglflext-rtcur
                          dmbtr = lv_hsl
                          wrbtr = lv_tsl ).
        ENDIF.

        COLLECT gt_qjhj.

      ENDLOOP.
    ENDLOOP.

    BREAK-POINT.
  ELSEIF s_jzrq[] IS NOT INITIAL.
    DATA(lw_jzrq) = s_jzrq[ 1 ].
    IF lw_jzrq-low+6(2) = '01'.
      DATA(lv_date) = lw_jzrq-low.
    ELSE.
      lv_date = lw_jzrq-low+0(6) && '01'.
    ENDIF.

    IF lw_jzrq-high IS NOT INITIAL AND lw_jzrq-low IS NOT INITIAL.
      IF lw_jzrq-low <> lw_jzrq-high.
        INSERT VALUE #( sign = 'I' option = 'BT' low = lw_jzrq-low high = lw_jzrq-high ) INTO TABLE lr_budat.
        lv_bedat = lw_jzrq-low.

        gt_budat-budat = lv_bedat.
        APPEND gt_budat.

        DO.
          IF lv_bedat = lw_jzrq-high .
            EXIT.
          ELSE.
            CLEAR:lv_endat.

            PERFORM frm_change_date USING lv_bedat 1 0 '+' 0 CHANGING lv_endat.
            gt_budat-budat = lv_endat.
            APPEND gt_budat.

            lv_bedat = lv_endat.
          ENDIF.
        ENDDO.
      ELSE.
        gt_budat-budat = lv_bedat.
        APPEND gt_budat.
        INSERT VALUE #( sign = 'I' option = 'EQ' low = lw_jzrq-low high = lw_jzrq-high ) INTO TABLE lr_budat.
      ENDIF.
    ELSEIF lw_jzrq-low IS NOT INITIAL.
      gt_budat-budat = lw_jzrq-low.
      APPEND gt_budat.

      INSERT VALUE #( sign = 'I' option = 'EQ' low = lw_jzrq-low  ) INTO TABLE lr_budat.
    ENDIF.

    SORT gt_budat BY budat.

    "当前的发生额
    SELECT * INTO TABLE @DATA(lt_bkpf)
      FROM bkpf
      WHERE bukrs EQ @p_bukrs AND
            budat IN @lr_budat.

    DATA(lt_bkpf_txt) = lt_bkpf[].

    DO.
      REFRESH:lt_bkpf_temp.
      IF lt_bkpf[] IS INITIAL.
        EXIT.
      ENDIF.

      APPEND LINES OF lt_bkpf FROM 1 TO 2000 TO lt_bkpf_temp.
      DELETE lt_bkpf FROM 1 TO 2000.

      IF lt_bkpf_temp[] IS NOT INITIAL.
        SELECT * APPENDING CORRESPONDING FIELDS OF TABLE lt_bseg
          FROM bseg
          FOR ALL ENTRIES IN lt_bkpf_temp
          WHERE belnr = lt_bkpf_temp-belnr AND
                bukrs = lt_bkpf_temp-bukrs AND
                gjahr = lt_bkpf_temp-gjahr AND
                hkont IN s_racct.
      ENDIF.
    ENDDO.

    "计算当前输入日期对应前一期间的科目余额
    PERFORM frm_change_date USING lv_date 0  1 '-' 0 CHANGING lv_qzdat."当前月前置日期

    IF lt_bseg[] IS NOT INITIAL.
      PERFORM frm_get_rqqc_data TABLES lt_bseg USING lv_qzdat.
    ENDIF.

    LOOP AT lt_bseg ASSIGNING FIELD-SYMBOL(<fs_bseg>).
      READ TABLE lt_bkpf_txt INTO DATA(lw_bkpf_txt) WITH KEY belnr = <fs_bseg>-belnr bukrs = <fs_bseg>-bukrs gjahr = <fs_bseg>-gjahr.
      IF sy-subrc EQ 0.
        READ TABLE gt_pswsl WITH KEY pswsl = <fs_bseg>-pswsl.
        IF sy-subrc NE 0.
          IF p_bwb = 'X' AND <fs_bseg>-pswsl = 'CNY'.
            gt_pswsl-pswsl = <fs_bseg>-pswsl.
            APPEND gt_pswsl.
          ELSEIF p_yb = 'X' AND <fs_bseg>-pswsl <> 'CNY'.
            gt_pswsl-pswsl = <fs_bseg>-pswsl.
            APPEND gt_pswsl.
          ENDIF.
        ENDIF.

        READ TABLE gt_hkont WITH KEY hkont = <fs_bseg>-hkont.
        IF sy-subrc NE 0.
          gt_hkont-hkont = <fs_bseg>-hkont.
          APPEND gt_hkont.
        ENDIF.

        gt_rqhz = VALUE #( budat = lw_bkpf_txt-budat"每天的汇总金额
                           pswsl = <fs_bseg>-pswsl ).

        IF p_mx = 'X'.
          gt_rqhj = VALUE #( racct = <fs_bseg>-hkont  "最后的合计金额
                           rtcur = <fs_bseg>-pswsl ).
        ELSEIF p_hz = 'X'.
          gt_rqhj = VALUE #( rtcur = <fs_bseg>-pswsl )."最后的合计金额
        ENDIF.

        IF p_yb = 'X'.
          gt_rqmx_yb = VALUE #( gjahr = <fs_bseg>-gjahr
                           budat = lw_bkpf_txt-budat
                           hkont = <fs_bseg>-hkont
                           pswsl = <fs_bseg>-pswsl
           ).

          gt_rqhj-wrbtr  = gt_rqhz-wrbtr = gt_rqmx_yb-wrbtr =  COND #( WHEN <fs_bseg>-shkzg = 'H' THEN <fs_bseg>-wrbtr * -1
                                                                       WHEN <fs_bseg>-shkzg = 'S' THEN <fs_bseg>-wrbtr ).
          COLLECT gt_rqmx_yb."明细原币

        ELSEIF p_bwb = 'X'.
          gt_rqmx_bwb = VALUE #( gjahr = <fs_bseg>-gjahr
                           budat = lw_bkpf_txt-budat
                           hkont = <fs_bseg>-hkont
                           pswsl = <fs_bseg>-pswsl
           ).
          gt_rqhj-dmbtr = gt_rqhz-dmbtr = gt_rqmx_bwb-dmbtr =  COND #( WHEN <fs_bseg>-shkzg = 'H' THEN <fs_bseg>-dmbtr * -1
                                                       WHEN <fs_bseg>-shkzg = 'S' THEN <fs_bseg>-dmbtr
                                                     ).
          COLLECT gt_rqmx_bwb."明细本位币
        ENDIF.

        COLLECT gt_rqhz."每天的汇总金额

        COLLECT gt_rqhj."最后的合计金额
      ENDIF.
    ENDLOOP.

    "计算期初数据,累计到查询日期的第一天
    PERFORM frm_get_beginning_data.
  ENDIF.

  SORT gt_hkont BY hkont.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat_lvc
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat_lvc .
  DATA:lv_name       TYPE lvc_fname,
       lv_text       TYPE string,
       lv_num(2)     TYPE c,
       lv_lifnr_name TYPE ekko-lifnr.
  DATA:lz      TYPE i,
       lv_flag.
  CLEAR:gt_fieldcat_lvc[],lv_flag.

  IF s_jzrq[] IS NOT INITIAL.
    PERFORM add_field_lvc USING: 'BUDAT' '日期' '10' 'C' '10' '0' 'X' '' '' '' '' '' ''.

    IF gt_hkont[] IS NOT INITIAL.
      SELECT * INTO TABLE @DATA(lt_skat)
        FROM skat
        FOR ALL ENTRIES IN @gt_hkont
        WHERE spras = @sy-langu AND
              ktopl = '1000' AND
              saknr = @gt_hkont-hkont.
    ENDIF.

    IF p_mx = 'X' .
      LOOP AT gt_hkont.
        READ TABLE lt_skat INTO DATA(lw_skat) WITH KEY saknr = gt_hkont-hkont.
        LOOP AT gt_pswsl.
          lv_text = '(' && gt_pswsl-pswsl && ')' && gt_hkont-hkont && '-' && lw_skat-txt20.
          CONCATENATE gt_pswsl-pswsl '_' gt_hkont-hkont INTO lv_name.
          PERFORM add_field_lvc USING lv_name lv_text '20' 'P' '17' '2'  'X' '' '' '' '' '' 'X'.
        ENDLOOP.
      ENDLOOP.
    ELSEIF p_hz = 'X'.
      LOOP AT gt_pswsl.
        lv_name = lv_text = gt_pswsl-pswsl.
        PERFORM add_field_lvc USING lv_name lv_text '13' 'P' '17' '2'  'X' '' '' '' '' '' 'X'.
      ENDLOOP.
    ENDIF.
  ELSEIF s_jzqj[] IS NOT INITIAL.
    PERFORM add_field_lvc USING: 'YMONTH' '期间' '10' 'C' '10' '0' 'X' '' '' '' '' '' ''.

    IF gt_hkont[] IS NOT INITIAL.
      SELECT * INTO TABLE @lt_skat
        FROM skat
        FOR ALL ENTRIES IN @gt_hkont
        WHERE spras = @sy-langu AND
              ktopl = '1000' AND
              saknr = @gt_hkont-hkont.
    ENDIF.

    IF p_mx = 'X' .
      LOOP AT gt_hkont.
        READ TABLE lt_skat INTO lw_skat WITH KEY saknr = gt_hkont-hkont.
        LOOP AT gt_pswsl.
          lv_text = '(' && gt_pswsl-pswsl && ')' && gt_hkont-hkont && '-' && lw_skat-txt20.
          CONCATENATE gt_pswsl-pswsl '_' gt_hkont-hkont INTO lv_name.
          PERFORM add_field_lvc USING lv_name lv_text '20' 'P' '17' '2'  'X' '' '' '' '' '' 'X'.
        ENDLOOP.
      ENDLOOP.
    ELSEIF p_hz = 'X'.
      LOOP AT gt_pswsl.
        lv_name = lv_text = gt_pswsl-pswsl.
        PERFORM add_field_lvc USING lv_name lv_text '13' 'P' '17' '2'  'X' '' '' '' '' '' 'X'.
      ENDLOOP.
    ENDIF.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREAT_DYN_TABLE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_creat_dyn_table .
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = gt_fieldcat_lvc
    IMPORTING
      ep_table        = dy_table.

  ASSIGN dy_table->* TO <dyn_table>."

  CREATE DATA dy_line LIKE LINE OF <dyn_table>.

  ASSIGN dy_line->* TO <dyn_wa>.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_ALV_DYN_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_alv_dyn_data .
  DATA:lc_dyn_fidld(18) TYPE c.
  DATA:lv_hsl       LIKE faglflext-hslvt,
       lv_hsl_fcode LIKE faglflext-hslvt.
  DATA:lv_bedat TYPE datum,
       lv_endat TYPE datum.

  CLEAR:lv_hsl.
  IF s_jzrq[] IS NOT INITIAL.
    IF p_mx = 'X'.
      PERFORM frm_set_data_jzrq_mx."日期明细
    ELSEIF p_hz = 'X'.
      PERFORM frm_set_data_jzrq_hz."日期汇总
    ENDIF.
  ELSEIF s_jzqj[] IS NOT INITIAL.
    IF p_mx = 'X'.
      PERFORM frm_set_data_jzqj_mx."期间明细
    ELSEIF p_hz = 'X'.
      PERFORM frm_set_data_jzqj_hz."期间汇总
    ENDIF.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_OUTPUT_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_output_data .
  gs_layout-totals_bef = 'X'.
  gs_layout-zebra = 'X'."
  gs_layout-no_toolbar = ''.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-cprog
      i_callback_pf_status_set = 'PF_STATUS_SET'
      i_callback_user_command  = 'USER_COMMAND'
      is_layout_lvc            = gs_layout
      it_fieldcat_lvc          = gt_fieldcat_lvc
      i_save                   = 'A'
    TABLES
      t_outtab                 = <dyn_table>
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  ADD_FIELD_LVC
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_2789   text
*      -->P_2790   text
*      -->P_2791   text
*      -->P_2792   text
*      -->P_2793   text
*      -->P_2794   text
*      -->P_2795   text
*      -->P_2796   text
*      -->P_2797   text
*      -->P_2798   text
*      -->P_2799   text
*----------------------------------------------------------------------*
FORM add_field_lvc USING  i_fieldname TYPE slis_fieldname
      i_text TYPE string
      i_outputlen TYPE lvc_outlen
      i_inttype TYPE inttype
      i_intlen TYPE intlen
      i_decimals TYPE decimals
      i_zero TYPE c
      i_fix_column TYPE c
      i_no_out TYPE c
      i_emphasize TYPE lvc_emphsz
      i_do_sum
      i_edit TYPE lvc_edit
      i_flag.
  CLEAR gw_fieldcat_lvc.
  gw_fieldcat_lvc-fieldname = i_fieldname.
  gw_fieldcat_lvc-colddictxt = 'L'.
  gw_fieldcat_lvc-scrtext_l = i_text.
  gw_fieldcat_lvc-outputlen = i_outputlen.
  gw_fieldcat_lvc-inttype = i_inttype.
  gw_fieldcat_lvc-intlen = i_intlen.
  gw_fieldcat_lvc-decimals = i_decimals.
  gw_fieldcat_lvc-no_zero = 'X'.
  gw_fieldcat_lvc-fix_column = i_fix_column.
  gw_fieldcat_lvc-no_out = i_no_out.
  gw_fieldcat_lvc-emphasize = i_emphasize.
  gw_fieldcat_lvc-do_sum = i_do_sum.
  APPEND gw_fieldcat_lvc TO gt_fieldcat_lvc.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SET_PF
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM pf_status_set USING  extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD_FULLSCREEN' EXCLUDING extab.
ENDFORM.                    "SET_PF
*&---------------------------------------------------------------------*
*&      Form  user_com
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
      rs_selfield TYPE slis_selfield.
  DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
  DATA: gd_repid LIKE sy-repid,
        ref_grid TYPE REF TO cl_gui_alv_grid.
  DATA :answer TYPE char4.
  IF ref_grid IS INITIAL.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        e_grid = ref_grid.
  ENDIF.

  IF NOT ref_grid IS INITIAL.
    CALL METHOD ref_grid->check_changed_data .
  ENDIF.

  CASE r_ucomm.
    WHEN '&BACK' OR '&EXIT' OR '&EXIT'.
      LEAVE TO SCREEN 0.
    WHEN OTHERS.
  ENDCASE.
  rs_selfield-refresh = 'X'.
ENDFORM.                    "USER_COM
*&---------------------------------------------------------------------*
*& Form frm_change_date
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LV_DATE
*&      --> P_0
*&      --> P_1
*&      --> P_
*&      --> P_0
*&      <-- LV_ENDAT
*&---------------------------------------------------------------------*
FORM frm_change_date  USING pv_date
                            VALUE(pv_day)
                            VALUE(pv_months)
                            VALUE(pv_signum)
                            VALUE(pv_year)
                      CHANGING pv_endat.
  CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
    EXPORTING
      date      = pv_date
      days      = pv_day
      months    = pv_months
      signum    = pv_signum
      years     = pv_year
    IMPORTING
      calc_date = pv_endat.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_data_jzrq_mx
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_data_jzrq_mx .
  DATA:lv_field(18) TYPE c,
       lv_index     TYPE i.
  DATA:lr_struc_descr TYPE REF TO cl_abap_structdescr,
       BEGIN OF lt_components OCCURS 40,
         name      TYPE abap_compdescr-name,
         component TYPE sy-tabix,
       END OF lt_components.
  DATA:lv_waerk TYPE waerk,
       lv_racct TYPE racct.
  FIELD-SYMBOLS: <ls_component> TYPE abap_compdescr,
                 <fs>           TYPE any.

  LOOP AT gt_budat.
    lv_index = lv_index + 1.

    ASSIGN COMPONENT  'BUDAT'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = gt_budat-budat.

    IF p_yb  = 'X'.
      LOOP AT gt_hkont.
        LOOP AT gt_pswsl.
          READ TABLE gt_rqmx_yb WITH KEY pswsl = gt_pswsl-pswsl hkont = gt_hkont-hkont budat = gt_budat-budat.
          IF sy-subrc EQ 0.
            lv_field =  gt_pswsl-pswsl && '_' && gt_hkont-hkont.
            ASSIGN COMPONENT  lv_field  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
            <dyn_field> = gt_rqmx_yb-wrbtr.
          ENDIF.
        ENDLOOP.
      ENDLOOP.
    ELSEIF p_bwb = 'X'.
      LOOP AT gt_hkont..
        LOOP AT gt_pswsl.
          READ TABLE gt_rqmx_bwb WITH KEY pswsl = gt_pswsl-pswsl hkont = gt_hkont-hkont budat = gt_budat-budat.
          IF sy-subrc EQ 0 .
            lv_field = gt_pswsl-pswsl && '_' && gt_hkont-hkont.
            ASSIGN COMPONENT  lv_field  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
            <dyn_field> = gt_rqmx_bwb-dmbtr.
          ENDIF.
        ENDLOOP.
      ENDLOOP.
    ENDIF.

    APPEND <dyn_wa> TO <dyn_table>.
    CLEAR:<dyn_wa>.
  ENDLOOP.

  "获取日期合计和日均
  ASSIGN LOCAL COPY OF INITIAL LINE OF <dyn_table> TO <fs>.
  lr_struc_descr ?= cl_abap_typedescr=>describe_by_data( <fs> ).
  LOOP AT lr_struc_descr->components ASSIGNING <ls_component>.
    lt_components-component = sy-tabix.
    lt_components-name      = <ls_component>-name.
    APPEND lt_components.
  ENDLOOP.
  SORT lt_components BY name.

  LOOP AT lt_components INTO DATA(lw_components).
    CLEAR:lv_waerk,lv_racct.
    ASSIGN COMPONENT  'BUDAT'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = '合计'.

    SPLIT lw_components-name AT '_' INTO lv_waerk lv_racct.
    LOOP AT gt_rqhj INTO DATA(lw_rqhj) WHERE rtcur = lv_waerk AND  racct = lv_racct..
      IF p_bwb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_rqhj-dmbtr.
      ELSEIF p_yb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_rqhj-wrbtr.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

  IF gt_rqhj[] IS NOT INITIAL.
    APPEND <dyn_wa> TO <dyn_table>.
    CLEAR:<dyn_wa>.
  ENDIF.

  LOOP AT lt_components INTO lw_components.
    CLEAR:lv_waerk,lv_racct.
    ASSIGN COMPONENT  'BUDAT'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = '每日平均'.

    SPLIT lw_components-name AT '_' INTO lv_waerk lv_racct.
    LOOP AT gt_rqhj INTO lw_rqhj WHERE rtcur = lv_waerk AND  racct = lv_racct..
      IF p_bwb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_rqhj-dmbtr / lv_index.
      ELSEIF p_yb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_rqhj-wrbtr  / lv_index.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

  IF gt_rqhj[] IS NOT INITIAL.
    APPEND <dyn_wa> TO <dyn_table>.
    CLEAR:<dyn_wa>.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_data_jzrq_hz
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_data_jzrq_hz .
  DATA:lv_field(18) TYPE c,
       lv_index     TYPE i.
  DATA:lr_struc_descr TYPE REF TO cl_abap_structdescr,
       BEGIN OF lt_components OCCURS 40,
         name      TYPE abap_compdescr-name,
         component TYPE sy-tabix,
       END OF lt_components.
  DATA:lv_waerk TYPE waerk,
       lv_racct TYPE racct.
  FIELD-SYMBOLS: <ls_component> TYPE abap_compdescr,
                 <fs>           TYPE any.


  LOOP AT gt_budat.
    lv_index = lv_index + 1.
    ASSIGN COMPONENT  'BUDAT'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = gt_budat-budat.

    LOOP AT gt_pswsl.
      READ TABLE gt_rqhz WITH KEY budat = gt_budat-budat pswsl = gt_pswsl-pswsl.
      IF sy-subrc EQ 0.
        ASSIGN COMPONENT  gt_pswsl-pswsl  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        IF p_bwb = 'X'.
          <dyn_field> = gt_rqhz-dmbtr.
        ELSEIF p_yb = 'X'.
          <dyn_field> = gt_rqhz-wrbtr.
        ENDIF.
      ENDIF.
    ENDLOOP.
    APPEND <dyn_wa> TO <dyn_table>.
    CLEAR:<dyn_wa>.
  ENDLOOP.

  "获取日期合计和日均
  ASSIGN LOCAL COPY OF INITIAL LINE OF <dyn_table> TO <fs>.
  lr_struc_descr ?= cl_abap_typedescr=>describe_by_data( <fs> ).
  LOOP AT lr_struc_descr->components ASSIGNING <ls_component>.
    lt_components-component = sy-tabix.
    lt_components-name      = <ls_component>-name.
    APPEND lt_components.
  ENDLOOP.
  SORT lt_components BY name.

  LOOP AT lt_components INTO DATA(lw_components).
    CLEAR:lv_waerk,lv_racct.
    ASSIGN COMPONENT  'BUDAT'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = '合计'.

    lv_waerk = lw_components-name.
    LOOP AT gt_rqhj INTO DATA(lw_rqhj) WHERE rtcur = lv_waerk AND  racct = ''.
      IF p_bwb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_rqhj-dmbtr.
      ELSEIF p_yb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_rqhj-wrbtr.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

  IF gt_rqhj[] IS NOT INITIAL.
    APPEND <dyn_wa> TO <dyn_table>.
    CLEAR:<dyn_wa>.
  ENDIF.

  LOOP AT lt_components INTO lw_components.
    CLEAR:lv_waerk,lv_racct.
    ASSIGN COMPONENT  'BUDAT'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = '每日平均'.

    lv_waerk = lw_components-name.
    LOOP AT gt_rqhj INTO lw_rqhj WHERE rtcur = lv_waerk AND  racct = ''.
      IF p_bwb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_rqhj-dmbtr / lv_index.
      ELSEIF p_yb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_rqhj-wrbtr  / lv_index.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

  IF gt_rqhj[] IS NOT INITIAL.
    APPEND <dyn_wa> TO <dyn_table>.
    CLEAR:<dyn_wa>.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_rqqc_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LT_BSEG
*&      --> LV_QZDAT
*&---------------------------------------------------------------------*
FORM frm_get_rqqc_data  TABLES   pt_bseg STRUCTURE bseg
                        USING  pv_qzdat.

  DATA:lv_num_char  TYPE char2,
       lv_month     TYPE char2,
       lv_num       TYPE numc3,
       lv_hslvt     TYPE faglflext-hslvt,
       lv_tslvt     TYPE faglflext-tslvt,
       lv_hsl       TYPE faglflext-hslvt,
       lv_hsl_temp  TYPE faglflext-hslvt,
       lv_tsl       TYPE faglflext-tslvt,
       lv_tsl_temp  TYPE faglflext-tslvt,
       lv_field_hsl TYPE string,
       lv_field_tsl TYPE string.
  FIELD-SYMBOLS: <fs_any_hsl> TYPE any,
                 <fs_any_tsl> TYPE any.

  SELECT * INTO TABLE @DATA(lt_faglflext)
   FROM faglflext
    FOR ALL ENTRIES IN @pt_bseg
   WHERE racct EQ @pt_bseg-hkont AND
         rbukrs EQ @p_bukrs AND
         racct IN @s_racct AND
         ryear EQ @pv_qzdat+0(4).

  lv_month = pv_qzdat+4(2).
  LOOP AT lt_faglflext INTO DATA(lw_faglflext).
    CLEAR:lv_num_char,lv_hslvt,lv_tslvt,lv_hsl_temp,lv_field_hsl,lv_field_tsl.
    lv_hslvt = lw_faglflext-hslvt.
    lv_tslvt = lw_faglflext-tslvt.

    DO .
      CLEAR:lv_hsl,lv_tsl.
      lv_num_char = lv_num_char + 1.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = lv_num_char
        IMPORTING
          output = lv_num_char.
      CONCATENATE  'LW_FAGLFLEXT-HSL' lv_num_char INTO lv_field_hsl.
      CONCATENATE  'LW_FAGLFLEXT-TSL' lv_num_char INTO lv_field_tsl.
      UNASSIGN:<fs_any_hsl>,<fs_any_tsl>.
      ASSIGN (lv_field_hsl) TO <fs_any_hsl>.
      IF <fs_any_hsl> IS ASSIGNED.
        lv_hsl  = <fs_any_hsl>.
      ENDIF.
      lv_hsl_temp = lv_hsl + lv_hsl_temp.

      ASSIGN (lv_field_tsl) TO <fs_any_tsl>.
      IF <fs_any_tsl> IS ASSIGNED.
        lv_tsl  = <fs_any_tsl>.
      ENDIF.
      lv_tsl_temp = lv_tsl + lv_tsl_temp.
      IF lv_num_char = lv_month.
        EXIT.
      ENDIF.
    ENDDO.

    lv_hsl_temp = lv_hslvt + lv_hsl_temp.
    lv_tsl_temp = lv_tslvt + lv_tsl_temp.

    gt_rqqcmx = VALUE #( racct = lw_faglflext-racct
                       rtcur = lw_faglflext-rtcur
                       hsl = lv_hsl_temp
                       tsl = lv_tsl_temp
                     ).
    COLLECT gt_rqqcmx.

    gt_rqqcmxhz = VALUE #( rtcur = lw_faglflext-rtcur
                       hsl = lv_hsl_temp
                       tsl = lv_tsl_temp
                     ).
    COLLECT gt_rqqcmxhz.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_beginning_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_beginning_data .
  DATA:lv_bedat TYPE datum.

  SORT gt_budat BY budat .
  lv_bedat = gt_budat[ 1 ] .
  IF p_mx = 'X'.
    LOOP AT gt_hkont.
      IF p_yb = 'X'.
        LOOP AT gt_rqqcmx WHERE racct = gt_hkont-hkont .
          "把期初累计到当前的明细原币
          gt_rqmx_yb-budat = lv_bedat.
          gt_rqmx_yb-gjahr = lv_bedat+0(4).
          gt_rqmx_yb-hkont = gt_hkont-hkont .
          gt_rqmx_yb-pswsl = gt_rqqcmx-rtcur.
          gt_rqmx_yb-wrbtr = gt_rqqcmx-tsl.
          COLLECT gt_rqmx_yb.

          "把期初累计到最后的合计金额
          gt_rqhj = VALUE #( racct = gt_hkont-hkont
                             rtcur = gt_rqqcmx-rtcur
                             dmbtr = gt_rqqcmx-hsl
                             wrbtr = gt_rqqcmx-tsl ).
          COLLECT gt_rqhj.
        ENDLOOP.
      ELSEIF p_bwb = 'X'.
        READ TABLE gt_rqqcmx WITH KEY racct = gt_hkont-hkont .
        IF sy-subrc EQ 0.
          "把期初累计到当前的明细本位币
          gt_rqmx_bwb-budat = lv_bedat.
          gt_rqmx_bwb-gjahr = lv_bedat+0(4).
          gt_rqmx_bwb-hkont = gt_hkont-hkont ..
          gt_rqmx_bwb-pswsl = gt_rqqcmx-rtcur.
          gt_rqmx_bwb-dmbtr = gt_rqqcmx-hsl.
          COLLECT gt_rqmx_bwb.

          "把期初累计到最后的合计金额
          gt_rqhj = VALUE #( racct = gt_hkont-hkont
                             rtcur = gt_rqqcmx-rtcur
                             dmbtr = gt_rqqcmx-hsl
                             wrbtr = gt_rqqcmx-tsl ).
          COLLECT gt_rqhj.
        ENDIF.
      ENDIF.
    ENDLOOP.
  ELSEIF p_hz = 'X'.
    LOOP AT gt_pswsl.
      IF p_yb = 'X'.
        LOOP AT gt_rqqcmxhz WHERE rtcur = gt_pswsl-pswsl.
          "把期初累计到当前的汇总
          gt_rqhz-budat = lv_bedat.
          gt_rqhz-pswsl = gt_pswsl-pswsl.
          gt_rqhz-wrbtr = gt_rqqcmxhz-tsl.
          gt_rqhz-dmbtr = gt_rqqcmxhz-hsl.
          COLLECT gt_rqhz.

          "把期初累计到最后的合计金额
          gt_rqhj = VALUE #( rtcur = gt_pswsl-pswsl
                             dmbtr = gt_rqqcmxhz-hsl
                             wrbtr = gt_rqqcmxhz-tsl ).
          COLLECT gt_rqhj.
        ENDLOOP.
      ELSEIF p_bwb = 'X'.
        READ TABLE gt_rqqcmxhz WITH KEY rtcur = 'CNY'.
        IF sy-subrc EQ 0.
          "把期初累计到当前的汇总
          gt_rqhz-budat = lv_bedat.
          gt_rqhz-pswsl = gt_pswsl-pswsl.
          gt_rqhz-wrbtr = gt_rqqcmxhz-tsl.
          gt_rqhz-dmbtr = gt_rqqcmxhz-hsl.
          COLLECT gt_rqhz.

          "把期初累计到最后的合计金额
          gt_rqhj = VALUE #( rtcur = gt_pswsl-pswsl
                             dmbtr = gt_rqqcmxhz-hsl
                             wrbtr = gt_rqqcmxhz-tsl ).
          COLLECT gt_rqhj.
        ENDIF.
      ENDIF.
    ENDLOOP.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_EXCEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_create_excel .

* 启动Excel
  CREATE OBJECT lv_excel 'EXCEL.APPLICATION'.

  IF sy-subrc <> 0.
    WRITE: / '启动Excel失败。'.
    STOP.
  ENDIF.

  CALL METHOD OF
    lv_excel
      'WORKBOOKS' = lv_workbook.

* 使excel 可视
  SET PROPERTY OF lv_excel 'VISIBLE'             = 0.  "0:不可视,1:可视

  SET PROPERTY OF lv_excel 'SHEETSINNEWWORKBOOK' = 1.
  "如果是读取excel文件中的内容 则是直接打开工作簿第一页
  CALL METHOD OF
    lv_workbook
    'ADD'.
* 例如:CALL
*       METHOD OF EXCEL 'WORKSHEETS'  = SHEET  EXPORTING #1 = 1.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_PROCESS_DATA_TO_EXCEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_process_data_to_excel USING  p_in_excel  TYPE ole2_object
                            p_in_line   TYPE i
                            p_in_field  TYPE any
                            p_out_cols  TYPE i.
  DATA: lv_cell   TYPE ole2_object.

* 指定单元格
  CALL METHOD OF
      p_in_excel
      'CELLS'    = lv_cell
    EXPORTING
      #1         = p_in_line
      #2         = p_out_cols.
* 写入值
  SET  PROPERTY OF lv_cell
                   'VALUE' = p_in_field.

  p_out_cols = p_out_cols + 1.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_excel
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_excel .
  PERFORM frm_create_excel.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_excel_dyn_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_excel_dyn_data .
  DATA:lc_dyn_fidld(18) TYPE c.
  DATA:lv_hsl       LIKE faglflext-hslvt,
       lv_hsl_fcode LIKE faglflext-hslvt.
  DATA:lv_bedat TYPE datum,
       lv_endat TYPE datum.
  BREAK-POINT.

  CLEAR:lv_hsl.
  IF s_jzrq[] IS NOT INITIAL.
    IF p_mx = 'X'.
      PERFORM frm_set_excel_data_jzrq_mx."日期明细
    ELSEIF p_hz = 'X'.
      PERFORM frm_set_excel_data_jzrq_hz."日期汇总
    ENDIF.
  ELSEIF s_jzqj[] IS NOT INITIAL.
    IF p_mx = 'X'.
      PERFORM frm_set_excel_data_jzqj_mx."期间明细
    ELSEIF p_hz = 'X'.
      PERFORM frm_set_excel_data_jzqj_hz."期间汇总
    ENDIF.
  ENDIF.

  "GET PROPERTY OF lv_excel 'ACTIVESHEET'    = lv_sheet.     "激活工作簿
  GET PROPERTY OF lv_excel 'ACTIVEWORKBOOK' = lv_workbook.  "激活工作区

  CALL METHOD OF
    lv_workbook
    'SAVEAS'
    EXPORTING
      #1 = gv_xlsname
      #2 = 1.

  "将excel文件保存
  CALL METHOD  OF lv_workbook 'CLOSE'.                  "关闭工作区
  CALL METHOD OF
    lv_excel
    'QUIT'.
  "退出excel

*WRITE:/ XLSNAME,'DONE'.
  "退出成功,输出done

  FREE OBJECT lv_sheet.                               "释放操作
  FREE OBJECT lv_workbook.
  FREE OBJECT lv_excel.

  MESSAGE '保存成功,路径:' && gv_xlsname  TYPE 'S'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_excel_data_jzrq_mx
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_excel_data_jzrq_mx .
  DATA:lv_field(18) TYPE c,
       lv_index     TYPE i.
  DATA:lr_struc_descr TYPE REF TO cl_abap_structdescr,
       BEGIN OF lt_components OCCURS 40,
         name      TYPE abap_compdescr-name,
         component TYPE sy-tabix,
       END OF lt_components.
  DATA:lv_waerk TYPE waerk,
       lv_racct TYPE racct.
  FIELD-SYMBOLS: <ls_component> TYPE abap_compdescr,
                 <fs>           TYPE any.
  DATA:lv_row TYPE i VALUE 1,
       lv_col TYPE i.
  lv_cols = 1.


  PERFORM frm_process_data_to_excel USING lv_excel lv_row '日期' lv_cols.

  IF p_yb  = 'X'.
    LOOP AT gt_hkont.
      LOOP AT gt_pswsl.
        READ TABLE gt_rqmx_yb WITH KEY pswsl = gt_pswsl-pswsl hkont = gt_hkont-hkont .
        IF sy-subrc EQ 0.
          lv_field = gt_pswsl-pswsl && '_' && gt_hkont-hkont.
          PERFORM frm_process_data_to_excel USING lv_excel lv_row lv_field lv_cols.
        ENDIF.
      ENDLOOP.
    ENDLOOP.
  ELSEIF p_bwb = 'X'.
    LOOP AT gt_hkont..
      LOOP AT gt_pswsl.
        READ TABLE gt_rqmx_bwb WITH KEY pswsl = gt_pswsl-pswsl hkont = gt_hkont-hkont .
        IF sy-subrc EQ 0 .
          lv_field = gt_pswsl-pswsl && '_' && gt_hkont-hkont.
          PERFORM frm_process_data_to_excel USING lv_excel lv_row lv_field lv_cols.
        ENDIF.
      ENDLOOP.
    ENDLOOP.
  ENDIF.

  lv_cols = 1.

  LOOP AT gt_budat.
    lv_row = lv_row + 1.

    ASSIGN COMPONENT  'BUDAT'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = gt_budat-budat.

    PERFORM frm_process_data_to_excel USING lv_excel lv_row gt_budat-budat lv_cols.

    IF p_yb  = 'X'.
      LOOP AT gt_hkont.

        LOOP AT gt_pswsl.
          READ TABLE gt_rqmx_yb WITH KEY pswsl = gt_pswsl-pswsl hkont = gt_hkont-hkont budat = gt_budat-budat.
          IF sy-subrc EQ 0.
            lv_field = gt_pswsl-pswsl && '_' && gt_hkont-hkont.
            ASSIGN COMPONENT  lv_field  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
            <dyn_field> = gt_rqmx_yb-wrbtr.

            PERFORM frm_process_data_to_excel USING lv_excel lv_row gt_rqmx_yb-wrbtr lv_cols.
          ENDIF.
        ENDLOOP.
      ENDLOOP.
    ELSEIF p_bwb = 'X'.
      LOOP AT gt_hkont..
        LOOP AT gt_pswsl.
          READ TABLE gt_rqmx_bwb WITH KEY pswsl = gt_pswsl-pswsl hkont = gt_hkont-hkont budat = gt_budat-budat.
          IF sy-subrc EQ 0 .
            lv_field = gt_pswsl-pswsl && '_' && gt_hkont-hkont.
            ASSIGN COMPONENT  lv_field  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
            <dyn_field> = gt_rqmx_bwb-dmbtr.
            PERFORM frm_process_data_to_excel USING lv_excel lv_row gt_rqmx_bwb-dmbtr lv_cols.
          ENDIF.
        ENDLOOP.
      ENDLOOP.
    ENDIF.

    APPEND <dyn_wa> TO <dyn_table>.
    CLEAR:<dyn_wa>.

    lv_cols = 1.
  ENDLOOP.

  "最后累计金额和日均

  ASSIGN LOCAL COPY OF INITIAL LINE OF <dyn_table> TO <fs>.
  lr_struc_descr ?= cl_abap_typedescr=>describe_by_data( <fs> ).
  LOOP AT lr_struc_descr->components ASSIGNING <ls_component>.
    lt_components-component = sy-tabix.
    lt_components-name      = <ls_component>-name.
    APPEND lt_components.
  ENDLOOP.
  SORT lt_components BY name.

  lv_row = lv_row + 1.
  lv_cols = 1.
  PERFORM frm_process_data_to_excel USING lv_excel lv_row  '合计' lv_cols.
  lv_cols = 2.

  LOOP AT lt_components INTO DATA(lw_components).
    CLEAR:lv_waerk,lv_racct.
    ASSIGN COMPONENT  'BUDAT'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = '合计'.

    SPLIT lw_components-name AT '_' INTO lv_waerk lv_racct.
    LOOP AT gt_rqhj INTO DATA(lw_rqhj) WHERE rtcur = lv_waerk AND  racct = lv_racct..
      IF p_bwb = 'X'.
        PERFORM frm_process_data_to_excel USING lv_excel lv_row  lw_rqhj-dmbtr lv_cols.
      ELSEIF p_yb = 'X'.
        PERFORM frm_process_data_to_excel USING lv_excel lv_row  lw_rqhj-wrbtr lv_cols.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

  lv_row = lv_row + 1.
  lv_index = lines( gt_budat ).
  lv_cols = 1.
  PERFORM frm_process_data_to_excel USING lv_excel lv_row  '每日平均' lv_cols.
  lv_cols = 2.

  LOOP AT lt_components INTO lw_components.
    CLEAR:lv_waerk,lv_racct.
    ASSIGN COMPONENT  'BUDAT'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = '每日平均'.

    SPLIT lw_components-name AT '_' INTO lv_waerk lv_racct.
    LOOP AT gt_rqhj INTO lw_rqhj WHERE rtcur = lv_waerk AND  racct = lv_racct..
      IF p_bwb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_rqhj-dmbtr / lv_index.
        PERFORM frm_process_data_to_excel USING lv_excel lv_row  <dyn_field> lv_cols.
      ELSEIF p_yb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_rqhj-wrbtr  / lv_index.
        PERFORM frm_process_data_to_excel USING lv_excel lv_row  <dyn_field> lv_cols.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_excel_data_jzrq_hz
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_excel_data_jzrq_hz .
  DATA:lv_field(18) TYPE c,
       lv_index     TYPE i.
  DATA:lr_struc_descr TYPE REF TO cl_abap_structdescr,
       BEGIN OF lt_components OCCURS 40,
         name      TYPE abap_compdescr-name,
         component TYPE sy-tabix,
       END OF lt_components.
  DATA:lv_waerk TYPE waerk,
       lv_racct TYPE racct.
  FIELD-SYMBOLS: <ls_component> TYPE abap_compdescr,
                 <fs>           TYPE any.
  DATA:lv_row TYPE i VALUE 1,
       lv_col TYPE i.
  lv_cols = 1.

  PERFORM frm_process_data_to_excel USING lv_excel lv_row '日期' lv_cols.

  LOOP AT gt_pswsl.
    PERFORM frm_process_data_to_excel USING lv_excel lv_row gt_pswsl-pswsl lv_cols.
  ENDLOOP.

  lv_cols = 1.

  LOOP AT gt_budat.
    lv_row = lv_row + 1.

    ASSIGN COMPONENT  'BUDAT'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = gt_budat-budat.

    PERFORM frm_process_data_to_excel USING lv_excel lv_row gt_budat-budat lv_cols.

    LOOP AT gt_pswsl.
      READ TABLE gt_rqhz WITH KEY budat = gt_budat-budat pswsl = gt_pswsl-pswsl.
      IF sy-subrc EQ 0.
        ASSIGN COMPONENT  gt_pswsl-pswsl  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        IF p_bwb = 'X'.
          <dyn_field> = gt_rqhz-dmbtr.
        ELSEIF p_yb = 'X'.
          <dyn_field> = gt_rqhz-wrbtr.
        ENDIF.

        PERFORM frm_process_data_to_excel USING lv_excel lv_row <dyn_field> lv_cols.
      ENDIF.
    ENDLOOP.
    APPEND <dyn_wa> TO <dyn_table>.
    CLEAR:<dyn_wa>.

    lv_cols = 1.
  ENDLOOP.

  "获取日期合计和日均
  ASSIGN LOCAL COPY OF INITIAL LINE OF <dyn_table> TO <fs>.
  lr_struc_descr ?= cl_abap_typedescr=>describe_by_data( <fs> ).
  LOOP AT lr_struc_descr->components ASSIGNING <ls_component>.
    lt_components-component = sy-tabix.
    lt_components-name      = <ls_component>-name.
    APPEND lt_components.
  ENDLOOP.
  SORT lt_components BY name.

  lv_row = lv_row + 1.
  lv_cols = 1.
  PERFORM frm_process_data_to_excel USING lv_excel lv_row  '合计' lv_cols.
  lv_cols = 2.

  LOOP AT lt_components INTO DATA(lw_components).
    CLEAR:lv_waerk,lv_racct.
    ASSIGN COMPONENT  'BUDAT'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = '合计'.

    lv_waerk = lw_components-name.
    LOOP AT gt_rqhj INTO DATA(lw_rqhj) WHERE rtcur = lv_waerk AND  racct = ''.
      IF p_bwb = 'X'.
        PERFORM frm_process_data_to_excel USING lv_excel lv_row  lw_rqhj-dmbtr lv_cols.
      ELSEIF p_yb = 'X'.
        PERFORM frm_process_data_to_excel USING lv_excel lv_row  lw_rqhj-wrbtr lv_cols.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

  lv_row = lv_row + 1.
  lv_index = lines( gt_budat ).
  lv_cols = 1.
  PERFORM frm_process_data_to_excel USING lv_excel lv_row  '每日平均' lv_cols.
  lv_cols = 2.

  LOOP AT lt_components INTO lw_components.
    CLEAR:lv_waerk,lv_racct.
    lv_waerk = lw_components-name.
    LOOP AT gt_rqhj INTO lw_rqhj WHERE rtcur = lv_waerk AND  racct = ''.
      IF p_bwb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_rqhj-dmbtr / lv_index.
        PERFORM frm_process_data_to_excel USING lv_excel lv_row  <dyn_field> lv_cols.
      ELSEIF p_yb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_rqhj-wrbtr  / lv_index.
        PERFORM frm_process_data_to_excel USING lv_excel lv_row  <dyn_field> lv_cols.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_download_excel
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_download_excel  CHANGING pv_path  TYPE string..
  DATA: lv_filename TYPE string,
        lv_path     TYPE string.

  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title         = '下载文件'
      file_filter          = '*.xls'
    CHANGING
      filename             = lv_filename
      path                 = lv_path
      fullpath             = pv_path
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.

  IF sy-subrc <> 0.
*   Implement suitable error handling here
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_data_jzqj_mx
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_data_jzqj_mx .
  DATA:lv_field(18) TYPE c,
       lv_index     TYPE i.
  DATA:lr_struc_descr TYPE REF TO cl_abap_structdescr,
       BEGIN OF lt_components OCCURS 40,
         name      TYPE abap_compdescr-name,
         component TYPE sy-tabix,
       END OF lt_components.
  DATA:lv_waerk TYPE waerk,
       lv_racct TYPE racct.
  FIELD-SYMBOLS: <ls_component> TYPE abap_compdescr,
                 <fs>           TYPE any.

  LOOP AT gt_period.
    lv_index = lv_index + 1.

    ASSIGN COMPONENT  'YMONTH'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = gt_period-ymonth.

    IF p_yb  = 'X'.
      LOOP AT gt_hkont..
        LOOP AT gt_pswsl.
          READ TABLE gt_qjmx_yb WITH KEY rtcur = gt_pswsl-pswsl racct = gt_hkont-hkont ymonth = gt_period-ymonth.
          IF sy-subrc EQ 0.
            lv_field = gt_pswsl-pswsl && '_' && gt_hkont-hkont.
            ASSIGN COMPONENT  lv_field  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
            <dyn_field> = gt_qjmx_yb-wrbtr.
          ENDIF.
        ENDLOOP.
      ENDLOOP.
    ELSEIF p_bwb = 'X'.
      LOOP AT gt_hkont..
        LOOP AT gt_pswsl.
          READ TABLE gt_qjmx_bwb WITH KEY rtcur = gt_pswsl-pswsl racct = gt_hkont-hkont ymonth = gt_period-ymonth.
          IF sy-subrc EQ 0 .
            lv_field = gt_pswsl-pswsl && '_' && gt_hkont-hkont.
            ASSIGN COMPONENT  lv_field  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
            <dyn_field> = gt_qjmx_bwb-dmbtr.
          ENDIF.
        ENDLOOP.
      ENDLOOP.
    ENDIF.

    APPEND <dyn_wa> TO <dyn_table>.
    CLEAR:<dyn_wa>.
  ENDLOOP.

  "获取期间和月均
  ASSIGN LOCAL COPY OF INITIAL LINE OF <dyn_table> TO <fs>.
  lr_struc_descr ?= cl_abap_typedescr=>describe_by_data( <fs> ).
  LOOP AT lr_struc_descr->components ASSIGNING <ls_component>.
    lt_components-component = sy-tabix.
    lt_components-name      = <ls_component>-name.
    APPEND lt_components.
  ENDLOOP.
  SORT lt_components BY name.

  LOOP AT lt_components INTO DATA(lw_components).
    CLEAR:lv_waerk,lv_racct.
    ASSIGN COMPONENT  'YMONTH'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = '合计'.

    SPLIT lw_components-name AT '_' INTO lv_waerk lv_racct.
    LOOP AT gt_qjhj INTO DATA(lw_qjhj) WHERE rtcur = lv_waerk AND  racct = lv_racct..
      IF p_bwb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_qjhj-dmbtr.
      ELSEIF p_yb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_qjhj-wrbtr.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

  IF gt_qjhj[] IS NOT INITIAL.
    APPEND <dyn_wa> TO <dyn_table>.
    CLEAR:<dyn_wa>.
  ENDIF.

  LOOP AT lt_components INTO lw_components.
    CLEAR:lv_waerk,lv_racct.
    ASSIGN COMPONENT  'YMONTH'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = '月度平均'.

    SPLIT lw_components-name AT '_' INTO lv_waerk lv_racct.
    LOOP AT gt_qjhj INTO lw_qjhj WHERE rtcur = lv_waerk AND  racct = lv_racct..
      IF p_bwb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_qjhj-dmbtr / lv_index.
      ELSEIF p_yb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_qjhj-wrbtr  / lv_index.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

  IF gt_qjhj[] IS NOT INITIAL.
    APPEND <dyn_wa> TO <dyn_table>.
    CLEAR:<dyn_wa>.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_data_jzqj_hz
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_data_jzqj_hz .
  DATA:lv_field(18) TYPE c,
       lv_index     TYPE i.
  DATA:lr_struc_descr TYPE REF TO cl_abap_structdescr,
       BEGIN OF lt_components OCCURS 40,
         name      TYPE abap_compdescr-name,
         component TYPE sy-tabix,
       END OF lt_components.
  DATA:lv_waerk TYPE waerk,
       lv_racct TYPE racct.
  FIELD-SYMBOLS: <ls_component> TYPE abap_compdescr,
                 <fs>           TYPE any.

  LOOP AT gt_period.
    lv_index = lv_index + 1.

    ASSIGN COMPONENT  'YMONTH'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = gt_period-ymonth.

    LOOP AT gt_pswsl.
      READ TABLE gt_qjhz WITH KEY ymonth = gt_period-ymonth rtcur = gt_pswsl-pswsl.
      IF sy-subrc EQ 0.
        ASSIGN COMPONENT  gt_pswsl-pswsl  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        IF p_bwb = 'X'.
          <dyn_field> = gt_qjhz-dmbtr.
        ELSEIF p_yb = 'X'.
          <dyn_field> = gt_qjhz-wrbtr.
        ENDIF.
      ENDIF.
    ENDLOOP.
    APPEND <dyn_wa> TO <dyn_table>.
    CLEAR:<dyn_wa>.
  ENDLOOP.

  "获取期间和月均
  ASSIGN LOCAL COPY OF INITIAL LINE OF <dyn_table> TO <fs>.
  lr_struc_descr ?= cl_abap_typedescr=>describe_by_data( <fs> ).
  LOOP AT lr_struc_descr->components ASSIGNING <ls_component>.
    lt_components-component = sy-tabix.
    lt_components-name      = <ls_component>-name.
    APPEND lt_components.
  ENDLOOP.
  SORT lt_components BY name.

  LOOP AT lt_components INTO DATA(lw_components).
    CLEAR:lv_waerk,lv_racct.
    ASSIGN COMPONENT  'YMONTH'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = '合计'.

    SPLIT lw_components-name AT '_' INTO lv_waerk lv_racct.
    LOOP AT gt_qjhj INTO DATA(lw_qjhj) WHERE rtcur = lv_waerk AND  racct = lv_racct..
      IF p_bwb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_qjhj-dmbtr.
      ELSEIF p_yb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_qjhj-wrbtr.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

  IF gt_qjhj[] IS NOT INITIAL.
    APPEND <dyn_wa> TO <dyn_table>.
    CLEAR:<dyn_wa>.
  ENDIF.

  LOOP AT lt_components INTO lw_components.
    CLEAR:lv_waerk,lv_racct.
    ASSIGN COMPONENT  'YMONTH'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = '月度平均'.

    SPLIT lw_components-name AT '_' INTO lv_waerk lv_racct.
    LOOP AT gt_qjhj INTO lw_qjhj WHERE rtcur = lv_waerk AND  racct = lv_racct..
      IF p_bwb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_qjhj-dmbtr / lv_index.
      ELSEIF p_yb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_qjhj-wrbtr  / lv_index.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

  IF gt_qjhj[] IS NOT INITIAL.
    APPEND <dyn_wa> TO <dyn_table>.
    CLEAR:<dyn_wa>.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_excel_data_jzqj_mx
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_excel_data_jzqj_mx .
  DATA:lv_field(18) TYPE c,
       lv_index     TYPE i.
  DATA:lr_struc_descr TYPE REF TO cl_abap_structdescr,
       BEGIN OF lt_components OCCURS 40,
         name      TYPE abap_compdescr-name,
         component TYPE sy-tabix,
       END OF lt_components.
  DATA:lv_waerk TYPE waerk,
       lv_racct TYPE racct.
  FIELD-SYMBOLS: <ls_component> TYPE abap_compdescr,
                 <fs>           TYPE any.

  DATA:lv_row TYPE i VALUE 1,
       lv_col TYPE i.
  lv_cols = 1.

  PERFORM frm_process_data_to_excel USING lv_excel lv_row '期间' lv_cols.

  IF p_yb  = 'X'.
    LOOP AT gt_hkont.
      LOOP AT gt_pswsl.
        READ TABLE gt_qjmx_yb WITH KEY rtcur = gt_pswsl-pswsl racct = gt_hkont-hkont .
        IF sy-subrc EQ 0.
          lv_field = gt_pswsl-pswsl && '_' && gt_hkont-hkont.
          PERFORM frm_process_data_to_excel USING lv_excel lv_row lv_field lv_cols.
        ENDIF.
      ENDLOOP.
    ENDLOOP.
  ELSEIF p_bwb = 'X'.
    LOOP AT gt_hkont.
      LOOP AT gt_pswsl.
        READ TABLE gt_qjmx_bwb WITH KEY rtcur = gt_pswsl-pswsl racct = gt_hkont-hkont .
        IF sy-subrc EQ 0 .
          lv_field = gt_pswsl-pswsl && '_' && gt_hkont-hkont.
          PERFORM frm_process_data_to_excel USING lv_excel lv_row lv_field lv_cols.
        ENDIF.
      ENDLOOP.
    ENDLOOP.
  ENDIF.

  lv_cols = 1.
  LOOP AT gt_period.
    lv_row = lv_row + 1.
    lv_index = lv_index + 1.

    ASSIGN COMPONENT  'YMONTH'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = gt_period-ymonth.

    PERFORM frm_process_data_to_excel USING lv_excel lv_row gt_period-ymonth lv_cols.

    IF p_yb  = 'X'.
      LOOP AT gt_hkont.
        LOOP AT gt_pswsl.
          READ TABLE gt_qjmx_yb WITH KEY rtcur = gt_pswsl-pswsl racct = gt_hkont-hkont ymonth = gt_period-ymonth.
          IF sy-subrc EQ 0.
            lv_field = gt_pswsl-pswsl && '_' && gt_hkont-hkont.
            ASSIGN COMPONENT  lv_field  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
            <dyn_field> = gt_qjmx_yb-wrbtr.
            PERFORM frm_process_data_to_excel USING lv_excel lv_row <dyn_field> lv_cols.
          ENDIF.
        ENDLOOP.
      ENDLOOP.
    ELSEIF p_bwb = 'X'.
      LOOP AT gt_hkont..
        LOOP AT gt_pswsl.
          READ TABLE gt_qjmx_bwb WITH KEY rtcur = gt_pswsl-pswsl racct = gt_hkont-hkont ymonth = gt_period-ymonth.
          IF sy-subrc EQ 0 .
            lv_field = gt_pswsl-pswsl && '_' && gt_hkont-hkont.
            ASSIGN COMPONENT  lv_field  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
            <dyn_field> = gt_qjmx_bwb-dmbtr.

            PERFORM frm_process_data_to_excel USING lv_excel lv_row <dyn_field> lv_cols.
          ENDIF.
        ENDLOOP.
      ENDLOOP.
    ENDIF.

    APPEND <dyn_wa> TO <dyn_table>.
    CLEAR:<dyn_wa>.
    lv_cols = 1.
  ENDLOOP.

  ASSIGN LOCAL COPY OF INITIAL LINE OF <dyn_table> TO <fs>.
  lr_struc_descr ?= cl_abap_typedescr=>describe_by_data( <fs> ).
  LOOP AT lr_struc_descr->components ASSIGNING <ls_component>.
    lt_components-component = sy-tabix.
    lt_components-name      = <ls_component>-name.
    APPEND lt_components.
  ENDLOOP.
  SORT lt_components BY name.

  lv_row = lv_row + 1.
  lv_cols = 1.
  PERFORM frm_process_data_to_excel USING lv_excel lv_row  '合计' lv_cols.
  lv_cols = 2.

  LOOP AT lt_components INTO DATA(lw_components).
    CLEAR:lv_waerk,lv_racct.
    ASSIGN COMPONENT  'YMONTH'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = '合计'.

    SPLIT lw_components-name AT '_' INTO lv_waerk lv_racct.
    LOOP AT gt_qjhj INTO DATA(lw_qjhj) WHERE rtcur = lv_waerk AND  racct = lv_racct..
      IF p_bwb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_qjhj-dmbtr.
        PERFORM frm_process_data_to_excel USING lv_excel lv_row <dyn_field> lv_cols.
      ELSEIF p_yb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_qjhj-wrbtr.
        PERFORM frm_process_data_to_excel USING lv_excel lv_row <dyn_field> lv_cols.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

  lv_row = lv_row + 1.
  lv_cols = 1.
  PERFORM frm_process_data_to_excel USING lv_excel lv_row  '月度平均' lv_cols.
  lv_cols = 2.

  LOOP AT lt_components INTO lw_components.
    CLEAR:lv_waerk,lv_racct.
    ASSIGN COMPONENT  'YMONTH'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = '月度平均'.

    SPLIT lw_components-name AT '_' INTO lv_waerk lv_racct.
    LOOP AT gt_qjhj INTO lw_qjhj WHERE rtcur = lv_waerk AND  racct = lv_racct..
      IF p_bwb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_qjhj-dmbtr / lv_index.
        PERFORM frm_process_data_to_excel USING lv_excel lv_row <dyn_field> lv_cols.
      ELSEIF p_yb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_qjhj-wrbtr  / lv_index.
        PERFORM frm_process_data_to_excel USING lv_excel lv_row <dyn_field> lv_cols.
      ENDIF.
    ENDLOOP.
  ENDLOOP.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_excel_data_jzqj_hz
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_excel_data_jzqj_hz .
  DATA:lv_field(18) TYPE c,
       lv_index     TYPE i.
  DATA:lr_struc_descr TYPE REF TO cl_abap_structdescr,
       BEGIN OF lt_components OCCURS 40,
         name      TYPE abap_compdescr-name,
         component TYPE sy-tabix,
       END OF lt_components.
  DATA:lv_waerk TYPE waerk,
       lv_racct TYPE racct.
  FIELD-SYMBOLS: <ls_component> TYPE abap_compdescr,
                 <fs>           TYPE any.
  DATA:lv_row TYPE i VALUE 1,
       lv_col TYPE i.
  lv_cols = 1.

  PERFORM frm_process_data_to_excel USING lv_excel lv_row '期间' lv_cols.

  LOOP AT gt_pswsl.
    PERFORM frm_process_data_to_excel USING lv_excel lv_row gt_pswsl-pswsl lv_cols.
  ENDLOOP.

  lv_cols = 1.
  LOOP AT gt_period.
    lv_row = lv_row + 1.
    lv_index = lv_index + 1.
    ASSIGN COMPONENT  'YMONTH'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = gt_period-ymonth.

    PERFORM frm_process_data_to_excel USING lv_excel lv_row gt_period-ymonth lv_cols.

    LOOP AT gt_pswsl.
      READ TABLE gt_qjhz WITH KEY ymonth = gt_period-ymonth rtcur = gt_pswsl-pswsl.
      IF sy-subrc EQ 0.
        ASSIGN COMPONENT  gt_pswsl-pswsl  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        IF p_bwb = 'X'.
          <dyn_field> = gt_qjhz-dmbtr.
        ELSEIF p_yb = 'X'.
          <dyn_field> = gt_qjhz-wrbtr.
        ENDIF.

        PERFORM frm_process_data_to_excel USING lv_excel lv_row <dyn_field> lv_cols.
      ENDIF.
    ENDLOOP.
    APPEND <dyn_wa> TO <dyn_table>.
    CLEAR:<dyn_wa>.

    lv_cols = 1.
  ENDLOOP.

  ASSIGN LOCAL COPY OF INITIAL LINE OF <dyn_table> TO <fs>.
  lr_struc_descr ?= cl_abap_typedescr=>describe_by_data( <fs> ).
  LOOP AT lr_struc_descr->components ASSIGNING <ls_component>.
    lt_components-component = sy-tabix.
    lt_components-name      = <ls_component>-name.
    APPEND lt_components.
  ENDLOOP.
  SORT lt_components BY name.

  lv_row = lv_row + 1.
  lv_cols = 1.
  PERFORM frm_process_data_to_excel USING lv_excel lv_row  '合计' lv_cols.
  lv_cols = 2.

  LOOP AT lt_components INTO DATA(lw_components).
    CLEAR:lv_waerk,lv_racct.
    ASSIGN COMPONENT  'YMONTH'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = '合计'.

    SPLIT lw_components-name AT '_' INTO lv_waerk lv_racct.
    LOOP AT gt_qjhj INTO DATA(lw_qjhj) WHERE rtcur = lv_waerk AND  racct = lv_racct..
      IF p_bwb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_qjhj-dmbtr.
      ELSEIF p_yb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_qjhj-wrbtr.
      ENDIF.
      PERFORM frm_process_data_to_excel USING lv_excel lv_row <dyn_field> lv_cols.
    ENDLOOP.
  ENDLOOP.

  lv_row = lv_row + 1.
  lv_cols = 1.
  PERFORM frm_process_data_to_excel USING lv_excel lv_row  '月度平均' lv_cols.
  lv_cols = 2.

  LOOP AT lt_components INTO lw_components.
    CLEAR:lv_waerk,lv_racct.
    ASSIGN COMPONENT  'YMONTH'  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
    <dyn_field> = '月度平均'.

    SPLIT lw_components-name AT '_' INTO lv_waerk lv_racct.
    LOOP AT gt_qjhj INTO lw_qjhj WHERE rtcur = lv_waerk AND  racct = lv_racct..
      IF p_bwb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_qjhj-dmbtr / lv_index.
      ELSEIF p_yb = 'X'.
        ASSIGN COMPONENT  lw_components-name  OF STRUCTURE <dyn_wa>  TO  <dyn_field> .
        <dyn_field> = lw_qjhj-wrbtr  / lv_index.
      ENDIF.

      PERFORM frm_process_data_to_excel USING lv_excel lv_row <dyn_field> lv_cols.
    ENDLOOP.
  ENDLOOP.
ENDFORM.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值