SAP报表开发.docx
《SAP报表开发.docx》由会员分享,可在线阅读,更多相关《SAP报表开发.docx(13页珍藏版)》请在冰点文库上搜索。
SAP报表开发
SAP报表开发概述
报表开发是指无屏幕的纯报表开发。
一、报表事件
对于纯报表程序,SAP预定义了一系列的报表事件,包括:
INITIALZATION
初始化事件。
常用来填充选择屏幕的默认值。
ATSELECTION-SCREENOUTPUT
选择屏幕的PBO事件。
显示选择屏幕之前触发。
ATSELECTION-SCREEN
选择屏幕的PAI事件。
用户在选择屏幕中执行某些功能后触发。
通常用来接收用户输入,并给用户出错提示。
START-OF-SELECTION
选择开始事件。
选择屏幕处理结束后触发(即点击“Execute”按钮之后)。
END-OF-SELECTION
选择结束时间。
通常在该事件中输出报表。
AT-LINE-SELECTION
交互式报表中,用户选择某行时触发。
AT-USER-COMMAND
交互式报表中,用户选择某个功能时触发。
TOP-OF-PAGE
页眉控制,每个新页面开始时触发。
通常输出页眉、报表标题行。
END-OF-PAGE
页脚控制,在当前页结束前触发。
二、事件处理顺序
下面是事件处理次序:
一个事件的ABAP代码,开始于事件关键字,结束于下一个事件关键字。
三、报表的通常格式
通常,一个报表程序包含如下几部分:
1、程序说明。
包括:
程序名称、作者、日期等信息。
2、关键字Report。
3、数据定义。
内表、参数都在这里定义。
4、Include部分。
指定包含文件。
5、定义选择屏幕。
利用SELECT-OPTIONS和PARAMETERS声明多个选择参数,系统会自动产生一个屏幕号为1000的选择屏幕。
6、INITIALIZATION事件。
完成对选择屏幕参数的默认值填充。
7、ATSELECTION-SCREEN事件。
对用户的输入参数作校验。
8、START-OF-SELECTION事件。
在这里完成数据处理。
9、END-OF-SELECTION事件。
在这里定义报表的输出。
10、如果不是采用ALV的方式输出报表,而是采用WRITE语句输出,则还有TOP-OF-PAGE和END-OF-PAGE事件。
四、关于选择屏幕
定义选择屏幕的常用关键字:
1、PARAMETERS….。
用来定义单值参数。
2、SELECT-OPTIONS。
用来定义单值、多值、范围参数。
3、SELECTION-SCREEN。
用来格式化选择屏幕。
定义选择屏幕时,我们会用到SELECT-OPTIONS这个关键字,该参数能够接受单值、多值、范围,实际上,该参数是一个内表,其结构如下:
DATA:
BeginofseltabOCCURS0,
SIGN
(1),OPTION
(2),LOWLIKEf,HIGHLIKEf,
ENDOFseltab.
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定义的选择参数能够直接用在OPENSQL语句中,例如:
WherefINseltab。
大家想想,一条这样的WHERE语句,如果用T-SQL需要多少个AND和OR?
这可是个好东西呀。
为了利用OPEN-SQL的这个特性,有时候,我们会自己定义这样的内表,自己填充数据,然后在OPEN-SQL语句中使用,即使我们不需要定义选择屏幕。
我们常用的屏幕格式化语句有:
1、在选择屏幕上产生空行:
SELECTION-SCREENSKIP.
2、定义屏幕块。
SELECTION-SCREENBEGINOFBLOCKblk0WITHFRAMETITLEtext-010.
SELECTION-SCREENENDOFBLOCKblk0.
如果大家对这个屏幕格式还是不满意,那么,请利用屏幕制作器,尽情地修改屏幕1000吧。
五、选择屏幕上的文本
定义完选择屏幕后,测试运行程序。
此时,我们看到的只是各个参数的名称,通常我们要用文本来替换裸露显示的参数名。
点击菜单“转到->文本元素->选择文本”,屏幕如下:
在Text栏中输入我们希望显示的选择文本。
如果参数定义来源于数据字典元素或数据元素,选中“Dictionaryref.”,则Text栏自动显示数据字典中定义的文本。
下面是“Textsymbols”屏幕,它在程序中通过text-010调用该文本符号(例如:
Writetext-010)。
如果开发多语言程序,这些textsymbols就必不可少了。
报表实例
财务部在实际业务处理时,有时候需要将会计凭证导出到Excel,而SAP提供的行项目显示在格式方面不能满足要求,在这一章中,我会将这一简单需求作为例子说明报表的写法。
第一步:
运用SE38或SE80创建一个报表,报表名称Z_FI_16(其实以Y或Z开头的名称都可以啦)。
第二步:
写代码,本程序代码如下:
=============================================================
REPORTz_fi_16.
*&---------------------------------------------------------------------*
*声明全局变量
*&---------------------------------------------------------------------*
DATA:
BEGINOFitabOCCURS0,
ndLIKEbkpf-gjahr,qjLIKEbkpf-monat,pzbhLIKEbkpf-belnr,
pzlxLIKEbkpf-blart,jzrqLIKEbkpf-budat,czLIKEbkpf-xblnr,
hbLIKEbkpf-waers,hlLIKEbkpf-kursf,ttwbLIKEbkpf-bktxt,
yhmLIKEbkpf-usnam,hxmLIKEbseg-buzei,jzdmLIKEbseg-bschl,
zhlxLIKEbseg-koart,tbzzLIKEbseg-umskz,jfdfLIKEbseg-shkzg,
jeLIKEbseg-wrbtr,bwbjeLIKEbseg-dmbtr,zzkmLIKEbseg-hkont,
kmmc(50)TYPEc,khLIKEbseg-kunnr,khmc(40)TYPEc,
gysLIKEbseg-lifnr,gysmc(40)TYPEc,cbzxLIKEbseg-kostl,
cbzxmc(20)TYPEc,xmwbLIKEbseg-sgtxt,
ENDOFitab.
DATA:
BEGINOFipzbhOCCURS0,
sign
(1)TYPEc,
option
(2)TYPEc,
low(10)TYPEc,
high(10)TYPEc,
ENDOFipzbh.
DATA:
i_countTYPEi,
c_tmp(50)TYPEc,
i_tmpTYPEi.
TABLES:
bkpf,bseg.
INCLUDEzincform.
*&---------------------------------------------------------------------*
*选择屏幕
*&---------------------------------------------------------------------*
SELECTION-SCREENBEGINOFBLOCKblk0WITHFRAMETITLEtext-010.
SELECTION-SCREENSKIP.
SELECT-OPTIONSp_yearFORbkpf-gjahr.
SELECT-OPTIONSp_periodFORbkpf-monat.
SELECT-OPTIONSp_pzbhFORbkpf-belnr.
SELECT-OPTIONSp_pzlxFORbkpf-blart.
SELECT-OPTIONSp_jzrqFORbkpf-budat.
SELECT-OPTIONSp_hbFORbkpf-waers.
SELECT-OPTIONSp_yhmFORbkpf-usnam.
SELECTION-SCREENSKIP.
SELECTION-SCREENENDOFBLOCKblk0.
SELECTION-SCREENBEGINOFBLOCKblk1WITHFRAMETITLEtext-020.
SELECTION-SCREENSKIP.
SELECT-OPTIONSp_jzdmFORbseg-bschl.
SELECT-OPTIONSp_zhlxFORbseg-koart.
SELECT-OPTIONSp_zzkmFORbseg-hkont.
SELECT-OPTIONSp_khFORbseg-kunnr.
SELECT-OPTIONSp_gysFORbseg-lifnr.
SELECTION-SCREENSKIP.
SELECTION-SCREENENDOFBLOCKblk1.
*&---------------------------------------------------------------------*
*初始化选择屏上的变量
*&---------------------------------------------------------------------*
INITIALIZATION.
*&---------------------------------------------------------------------*
*初始化全局变量,检查用户的输入
*&---------------------------------------------------------------------*
ATSELECTION-SCREEN.
REFRESHipzbh.
SELECTbelnrASlow
INTOCORRESPONDINGFIELDSOFTABLEipzbh
FROMbkpf
WHEREgjahrINp_yearANDmonatINp_period
ANDbelnrINp_pzbhANDblartINp_pzlx
ANDbudatINp_jzrqANDwaersINp_hbANDusnamINp_yhm.
IFsy-dbcnt=0.
MESSAGEe846(so)WITH'没有符合条件的会计凭证!
'.
ENDIF.
IFsy-dbcnt>2000.
MESSAGEe846(so)WITH'超过2000条会计凭证分录,请缩小查寻范围'.
ENDIF.
LOOPATipzbh.
ipzbh-sign='I'.
ipzbh-option='EQ'.
MODIFYipzbh.
ENDLOOP.
*&---------------------------------------------------------------------*
*主要数据处理逻辑
*&---------------------------------------------------------------------*
START-OF-SELECTION.
SELECTgjahrASndbelnrASpzbhbuzeiAShxmbschlASjzdm
koartASzhlxumskzAStbzzshkzgASjfdfwrbtrASje
dmbtrASbwbjehkontASzzkmkunnrASkhlifnrASgys
kostlAScbzxsgtxtASxmwb
INTOCORRESPONDINGFIELDSOFTABLEitab
FROMbseg
WHEREbelnrINipzbhANDgjahrINp_yearANDbschlINp_jzdm
ANDkoartINp_zhlxANDhkontINp_zzkmANDkunnrINp_kh
ANDlifnrINp_gys.
LOOPATitab.
SELECTSINGLEmonatblartbudatxblnrwaerskursfbktxtusnamINTO(itab-qj,
itab-pzlx,itab-jzrq,itab-cz,itab-hb,itab-hl,itab-ttwb,itab-yhm)
FROMbkpf
WHEREgjahr=itab-ndANDbelnr=itab-pzbh.
*下面几个Perform分别用来获得帐户描述、客户描述、供应商描述、成本中心描述
PERFORMget_acctnameUSINGitab-zzkmCHANGINGitab-kmmc.
PERFORMget_custnameUSINGitab-khCHANGINGitab-khmc.
PERFORMget_supplynameUSINGitab-gysCHANGINGitab-gysmc.
PERFORMget_ccnameUSINGitab-cbzxCHANGINGitab-cbzxmc.
MODIFYitab.
ENDLOOP.
PERFORMdisplay_data.
*&---------------------------------------------------------------------*
*行选择时的处理
*&---------------------------------------------------------------------*
ATLINE-SELECTION.
*&---------------------------------------------------------------------*
*用自定义命令按钮时的处理
*&---------------------------------------------------------------------*
ATUSER-COMMAND.
*&---------------------------------------------------------------------*
*页眉
*&---------------------------------------------------------------------*
TOP-OF-PAGE.
LOAD-OF-PROGRAM
*&---------------------------------------------------------------------*
*页脚
*&---------------------------------------------------------------------*
END-OF-PAGE.
*&---------------------------------------------------------------------*
*&显示数据
*&---------------------------------------------------------------------*
FORMdisplay_data.
TYPE-POOLSslis.
DATA:
ws_fieldcatTYPEslis_t_fieldcat_alvWITHHEADERLINE,
ws_fieldgroups_tabTYPEslis_t_sp_group_alv,
ws_layoutTYPEslis_layout_alv,
ws_sortfields_tabTYPEslis_t_sortinfo_alvWITHHEADERLINE,
ws_eventsTYPEslis_t_event.
DATA:
nnTYPEiVALUE0.
DEFINEhout.
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'.
appendws_fieldcat.
clearws_fieldcat.
END-OF-DEFINITION.
CALLFUNCTION'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage=100
text='正在进行数据处理,请稍等...'.
houtnd'年度'4numc''.houtqj'期间'2numc''.
houtjzrq'记帐日期'10dats''.houtxmwb'项目文本'20char''.
houtkh'客户'10char''.houtkhmc'客户名称'40char''.
houtgys'供应商'10char''.houtgysmc'供应商名称'40char''.
houtcbzx'成本中心'10char''.houtcbzxmc'成本中心名称'20char''.
houtpzlx'凭证类型'2char''.houtpzbh'凭证编号'10char''.
houthxm'行项目'6numc''.houtzzkm'总账科目'10char''.
houtkmmc'科目名称'50char''.houthb'货币'5char''.
houthl'汇率'8numc''.houtjfdf'借方/贷方'5char''.
houtje'金额'11curr''.houtbwbje'本位币金额'11curr''.
houtcz'参照'10char''.houtyhm'用户名'10char''.
houtjzdm'记帐代码'5char''.houtzhlx'帐户类型'5char''.
houttbzz'特别总账标识'5char''.houtttwb'抬头文本'20char''.
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'.
CALLFUNCTION'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编辑器菜单:
转到文本->元素->选择文本。
第四步:
分配事务代码和自定义菜单。