ZFI008.TXT(用AVL和EXCEL两种方法到处数据)

来源:互联网 发布:身份证信息查询软件 编辑:程序博客网 时间:2024/06/05 15:45

*&---------------------------------------------------------------------*
*& Report  ZFI008                                                      *
*& Program Name : ZFI008                                               *
*& Program Title: 应付/预付帐款总帐-供应商(往来帐)                   *
*& Model        : FI                                                   *
*& Created by   : 侯志宇                                               *
*& Created on   : 2007.08.27                                           *                                                                 *
*&                                                                     *
*&---------------------------------------------------------------------*

REPORT  ZFI008 .
INCLUDE OLE2INCL.
*-----定义与EXCEL 输出相关变量-------------------------
TYPE-POOLS OLE2.
DATA: EXCEL TYPE OLE2_OBJECT,        " Excel object
      W_BOOK TYPE OLE2_OBJECT,       " list of workbooks
      W_SHEET TYPE OLE2_OBJECT,      " workbook
      TMPSHEET TYPE OLE2_OBJECT,     "worksheet
      H_ZL TYPE OLE2_OBJECT,         " cell
      H_F TYPE OLE2_OBJECT,          " font
      H_S TYPE OLE2_OBJECT,          " SHEET
      H_R TYPE OLE2_OBJECT.          " RANGE
DATA: K TYPE I.
DATA: SHEET_NAME(20).  "Excel文件里的sheet name
DATA REMOTE_FILE LIKE RCGFILETR-FTAPPL.  "远程文件类型
DATA LOCAL_FILE LIKE RCGFILETR-FTFRONT.  "下载文件类型
REMOTE_FILE = 'c:/ZFI008.xls'.
LOCAL_FILE = 'C:/SAPREPORT/应付预付帐款总帐-供应商(往来帐).xls'.
*----------alv所需变量定义--------------------------------------------------
TYPE-POOLS: SLIS.
DATA:
  V_REPID            LIKE SY-REPID,
  I_PERIOD           TYPE STRING.
DATA:
  GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE,
                                            "ALV 字段
  V_ALV_LAYOUT       TYPE SLIS_LAYOUT_ALV.  "ALV 样式
DATA GIT_LISTHEADER TYPE SLIS_T_LISTHEADER.
DATA GIT_EVENTS TYPE SLIS_T_EVENT.
*--------------------------------------------------------------------------
TABLES: T001,BSIK,BSAK,SKAT,LFA1.
*------定义输出内表--------------------------
*输出行项目数据
DATA: BEGIN OF GT_OUTPUT OCCURS 0,
      HKONT LIKE BSIK-HKONT,"科目编码
      TXT50 LIKE SKAT-TXT50,"科目名称
      LIFNR LIKE BSIK-LIFNR,"供应商编号
      NAME1 LIKE LFA1-NAME1,"供应商名称
 ZQC   TYPE P DECIMALS 2,"期初余额
      ZQCFX(2)  TYPE C,"方向
      ZJF   TYPE P DECIMALS 2,"借方
      ZDF   TYPE P DECIMALS 2,"贷方
      ZQM TYPE P DECIMALS 2,"期末余额
      ZQMFX(2)  TYPE C,"方向
      MONAT LIKE BSIK-MONAT,"会计期间
      END OF GT_OUTPUT.
*输出表头数据
DATA: BEGIN OF GT_HEAD OCCURS 0,
      GT_TITLE TYPE STRING,"标题
      HKONT LIKE BSIK-HKONT,"科目编码
      TXT50 LIKE SKAT-TXT50,"科目名称
      ZDATA TYPE STRING,"日期
      MONAT LIKE BSIK-MONAT,"会计期间
      END OF GT_HEAD.
*-----逻辑计算变量定义区----------------
DATA: GT_LINE TYPE I."输出数据的行数
*---计算期初余额专用
DATA: BEGIN OF BSIK_DMBTR OCCURS 0,
       SHKZG LIKE BSIK-SHKZG,"借方/贷方标识
       DMBTR LIKE BSIK-DMBTR,"按本位币计的金额
      END OF BSIK_DMBTR,
      BEGIN OF BSAK_DMBTR OCCURS 0,
       SHKZG LIKE BSAK-SHKZG,"借方/贷方标识
       DMBTR LIKE BSAK-DMBTR,"按本位币计的金额
      END OF BSAK_DMBTR,
      BSIK_S TYPE P DECIMALS 2,"借方金额
      BSIK_H TYPE P DECIMALS 2,"贷方金额
      BSAK_S TYPE P DECIMALS 2,"借方金额
      BSAK_H TYPE P DECIMALS 2."贷方金额
*--合计值
DATA: ZQC   TYPE P DECIMALS 2,"期初余额
      ZQCFX(2)  TYPE C,"方向
      ZJF   TYPE P DECIMALS 2,"借方
      ZDF   TYPE P DECIMALS 2,"贷方
      SUM   TYPE P DECIMALS 2,"sum
      ZQM   TYPE P DECIMALS 2,"期末余额
      ZQMFX(2)  TYPE C."方向
*---ALV表头输出专用---
DATA: ZHKONT TYPE STRING,"科目
      ZMONAT TYPE STRING."期间
*-----------------定义屏幕输出----------------------
SELECTION-SCREEN BEGIN OF BLOCK BLOCK1 WITH FRAME TITLE TEXT-001.
PARAMETERS: P_BUKRS LIKE GLT0-BUKRS OBLIGATORY DEFAULT '1000',"公司代码
            P_GJAHR LIKE BSIK-GJAHR OBLIGATORY DEFAULT SY-DATUM+0(4)."年度
SELECT-OPTIONS:
         P_HKONT FOR BSIK-HKONT OBLIGATORY,"科目
         P_MONAT FOR BSIK-MONAT OBLIGATORY."期间
SELECTION-SCREEN END OF BLOCK BLOCK1.
SELECTION-SCREEN BEGIN OF BLOCK BLOCK2 WITH FRAME TITLE TEXT-002.
PARAMETERS: ALV RADIOBUTTON GROUP RAD1,
        XLS RADIOBUTTON GROUP RAD1 DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK BLOCK2.
*------调用事件----------------------------------------
*INITIALIZATION."初始化事件
START-OF-SELECTION.
*---逻辑判断,输入的月份不能大于当前月份
  IF P_GJAHR > SY-DATUM+0(4).
    MESSAGE S002(ZFI) WITH '输入的年份不能大于系统当前年份!'.
    STOP.
  ENDIF.
  IF P_MONAT-LOW > SY-DATUM+4(2).
    MESSAGE S002(ZFI) WITH '输入的月份不能大于系统当前月份!'.
    STOP.
  ENDIF.
  IF P_MONAT-HIGH > SY-DATUM+4(2).
    MESSAGE S002(ZFI) WITH '输入的月份不能大于系统当前月份!'.
    STOP.
  ENDIF.
*------------------------
*--取得行项目数据
  PERFORM DATA_GET.
*--输出方式确认
  IF ALV = 'X'."如果是ALV输出
    V_REPID = SY-REPID."初始化ALV
*----判断输出值是否为空-------
    CLEAR SUM.
    SUM = LINES( GT_OUTPUT ).
    IF SUM = 0.
      MESSAGE S002(ZFI) WITH '没有可以输出的数据!'.
      STOP.
    ENDIF.
    CLEAR SUM.
    PERFORM ALV_DISPLAY."ALV输出
  ELSE.
    PERFORM GT_HEAD."取得表头数据
*----判断输出值是否为空-------
    CLEAR SUM.
    SUM = LINES( GT_HEAD ).
    IF SUM = 0.
      MESSAGE S002(ZFI) WITH '没有可以输出的数据!'.
      STOP.
    ENDIF.
    CLEAR SUM.
    PERFORM XLS_DISPLAY."EXCEL输出
  ENDIF.
*&---------------------------------------------------------------------*
*&      Form  DATA_GET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DATA_GET .
*根据屏幕输入的条件在BSIK中取得科目编码、供应商编号/会计期间
  SELECT DISTINCT HKONT LIFNR FROM BSIK
                     INTO CORRESPONDING FIELDS OF TABLE GT_OUTPUT
                     WHERE BUKRS EQ P_BUKRS"公司代码
                     AND   GJAHR EQ P_GJAHR"年度
                     AND   HKONT IN P_HKONT"科目
                     AND   MONAT IN P_MONAT."期间
*----------测试用----------------------------------
*                     AND   MONAT IN P_MONAT"期间
*                     AND   LIFNR = '0000200046'."供应商
*----循环主数据进行逻辑处理-------
  LOOP AT GT_OUTPUT.
*-----取得科目名称
    SELECT SINGLE TXT50 FROM SKAT
                  INTO  GT_OUTPUT-TXT50
                  WHERE SAKNR = GT_OUTPUT-HKONT
                  AND  SPRAS = '1'.
*-----取得供应商描述
    SELECT SINGLE NAME1 FROM LFA1
                        INTO GT_OUTPUT-NAME1
                        WHERE LIFNR = GT_OUTPUT-LIFNR.
*----计算期初余额-----------------------------
*--取得BSIK中的本位币、借贷标志
    SELECT SHKZG DMBTR FROM BSIK
                       INTO TABLE BSIK_DMBTR
                       WHERE LIFNR = GT_OUTPUT-LIFNR"供应商
                       AND HKONT = GT_OUTPUT-HKONT"科目
                       AND GJAHR = P_GJAHR"年度
                       AND MONAT < P_MONAT-LOW."期间
*---取得BSAK中的本位币、借贷标志
    SELECT SHKZG DMBTR FROM BSAK
                       INTO TABLE BSAK_DMBTR
                       WHERE LIFNR = GT_OUTPUT-LIFNR"供应商
                       AND HKONT = GT_OUTPUT-HKONT"科目
                       AND GJAHR = P_GJAHR"年度
                       AND MONAT < P_MONAT-LOW."期间
*--取得BSIK中借方/贷方的金额
    LOOP AT BSIK_DMBTR.
      IF BSIK_DMBTR-SHKZG = 'S'.
        BSIK_S = BSIK_S + BSIK_DMBTR-DMBTR."取得借方的金额
      ENDIF.
      IF BSIK_DMBTR-SHKZG = 'H'.
        BSIK_H = BSIK_H + BSIK_DMBTR-DMBTR."取得借方的金额
      ENDIF.
    ENDLOOP.
*--取得BSAK中借方/贷方的金额
    LOOP AT BSAK_DMBTR.
      IF BSAK_DMBTR-SHKZG = 'S'.
        BSAK_S = BSAK_S + BSAK_DMBTR-DMBTR."取得借方的金额
      ENDIF.
      IF BSAK_DMBTR-SHKZG = 'H'.
        BSAK_H = BSAK_H + BSAK_DMBTR-DMBTR."取得借方的金额
      ENDIF.
    ENDLOOP.
*---期初余额计算-------
*期初余额:BSIK-DMBTR(S-H)+  BSAK-DMBTR (S-H)(期间为上月底期末余额)
    GT_OUTPUT-ZQC = ( BSIK_S - BSIK_H ) + ( BSAK_S - BSAK_H ).
*---取得期初方向
    IF GT_OUTPUT-ZQC = 0.
      GT_OUTPUT-ZQCFX = '平'.
    ENDIF.
    IF GT_OUTPUT-ZQC < 0.
      GT_OUTPUT-ZQCFX = '贷'.
    ENDIF.
    IF GT_OUTPUT-ZQC > 0.
      GT_OUTPUT-ZQCFX = '借'.
    ENDIF.
*--清空临时计算数据-----
    CLEAR: BSIK_DMBTR[],BSAK_DMBTR[],BSIK_S,BSIK_H,BSAK_S,BSAK_H.
*----计算借方、贷方金额-----------------------------
*--取得BSIK中的本位币、借贷标志
    SELECT SHKZG DMBTR FROM BSIK
                       INTO TABLE BSIK_DMBTR
                       WHERE LIFNR = GT_OUTPUT-LIFNR"供应商
                       AND HKONT = GT_OUTPUT-HKONT"科目
                       AND GJAHR = P_GJAHR"年度
                       AND MONAT IN P_MONAT."期间
*---取得BSAK中的本位币、借贷标志
    SELECT SHKZG DMBTR FROM BSAK
                       INTO TABLE BSAK_DMBTR
                       WHERE LIFNR = GT_OUTPUT-LIFNR"供应商
                       AND HKONT = GT_OUTPUT-HKONT"科目
                       AND GJAHR = P_GJAHR"年度
                       AND MONAT IN P_MONAT."期间
*--取得BSIK中借方/贷方的金额
    LOOP AT BSIK_DMBTR.
      IF BSIK_DMBTR-SHKZG = 'S'.
        BSIK_S = BSIK_S + BSIK_DMBTR-DMBTR."取得借方的金额
      ENDIF.
      IF BSIK_DMBTR-SHKZG = 'H'.
        BSIK_H = BSIK_H + BSIK_DMBTR-DMBTR."取得借方的金额
      ENDIF.
    ENDLOOP.
*--取得BSAK中借方/贷方的金额
    LOOP AT BSAK_DMBTR.
      IF BSAK_DMBTR-SHKZG = 'S'.
        BSAK_S = BSAK_S + BSAK_DMBTR-DMBTR."取得借方的金额
      ENDIF.
      IF BSAK_DMBTR-SHKZG = 'H'.
        BSAK_H = BSAK_H + BSAK_DMBTR-DMBTR."取得借方的金额
      ENDIF.
    ENDLOOP.
*----取得借方金额
    GT_OUTPUT-ZJF = BSIK_S + BSAK_S.
*----取得贷方金额
    GT_OUTPUT-ZDF = BSIK_H + BSAK_H.
*--清空临时计算数据-----
    CLEAR: BSIK_DMBTR[],BSAK_DMBTR[],BSIK_S,BSIK_H,BSAK_S,BSAK_H.
*取得期末余额
*期末余额:期初余额+借方-贷方
    GT_OUTPUT-ZQM = GT_OUTPUT-ZQC + GT_OUTPUT-ZJF - GT_OUTPUT-ZDF.
*取得期末方向
    IF GT_OUTPUT-ZQM = 0.
      GT_OUTPUT-ZQMFX = '平'.
    ENDIF.
    IF GT_OUTPUT-ZQM < 0.
      GT_OUTPUT-ZQMFX = '贷'.
    ENDIF.
    IF GT_OUTPUT-ZQM > 0.
      GT_OUTPUT-ZQMFX = '借'.
    ENDIF.

*----更新内表-----------
    GT_OUTPUT-ZQM = ABS( GT_OUTPUT-ZQM )."取得绝对值
    GT_OUTPUT-ZQC = ABS( GT_OUTPUT-ZQC )."取得绝对值
    MODIFY GT_OUTPUT.
  ENDLOOP.
*--按供应商排序-----
  SORT GT_OUTPUT BY LIFNR.
ENDFORM.                    " DATA_GET
*&---------------------------------------------------------------------*
*&      Form  gt_head
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GT_HEAD .
**根据屏幕输入的条件在BSIK中取得科目编码、会计期间
  SELECT DISTINCT HKONT FROM BSIK
                     INTO CORRESPONDING FIELDS OF TABLE GT_HEAD
                     WHERE BUKRS EQ P_BUKRS"公司代码
                     AND   GJAHR EQ P_GJAHR"年度
                     AND   HKONT IN P_HKONT"科目
                     AND   MONAT IN P_MONAT."期间
  LOOP AT GT_HEAD.
*-----取得科目名称----
    SELECT SINGLE TXT50 FROM SKAT
                  INTO  GT_HEAD-TXT50
                  WHERE SAKNR = GT_HEAD-HKONT
                  AND  SPRAS = '1'.
*--取得标题数据(根据科目决定使用应付还是预付作为抬头,若科目为2121*则为应付,若科目为1151*则为预付)
    IF GT_HEAD-HKONT(6) = '002121'.
      GT_HEAD-GT_TITLE = '应付账款总账—供应商'.
    ENDIF.
    IF GT_HEAD-HKONT(6) = '001151'.
      GT_HEAD-GT_TITLE = '预付账款总账—供应商'.
    ENDIF.
*--取得表头日期---
    IF P_MONAT-HIGH <> '00'.
      CONCATENATE P_GJAHR '年' P_MONAT-LOW '月到' P_MONAT-HIGH '月' INTO GT_HEAD-ZDATA.
    ELSE.
      CONCATENATE P_GJAHR '年' P_MONAT-LOW '月' INTO GT_HEAD-ZDATA.
    ENDIF.
*----更新内表--------
    MODIFY GT_HEAD.
  ENDLOOP.
ENDFORM.                    " gt_head
**********************ALV输出*****************************************
*&---------------------------------------------------------------------*
*&      Form  ALV_DISPLAY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM ALV_DISPLAY .
  DATA L_TMP TYPE LVC_TITLE.
  PERFORM FRM_GET_EVENTS."alv表头所用
  PERFORM FRM_COMMENT_BUILD."alv表头所用
*  v_alv_layout-colwidth_optimize = 'X'.
*  v_alv_layout-info_fieldname = 'COLOR'.
  PERFORM INIT_FIELDCAT.
