您的位置:首页 > 其它

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

2007-11-09 15:40 507 查看
*&---------------------------------------------------------------------*
*& 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: