SAP报表开发
- 格式:doc
- 大小:97.00 KB
- 文档页数:14
SAP报表开发概述
报表开发是指无屏幕的纯报表开发。
一、报表事件
对于纯报表程序,SAP 预定义了一系列的报表事件,包括:
二、事件处理顺序
下面是事件处理次序:
一个事件的ABAP 代码,开始于事件关键字,结束于下一个事件关键字。
三、报表的通常格式
通常,一个报表程序包含如下几部分:
1、程序说明。
包括:程序名称、作者、日期等信息。
2、关键字Report。
3、数据定义。
内表、参数都在这里定义。
4、Include 部分。
指定包含文件。
5、定义选择屏幕。
利用SELECT-OPTIONS 和PARAMETERS 声明多个选择参数,系统会自动产生一个屏幕号为1000 的选择屏幕。
6、INITIALIZATION 事件。
完成对选择屏幕参数的默认值填充。
7、AT SELECTION-SCREEN 事件。
对用户的输入参数作校验。
8、START-OF-SELECTION 事件。
在这里完成数据处理。
9、END-OF-SELECTION 事件。
在这里定义报表的输出。
10、如果不是采用ALV 的方式输出报表,而是采用WRITE 语句输出,则还有TOP-OF-PAGE 和END-OF-PAGE 事件。
四、关于选择屏幕
定义选择屏幕的常用关键字:
1、PARAMETERS….<AS CHECKBOX / RADIOBUTTON GROUP rg1>。
用来定义单值参数。
2、SELECT-OPTIONS。
用来定义单值、多值、范围参数。
3、SELECTION-SCREEN。
用来格式化选择屏幕。
定义选择屏幕时,我们会用到SELECT-OPTIONS 这个关键字,该参数能够接受单值、多值、范围,实际上,该参数是一个内表,其结构如下:
DATA: Begin of seltab OCCURS 0,
SIGN(1), OPTION(2), LOW LIKE f, HIGH LIKE f,
END OF seltab.
Seltab-SIGN:可选值为I 和E。
I 表示包含(Include),E 表示排除(Exclude)。
Seltab-OPTION:可选值为EQ、NE、GT、LE、LT、BT、NB。
EQ 表示等于,NE 表示不等于,GT 表示大于,LE 表示小于或等于,LT 表示小于,BT 表示在..之间,NB 表示不在…之间。
SELECT-OPTIONS 定义的选择参数能够直接用在OPEN SQL 语句中,例如:Where f IN seltab。
大家想想,一条这样的WHERE 语句,如果用T-SQL 需要多少个AND 和OR?这可是个好东西呀。
为了利用OPEN-SQL 的这个特性,有时候,我们会自己定义这样的内表,自己填充数据,然后在OPEN-SQL 语句中使用,即使我们不需要定义选择屏幕。
我们常用的屏幕格式化语句有:
1、在选择屏幕上产生空行:SELECTION-SCREEN SKIP.
2、定义屏幕块。
SELECTION-SCREEN BEGIN OF BLOCK blk0 WITH FRAME TITLE text-010. SELECTION-SCREEN END OF BLOCK blk0.
如果大家对这个屏幕格式还是不满意,那么,请利用屏幕制作器,尽情地修改屏幕1000 吧。
五、选择屏幕上的文本
定义完选择屏幕后,测试运行程序。
此时,我们看到的只是各个参数的名称,通常我们要用文本来替换裸露显示的参数名。
点击菜单“转到->文本元素->选择文本”,屏幕如下:
在Text 栏中输入我们希望显示的选择文本。
如果参数定义来源于数据字典元素或数据元素,选中“Dictionary ref.”,则Text 栏自动显示数据字典中定义的文本。
下面是“Text symbols”屏幕,它在程序中通过text-010 调用该文本符号(例如:Write text-010)。
如果开发多语言程序,这些text symbols 就必不可少了。
报表实例
财务部在实际业务处理时,有时候需要将会计凭证导出到Excel,而SAP 提供的行项目显示在格式方面不能满足要求,在这一章中,我会将这一简单需求作为例子说明报表的写法。
第一步:运用SE38 或SE80 创建一个报表,报表名称Z_FI_16(其实以Y 或Z 开头的名称都可以啦)。
第二步:写代码,本程序代码如下:
======================================================= ======
REPORT z_fi_16 .
*&---------------------------------------------------------------------*
* 声明全局变量
*&---------------------------------------------------------------------*
DATA: BEGIN OF itab OCCURS 0,
nd LIKE bkpf-gjahr, qj LIKE bkpf-monat, pzbh LIKE bkpf-belnr, pzlx LIKE bkpf-blart, jzrq LIKE bkpf-budat, cz LIKE bkpf-xblnr,
hb LIKE bkpf-waers, hl LIKE bkpf-kursf, ttwb LIKE bkpf-bktxt,
yhm LIKE bkpf-usnam, hxm LIKE bseg-buzei, jzdm LIKE bseg-bschl, zhlx LIKE bseg-koart, tbzz LIKE bseg-umskz, jfdf LIKE bseg-shkzg, je LIKE bseg-wrbtr, bwbje LIKE bseg-dmbtr, zzkm LIKE bseg-hkont, kmmc(50) TYPE c, kh LIKE bseg-kunnr, khmc(40) TYPE c,
gys LIKE bseg-lifnr, gysmc(40) TYPE c, cbzx LIKE bseg-kostl, cbzxmc(20) TYPE c, xmwb LIKE bseg-sgtxt,
END OF itab.
DATA: BEGIN OF ipzbh OCCURS 0,
sign(1) TYPE c,
option(2) TYPE c,
low(10) TYPE c,
high(10) TYPE c,
END OF ipzbh.
DATA: i_count TYPE i,
c_tmp(50) TYPE c,
i_tmp TYPE i.
TABLES: bkpf, bseg.
INCLUDE zincform.
*&---------------------------------------------------------------------*
* 选择屏幕
*&---------------------------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK blk0 WITH FRAME TITLE text-010. SELECTION-SCREEN SKIP.
SELECT-OPTIONS p_year FOR bkpf-gjahr.
SELECT-OPTIONS p_period FOR bkpf-monat.
SELECT-OPTIONS p_pzbh FOR bkpf-belnr.
SELECT-OPTIONS p_pzlx FOR bkpf-blart.
SELECT-OPTIONS p_jzrq FOR bkpf-budat.
SELECT-OPTIONS p_hb FOR bkpf-waers.
SELECT-OPTIONS p_yhm FOR bkpf-usnam.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN END OF BLOCK blk0.
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-020. SELECTION-SCREEN SKIP.
SELECT-OPTIONS p_jzdm FOR bseg-bschl.
SELECT-OPTIONS p_zhlx FOR bseg-koart.
SELECT-OPTIONS p_zzkm FOR bseg-hkont.
SELECT-OPTIONS p_kh FOR bseg-kunnr.
SELECT-OPTIONS p_gys FOR bseg-lifnr.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN END OF BLOCK blk1.
*&---------------------------------------------------------------------* * 初始化选择屏上的变量
*&---------------------------------------------------------------------* INITIALIZATION.
*&---------------------------------------------------------------------* * 初始化全局变量,检查用户的输入
*&---------------------------------------------------------------------* AT SELECTION-SCREEN.
REFRESH ipzbh.
SELECT belnr AS low
INTO CORRESPONDING FIELDS OF TABLE ipzbh
FROM bkpf
WHERE gjahr IN p_year AND monat IN p_period
AND belnr IN p_pzbh AND blart IN p_pzlx
AND budat IN p_jzrq AND waers IN p_hb AND usnam IN p_yhm.
IF sy-dbcnt = 0.
MESSAGE e846(so) WITH '没有符合条件的会计凭证!'.
ENDIF.
IF sy-dbcnt > 2000.
MESSAGE e846(so) WITH '超过2000条会计凭证分录,请缩小查寻范围'. ENDIF.
LOOP AT ipzbh.
ipzbh-sign = 'I'.
ipzbh-option = 'EQ'.
MODIFY ipzbh.
ENDLOOP.
*&---------------------------------------------------------------------*
* 主要数据处理逻辑
*&---------------------------------------------------------------------*
START-OF-SELECTION.
SELECT gjahr AS nd belnr AS pzbh buzei AS hxm bschl AS jzdm
koart AS zhlx umskz AS tbzz shkzg AS jfdf wrbtr AS je
dmbtr AS bwbje hkont AS zzkm kunnr AS kh lifnr AS gys
kostl AS cbzx sgtxt AS xmwb
INTO CORRESPONDING FIELDS OF TABLE itab
FROM bseg
WHERE belnr IN ipzbh AND gjahr IN p_year AND bschl IN p_jzdm
AND koart IN p_zhlx AND hkont IN p_zzkm AND kunnr IN p_kh
AND lifnr IN p_gys.
LOOP AT itab.
SELECT SINGLE monat blart budat xblnr waers kursf bktxt usnam INTO (itab-qj, itab-pzlx, itab-jzrq, itab-cz, itab-hb, itab-hl, itab-ttwb, itab-yhm)
FROM bkpf
WHERE gjahr = itab-nd AND belnr = itab-pzbh.
* 下面几个Perform分别用来获得帐户描述、客户描述、供应商描述、成本中心描述PERFORM get_acctname USING itab-zzkm CHANGING itab-kmmc. PERFORM get_custname USING itab-kh CHANGING itab-khmc. PERFORM get_supplyname USING itab-gys CHANGING itab-gysmc. PERFORM get_ccname USING itab-cbzx CHANGING itab-cbzxmc.
MODIFY itab.
ENDLOOP.
PERFORM display_data.
*&---------------------------------------------------------------------*
* 行选择时的处理
*&---------------------------------------------------------------------*
AT LINE-SELECTION.
*&---------------------------------------------------------------------*
* 用自定义命令按钮时的处理
*&---------------------------------------------------------------------*
AT USER-COMMAND.
*&---------------------------------------------------------------------*
* 页眉
*&---------------------------------------------------------------------*
TOP-OF-PAGE.
LOAD-OF-PROGRAM
*&---------------------------------------------------------------------* * 页脚
*&---------------------------------------------------------------------* END-OF-PAGE.
*&---------------------------------------------------------------------* *& 显示数据
*&---------------------------------------------------------------------* FORM display_data.
TYPE-POOLS slis.
DATA: ws_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE,
ws_fieldgroups_tab TYPE slis_t_sp_group_alv,
ws_layout TYPE slis_layout_alv,
ws_sortfields_tab TYPE slis_t_sortinfo_alv WITH HEADER LINE,
ws_events TYPE slis_t_event.
DATA: nn TYPE i VALUE 0.
DEFINE hout.
nn = nn + 1.
ws_fieldcat-tabname = 'itab'.
ws_fieldcat-fieldname = '&1'.
ws_fieldcat-seltext_m = &2.
ws_fieldcat-col_pos = nn.
ws_fieldcat-outputlen = &3.
ws_fieldcat-datatype = '&4'.
ws_fieldcat-do_sum = '&5'.
ws_fieldcat-lzero = 'X'.
ws_fieldcat-no_zero = 'X'.
append ws_fieldcat.
clear ws_fieldcat.
END-OF-DEFINITION.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' EXPORTING
percentage = 100
text = '正在进行数据处理,请稍等...'.
hout nd '年度' 4 numc ''. hout qj '期间' 2 numc ''.
hout jzrq '记帐日期' 10 dats ''. hout xmwb '项目文本' 20 char ''.
hout kh '客户' 10 char ''. hout khmc '客户名称' 40 char ''.
hout gys '供应商' 10 char ''. hout gysmc '供应商名称' 40 char ''.
hout cbzx '成本中心' 10 char ''. hout cbzxmc '成本中心名称' 20 char ''. hout pzlx '凭证类型' 2 char ''. hout pzbh '凭证编号' 10 char ''.
hout hxm '行项目' 6 numc ''. hout zzkm '总账科目' 10 char ''.
hout kmmc '科目名称' 50 char ''. hout hb '货币' 5 char ''.
hout hl '汇率' 8 numc ''. hout jfdf '借方/贷方' 5 char ''.
hout je '金额' 11 curr ''. hout bwbje '本位币金额' 11 curr ''.
hout cz '参照' 10 char ''. hout yhm '用户名' 10 char ''.
hout jzdm '记帐代码' 5 char ''. hout zhlx '帐户类型' 5 char ''. hout tbzz '特别总账标识' 5 char ''. hout ttwb '抬头文本' 20 char ''. ws_layout-zebra = 'X'.
ws_layout-get_selinfos = 'X'.
ws_layout-colwidth_optimize = 'X'.
ws_layout-detail_popup = 'X'.
ws_layout-no_keyfix = 'X'.
ws_layout-no_totalline = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
is_layout = ws_layout
it_fieldcat = ws_fieldcat[]
it_special_groups = ws_fieldgroups_tab[]
it_sort = ws_sortfields_tab[]
it_events = ws_events[]
i_grid_title = ''
TABLES
t_outtab = itab
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. "display_data
======================================================= ======
第三步:定义选择屏幕文本。
ABAP 编辑器菜单:转到文本->元素->选择文本。
第四步:分配事务代码和自定义菜单。