*   调用ALV函数显示
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM = V_REPID
      I_GRID_TITLE       = L_TMP
      IS_LAYOUT          = V_ALV_LAYOUT
      IT_FIELDCAT        = GT_FIELDCAT[]
      I_SAVE             = 'X'
*     IS_VARIANT         =
      IT_EVENTS          = GIT_EVENTS[]"alv表头赋值
*      i_callback_user_command = 'FRM_UCOMM'"ALV事件
    TABLES
      T_OUTTAB           = GT_OUTPUT
    EXCEPTIONS
      PROGRAM_ERROR      = 1
      OTHERS             = 2.

ENDFORM.                    " ALV_DISPLAY
*&--------------------------------------------------------------------*
*&      Form  FRM_GET_EVENTS
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
FORM FRM_GET_EVENTS .
  DATA FORMNAME_TOP_OF_PAGE TYPE SLIS_FORMNAME VALUE 'FRM_TOP_OF_PAGE'.
  DATA L_EVENTS TYPE SLIS_ALV_EVENT.

  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
    EXPORTING
      I_LIST_TYPE     = 0
    IMPORTING
      ET_EVENTS       = GIT_EVENTS
    EXCEPTIONS
      LIST_TYPE_WRONG = 1
      OTHERS          = 2.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
           WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
* 在事件(字段名:NAME)为"TOP_OF_PAGE"的行中将FORM名(字段名:
*FORM)设为"FRM_TOP_OF_PAGE"
* 这样,系统就会自动PERFORM FRM_TOP_OF_PAGE.
  CLEAR L_EVENTS.
  READ TABLE GIT_EVENTS WITH KEY NAME = SLIS_EV_TOP_OF_PAGE INTO
L_EVENTS.
  IF SY-SUBRC = 0.
    MOVE FORMNAME_TOP_OF_PAGE TO L_EVENTS-FORM.
    MODIFY GIT_EVENTS FROM L_EVENTS INDEX SY-TABIX.
  ELSE.
    L_EVENTS-FORM = FORMNAME_TOP_OF_PAGE.
    L_EVENTS-NAME = FORMNAME_TOP_OF_PAGE.
    APPEND L_EVENTS TO GIT_EVENTS.
  ENDIF.
ENDFORM.                    " FRM_GET_EVENTS

*&--------------------------------------------------------------------*
*&      Form  FRM_COMMENT_BUILD
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
FORM FRM_COMMENT_BUILD .
  DATA L_LISTHEADER TYPE SLIS_LISTHEADER.
  CLEAR: GIT_LISTHEADER, L_LISTHEADER.
*---处理屏幕数据,作为表头--------------
*----处理ALV表头科目输出
  IF P_HKONT-HIGH <> ''.
    CONCATENATE P_HKONT-LOW '到' P_HKONT-HIGH INTO ZHKONT.
  ELSE.
    ZHKONT = P_HKONT-LOW.
  ENDIF.
*----处理ALV表头期间输出
  IF P_MONAT-HIGH <> '00'.
    CONCATENATE P_MONAT-LOW '到' P_MONAT-HIGH INTO ZMONAT.
  ELSE.
    ZMONAT = P_MONAT-LOW.
  ENDIF.
*---------------------------------------
  L_LISTHEADER-TYP  = 'H'.
  L_LISTHEADER-INFO = '应付/预付帐款总帐-供应商(往来帐)'.
  APPEND L_LISTHEADER TO GIT_LISTHEADER.
  CLEAR L_LISTHEADER.
  L_LISTHEADER-TYP  = 'S'.
  L_LISTHEADER-KEY  = '公司代码:'.
  L_LISTHEADER-INFO = P_BUKRS.
  APPEND L_LISTHEADER TO GIT_LISTHEADER.
  L_LISTHEADER-TYP  = 'S'.
  L_LISTHEADER-KEY  = '年度:'.
  L_LISTHEADER-INFO = P_GJAHR.
  APPEND L_LISTHEADER TO GIT_LISTHEADER.
  L_LISTHEADER-TYP  = 'S'.
  L_LISTHEADER-KEY  = '科目:'.
  L_LISTHEADER-INFO = ZHKONT.
  APPEND L_LISTHEADER TO GIT_LISTHEADER.
  L_LISTHEADER-TYP  = 'S'.
  L_LISTHEADER-KEY  = '期间:'.
  L_LISTHEADER-INFO = ZMONAT.
  APPEND L_LISTHEADER TO GIT_LISTHEADER.
  L_LISTHEADER-TYP  = 'S'.
  L_LISTHEADER-KEY  = '用户:'.
  L_LISTHEADER-INFO = SY-UNAME.
  APPEND L_LISTHEADER TO GIT_LISTHEADER.
ENDFORM.                    " FRM_COMMENT_BUILD
*&--------------------------------------------------------------------*
*&      Form  FRM_TOP_OF_PAGE
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
FORM FRM_TOP_OF_PAGE.
  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      IT_LIST_COMMENTARY = GIT_LISTHEADER
      I_LOGO             = 'ENJOYSAP_LOGO'.  "TCODE:OAOR,CLASS
*NAME:PICTURES,CLASS TYPE :OT,执行,可以看到所有的PICTURE

ENDFORM.                    "FRM_TOP_OF_PAGE

*&---------------------------------------------------------------------*
*&      Form  INIT_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM INIT_FIELDCAT .
  GT_FIELDCAT-FIELDNAME = 'HKONT'.
  GT_FIELDCAT-SELTEXT_L = '科目编码'.
  GT_FIELDCAT-SELTEXT_S = '科目编码'.
  GT_FIELDCAT-SELTEXT_M = '科目编码'.
  APPEND GT_FIELDCAT.
  CLEAR GT_FIELDCAT.
  GT_FIELDCAT-FIELDNAME = 'TXT50'.
  GT_FIELDCAT-SELTEXT_L = '科目名称'.
  GT_FIELDCAT-SELTEXT_S = '科目名称'.
  GT_FIELDCAT-SELTEXT_M = '科目名称'.
  APPEND GT_FIELDCAT.
  CLEAR GT_FIELDCAT.
  GT_FIELDCAT-FIELDNAME = 'LIFNR'.
  GT_FIELDCAT-SELTEXT_L = '供应商编号'.
  GT_FIELDCAT-SELTEXT_S = '供应商编号'.
  GT_FIELDCAT-SELTEXT_M = '供应商编号'.
  APPEND GT_FIELDCAT.
  CLEAR GT_FIELDCAT.
  GT_FIELDCAT-FIELDNAME = 'NAME1'.
  GT_FIELDCAT-SELTEXT_L = '供应商名称'.
  GT_FIELDCAT-SELTEXT_S = '供应商名称'.
  GT_FIELDCAT-SELTEXT_M = '供应商名称'.
  APPEND GT_FIELDCAT.
  CLEAR GT_FIELDCAT.
  GT_FIELDCAT-FIELDNAME = 'ZQC'.
  GT_FIELDCAT-SELTEXT_L = '期初余额'.
  GT_FIELDCAT-SELTEXT_S = '期初余额'.
  GT_FIELDCAT-SELTEXT_M = '期初余额'.
  APPEND GT_FIELDCAT.
  CLEAR GT_FIELDCAT.
  GT_FIELDCAT-FIELDNAME = 'ZQCFX'.
  GT_FIELDCAT-SELTEXT_L = '方向'.
  GT_FIELDCAT-SELTEXT_S = '方向'.
  GT_FIELDCAT-SELTEXT_M = '方向'.
  APPEND GT_FIELDCAT.
  CLEAR GT_FIELDCAT.
  GT_FIELDCAT-FIELDNAME = 'ZJF'.
  GT_FIELDCAT-SELTEXT_L = '借方'.
  GT_FIELDCAT-SELTEXT_S = '借方'.
  GT_FIELDCAT-SELTEXT_M = '借方'.
*  gt_fieldcat-hotspot = 'X'.
  APPEND GT_FIELDCAT.
  CLEAR GT_FIELDCAT.
  GT_FIELDCAT-FIELDNAME = 'ZDF'.
  GT_FIELDCAT-SELTEXT_L = '贷方'.
  GT_FIELDCAT-SELTEXT_S = '贷方'.
  GT_FIELDCAT-SELTEXT_M = '贷方'.
  APPEND GT_FIELDCAT.
  CLEAR GT_FIELDCAT.
  GT_FIELDCAT-FIELDNAME = 'ZQM'.
  GT_FIELDCAT-SELTEXT_L = '期末余额'.
  GT_FIELDCAT-SELTEXT_S = '期末余额'.
  GT_FIELDCAT-SELTEXT_M = '期末余额'.
  APPEND GT_FIELDCAT.
  CLEAR GT_FIELDCAT.
  GT_FIELDCAT-FIELDNAME = 'ZQMFX'.
  GT_FIELDCAT-SELTEXT_L = '方向'.
  GT_FIELDCAT-SELTEXT_S = '方向'.
  GT_FIELDCAT-SELTEXT_M = '方向'.
  APPEND GT_FIELDCAT.
  CLEAR GT_FIELDCAT.
