![]()
*&---------------------------------------------------------------------*
*& Report ZFIR002
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zfir002.
*----------------------------------------------------------------------*
* TABLES
*----------------------------------------------------------------------*
TABLES: bseg,bkpf,faglflext,glt0,setheadert,zqtfi002.
*----------------------------------------------------------------------*
* TYPE-POOLS
*----------------------------------------------------------------------*
TYPE-POOLS: slis.
TYPE-POOLS: esp1. " 增加弹出消息框
TYPE-POOLS ole2 .
DATA: it_i_message_tab TYPE esp1_message_tab_type WITH HEADER LINE.
TYPES: BEGIN OF typ_glt0,"会计凭证总账内表
ryear TYPE glt0-ryear,
drcrk TYPE glt0-drcrk, "借方/贷方标识
rpmax TYPE glt0-rpmax, "期间
hslvt TYPE glt0-hslvt,
hsl01 TYPE glt0-hsl01,
hsl02 TYPE glt0-hsl02,
hsl03 TYPE glt0-hsl02,
hsl04 TYPE glt0-hsl02,
hsl05 TYPE glt0-hsl02,
hsl06 TYPE glt0-hsl02,
hsl07 TYPE glt0-hsl02,
hsl08 TYPE glt0-hsl02,
hsl09 TYPE glt0-hsl02,
hsl10 TYPE glt0-hsl02,
hsl11 TYPE glt0-hsl02,
hsl12 TYPE glt0-hsl02,
hsl13 TYPE glt0-hsl13,
hsl14 TYPE glt0-hsl14,
hsl15 TYPE glt0-hsl15,
hsl16 TYPE glt0-hsl16,
racct TYPE glt0-racct, "科目
END OF typ_glt0.
DATA: gt_fag TYPE TABLE OF faglflext WITH HEADER LINE .
TYPES: BEGIN OF typ_tab1,"
box_name TYPE c, "选择框
t_edit TYPE lvc_t_styl,
zxiangm(30),"项目
zitem TYPE i, "行次
zbysjs TYPE glt0-hsl01, "本月实际数
zbnljs TYPE glt0-hsl01, "本年累计数
zsnljs TYPE glt0-hsl01, "上年累计数
zzflag TYPE c,
zbnsyljs TYPE glt0-hsl01, "本年上月累计数
END OF typ_tab1.
DATA: t_out TYPE TABLE OF typ_tab1 WITH HEADER LINE .
DATA: lt_otab TYPE TABLE OF typ_tab1 WITH HEADER LINE .
DATA: lt_tabh TYPE TABLE OF typ_tab1 WITH HEADER LINE .
RANGES: rg_budat FOR bkpf-budat.
DATA: g_time TYPE bkpf-monat.
DATA: p_roald LIKE rlgrap-filename.
*************excel define
*定义OLE变量
"INCLUDE zqficor002_ole2incl.
*INCLUDE OLE2INCL.
DATA: excel TYPE ole2_object,
sheet TYPE ole2_object,
cell TYPE ole2_object,
workbook TYPE ole2_object.
DATA: BEGIN OF gt_type OCCURS 0,
zitem TYPE zel_zitem,
c100(50) TYPE c, "第三列
d100(50) TYPE c, "第四列
e100(50) TYPE c, "第五列
h100(50) TYPE c, "本年上月累计数
END OF gt_type.
* 会计凭证信息
DATA:BEGIN OF it_acdoca OCCURS 0.
DATA: rbukrs LIKE acdoca-rbukrs, "公司代码
belnr LIKE acdoca-belnr, "会计凭证
gjahr LIKE acdoca-ryear, "年度
docln LIKE acdoca-docln, "行项目
drcrk LIKE acdoca-drcrk, "借贷标识
budat LIKE acdoca-budat, "过账日期
hsl LIKE acdoca-hsl, "金额
racct LIKE acdoca-racct, "科目号
rstgr LIKE bseg-rstgr, "原因代码
buzei LIKE bseg-buzei, "BSEG中的行项目
txt20 LIKE skat-txt20, "科目描述
sn_gjahr TYPE bseg-gjahr, "上年年度
zbz(1).
INCLUDE STRUCTURE zqsficor002. "INCLUDE 结构
DATA:END OF it_acdoca.
DATA:it_acdoca_mx LIKE TABLE OF it_acdoca WITH HEADER LINE.
DATA:wa_type LIKE LINE OF gt_type.
DATA: gt_tpkm TYPE TABLE OF zqtfi002. "利润表科目及格式维护
DATA: wa_tpkm TYPE zqtfi002.
DATA: g_text1(40),
g_text2(50),
g_text3(40).
DATA g_year_sy TYPE bseg-gjahr.
DATA g_month_sy TYPE bkpf-monat.
DATA: it_event TYPE slis_t_event, "不能有表头,否则会RUNTIME ERROR
it_listheader TYPE slis_t_listheader.
DATA str_butxt TYPE string.
DATA:gt_alv1 TYPE STANDARD TABLE OF zqsficor002,
wa_alv1 TYPE zqsficor002.
** 加入 SELECT 的條件
DATA: gt_vimsellist LIKE vimsellist OCCURS 1 WITH HEADER LINE.
INCLUDE z_rpt_template. "报表模板
*----------------------------------------------------------------------*
* SELECTION-SCREEN
*----------------------------------------------------------------------*
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS:p_bukrs TYPE bseg-bukrs OBLIGATORY,
p_ryear TYPE bseg-gjahr OBLIGATORY,
p_rpmax TYPE bkpf-monat OBLIGATORY.
PARAMETERS:s1 AS CHECKBOX DEFAULT 'X',
s2 AS CHECKBOX.
PARAMETERS:p1 RADIOBUTTON GROUP g1,
p2 RADIOBUTTON GROUP g1.
SELECTION-SCREEN: END OF BLOCK b1.
*----------------------------------------------------------------------*
* INITIALIZATION.
*----------------------------------------------------------------------*
INITIALIZATION.
sscrfields-functxt_01 = '利润表科目维护'.
p_ryear = sy-datum(4).
p_rpmax = sy-datum+4(2).
PERFORM frm_initial.
*----------------------------------------------------------------------*
* AT SELECTION-SCREEN
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
CASE sscrfields-ucomm .
WHEN 'FC01'. "管理报表格式维护'.
* REFRESH GT_VIMSELLIST.
* GT_VIMSELLIST-VIEWFIELD = 'BUKRS'.
* GT_VIMSELLIST-OPERATOR = 'EQ'.
* GT_VIMSELLIST-VALUE = P_BUKRS.
* GT_VIMSELLIST-AND_OR = 'AND'.
* APPEND GT_VIMSELLIST.
CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
EXPORTING
action = 'S'
view_name = 'ZQTFI002'
TABLES
dba_sellist = gt_vimsellist
EXCEPTIONS
client_reference = 1
foreign_lock = 2
invalid_action = 3
no_clientindependent_auth = 4
no_database_function = 5
no_editor_function = 6
no_show_auth = 7
no_tvdir_entry = 8
no_upd_auth = 9
only_show_allowed = 10
system_failure = 11
unknown_field_in_dba_sellist = 12
view_not_found = 13
maintenance_prohibited = 14
OTHERS = 15.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDCASE.
** 权限检查
PERFORM frm_sub_auth_check.
*----------------------------------------------------------------------*
* INCLUDE
*----------------------------------------------------------------------*
INCLUDE zqficor002_f01.
* INCLUDE ZQFIR002_F01.
* INCLUDE ZFIR_LDV_PROFIT_F01.
*----------------------------------------------------------------------*
* START-OF-SELECTION
*----------------------------------------------------------------------*
START-OF-SELECTION.
** 取数据
PERFORM frm_sub_read_table.
*----------------------------------------------------------------------*
* END-OF-SELECTION
*----------------------------------------------------------------------*
END-OF-SELECTION.
** Excel输出
" PERFORM FRM_SUB_EXCEL_OUTPUT.
*&---------------------------------------------------------------------*
*& 包含 ZQFIR002_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form SUB_AUTH_CHECK
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_sub_auth_check .
AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
ID 'BUKRS' FIELD p_bukrs
ID 'ACTVT' FIELD '03'.
IF sy-subrc <> 0.
* MESSAGE E007 WITH P_BUKRS.
EXIT.
ENDIF.
ENDFORM. " FRM_SUB_AUTH_CHECK
*&---------------------------------------------------------------------*
*& Form FRM_SUB_READ_TABLE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_sub_read_table .
DATA:last_year TYPE gjahr.
RANGES:rr_year FOR bseg-gjahr .
g_time = p_rpmax.
IF p_rpmax = '01'.
g_year_sy = p_ryear - 1.
g_month_sy = 16.
ELSE.
g_year_sy = p_ryear.
g_month_sy = p_rpmax - 1.
ENDIF.
last_year = p_ryear - 1.
rr_year-sign = 'I'.
rr_year-option = 'BT'.
rr_year-low = p_ryear.
rr_year-high = p_ryear.
APPEND rr_year.
*********************根据公司代码、年份查找总帐: 总计表
SELECT
racct
ryear
drcrk"借贷标识
rpmax
hslvt hsl01 hsl02 hsl03 hsl04 hsl05 hsl06
hsl07 hsl08 hsl09 hsl10 hsl11 hsl12
hsl13 hsl14 hsl15 hsl16
INTO CORRESPONDING FIELDS OF TABLE gt_fag
FROM faglflext
WHERE ryear IN rr_year
AND rbukrs = p_bukrs
AND prctr IN s_prctr.
IF sy-subrc <> 0.
MESSAGE '无数据!' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
***************损益表会计科目及格式维护
SELECT *
INTO TABLE gt_tpkm
FROM zqtfi002a.
DATA: ls_dex TYPE i,
ls_dex2 TYPE i.
SELECT MAX( zitem )
INTO ls_dex2
FROM zqtfi002a.
DO ls_dex2 TIMES.
ls_dex = ls_dex + 1.
t_out-zitem = ls_dex.
APPEND t_out.
ENDDO.
RANGES: rg_hkont FOR bseg-hkont.
FIELD-SYMBOLS <fs_h1> TYPE any.
DATA: l_num LIKE bkpf-monat,
l_hslvt LIKE glt0-hslvt,
l_charh1(13).
DATA: ls_zbysjs TYPE glt0-hsl01, "本月实际数
ls_zbnljs TYPE glt0-hsl01, "本年累计数
ls_zsnljs TYPE glt0-hsl01, "shang年累计数
ls_zbnsyljs TYPE glt0-hsl01. "本年上月累计数
DATA: ls_zzflag1 TYPE c.
LOOP AT t_out.
READ TABLE gt_tpkm INTO wa_tpkm WITH KEY zitem = t_out-zitem.
IF sy-subrc = 0.
t_out-zxiangm = wa_tpkm-zitemt."行项目名称
CLEAR wa_tpkm.
LOOP AT gt_tpkm INTO wa_tpkm WHERE zitem = t_out-zitem AND zsaknr1 IS NOT INITIAL.
CLEAR: ls_zbysjs,ls_zbnljs,ls_zsnljs,ls_zbnsyljs. "本年累计
LOOP AT gt_fag WHERE racct >= wa_tpkm-zsaknr1 AND racct <= wa_tpkm-zsaknr2.
IF wa_tpkm-rfarea IS NOT INITIAL.
CHECK wa_tpkm-rfarea = gt_fag-rfarea.
ENDIF.
IF gt_fag-ryear = p_ryear.
l_hslvt = gt_fag-hslvt .
CLEAR l_num.
DO g_time TIMES.
l_num = l_num + 1.
CONCATENATE 'GT_FAG-HSL' l_num INTO l_charh1."总账表所需要计算的月份
ASSIGN (l_charh1) TO <fs_h1>.
ls_zbnljs = ls_zbnljs + <fs_h1>."本年累计数
IF p_rpmax = l_num.
ls_zbysjs = ls_zbysjs + <fs_h1>."本月实际数
ENDIF.
CLEAR l_charh1.
ENDDO.
ls_zbnljs = ls_zbnljs + l_hslvt." "本年累计数
* ELSEIF gt_fag-ryear = last_year.
* l_hslvt = gt_fag-hslvt .
* CLEAR l_num.
* DO g_time TIMES.
* l_num = l_num + 1.
* CONCATENATE 'GT_FAG-HSL' l_num INTO l_charh1."总账表所需要计算的月份
* ASSIGN (l_charh1) TO <fs_h1>.
* ls_zsnljs = ls_zsnljs + <fs_h1>."上年累计数
* CLEAR l_charh1.
* ENDDO.
* ls_zsnljs = ls_zsnljs + l_hslvt." "上年累计数
ENDIF.
********************************************************************** 本年上月累计数
* IF gt_fag-ryear = g_year_sy.
* l_hslvt = gt_fag-hslvt .
* CLEAR l_num.
* DO g_month_sy TIMES.
* l_num = l_num + 1.
* CONCATENATE 'GT_FAG-HSL' l_num INTO l_charh1."总账表所需要计算的月份
* ASSIGN (l_charh1) TO <fs_h1>.
* ls_zbnsyljs = ls_zbnsyljs + <fs_h1>."上年累计数
* CLEAR l_charh1.
* ENDDO.
* ls_zbnsyljs = ls_zbnsyljs + l_hslvt." "上年累计数
* ENDIF.
********************************************************************** "本年上月累计数
ENDLOOP.
IF wa_tpkm-zjia01 = '-'. "-
ls_zsnljs = 0 - ls_zsnljs.
ls_zbysjs = 0 - ls_zbysjs.
ls_zbnljs = 0 - ls_zbnljs.
ls_zbnsyljs = 0 - ls_zbnsyljs." "本年上月累计数
ENDIF.
t_out-zbysjs = t_out-zbysjs + ls_zbysjs." "本月实际数
t_out-zbnljs = t_out-zbnljs + ls_zbnljs." "本年累计数
t_out-zsnljs = t_out-zsnljs + ls_zsnljs." "上年累计数
t_out-zbnsyljs = t_out-zbnsyljs + ls_zbnsyljs." "本年上月累计数
ENDLOOP.
* IF s1 <> 'X'.
* IF wa_tpkm-zamtdisp = 'Y'. "反向显示
* t_out-zsnljs = 0 - t_out-zsnljs.
* t_out-zbysjs = 0 - t_out-zbysjs." "本月实际数
* t_out-zbnljs = 0 - t_out-zbnljs." "本年累计数
* t_out-zbnsyljs = 0 - t_out-zbnsyljs." "本年上月累计数
* ENDIF.
* ENDIF .
MODIFY t_out.
ENDIF.
ENDLOOP.
LOOP AT t_out.""""""""""""将内表数据赋值给准备EXCEL输出的内表中。
wa_type-zitem = t_out-zitem.
wa_type-c100 = t_out-zbysjs."本月实际数
wa_type-d100 = t_out-zbnljs."本年累计数
wa_type-e100 = t_out-zsnljs.
wa_type-h100 = t_out-zbnsyljs."本年上月累计数
IF t_out-zbysjs < 0.
CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
CHANGING
value = wa_type-c100.
ENDIF.
IF t_out-zbnljs < 0.
CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
CHANGING
value = wa_type-d100.
ENDIF.
IF t_out-zsnljs < 0.
CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
CHANGING
value = wa_type-e100.
ENDIF.
IF t_out-zbnsyljs < 0."本年上月累计数
CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
CHANGING
value = wa_type-h100.
ENDIF.
APPEND wa_type TO gt_type.
ENDLOOP.
CLEAR: gt_alv1.
LOOP AT gt_type INTO wa_type.
MOVE-CORRESPONDING wa_type TO wa_alv1.
READ TABLE gt_tpkm INTO wa_tpkm WITH KEY zitem = wa_type-zitem.
IF sy-subrc EQ 0.
wa_alv1-zitemt = wa_tpkm-zitemt.
ENDIF.
wa_alv1-zbnsyljs = wa_type-h100."本年上月累计
wa_alv1-bukrs = p_bukrs.
wa_alv1-zbysjs = wa_type-c100."本月实际
wa_alv1-zsnljs = wa_type-e100."上年累计
wa_alv1-zbnljs = wa_type-d100."本年累计
APPEND wa_alv1 TO gt_alv1.
CLEAR:wa_alv1.
ENDLOOP.
"""""""""添加公式
DATA:lv_index TYPE i,
lv_index1 TYPE i.
DATA:lv_shuzi TYPE char3,
lv_char TYPE char1.
DATA:lv_fh TYPE char1 .
DATA:lv_dmbtr TYPE dmbtr,
lv_dmbtr1 TYPE dmbtr.
SORT gt_tpkm BY zitem .
DATA:lv_rate TYPE string.
IF p_waers EQ 'USD'.
CLEAR lv_rate.
" "如果是美元货币
CALL FUNCTION 'READ_EXCHANGE_RATE'
EXPORTING
date = sy-datum
foreign_currency = 'USD'
local_currency = 'MXN'
IMPORTING
exchange_rate = lv_rate.
ENDIF.
LOOP AT gt_tpkm INTO DATA(gs_tbkm) WHERE zgs IS NOT INITIAL .
lv_index = strlen( gs_tbkm-zgs ).
CLEAR lv_index1 .
CLEAR:lv_dmbtr ,
lv_dmbtr1 .
CLEAR:lv_shuzi .
lv_fh = '+'.
WHILE lv_index <> lv_index1.
lv_char = gs_tbkm-zgs+lv_index1(1).
IF lv_char = '+' OR lv_char = '-'.
READ TABLE gt_alv1 INTO wa_alv1 WITH KEY zitem = lv_shuzi .
IF sy-subrc = 0 .
IF lv_fh = '+'.
lv_dmbtr = lv_dmbtr + wa_alv1-zbysjs .
lv_dmbtr1 = lv_dmbtr1 + wa_alv1-zbnljs .
ELSEIF lv_fh = '-'.
lv_dmbtr = lv_dmbtr - wa_alv1-zbysjs .
lv_dmbtr1 = lv_dmbtr1 - wa_alv1-zbnljs .
ENDIF.
lv_fh = lv_char .
ENDIF.
CLEAR lv_shuzi .
ELSE.
lv_shuzi = lv_shuzi && lv_char .
CONDENSE lv_shuzi NO-GAPS .
ENDIF.
lv_index1 = lv_index1 + 1 .
IF lv_index1 = lv_index .
READ TABLE gt_alv1 INTO wa_alv1 WITH KEY zitem = lv_shuzi .
IF sy-subrc = 0 .
IF lv_fh = '+'.
lv_dmbtr = lv_dmbtr + wa_alv1-zbysjs .
lv_dmbtr1 = lv_dmbtr1 + wa_alv1-zbnljs .
ELSEIF lv_fh = '-'.
lv_dmbtr = lv_dmbtr - wa_alv1-zbysjs .
lv_dmbtr1 = lv_dmbtr1 - wa_alv1-zbnljs .
ENDIF.
lv_fh = lv_char .
ENDIF.
ENDIF.
ENDWHILE.
wa_alv1-zbysjs = lv_dmbtr .
wa_alv1-zbnljs = lv_dmbtr1 .
"汇率转换
IF p_waers EQ 'USD'.
IF lv_rate <> 0.
wa_alv1-zbnljs = wa_alv1-zbnljs / lv_rate.
ENDIF.
ENDIF.
MODIFY gt_alv1 FROM wa_alv1 TRANSPORTING zbysjs zbnljs WHERE zitem = gs_tbkm-zitem .
ENDLOOP.
ENDFORM. " FRM_SUB_READ_TABLE
*&---------------------------------------------------------------------*
*& Form FRM_SUB_EXCEL_OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_sub_excel_output .
DATA: l_text TYPE string,
l_objnm LIKE wwwdatatab-objid VALUE 'ZQFIR002',
l_objdt LIKE wwwdatatab,
l_rc TYPE sy-subrc.
**
CLEAR: g_text1,g_text2,g_text3.
SELECT SINGLE butxt INTO g_text1 FROM t001 WHERE bukrs = p_bukrs.
CONCATENATE '编制单位:' g_text1 INTO g_text1 .
CONCATENATE p_ryear '年' p_rpmax '月' INTO g_text2.
CONCATENATE p_ryear '年' p_rpmax '月' TEXT-002 INTO g_text3.
SELECT SINGLE relid objid
INTO CORRESPONDING FIELDS OF l_objdt
FROM wwwdata
WHERE objid = l_objnm.
IF sy-subrc <> 0.
CONCATENATE '模板:' l_objnm '不存在,请使用事务码SMW0上传' INTO l_text.
MESSAGE l_text TYPE 'S'.
CLEAR l_text.
LEAVE LIST-PROCESSING.
ELSE.
CALL FUNCTION 'TMP_GUI_BROWSE_FOR_FOLDER'
EXPORTING
window_title = '选择损益表保存文件夹'
initial_folder = ''
IMPORTING
selected_folder = p_roald
EXCEPTIONS
cntl_error = 1
OTHERS = 2.
CONCATENATE p_roald '\' g_text2 '_' '损益表.XLSX' INTO p_roald.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = l_objdt
destination = p_roald
IMPORTING
rc = l_rc.
IF l_rc <> 0.
CLEAR l_text.
CONCATENATE '模板:' l_objnm '下载失败,请与开发人员联系' INTO l_text.
MESSAGE l_text TYPE 'S'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDIF.
* 正在处理提示
PERFORM frm_process_prompt.
* 打开EXCEL
PERFORM frm_excel_open USING p_roald.
* EXCEL赋值
PERFORM frm_excel_value.
* 释放对象
PERFORM frm_excel_free.
ENDFORM. " FRM_SUB_EXCEL_OUTPUT
*&---------------------------------------------------------------------*
*& Form FRM_PROCESS_PROMPT
*&---------------------------------------------------------------------*
* 正在处理提示
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_process_prompt .
DATA: l_dis(150) TYPE c.
CONCATENATE '正在处理文件:' p_roald INTO l_dis.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
text = l_dis.
ENDFORM. " FRM_PROCESS_PROMPT
*&---------------------------------------------------------------------*
*& Form FRM_EXCEL_OPEN
*&---------------------------------------------------------------------*
* 打开EXCEL
*----------------------------------------------------------------------*
* -->P_L_FILE text
*----------------------------------------------------------------------*
FORM frm_excel_open USING p_l_file.
CREATE OBJECT excel 'EXCEL.APPLICATION'.
IF sy-subrc <> 0.
MESSAGE 'Excel开打失败!.' TYPE 'S'.
STOP.
ELSE.
SET PROPERTY OF excel 'VISIBLE' = 1.
CALL METHOD OF excel 'WORKBOOKS' = workbook. "新产生一个Excel
CALL METHOD OF workbook 'OPEN'
EXPORTING
#1 = p_l_file. "要打开的Excel的路径
GET PROPERTY OF excel 'ACTIVECELL' = sheet.
ENDIF.
CALL METHOD OF excel 'WORKSHEETS' = sheet
EXPORTING
#1 = 'SHEET1'.
CALL METHOD OF sheet 'ACTIVATE'.
ENDFORM. " FRM_EXCEL_OPEN
*&---------------------------------------------------------------------*
*& Form FRM_EXCEL_VALUE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_excel_value .
DATA: l_zitem TYPE zqtfi002-zitem,
l_zcol TYPE zqtfi002-zcol.
*打开第一个Sheet
CALL METHOD OF excel 'WORKSHEETS' = sheet
EXPORTING
#1 = 1.
CALL METHOD OF sheet 'ACTIVATE'.
SELECT SINGLE butxt INTO @DATA(lv_butxt)
FROM t001
WHERE bukrs = @p_bukrs.
g_text2 = '编制单位:' && lv_butxt && ' /' && g_text2 .
REPLACE '/' IN g_text2 WITH space .
**
"PERFORM frm_cell_set USING 2 1 g_text3.
"PERFORM frm_cell_set USING 3 2 g_text3. "年月
"PERFORM frm_cell_set USING 3 1 lv_butxt. "公司名称
"PERFORM frm_cell_set USING 4 1 g_text1.
PERFORM frm_cell_set USING 3 1 g_text2.
* LOOP AT gt_type.
* l_zitem = gt_type-zitem.
* READ TABLE gt_tpkm INTO wa_tpkm WITH KEY
* zitem = l_zitem.
* CHECK sy-subrc = 0 AND
* wa_tpkm-zrow IS NOT INITIAL AND
* wa_tpkm-zcol IS NOT INITIAL.
*
* IF gt_type-c100 NE 0.
* PERFORM frm_cell_set USING wa_tpkm-zrow wa_tpkm-zcol gt_type-c100 .
* ENDIF.
* IF gt_type-d100 NE 0.
* l_zcol = wa_tpkm-zcol + 1.
* PERFORM frm_cell_set USING wa_tpkm-zrow l_zcol gt_type-d100 .
* ENDIF.
* ENDLOOP.
DATA: lv_c100 TYPE c LENGTH 50,
lv_d100 TYPE c LENGTH 50.
LOOP AT gt_alv1 INTO DATA(ls_alv1).
l_zitem = ls_alv1-zitem.
lv_c100 = ls_alv1-zbysjs.
lv_d100 = ls_alv1-zbnljs.
CONDENSE lv_c100 NO-GAPS.
CONDENSE lv_d100 NO-GAPS.
IF ls_alv1-zbysjs < 0.
CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
CHANGING
value = lv_c100.
ENDIF.
IF ls_alv1-zbnljs < 0.
CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
CHANGING
value = lv_d100.
ENDIF.
READ TABLE gt_tpkm INTO wa_tpkm WITH KEY zitem = l_zitem.
CHECK sy-subrc = 0 AND
wa_tpkm-zrow IS NOT INITIAL AND
wa_tpkm-zcol IS NOT INITIAL.
IF lv_c100 NE 0.
PERFORM frm_cell_set USING wa_tpkm-zrow wa_tpkm-zcol lv_c100 .
ENDIF.
IF lv_d100 NE 0.
l_zcol = wa_tpkm-zcol + 1.
PERFORM frm_cell_set USING wa_tpkm-zrow l_zcol lv_d100 .
ENDIF.
CLEAR: lv_c100,
lv_d100.
ENDLOOP.
*****************
GET PROPERTY OF excel 'ACTIVESHEET' = sheet.
GET PROPERTY OF excel 'ACTIVEWORKBOOK' = workbook.
CALL METHOD OF workbook 'SAVE'.
ENDFORM. " FRM_EXCEL_VALUE
*&---------------------------------------------------------------------*
*& Form FRM_EXCEL_FREE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_excel_free .
FREE: excel,workbook,sheet,cell.
ENDFORM. " FRM_EXCEL_FREE
*&---------------------------------------------------------------------*
*& Form FRM_CELL_SET
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ROW 第几行
* -->P_COL 第几列
* -->P_D_BUTXT 要填的值
*----------------------------------------------------------------------*
FORM frm_cell_set USING p_row
p_col
p_d_butxt.
CALL METHOD OF sheet 'CELLS' = cell
EXPORTING
#1 = p_row
#2 = p_col.
SET PROPERTY OF cell 'VALUE' = p_d_butxt.
ENDFORM. " FRM_CELL_SET
*&---------------------------------------------------------------------*
*& Form reda_excel_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->U_FROW text
* -->U_FCOL text
*----------------------------------------------------------------------*
FORM reda_excel_data USING u_frow
u_fcol.
* U_TROW
* U_TCOL.
DATA: lo_cell TYPE ole2_object,
lo_cell1 TYPE ole2_object,
lo_range TYPE ole2_object.
CALL METHOD OF sheet 'Cells' = lo_cell
EXPORTING
#1 = u_frow
#2 = u_fcol.
CALL METHOD OF sheet 'Cells' = lo_cell1
EXPORTING
#1 = u_frow
#2 = u_fcol.
CALL METHOD OF sheet 'RANGE' = lo_range
EXPORTING
#1 = lo_cell
#2 = lo_cell1.
CALL METHOD OF lo_range 'SELECT'.
CALL METHOD OF sheet 'PASTE'.
FREE OBJECT lo_cell.
FREE OBJECT lo_cell1.
FREE OBJECT lo_range.
ENDFORM. " REDA_EXCEL_DATA
*&---------------------------------------------------------------------*
*& FORM FRM_INITIAL
*&---------------------------------------------------------------------*
*& 报表初始化
*&---------------------------------------------------------------------*
FORM frm_initial .
* 指派输出表
PERFORM frm_assign_table TABLES gt_alv1[].
* 设置表格字段文本元素前缀字符
PERFORM frm_set_grid_label USING 'C'.
* 设置初始化GUI状态的子过程
PERFORM frm_set_gui_status_from USING c_form_pf_status.
* 捕捉“全选”,“全不选”命令
PERFORM frm_catch_command USING: '&ALL', '&SAL'.
* 设置接受用户命令的子过程
PERFORM frm_set_command_form USING c_form_command.
gs_layout-stylefname = 'STYLE'.
ENDFORM. "FRM_INITIAL
*&---------------------------------------------------------------------*
*& FORM FRM_TOP_OF_PAGE
*&---------------------------------------------------------------------*
* 表头
*----------------------------------------------------------------------*
* --> P1 TEXT
* <-- P2 TEXT
*----------------------------------------------------------------------*
FORM frm_top_of_page.
"建立输出抬头
PERFORM frm_comment_build.
"执行显示抬头标题
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = it_listheader.
ENDFORM. "FRM_TOP_OF_PAGE
*&---------------------------------------------------------------------*
*& FORM FRM_COMMENT_BUILD
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
* --> P1 TEXT
* <-- P2 TEXT
*----------------------------------------------------------------------*
FORM frm_comment_build .
DATA lw_listheader TYPE slis_listheader.
CLEAR: it_listheader, lw_listheader.
lw_listheader-typ = 'H'.
lw_listheader-info = 'Estado de resultados'.
APPEND lw_listheader TO it_listheader.
* CLEAR lw_listheader.
* lw_listheader-typ = 'S'.
* lw_listheader-key = '会企03表'.
* APPEND lw_listheader TO it_listheader.
lw_listheader-typ = 'S'.
* LW_LISTHEADER-INFO = '制表单位:'.
lw_listheader-key = str_butxt..
APPEND lw_listheader TO it_listheader.
CLEAR lw_listheader.
lw_listheader-typ = 'S'.
lw_listheader-key = p_rpmax.
APPEND lw_listheader TO it_listheader.
CLEAR lw_listheader.
lw_listheader-typ = 'S'.
lw_listheader-key = 'Unidades:' && p_waers.
APPEND lw_listheader TO it_listheader.
ENDFORM. " FRM_COMMENT_BUILD
*&---------------------------------------------------------------------*
*& FORM FRM_PF_STATUS
*&---------------------------------------------------------------------*
* 设置状态栏
*----------------------------------------------------------------------*
FORM frm_pf_status USING pt_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD' EXCLUDING pt_extab.
ENDFORM. "FRM_PF_STATUS
FORM frm_user_command USING pv_ucomm LIKE sy-ucomm
ps_selfield TYPE slis_selfield.
FIELD-SYMBOLS <fs_out> TYPE any.
CASE pv_ucomm.
WHEN '&IC1'."点击ALV单元格,实现显示明细
CHECK NOT ps_selfield-value IS INITIAL.
READ TABLE <fs_outtab> ASSIGNING <fs_out> INDEX ps_selfield-tabindex.
CHECK sy-subrc EQ 0.
PERFORM frm_get_document USING <fs_out>.
MOVE-CORRESPONDING <fs_out> TO it_acdoca_mx.
PERFORM frm_show_detail USING it_acdoca_mx ps_selfield-fieldname.
PERFORM frm_refresh_display USING ps_selfield.
WHEN '&EXPORT'."导出EXCEL
"PERFORM frm_save_data_excel.
PERFORM frm_sub_excel_output.
ENDCASE.
ENDFORM. "FRM_USER_COMMAND
*---------------------------------------------------------------------*
* FORM FRM_EDIT_FCAT
*---------------------------------------------------------------------*
* 编辑表头字段
*---------------------------------------------------------------------*
FORM frm_edit_fcat.
** 0不显示
* $FIELD NO_ZERO: 'BNHSL','SNHSL'.
* 隐藏字段
$field no_out: 'ZSAKNR1', 'ZSAKNR2', 'ZSNLJS','ZBNSYLJS'. "by wangwei 20200720隐藏上年累计和本年上月累计两个字段
"注册事件
PERFORM frm_register_events.
ENDFORM. "FRM_EDIT_FCAT
*&---------------------------------------------------------------------*
*& FORM FRM_REGISTER_EVENTS
*&---------------------------------------------------------------------*
*& 注册事件
*&---------------------------------------------------------------------*
FORM frm_register_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 = gt_event
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.
CLEAR l_events.
READ TABLE gt_event 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 gt_event 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 gt_local_evt.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DOCUMENT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> <FS_OUT>
*&---------------------------------------------------------------------*
FORM frm_get_document USING ps_out TYPE zqsficor002.
DATA:rt_hkont TYPE RANGE OF skat-saknr,
rs_hkont LIKE LINE OF rt_hkont.
REFRESH:it_acdoca_mx.
LOOP AT gt_tpkm INTO wa_tpkm WHERE zitem = ps_out-zitem.
IF wa_tpkm-zsaknr1 IS NOT INITIAL AND wa_tpkm-zsaknr2 IS NOT INITIAL.
rs_hkont-sign = 'I'.
rs_hkont-option = 'BT'.
rs_hkont-low = wa_tpkm-zsaknr1.
rs_hkont-high = wa_tpkm-zsaknr2.
APPEND rs_hkont TO rt_hkont.
CLEAR: rs_hkont.
ELSEIF wa_tpkm-zsaknr1 IS NOT INITIAL.
rs_hkont-sign = 'I'.
rs_hkont-option = 'EQ'.
rs_hkont-low = wa_tpkm-zsaknr1.
APPEND rs_hkont TO rt_hkont.
CLEAR: rs_hkont.
ENDIF.
ENDLOOP.
*****查询会计凭证信息
IF rt_hkont IS NOT INITIAL.
SELECT
acdoca~rbukrs "公司代码
acdoca~belnr "会计凭证
acdoca~ryear "年度
acdoca~docln "行项目
acdoca~drcrk "借贷标识
acdoca~budat "过账日期
acdoca~hsl "金额
acdoca~racct "科目号
skat~txt20
INTO CORRESPONDING FIELDS OF TABLE it_acdoca_mx
FROM acdoca INNER JOIN skat
ON acdoca~racct = skat~saknr
WHERE acdoca~racct IN rt_hkont
AND acdoca~rbukrs EQ p_bukrs
AND acdoca~gjahr EQ p_ryear
AND acdoca~poper EQ p_rpmax
AND skat~spras EQ sy-langu
AND skat~ktopl EQ 'HD01'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM FRM_SHOW_DETAIL
*&---------------------------------------------------------------------*
*& 显示明细数据
*&---------------------------------------------------------------------*
FORM frm_show_detail USING ps_data LIKE it_acdoca_mx
pv_field TYPE fieldname.
DATA: pt_fieldcat TYPE slis_t_fieldcat_alv.
DATA: ls_layout TYPE slis_layout_alv,
ls_fieldcat TYPE slis_fieldcat_alv,
lt_fieldcat TYPE slis_t_fieldcat_alv.
* BUILD THE FIELD CATALOG
DEFINE m_fieldcat1.
ADD 1 TO ls_fieldcat-col_pos.
ls_fieldcat-fieldname = &1.
ls_fieldcat-seltext_l = &2.
ls_fieldcat-outputlen = &3.
ls_fieldcat-emphasize = &4.
ls_fieldcat-key = &5.
ls_fieldcat-do_sum = &6.
APPEND ls_fieldcat TO lt_fieldcat.
END-OF-DEFINITION.
" m_fieldcat1 'ZNO' '报表项' '8' '' '' ''.
m_fieldcat1 'RBUKRS' '公司代码' '8' '' 'X' ''.
m_fieldcat1 'BUDAT' '过账日期' '10' '' '' ''.
m_fieldcat1 'GJAHR' '年度' '6' '' 'X' ''.
m_fieldcat1 'BELNR' '会计凭证' '10' '' 'X' ''.
m_fieldcat1 'DOCLN' '行项目' '6' '' 'X' ''.
m_fieldcat1 'DRCRK' '借贷标识' '8' '' 'X' ''.
m_fieldcat1 'HSL' '金额' '16' '' '' 'X'.
m_fieldcat1 'RACCT' '科目号' '10' '' '' ''.
m_fieldcat1 'TXT20' '科目描述' '20' '' '' ''.
* m_fieldcat1 'RSTGR' '原因代码' '8' '' '' ''.
* m_fieldcat1 'ZTXT' '编号文本' '20' '' '' ''.
* m_fieldcat1 'ZTYPE' '类型' '4' '' '' ''.
* m_fieldcat1 'OPERATOR' '运算符' '6' '' '' ''.
SORT it_acdoca_mx BY budat gjahr belnr belnr.
* 显示明细数据
ls_layout-colwidth_optimize = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
* I_CALLBACK_TOP_OF_PAGE = 'FRM_TOP_OF_PAGE'
it_fieldcat = lt_fieldcat
is_layout = ls_layout
* I_CALLBACK_PF_STATUS_SET = 'STANDARD1'
i_callback_user_command = 'FRM_USER_COMMAND1'
i_default = 'X'
i_save = 'A'
* IT_FILTER = PT_FILTER
* IT_SORT = PT_SORT
TABLES
t_outtab = it_acdoca_mx
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. "FRM_SHOW_DETAIL
FORM frm_user_command1 USING pv_ucomm LIKE sy-ucomm
ps_selfield TYPE slis_selfield.
DATA : lv_grid TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lv_grid.
CALL METHOD lv_grid->check_changed_data.
CASE pv_ucomm.
WHEN '&IC1'.
CLEAR it_acdoca_mx.
READ TABLE it_acdoca_mx INDEX ps_selfield-tabindex.
IF sy-subrc = 0.
CASE ps_selfield-fieldname.
WHEN 'GJAHR' OR 'BELNR' OR 'DOCLN'.
SET PARAMETER ID 'BLN' FIELD it_acdoca_mx-belnr.
SET PARAMETER ID 'GJR' FIELD it_acdoca_mx-gjahr.
SET PARAMETER ID 'BUK' FIELD it_acdoca_mx-rbukrs.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN .
ENDCASE.
ENDIF.
ENDCASE.
ENDFORM. "FRM_USER_COMMAND1