ZFI利润表(开发笔记)

REPORT ZFIR_PROFIT.

TYPE-POOLS: SLIS.

*CSKS-KOSAR

TABLES: BKPF , BSEG , CSKS , ZFITAB001 , FAGLFLEXA.

CONSTANTS: C_ZNAME TYPE ZFITAB001-ZNAME VALUE 'A02'.

RANGES: R_RACCT FOR FAGLFLEXA-RACCT.
RANGES: R_KOSAR FOR CSKS-KOSAR.
RANGES: R_HKONT FOR ZFITAB001-ZFHKONT.

DATA: IT_FITAB001 TYPE STANDARD TABLE OF ZFITAB001 WITH HEADER LINE.
*--------------------------------------------------------------------*
* 介绍: IT_CELL       统计出 行,列,科目范围等信息
*        IT_CELL_DATA 统计出 行,列,金额
*--------------------------------------------------------------------*
TYPES: BEGIN OF TY_CELL,
         ZROW    TYPE ZFITAB001-ZROW,               "行
         ZCOL    TYPE ZFITAB001-ZCOL,               "列
         R_HKONT TYPE RANGE OF ZFITAB001-ZFHKONT ,  "科目范围
         R_KOSAR TYPE RANGE OF ZFITAB001-ZFKOSAR,   "成本中心类型
         PLUSM   TYPE ZFITAB001-PLUSM,              "正负
         ZXM     TYPE ZFITAB001-ZXM,                "描述
         ZHC     TYPE ZFITAB001-ZHC,                "行次
       END OF TY_CELL.
DATA: IT_CELL TYPE STANDARD TABLE OF TY_CELL WITH HEADER LINE.

TYPES: BEGIN OF TY_CELL_DATA,
         ZROW     TYPE ZFITAB001-ZROW,               "行
         ZCOL     TYPE ZFITAB001-ZCOL,               "列
         BQ_DMBTR TYPE FAGLFLEXT-HSLVT,              "本 期 数
         BN_DMBTR TYPE FAGLFLEXT-HSLVT,              "本年累计数
         SQ_DMBTR TYPE FAGLFLEXT-HSLVT,              "上年同期累计数
       END OF TY_CELL_DATA.
DATA: IT_CELL_DATA TYPE STANDARD TABLE OF TY_CELL_DATA WITH HEADER LINE.

*---- OLE变量
DATA: V_EXCEL TYPE OLE2_OBJECT,
      V_SHEET TYPE OLE2_OBJECT,
*      g_sheet TYPE ole2_object,
      V_BOOK  TYPE OLE2_OBJECT,
      V_CELL  TYPE OLE2_OBJECT.
DATA: V_SHEET_NUMBER TYPE I.
DATA: L_NAME     LIKE WWWDATATAB,
      L_MIME     LIKE W3MIME OCCURS 10,
      L_FILENAME TYPE STRING,
      L_DFNAME   TYPE STRING,
      L_PATH     TYPE STRING,
      L_FULLPATH TYPE STRING,
      L_ROW      TYPE I,
      L_COL      TYPE I,
      L_TITLE    TYPE STRING.

DATA: IDX_TABIX TYPE SY-TABIX.
*--------------------------------------------------------------------*
*               SELECT-SCREEN
*--------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BK1 WITH FRAME.
PARAMETERS: P_BUKRS TYPE BKPF-BUKRS OBLIGATORY,
            P_GJAHR TYPE BKPF-GJAHR OBLIGATORY,
            P_MONAT TYPE BKPF-MONAT OBLIGATORY.
SELECTION-SCREEN END OF BLOCK BK1.

*--------------------------------------------------------------------*
*               START-OF-SELECTION
*--------------------------------------------------------------------*
START-OF-SELECTION.

*---- 查询数据
  PERFORM FRM_GET_DATA.

**---- 下载
  PERFORM FRM_DOWNLOAD_EXCEL.

*--------------------------------------------------------------------*
*                  FORM
*--------------------------------------------------------------------*
FORM FRM_GET_DATA.
  SELECT *
    FROM ZFITAB001
    INTO TABLE IT_FITAB001
   WHERE ZNAME = C_ZNAME
    .

  CLEAR: R_RACCT[].
  LOOP AT IT_FITAB001.
    CLEAR: R_RACCT.
    IF IT_FITAB001-ZFHKONT <> ''.
      IF IT_FITAB001-ZTHKONT <> ''.
        R_RACCT-SIGN = 'I'.
        R_RACCT-OPTION = 'BT'.
        R_RACCT-LOW =  IT_FITAB001-ZFHKONT.
        R_RACCT-HIGH =  IT_FITAB001-ZTHKONT.
        APPEND R_RACCT.
      ELSE.
        R_RACCT-SIGN = 'I'.
        R_RACCT-OPTION = 'EQ'.
        R_RACCT-LOW =  IT_FITAB001-ZFHKONT.
        APPEND R_RACCT.
      ENDIF.
    ENDIF.

*---- 组合每个单元格的查询条件
    READ TABLE IT_CELL WITH KEY ZROW = IT_FITAB001-ZROW ZCOL = IT_FITAB001-ZCOL.
    IF SY-SUBRC = 0.
      IDX_TABIX = SY-TABIX.
      IF IT_FITAB001-ZFHKONT <> ''.
        APPEND R_RACCT TO IT_CELL-R_HKONT[].
      ENDIF.

      IF IT_FITAB001-ZFKOSAR <> ''.
        CLEAR R_KOSAR.
        IF IT_FITAB001-ZFKOSAR = 'B'.
          R_KOSAR-SIGN = 'I'.
          R_KOSAR-OPTION = 'EQ'.
          R_KOSAR-LOW =  ''.
          APPEND R_KOSAR TO IT_CELL-R_KOSAR[].
        ELSE.
          IF IT_FITAB001-ZTKOSAR <> ''.
            R_KOSAR-SIGN = 'I'.
            R_KOSAR-OPTION = 'BT'.
            R_KOSAR-LOW =  IT_FITAB001-ZFKOSAR.
            R_KOSAR-HIGH =  IT_FITAB001-ZTKOSAR.
            APPEND R_KOSAR TO IT_CELL-R_KOSAR[].
          ELSE.
            R_KOSAR-SIGN = 'I'.
            R_KOSAR-OPTION = 'EQ'.
            R_KOSAR-LOW =  IT_FITAB001-ZFKOSAR.
            APPEND R_KOSAR TO IT_CELL-R_KOSAR[].
          ENDIF.
        ENDIF.
      ENDIF.
      MODIFY IT_CELL INDEX IDX_TABIX.
    ELSE.

      CLEAR IT_CELL.
      IT_CELL-ZROW    = IT_FITAB001-ZROW.               "行
      IT_CELL-ZCOL    = IT_FITAB001-ZCOL.               "列
      IT_CELL-PLUSM   = IT_FITAB001-PLUSM.              "正负
      IT_CELL-ZXM     = IT_FITAB001-ZXM.                "描述
      IT_CELL-ZHC     = IT_FITAB001-ZHC.                "行次
      IF IT_FITAB001-ZFHKONT <> ''.
        APPEND R_RACCT TO IT_CELL-R_HKONT[].
      ENDIF.
      IF IT_FITAB001-ZFKOSAR <> ''.
        CLEAR R_KOSAR.
        IF IT_FITAB001-ZFKOSAR = 'B'.
          R_KOSAR-SIGN = 'I'.
          R_KOSAR-OPTION = 'EQ'.
          R_KOSAR-LOW =  ''.
          APPEND R_KOSAR TO IT_CELL-R_KOSAR[].
        ELSE.

          IF IT_FITAB001-ZTKOSAR <> ''.
            R_KOSAR-SIGN = 'I'.
            R_KOSAR-OPTION = 'BT'.
            R_KOSAR-LOW =  IT_FITAB001-ZFKOSAR.
            R_KOSAR-HIGH =  IT_FITAB001-ZTKOSAR.
            APPEND R_KOSAR TO IT_CELL-R_KOSAR[].
          ELSE.
            R_KOSAR-SIGN = 'I'.
            R_KOSAR-OPTION = 'EQ'.
            R_KOSAR-LOW =  IT_FITAB001-ZFKOSAR.
            APPEND R_KOSAR TO IT_CELL-R_KOSAR[].
          ENDIF.

        ENDIF.

      ENDIF.
      APPEND IT_CELL.
    ENDIF.
  ENDLOOP.

  DATA: L_RYEAR TYPE FAGLFLEXA-RYEAR.
  DATA: FLAG TYPE C.
  L_RYEAR = P_GJAHR - 1.   "前一年
  DATA: IT_FAGLFLEXT TYPE STANDARD TABLE OF FAGLFLEXT WITH HEADER LINE.
*---- 查询本年和上一年的金额
  SELECT *
    FROM FAGLFLEXT
   INTO CORRESPONDING FIELDS OF TABLE IT_FAGLFLEXT
    WHERE ( RYEAR = P_GJAHR OR RYEAR = L_RYEAR )
    AND RBUKRS = P_BUKRS
     AND RACCT IN R_RACCT.

*  DELETE it_faglflext WHERE awtyp = 'AUAK'.

  LOOP AT IT_FAGLFLEXT.
    LOOP AT IT_CELL.
      CLEAR IT_CELL_DATA.

      IT_CELL_DATA-ZROW = IT_CELL-ZROW.
      IT_CELL_DATA-ZCOL = IT_CELL-ZCOL.

      CLEAR IT_FITAB001[].
      SELECT * INTO CORRESPONDING FIELDS OF TABLE IT_FITAB001[] FROM ZFITAB001
        WHERE ZNAME = C_ZNAME
          AND ZROW  = IT_CELL-ZROW
          AND ZCOL  = IT_CELL-ZCOL
          .

      DELETE IT_FITAB001[] WHERE ZFHKONT IS INITIAL AND ZTHKONT IS INITIAL AND ZFKOSAR IS INITIAL AND ZTKOSAR IS INITIAL.
      SORT IT_FITAB001[] BY ZFHKONT ZTHKONT ZFKOSAR ZTKOSAR .
      DELETE ADJACENT DUPLICATES FROM IT_FITAB001[] COMPARING ZFHKONT ZTHKONT ZFKOSAR ZTKOSAR.

      CLEAR FLAG .
      LOOP AT IT_FITAB001.
        CLEAR: R_RACCT.
        CLEAR: R_RACCT[].
        IF IT_FITAB001-ZFHKONT <> ''.
          IF IT_FITAB001-ZTHKONT <> ''.
            R_RACCT-SIGN = 'I'.
            R_RACCT-OPTION = 'BT'.
            R_RACCT-LOW =  IT_FITAB001-ZFHKONT.
            R_RACCT-HIGH =  IT_FITAB001-ZTHKONT.
            APPEND R_RACCT.
          ELSE.
            R_RACCT-SIGN = 'I'.
            R_RACCT-OPTION = 'EQ'.
            R_RACCT-LOW =  IT_FITAB001-ZFHKONT.
            APPEND R_RACCT.
          ENDIF.
        ENDIF.

        IF R_RACCT[] IS NOT INITIAL AND IT_FAGLFLEXT-RACCT IN R_RACCT[] .
          CLEAR R_KOSAR.
          CLEAR R_KOSAR[].
          IF IT_FITAB001-ZFKOSAR <> ''.

            IF IT_FITAB001-ZFKOSAR = 'B'.
              R_KOSAR-SIGN = 'I'.
              R_KOSAR-OPTION = 'EQ'.
              R_KOSAR-LOW =  ''.
              APPEND R_KOSAR.
            ELSE.
              IF IT_FITAB001-ZTKOSAR <> ''.
                R_KOSAR-SIGN = 'I'.
                R_KOSAR-OPTION = 'BT'.
                R_KOSAR-LOW =  IT_FITAB001-ZFKOSAR.
                R_KOSAR-HIGH =  IT_FITAB001-ZTKOSAR.
                APPEND R_KOSAR.
              ELSE.
                R_KOSAR-SIGN = 'I'.
                R_KOSAR-OPTION = 'EQ'.
                R_KOSAR-LOW =  IT_FITAB001-ZFKOSAR.
                APPEND R_KOSAR.
              ENDIF.
            ENDIF.

            CLEAR CSKS .
            SELECT SINGLE * FROM CSKS WHERE KOSTL = IT_FAGLFLEXT-RCNTR.
            IF R_KOSAR[] IS NOT INITIAL AND CSKS-KOSAR IN R_KOSAR[].
              FLAG = 'X'.
              EXIT.
            ENDIF.
          ELSE.
            FLAG = 'X'.
            EXIT.
          ENDIF.
        ENDIF.
        CLEAR IT_FITAB001.
      ENDLOOP.

      IF FLAG IS INITIAL.
        CONTINUE.
      ENDIF.

*---- 汇总
*---- 本年
      IF IT_FAGLFLEXT-RYEAR = P_GJAHR.
        CASE P_MONAT.
          WHEN 1.
            IT_CELL_DATA-BQ_DMBTR = IT_FAGLFLEXT-HSL01.           "本 期 数
            CLEAR: IT_FAGLFLEXT-HSL02 , IT_FAGLFLEXT-HSL03 , IT_FAGLFLEXT-HSL04 , IT_FAGLFLEXT-HSL05 , IT_FAGLFLEXT-HSL06,
                   IT_FAGLFLEXT-HSL07 , IT_FAGLFLEXT-HSL08 , IT_FAGLFLEXT-HSL09 , IT_FAGLFLEXT-HSL10 , IT_FAGLFLEXT-HSL11 , IT_FAGLFLEXT-HSL12,
                   IT_FAGLFLEXT-HSL13 , IT_FAGLFLEXT-HSL14 , IT_FAGLFLEXT-HSL15 , IT_FAGLFLEXT-HSL16 .
          WHEN 2.
            IT_CELL_DATA-BQ_DMBTR = IT_FAGLFLEXT-HSL02.           "本 期 数
            CLEAR: IT_FAGLFLEXT-HSL03 , IT_FAGLFLEXT-HSL04 , IT_FAGLFLEXT-HSL05 , IT_FAGLFLEXT-HSL06,
                   IT_FAGLFLEXT-HSL07 , IT_FAGLFLEXT-HSL08 , IT_FAGLFLEXT-HSL09 , IT_FAGLFLEXT-HSL10 , IT_FAGLFLEXT-HSL11 , IT_FAGLFLEXT-HSL12,
                   IT_FAGLFLEXT-HSL13 , IT_FAGLFLEXT-HSL14 , IT_FAGLFLEXT-HSL15 , IT_FAGLFLEXT-HSL16 .
          WHEN 3.
            IT_CELL_DATA-BQ_DMBTR = IT_FAGLFLEXT-HSL03.           "本 期 数
            CLEAR: IT_FAGLFLEXT-HSL04 , IT_FAGLFLEXT-HSL05 , IT_FAGLFLEXT-HSL06,
                   IT_FAGLFLEXT-HSL07 , IT_FAGLFLEXT-HSL08 , IT_FAGLFLEXT-HSL09 , IT_FAGLFLEXT-HSL10 , IT_FAGLFLEXT-HSL11 , IT_FAGLFLEXT-HSL12,
                   IT_FAGLFLEXT-HSL13 , IT_FAGLFLEXT-HSL14 , IT_FAGLFLEXT-HSL15 , IT_FAGLFLEXT-HSL16 .
          WHEN 4.
            IT_CELL_DATA-BQ_DMBTR = IT_FAGLFLEXT-HSL04.           "本 期 数
            CLEAR:  IT_FAGLFLEXT-HSL05 , IT_FAGLFLEXT-HSL06,
                    IT_FAGLFLEXT-HSL07 , IT_FAGLFLEXT-HSL08 , IT_FAGLFLEXT-HSL09 , IT_FAGLFLEXT-HSL10 , IT_FAGLFLEXT-HSL11 , IT_FAGLFLEXT-HSL12,
                    IT_FAGLFLEXT-HSL13 , IT_FAGLFLEXT-HSL14 , IT_FAGLFLEXT-HSL15 , IT_FAGLFLEXT-HSL16 .
          WHEN 5.
            IT_CELL_DATA-BQ_DMBTR = IT_FAGLFLEXT-HSL05.           "本 期 数
            CLEAR: IT_FAGLFLEXT-HSL06,
                   IT_FAGLFLEXT-HSL07 , IT_FAGLFLEXT-HSL08 , IT_FAGLFLEXT-HSL09 , IT_FAGLFLEXT-HSL10 , IT_FAGLFLEXT-HSL11 , IT_FAGLFLEXT-HSL12,
                   IT_FAGLFLEXT-HSL13 , IT_FAGLFLEXT-HSL14 , IT_FAGLFLEXT-HSL15 , IT_FAGLFLEXT-HSL16 .
          WHEN 6.
            IT_CELL_DATA-BQ_DMBTR = IT_FAGLFLEXT-HSL06.           "本 期 数
            CLEAR: IT_FAGLFLEXT-HSL07 , IT_FAGLFLEXT-HSL08 , IT_FAGLFLEXT-HSL09 , IT_FAGLFLEXT-HSL10 , IT_FAGLFLEXT-HSL11 , IT_FAGLFLEXT-HSL12,
                  IT_FAGLFLEXT-HSL13 , IT_FAGLFLEXT-HSL14 , IT_FAGLFLEXT-HSL15 , IT_FAGLFLEXT-HSL16 .
          WHEN 7.
            IT_CELL_DATA-BQ_DMBTR = IT_FAGLFLEXT-HSL07.           "本 期 数
            CLEAR:  IT_FAGLFLEXT-HSL08 , IT_FAGLFLEXT-HSL09 , IT_FAGLFLEXT-HSL10 , IT_FAGLFLEXT-HSL11 , IT_FAGLFLEXT-HSL12,
                    IT_FAGLFLEXT-HSL13 , IT_FAGLFLEXT-HSL14 , IT_FAGLFLEXT-HSL15 , IT_FAGLFLEXT-HSL16 .
          WHEN 8.
            IT_CELL_DATA-BQ_DMBTR = IT_FAGLFLEXT-HSL08.           "本 期 数
            CLEAR: IT_FAGLFLEXT-HSL09 , IT_FAGLFLEXT-HSL10 , IT_FAGLFLEXT-HSL11 , IT_FAGLFLEXT-HSL12,
                   IT_FAGLFLEXT-HSL13 , IT_FAGLFLEXT-HSL14 , IT_FAGLFLEXT-HSL15 , IT_FAGLFLEXT-HSL16 .
          WHEN 9.
            IT_CELL_DATA-BQ_DMBTR = IT_FAGLFLEXT-HSL09.           "本 期 数
            CLEAR: IT_FAGLFLEXT-HSL10 , IT_FAGLFLEXT-HSL11 , IT_FAGLFLEXT-HSL12,
                   IT_FAGLFLEXT-HSL13 , IT_FAGLFLEXT-HSL14 , IT_FAGLFLEXT-HSL15 , IT_FAGLFLEXT-HSL16 .
          WHEN 10.
            IT_CELL_DATA-BQ_DMBTR = IT_FAGLFLEXT-HSL10.           "本 期 数
            CLEAR: IT_FAGLFLEXT-HSL11 , IT_FAGLFLEXT-HSL12,
                   IT_FAGLFLEXT-HSL13 , IT_FAGLFLEXT-HSL14 , IT_FAGLFLEXT-HSL15 , IT_FAGLFLEXT-HSL16 .
          WHEN 11.
            IT_CELL_DATA-BQ_DMBTR = IT_FAGLFLEXT-HSL11.           "本 期 数
            CLEAR: IT_FAGLFLEXT-HSL12,
                   IT_FAGLFLEXT-HSL13 , IT_FAGLFLEXT-HSL14 , IT_FAGLFLEXT-HSL15 , IT_FAGLFLEXT-HSL16 .
          WHEN 12.
            IT_CELL_DATA-BQ_DMBTR = IT_FAGLFLEXT-HSL12.           "本 期 数
            CLEAR: IT_FAGLFLEXT-HSL13 , IT_FAGLFLEXT-HSL14 , IT_FAGLFLEXT-HSL15 , IT_FAGLFLEXT-HSL16 .
          WHEN 13.
            IT_CELL_DATA-BQ_DMBTR = IT_FAGLFLEXT-HSL13.           "本 期 数
            CLEAR: IT_FAGLFLEXT-HSL14 , IT_FAGLFLEXT-HSL15 , IT_FAGLFLEXT-HSL16 .
          WHEN 14.
            IT_CELL_DATA-BQ_DMBTR = IT_FAGLFLEXT-HSL14.           "本 期 数
            CLEAR: IT_FAGLFLEXT-HSL15 , IT_FAGLFLEXT-HSL16 .
          WHEN 15.
            IT_CELL_DATA-BQ_DMBTR = IT_FAGLFLEXT-HSL15.           "本 期 数
            CLEAR: IT_FAGLFLEXT-HSL16 .
          WHEN 16.
            IT_CELL_DATA-BQ_DMBTR = IT_FAGLFLEXT-HSL16.           "本 期 数
          WHEN OTHERS.
        ENDCASE.
        IT_CELL_DATA-BN_DMBTR  = IT_FAGLFLEXT-HSL01 + IT_FAGLFLEXT-HSL02 + IT_FAGLFLEXT-HSL03 + IT_FAGLFLEXT-HSL04 + IT_FAGLFLEXT-HSL05 + IT_FAGLFLEXT-HSL06
                               + IT_FAGLFLEXT-HSL07 + IT_FAGLFLEXT-HSL08 + IT_FAGLFLEXT-HSL09 + IT_FAGLFLEXT-HSL10 + IT_FAGLFLEXT-HSL11 + IT_FAGLFLEXT-HSL12
                               + IT_FAGLFLEXT-HSL13 + IT_FAGLFLEXT-HSL14 + IT_FAGLFLEXT-HSL15 + IT_FAGLFLEXT-HSL16 .          "本年累计数
      ENDIF.


*---- 上年同期
      IF IT_FAGLFLEXT-RYEAR = L_RYEAR.
        CASE P_MONAT.
          WHEN 1.
            IT_CELL_DATA-SQ_DMBTR = IT_FAGLFLEXT-HSL01.           "
          WHEN 2.
            IT_CELL_DATA-SQ_DMBTR = IT_FAGLFLEXT-HSL02.           "
          WHEN 3.
            IT_CELL_DATA-SQ_DMBTR = IT_FAGLFLEXT-HSL03.           "
          WHEN 4.
            IT_CELL_DATA-SQ_DMBTR = IT_FAGLFLEXT-HSL04.           "
          WHEN 5.
            IT_CELL_DATA-SQ_DMBTR = IT_FAGLFLEXT-HSL05.           "
          WHEN 6.
            IT_CELL_DATA-SQ_DMBTR = IT_FAGLFLEXT-HSL06.           "
          WHEN 7.
            IT_CELL_DATA-SQ_DMBTR = IT_FAGLFLEXT-HSL07.           "
          WHEN 8.
            IT_CELL_DATA-SQ_DMBTR = IT_FAGLFLEXT-HSL08.           "
          WHEN 9.
            IT_CELL_DATA-SQ_DMBTR = IT_FAGLFLEXT-HSL09.           "
          WHEN 10.
            IT_CELL_DATA-SQ_DMBTR = IT_FAGLFLEXT-HSL10.           "
          WHEN 11.
            IT_CELL_DATA-SQ_DMBTR = IT_FAGLFLEXT-HSL11.           "
          WHEN 12.
            IT_CELL_DATA-SQ_DMBTR = IT_FAGLFLEXT-HSL12.           "
          WHEN 13.
            IT_CELL_DATA-SQ_DMBTR = IT_FAGLFLEXT-HSL13.           "
          WHEN 14.
            IT_CELL_DATA-SQ_DMBTR = IT_FAGLFLEXT-HSL14.           "
          WHEN 15.
            IT_CELL_DATA-SQ_DMBTR = IT_FAGLFLEXT-HSL15.           "
          WHEN 16.
            IT_CELL_DATA-SQ_DMBTR = IT_FAGLFLEXT-HSL16.           "
          WHEN OTHERS.
        ENDCASE.
      ENDIF.

*      IF it_faglflext-drcrk = 'H'.
*        it_cell_data-bq_dmbtr = - it_cell_data-bq_dmbtr.
*        it_cell_data-bn_dmbtr = - it_cell_data-bn_dmbtr.
*        it_cell_data-sq_dmbtr = - it_cell_data-sq_dmbtr.
*      ENDIF.

      IF IT_CELL-PLUSM = '-'..
        IT_CELL_DATA-BQ_DMBTR = - IT_CELL_DATA-BQ_DMBTR.
        IT_CELL_DATA-BN_DMBTR = - IT_CELL_DATA-BN_DMBTR.
        IT_CELL_DATA-SQ_DMBTR = - IT_CELL_DATA-SQ_DMBTR.
      ENDIF.

      COLLECT IT_CELL_DATA.
    ENDLOOP.
  ENDLOOP.

ENDFORM.

FORM FRM_DOWNLOAD_EXCEL.
  DATA: LV_STR TYPE C LENGTH 1000.
  DATA: LV_CHAR TYPE CHAR200.
  DATA: O_VALUE TYPE CHAR200.

  L_NAME-RELID = 'MI'.
  L_NAME-OBJID = 'ZFIR_PROFIT_STATEMENT_REPORTB'.
  L_NAME-TEXT = TEXT-H01.