ENDFORM.                    " INIT_FIELDCAT
***************************EXCEL输出***********************************
*&---------------------------------------------------------------------*
*&      Form  XLS_DISPLAY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM XLS_DISPLAY .
  CALL FUNCTION 'WS_FILE_DELETE'
    EXPORTING
      FILE = LOCAL_FILE.
*  从服务器上下载Excel文件到本地
  CALL FUNCTION 'C13Z_FILE_DOWNLOAD_BINARY'
    EXPORTING
      I_FILE_FRONT_END    = LOCAL_FILE
      I_FILE_APPL         = REMOTE_FILE
      I_FILE_OVERWRITE    = 'X'
    EXCEPTIONS
      FE_FILE_OPEN_ERROR  = 1
      FE_FILE_EXISTS      = 2
      FE_FILE_WRITE_ERROR = 3
      AP_NO_AUTHORITY     = 4
      AP_FILE_OPEN_ERROR  = 5
      AP_FILE_EMPTY       = 6
      OTHERS              = 7.


  CREATE OBJECT EXCEL 'EXCEL.APPLICATION'.     "创建一个EXCEL对象
  IF SY-SUBRC NE 0.
    WRITE: / 'Excel init failed, return code is ',SY-SUBRC.
    EXIT.
  ENDIF.
  SET PROPERTY OF EXCEL  'Visible' = 1.        "设置输出时为可视

  CALL METHOD OF EXCEL 'Workbooks' = W_BOOK.   "

  PERFORM ERR_HDL.
  CALL METHOD OF W_BOOK 'OPEN'                 "打开指定路径的EXCEL
    EXPORTING
      #1 = LOCAL_FILE.

****指定sheet属性
  GET PROPERTY OF EXCEL 'Sheets' = W_SHEET.

  PERFORM ERR_HDL.
  CLEAR GT_HEAD.
  LOOP AT GT_HEAD.
***调用EXCEL工作sheets组
    CALL METHOD OF EXCEL 'WORKSHEETS' = TMPSHEET
      EXPORTING
        #1 = SY-TABIX.
***选中当前sheet
    CALL METHOD OF EXCEL 'Sheets' = W_SHEET
      EXPORTING
        #1 = SY-TABIX.
***拷贝当前sheet在工作用sheet组中
    CALL METHOD OF W_SHEET 'copy'
      EXPORTING
        #1 = TMPSHEET.
*再选中当前sheet
    CALL METHOD OF EXCEL 'sheets' = W_SHEET
      EXPORTING
        #1 = SY-TABIX.
    CALL METHOD OF W_SHEET 'select' .
**设置当前sheet为总帐科目名
    SET PROPERTY OF W_SHEET 'name' = GT_HEAD-HKONT."科目编码
***FILL抬头
    PERFORM FILL_HEAD.
    K = 5.
***FILL内表
    LOOP AT GT_OUTPUT WHERE HKONT = GT_HEAD-HKONT.
      PERFORM FILL_EXCEL USING K .
      K = K + 1.
*---计算合计值-----
      ZQC = ZQC + GT_OUTPUT-ZQC."期初余额
      ZJF = ZJF + GT_OUTPUT-ZJF."借方
      ZDF = ZDF + GT_OUTPUT-ZDF."贷方
      ZQM = ZQM + GT_OUTPUT-ZQM."期末余额
*-----动态输出页脚的位置----------
      GT_LINE = K + 1."在输出的行数上增加一行,用来输出页脚
      CLEAR GT_OUTPUT.
    ENDLOOP.
*--取得合计的方向
*---取得期初合计方向
    IF ZQC = 0.
      ZQCFX = '平'.
    ENDIF.
    IF ZQC < 0.
      ZQCFX = '贷'.
    ENDIF.
    IF ZQC > 0.
      ZQCFX = '借'.
    ENDIF.
*取得期末合计方向
    IF ZQM = 0.
      ZQMFX = '平'.
    ENDIF.
    IF ZQM < 0.
      ZQMFX = '贷'.
    ENDIF.
    IF ZQM > 0.
      ZQMFX = '借'.
    ENDIF.
    ZQC = ABS( ZQC )."取得绝对值
    ZQM = ABS( ZQM )."取得绝对值
*---动态输出页脚信息------
    PERFORM FOOTER.
    CLEAR: GT_LINE,ZQC,ZJF,ZDF,ZQM,ZQCFX,ZQMFX.
  ENDLOOP.
  FREE OBJECT EXCEL.
  PERFORM ERR_HDL.

ENDFORM.                    " DATA_DISPLAY
*&---------------------------------------------------------------------*
*&      Form  ERR_HDL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM ERR_HDL .
  IF SY-SUBRC <> 0.
    WRITE: / 'OLE error: Return code ='(010), SY-SUBRC.
    STOP.
  ENDIF.
ENDFORM.                    " ERR_HDL

**

*&---------------------------------------------------------------------*
*&      Form  fill_excel
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_T  text
*      -->P_TYPE  text
*      -->P_I  text
*----------------------------------------------------------------------*
FORM FILL_EXCEL  USING K TYPE I.
  PERFORM FILL_CELL USING K 1 0 GT_OUTPUT-HKONT."科目编码
  PERFORM FILL_CELL USING K 2 0 GT_OUTPUT-TXT50."科目名称
  PERFORM FILL_CELL USING K 3 0 GT_OUTPUT-LIFNR."供应商编号
  PERFORM FILL_CELL USING K 4 0 GT_OUTPUT-NAME1."供应商名称
  PERFORM FILL_CELL USING K 5 0 GT_OUTPUT-ZQCFX."方向
  PERFORM FILL_CELL USING K 6 0 GT_OUTPUT-ZQC."期初余额
  PERFORM FILL_CELL USING K 7 0 GT_OUTPUT-ZJF."借方
  PERFORM FILL_CELL USING K 8 0 GT_OUTPUT-ZDF."贷方
  PERFORM FILL_CELL USING K 9 0 GT_OUTPUT-ZQMFX."方向
  PERFORM FILL_CELL USING K 10 0 GT_OUTPUT-ZQM."期末余额
ENDFORM.                    " fill_excel

*&--------------------------------------------------------------------*
*&      Form  fill_cell
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*      -->I          text
*      -->J          text
*      -->BOLD       text
*      -->VAL        text
*---------------------------------------------------------------------*
FORM FILL_CELL USING I J BOLD VAL.
  CALL METHOD OF EXCEL 'Cells' = H_ZL
    EXPORTING
      #1 = I
      #2 = J.
  PERFORM ERR_HDL.
  SET PROPERTY OF H_ZL 'Value' = VAL .
  GET PROPERTY OF H_ZL 'Font'  = H_F.
  SET PROPERTY OF H_F  'Bold'  = BOLD .
  PERFORM ERR_HDL.
ENDFORM.                    "FILL_CELL
*&---------------------------------------------------------------------*
*&      Form  FILL_HEAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FILL_HEAD.
*---HEAD AND FOOT
  PERFORM FILL_CELL USING 1 5 0 GT_HEAD-GT_TITLE."输出标题
  PERFORM FILL_CELL USING 2 2 0 GT_HEAD-TXT50."科目名称
  PERFORM FILL_CELL USING 2 4 0 GT_HEAD-ZDATA."屏幕输入日期
ENDFORM.                    " FILL_HEAD
*&---------------------------------------------------------------------*
*&      Form  FOOTER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FOOTER .
  PERFORM FILL_CELL USING K 2 0 '合计:'.
  PERFORM FILL_CELL USING K 5 0 ZQCFX."方向
  PERFORM FILL_CELL USING K 6 0 ZQC."期初余额
  PERFORM FILL_CELL USING K 7 0 ZJF."借方
  PERFORM FILL_CELL USING K 8 0 ZDF."贷方
  PERFORM FILL_CELL USING K 9 0 ZQMFX."方向
  PERFORM FILL_CELL USING K 10 0 ZQM."期末余额
  PERFORM FILL_CELL USING GT_LINE 1 0 '核算单位:首钢京唐公司计财部'.
  PERFORM FILL_CELL USING GT_LINE 3 0 '制表:'.
  PERFORM FILL_CELL USING GT_LINE 4 0 '打印日期:'.
  PERFORM FILL_CELL USING GT_LINE 5 0 SY-DATUM.
ENDFORM.                    " FOOTER 

原创粉丝点击