SAP(十)报表程序
- 创建程序
程序类型
用SELECT-OPTIONS或者PARAMETERS定义数据后台运行报表程序,会自动生成下列代码结果,可以输入指的画面。
REPORT z12_01.
DATA : gt_sflight LIKE TABLE OF sflight,
gs_sflight TYPE sflight.
SELECT-OPTIONS : s_carrid FOR gs_sflight-carrid.
INITIALIZATION.
s_carrid-sign = 'I'.
s_carrid-option = 'EQ'.
s_carrid-low = 'AA'.
s_carrid-high = 'SQ'.
APPEND s_carrid.
*
*INITIALIZATION.
* s_carrid-sign = 'I'.
* s_carrid-option = 'BT'.
* s_carrid-low = 'AA'.
* s_carrid-high = 'SQ'.
* APPEND s_carrid.
START-OF-SELECTION.
SELECT carrid connid FROM sflight INTO CORRESPONDING FIELDS OF TABLE gt_sflight WHERE carrid IN s_carrid.
END-OF-SELECTION.
LOOP AT gt_sflight INTO gs_sflight.
WRITE : / gs_sflight-carrid ,gs_sflight-connid.
ENDLOOP.
- 报表程序定义
大概有三种类型
数据定义部分和查询选择画面(SELECTION-SCREEN)
直到运行时刻的触发事件
显示数据的列表事件
程序及数据定义
EPORT z12_01.
DATA : gt_sflight LIKE TABLE OF sflight,
gs_sflight TYPE sflight.
*SELECTION-SCREEN
SELECT-OPTIONS : s_carrid FOR gs_sflight-carrid.
PRAMETERS : P_SCARR LIKE sflight-carrid.
- 事件
INITIALIZATION.
AT SELECTION-SCREEN.
START-OF-SELECTION.
END-OF-SELECTION.
- 报表程序事件流程
TOP-OF-PAGE.
END-OD-PAGE.
AT LINE-SELECTION.
AT PF<NN>
AT USER-COMMAND.
- AT SELECTION-SCREEN、PAI、AT USER-COMMAND
当点击屏幕上元素(包括按钮、单选复选按钮、下拉列表、菜单、工具条)时,
选择屏幕触发的是AT SELECTION-SCREEN(不是AT USER-COMMAND 事件)
对话屏幕触发的PAI事件
列表屏幕触发的才是AT USER-COMMAND事件
SELECTION-SCREEN SKIP 空行
SELECTION-SCREEN ULINE 水平线
SELECTION-SCREEN COMMENT text FOR FIELD sel 文本标签
SELECTION-SCREEN PUSHBUTTONbt_text USER-COMMAND fcode 按钮
SELECTION-SCREEN BEGIN OF LINE 多元素行
SELECTION-SCREEN BEGIN OF BLOCK block 屏幕块
SELECTION-SCREEN BEGIN OF TABBED BLOCK tblock Tabstrip
SELECTION-SCREEN FUNCTION KEY n 激活工具栏中预设按钮
SELECTION-SCREEN BEGIN OF SCREEN dynnr [AS SUBSCREEN] 定义屏幕或子屏幕
选择画面
- PARAMETERS
PARAMETERS {para[(len)]}|{para [LENGTH len]}
type_options [{ TYPE type [DECIMALS dec] }| { LIKE dobj }| { LIKE (name) }]
screen_options[{ {[OBLIGATORY|NO-DISPLAY] [VISIBLE LENGTH vlen]}
| {AS CHECKBOX [USER-COMMAND fcode]}
| {RADIOBUTTON GROUP group [USER-COMMAND fcode]}
| {AS LISTBOX VISIBLE LENGTH vlen [USER-COMMAND fcode][OBLIGATORY]}}
[MODIF ID modid]]
value_options[DEFAULT val][LOWER CASE][MATCHCODE OBJECT hp][MEMORY ID pid][VALUE CHECK]
OBLIGATORY:如果某个屏幕输入元素处于隐藏状态,即使它是必输入的,则在提交时也不会提示你必输入(但如果是必须的,在隐藏前一要输入,否则会出错并要求重新输入),只有在显示状态时且不输入时才会提示
MODIF ID key:设置修改组代码,方便屏幕的元素的批量修改,key中设定的代码将被赋给系统内表SCREEN-GROUP1字段
MATCHCODE OBJECT:指定一个search_help
MEMORY ID pid:通过SAP Memory进行同一用户会话不同窗口间的参数传递
VALUE CHECK:开启系统自动检验(如果屏幕元素参照的数据元素所对应的Domain设置了fixed Values、Value Table)
PARAMETERS: p_check as CHECKBOX USER-COMMAND chk
PARAMETERS: p_radio1 TYPE c RADIOBUTTON GROUP g1 USER-COMMAND rbt,
p_radio2 TYPE c RADIOBUTTON GROUP g1.
PARAMETERS p_carri2 LIKE spfli-carrid
AS LISTBOX VISIBLE LENGTH 20
USER-COMMAND lst
SELECT-OPTIONS
SELECT-OPTIONS selcrit FOR {dobj|(name)}
screen_options[OBLIGATORY|NO-DISPLAY][VISIBLE LENGTH vlen][NO-EXTENSION][NO INTERVALS][MODIF ID id]
value_options [DEFAULT val1 [TO val2] [OPTION opt] [SIGN sgn]][LOWER CASE]
[MATCHCODE OBJECT search_help][MEMORY ID pid]
该语句会生成一个名为selcrit选择条件内表,具体请参数OPEN SQL章节中的 RANG条件内表
NO-EXTENSION:限制选择表为单行,元素输入后面不会出现按钮 [iksˈtenʃən]
NO INTERVALS:只会出现LOW字段,To后面的HIGH字段不出现在选择屏幕上,但是用户仍然可以在Mutiple Selection窗口中输入范围选择。也就是说:只要有按钮,就可以选择多个条件与范围值 [ˈintəvəl]
OBLIGATORY:只有前面一个框框中出现钩,第二个框没有,也就是说该选项只能LOW字段有效
DEFAULT:
TABLES: mara,marc.
SELECT-OPTIONS:werks FOR marc-werks OBLIGATORY DEFAULT 1001 TO 1007 SIGN I OPTION BT.
SELECT-OPTIONS:p2 FOR mara-matnr MODIF.
AT SELECTION-SCREEN OUTPUT.
p2-low = 'aaaa'.
APPEND p2 .
MEMORY ID:将第一个输入框中的数据存放到SAP MEMORY中共享
- 使用SELECT-OPTIONS替代PARAMETERS
实际上PARAMETERS 类型的参数完全可以使用SELECT-OPTIONS来替代,下面就是使用这种替换方式,外表看上去与PARAMETERS是一样的,但双击后可以出现操作符选择界面,所以唯一不同点就是这个可以选择操作符,而且这样做的好处是:当不输入值时,查询所有的,但PARAMETERS值为空是查询就是为空(或0)的值(如果此时要忽略这个条件,则要将单值转换为Rang或者是分两种情况来写SQL条件):
TABLES: marc.
SELECT-OPTIONS: s_werks FOR marc-werks NO INTERVALS NO-EXTENSION.
TABLES: mara,marc.
DATA: g_pg(24).
SELECTION-SCREEN BEGIN OF BLOCK bk1 WITH FRAME TITLE text-001.
PARAMETERS: p_bukrs LIKE t001-bukrs OBLIGATORY."Company code
SELECT-OPTIONS:
s_werks FOR marc-werks OBLIGATORY NO INTERVALS,
s_matnr FOR mara-matnr NO-EXTENSION ,
s_segme FOR g_pg."参照普通变量
PARAMETERS: p_line(6).
SELECTION-SCREEN SKIP 1.
PARAMETERS: p_x1 RADIOBUTTON GROUP gp1 DEFAULT 'X',
p_x2 RADIOBUTTON GROUP gp1.
PARAMETERS: p_old TYPE c AS CHECKBOX.
PARAMETERS: p_oldhir LIKE grpdynp-name_coall MODIF ID m1 DEFAULT 'ABB_CHINA.XXXX'.
SELECTION-SCREEN:SKIP 1.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_dwload AS CHECKBOX.
SELECTION-SCREEN COMMENT 5(29) text-001.
PARAMETERS: p_file TYPE string.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK bk1.
- 点击时显示、隐藏其他屏幕元素
PARAMETERS show_all AS CHECKBOX USER-COMMAND flag.
PARAMETERS hide RADIOBUTTON GROUP rd USER-COMMAND flag2 DEFAULT 'X'.
PARAMETERS show RADIOBUTTON GROUP rd .
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME .
PARAMETERS: p1 TYPE c LENGTH 10 ,
p2 TYPE c LENGTH 10.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE t.
PARAMETERS: p3 TYPE c LENGTH 10 MODIF ID bl2,
p4 TYPE c LENGTH 10 MODIF ID bl2.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME .
PARAMETERS: p5 TYPE c LENGTH 10 MODIF ID bl3,
p6 TYPE c LENGTH 10 MODIF ID bl3.
SELECTION-SCREEN END OF BLOCK b3.
INITIALIZATION.
t = '----ALL----'.
"单先与复选框、下拉列表项点击触发PAI后,接下来还会触发屏幕的PBO(回车也是这样),但如果点击的是执行按钮,则不会接着触发屏幕的PBO,除非没有输出或在Basic List列表页面上点击返回按钮时,才会触发PBO
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF show_all = 'X' AND screen-group1 = 'BL2'.
screen-active = '1'."显示
MODIFY SCREEN.
ELSEIF screen-group1 = 'BL2'.
screen-active = '0'."隐藏
MODIFY SCREEN.
ENDIF.
IF show = 'X' AND screen-group1 = 'BL3'.
screen-active = '1'.
MODIFY SCREEN.
ELSEIF screen-group1 = 'BL3'.
screen-active = '0'.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
- 按钮
SELECTION-SCREEN:PUSHBUTTON 2(12) but1 USER-COMMAND cli1.
INITIALIZATION.
but1 = 'Button 1'."可直接设置按钮上的标签文本
AT SELECTION-SCREEN.
CASE sy-ucomm.
WHEN 'CLI1'.
ENDCASE.
- 下拉列表 AS LISTBOX
PARAMETERS p_carri1 LIKE SPFLI-CARRID.
PARAMETERS p_carri2 LIKE spfli-carrid
AS LISTBOX VISIBLE LENGTH 20
USER-COMMAND onli
DEFAULT 'LH'.
屏幕流逻辑详情见12.7. 屏幕流逻辑;
子屏幕、动态屏幕修改、屏幕跳转等。
- 程序结构之事件
报表事件:
INITIALIZATION. 画面之前初始化画面字段。
START-OF-SELECTION.
END-OF-SELECTION. 对于最后调用的事件,是查询到所有数据后将这些数据输出到画面之前执行。
AT SELECTION-SCREEN选择屏幕事件在NITIALIZATION和START-OF-SELECTION之间触发,对应于对话屏幕PBO、PAI、POH、POV事件。
AT SELECTION-SCREEN { OUTPUT }
| { ON {para|selcrit} }
| { ON END OF selcrit }
| { ON BLOCK block }
| { ON RADIOBUTTON GROUP radi }
| { ON {HELP-REQUEST|VALUE-REQUEST}
{ FOR {para|selcrit-low|selcrit-high} }
| { ON EXIT-COMMAND }
| { }.
DATA : g_total TYPE i,
g_cnt TYPE i,
g_index TYPE i.
DATA : gt_sflight TYPE TABLE OF sflight WITH HEADER LINE.
START-OF-SELECTION.
SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_sflight FROM sflight.
DESCRIBE TABLE gt_sflight LINES g_total.
* 计算内表 gt_sflight 的行数 ,将行数放到变量 g_total 里。
LOOP AT gt_sflight.
g_cnt = g_cnt + 1.
PERFORM progress_indicator USING g_cNt g_total 'Progressing...'.
ENDLOOP.
WRITE 'SUCCESS'.
FORM progress_indicator USING value(p_cur)
VALUE(p_total)
VALUE(p_text).
DATA : lv_text(50) TYPE C,
lv_idx(30) TYPE n.
lv_Idx = ( p_cur / p_total ) * 100.
CONCATENATE lv_idx '% :' p_text INTO lv_text.
CALL FUNCTION
'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = lv_idx
text = lv_text
EXCEPTIONS
OTHERS = 0.
ENDFORM.
DATA : lt_scarr TYPE STANDARD TABLE OF scarr WITH HEADER LINE ,
ls_scarr TYPE scarr,
lv_chk TYPE c,
lv_fldname(30),
lv_fldval(50).
START-OF-SELECTION.
SELECT * INTO TABLE lt_scarr FROM scarr.
END-OF-SELECTION.
LOOP AT lt_scarr.
WRITE : / lv_chk AS CHECKBOX,
sy-vline,lt_scarr-carrid,lt_scarr-carrname.
HIDE : lt_scarr-carrid,lt_scarr-carrname.
ENDLOOP.
AT LINE-SELECTION.
CHECK sy-lsind = 1.
WINDOW STARTING AT 5 5 ENDING AT 55 10.
WRITE : / 'AAAA'.
WRITE : / lt_scarr-carrid,lt_scarr-carrname.
- 逻辑数据库事件
GET node [LATE] [FIELDS f1 f2 …].
- 程序结构–List Process 事件
TOP-OF-PAGE. 在新一页输出第一条数据之前执行。
END-OF-PAGE.当前页页脚触发的的事件。
AT LINE-SELECTION.当双击报表的一行或者按f2触发的事件。
AT USER-COMMAND.当选择菜单栏功能及单击按钮时触发的事件。
AT pf.
TOP-OF-PAGE DURING LINE-SELECTION。再次级报表中控制表头时使用的事件。
TOP-OF-PAGE. END-OF-PAGE.
REPORT ZHT_02 LINE-SIZE 60 LINE-COUNT 10(2).
TOP-OF-PAGE.
WRITE : 'Top of Page'.
ULINE AT /(60).
END-OF-PAGE.
ULINE.
WRITE : /30 'Page no :',sy-pagno.
START-OF-SELECTION.
DO 20 TIMES.
WRITE / sy-index.
ENDDO.
AT LINE-SELECTION.
REPORT ZHT_02.
START-OF-SELECTION.
WRITE 'First List'.
FORMAT HOTSPOT ON COLOR 7.
WRITE : / 'AAAAA'.
FORMAT HOTSPOT OFF COLOR OFF.
AT LINE-SELECTION.
WRITE : 'BBBBB'.
WRITE : / 'SY-UCOMM=',SY-UCOMM.
AT USER-COMMAND.
右击程序创建GUI状态,
输入FCI后双击
START-OF-SELECTION.
SET PF-STATUS 'TEST'.
WRITE : 'BUTTON'.
AT USER-COMMAND.
CASE SY-UCOMM.
WHEN 'FC1'.
LEAVE PROGRAM.
ENDCASE.
TOP-OF-PAGE DURING LINE-SELECTION。
REPORT ZHT_03.
TOP-OF-PAGE.
WRITE 'First List TOP-OF-PAGE'.
ULINE.
TOP-OF-PAGE DURING LINE-SELECTION.
WRITE ' List TOP-OF-PAGE'.
ULINE.
AT LINE-SELECTION.
PERFORM write_list .
START-OF-SELECTION.
WRITE : 'AAAAAAA'.
FORM write_list.
WRITE : 'BBBBBB',
/ 'NNNNN'.
ENDFORM.
- 调用报表程序
TABLES : sflight.
DATA : gt_seltab TYPE TABLE OF rsparams WITH HEADER LINE,
gs_report(40) TYPE C.
gs_report = 'Z12_01'.
CLear gt_seltab.
gt_seltab-selname = 'SEL_CARR'.
gt_seltab-kind = 'S'.
gt_seltab-sign = 'I'.
gt_seltab-option = 'EQ'.
gt_seltab-low = 'AA'.
APPEND gt_seltab.
SUBMIT (gs_report) WITH SELECTION-TABLE gt_seltab AND RETURN.
文章来自于网络,如果侵犯了您的权益,请联系站长删除!