*---- 取模板
  CALL FUNCTION 'WWWDATA_IMPORT'
    EXPORTING
      KEY               = L_NAME
    TABLES
      MIME              = L_MIME
    EXCEPTIONS
      WRONG_OBJECT_TYPE = 1
      IMPORT_ERROR      = 2
      OTHERS            = 3.

*---- 弹出框
  CONCATENATE TEXT-H01 '_' SY-DATUM SY-UZEIT INTO L_DFNAME.
  L_TITLE = TEXT-H01.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
    EXPORTING
      WINDOW_TITLE         = L_TITLE
*     DEFAULT_EXTENSION    = CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL
      DEFAULT_FILE_NAME    = L_DFNAME
      FILE_FILTER          = CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL
    CHANGING
      FILENAME             = L_FILENAME
      PATH                 = L_PATH
      FULLPATH             = L_FULLPATH
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4.
  IF SY-SUBRC <> 0.
    STOP.
  ENDIF.

*---- 下载模板
  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      FILENAME = L_FULLPATH
      FILETYPE = 'BIN'
    TABLES
      DATA_TAB = L_MIME.

*--打开excel模板
  PERFORM FRM_OPEN_EXCEL USING L_FULLPATH.

*--打开excel第一个sheet
  V_SHEET_NUMBER = 1.
  PERFORM FRM_OPEN_EXCEL_SHEET USING V_SHEET_NUMBER.

*---- 公司代码
  SELECT SINGLE BUTXT FROM T001 INTO LV_STR WHERE BUKRS = P_BUKRS.
  PERFORM FRM_WRITE_CELL_X USING 3 1 LV_STR.

*---- 日期
  DATA: L_DATE TYPE CHAR8.
  L_DATE+0(4) = P_GJAHR.
  L_DATE+4(2) = P_MONAT.
  L_DATE+6(2) = '01'.
  CLEAR LV_STR.
  WRITE L_DATE TO LV_STR USING EDIT MASK 'LL____/__/__'.
  PERFORM FRM_WRITE_CELL USING 3 3 LV_STR.

  LOOP AT IT_CELL_DATA.
*---- 本期
    IF IT_CELL_DATA-BQ_DMBTR <> 0.
      LV_STR = IT_CELL_DATA-BQ_DMBTR.
      CONDENSE LV_STR NO-GAPS.
      PERFORM FRM_PUT_SIGN_IN_FRONT USING LV_STR.
      PERFORM FRM_WRITE_CELL USING IT_CELL_DATA-ZROW IT_CELL_DATA-ZCOL LV_STR.
    ENDIF.
*---- 本年
    IT_CELL_DATA-ZCOL = IT_CELL_DATA-ZCOL + 1.
    IF IT_CELL_DATA-BN_DMBTR <> 0.
      LV_STR = IT_CELL_DATA-BN_DMBTR.
      CONDENSE LV_STR NO-GAPS.
      PERFORM FRM_PUT_SIGN_IN_FRONT USING LV_STR.
      PERFORM FRM_WRITE_CELL USING IT_CELL_DATA-ZROW IT_CELL_DATA-ZCOL LV_STR.
    ENDIF.
*---- 上年同期
    IT_CELL_DATA-ZCOL = IT_CELL_DATA-ZCOL + 1.
    IF IT_CELL_DATA-SQ_DMBTR <> 0.
      LV_STR = IT_CELL_DATA-SQ_DMBTR.
      CONDENSE LV_STR NO-GAPS.
      PERFORM FRM_PUT_SIGN_IN_FRONT USING LV_STR.
      PERFORM FRM_WRITE_CELL USING IT_CELL_DATA-ZROW IT_CELL_DATA-ZCOL LV_STR.
    ENDIF.
  ENDLOOP.

*---- 关闭EXCEL
  SET PROPERTY OF V_EXCEL 'DisplayAlerts' = 0.
  PERFORM FRM_SAVE_EXCEL USING L_FULLPATH.

ENDFORM.

FORM FRM_OPEN_EXCEL USING PA_PATH.
  CREATE OBJECT V_EXCEL 'Excel.Application'.

  SET PROPERTY OF V_EXCEL 'DisplayAlerts' = 0.
  SET PROPERTY OF V_EXCEL 'Visible' = 0.                    "0."不可见
  CALL METHOD OF
    V_EXCEL
      'Workbooks' = V_BOOK.

  CALL METHOD OF
    V_BOOK
    'Open' = V_BOOK
    EXPORTING
    #1 = PA_PATH.

  IF SY-SUBRC <> 0.
    MESSAGE E001(00) WITH 'Open file failed!'.
    STOP.
  ENDIF.
ENDFORM.                    " FRM_OPEN_EXCEL

*&---------------------------------------------------------------------*
*&      Form  FRM_OPEN_EXCEL_SHEET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PA_SHEET_NUMBER  text
*----------------------------------------------------------------------*
FORM FRM_OPEN_EXCEL_SHEET  USING    PA_SHEET_NUMBER.
  CALL METHOD OF
    V_BOOK
    'Sheets' = V_SHEET
    EXPORTING
    #1 = PA_SHEET_NUMBER.
ENDFORM.                    " FRM_OPEN_EXCEL_SHEET

*&---------------------------------------------------------------------*
*&      Form  FRM_WRITE_CELL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PA_ROW     text
*      -->PA_COL     text
*      -->PA_VAL     text
*----------------------------------------------------------------------*
FORM FRM_WRITE_CELL  USING   PA_ROW
                             PA_COL
                             PA_VAL.
  DATA: L_ROW TYPE P LENGTH 10 DECIMALS 0,
        L_COL TYPE P LENGTH 10 DECIMALS 0.
  L_ROW = PA_ROW.
  L_COL = PA_COL.
  CALL METHOD OF
    V_SHEET
    'Cells' = V_CELL
    EXPORTING
    #1 = L_ROW
    #2 = L_COL.
  SET PROPERTY OF V_CELL 'Value' = PA_VAL.
ENDFORM.                    " FRM_WRITE_CELL

FORM FRM_SAVE_EXCEL  USING    PA_FULLPATH.
  SET PROPERTY OF V_EXCEL 'Visible' = 1.   "显示

  CALL METHOD OF
    V_BOOK
    'SAVEAS'
    EXPORTING
      #1 = PA_FULLPATH.

*  CALL METHOD OF V_BOOK 'CLOSE' .

  CALL METHOD OF
    V_BOOK
      'Exit' = V_BOOK.
  CALL METHOD OF
    V_EXCEL
    'QUIT'.
  FREE OBJECT V_SHEET.
  FREE OBJECT V_BOOK.
  FREE OBJECT V_EXCEL.
ENDFORM.                    " FRM_SAVE_EXCEL

FORM FRM_PUT_SIGN_IN_FRONT USING P_VALUE.
  CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
    CHANGING
      VALUE = P_VALUE.
ENDFORM.


FORM FRM_WRITE_CELL_TEXT  USING  PA_ROW
                              PA_COL
                              PA_VAL.
  DATA: L_STR TYPE CHAR100.
  CALL METHOD OF
    V_SHEET
    'Cells' = V_CELL
    EXPORTING
    #1 = PA_ROW
    #2 = PA_COL.

  GET PROPERTY OF V_CELL  'Value' = L_STR.


  IF L_STR = ''.
    L_STR =  PA_VAL.
  ELSE.
    CONCATENATE L_STR PA_VAL
           INTO L_STR
      SEPARATED BY CL_ABAP_CHAR_UTILITIES=>CR_LF.
  ENDIF.
*        SHIFT l_str LEFT DELETING LEADING space.
  PA_VAL = L_STR.
  SET PROPERTY OF V_CELL 'Value' = PA_VAL.
ENDFORM.                    " FRM_WRITE_CELL

FORM FRM_WRITE_CELL_X  USING  PA_ROW
                              PA_COL
                              PA_VAL.
  DATA: L_STR TYPE CHAR100.
  CALL METHOD OF
    V_SHEET
    'Cells' = V_CELL
    EXPORTING
    #1 = PA_ROW
    #2 = PA_COL.

*  GET PROPERTY OF V_CELL  'Value' = L_STR.
**  REPLACE ALL OCCURRENCES OF REGEX '&' IN l_str WITH pa_val.
*  REPLACE FIRST OCCURRENCE OF REGEX '&' IN L_STR WITH PA_VAL.
*  PA_VAL = L_STR.
  CLEAR L_STR .
  L_STR = '编制单位:'&& PA_VAL.
  SET PROPERTY OF V_CELL 'Value' = L_STR.
ENDFORM.                    " FRM_WRITE_CELL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值