一、程序属性
创建程序类型:
状态:
根据程序状态不能使用特定 Utility。例如,选择系统程序,则不能使用 debug 功能
权限组:
分配程序执行/修改相关的权限组。若是安全相关程序有必要设置权限组。
逻辑数据库:
只在 TYPE-1 程序中选择。
通过 LDB 实现程序。为了查询使用频率高的表的数据,将经常使用的表连接及相似的查询条件用一个包创建,可以重复利用的程序称为 LDB。
例:
REPORT zprogram_alv.
DATA : gt_itab TYPE TABLE OF sflight,
gs_itab TYPE sflight.
SELECT-OPTIONS:s_carrid FOR gs_itab-carrid.
INITIALIZATION. "初始化
s_carrid-sign = 'I'.
s_carrid-option = 'EQ'.
s_carrid-low = 'AA'.
APPEND s_carrid.
START-OF-SELECTION.
SELECT carrid connid
INTO CORRESPONDING FIELDS OF TABLE gt_itab
FROM sflight
WHERE carrid IN s_carrid.
END-OF-SELECTION.
LOOP AT gt_itab INTO gs_itab.
WRITE: / gs_itab-carrid,gs_itab-connid.
ENDLOOP.
二、程序结构——定义
1、数据定义部分和查询选择画面 (SELECTION-SCREEN)
2、直到运行时刻的触发事件
3、显示数据的列表事件
定义程序语句:
1.指定程序 LIST Heading
决定在执行程序的报表画面上是否以程序名作为基本标题。
2.Line-Size
指定输出报表的宽度。宽度设置成0 或者删除 LINE-SIZE 语句,则会使用标准宽度。
- Message ID
定义ABAP 程序中要使用的 MESSAGE ID
选择画面:
1、PARAMETERS
PARAMETERS 定义用户可以输入值的输入字段。PARAMETERS 变量如果不指定 TYPE 类型,则默认定义为基本 CHAR 1类型PARAMETERS 中输入的值用在查询数据的 SELECT 语的条件中使用。此参数只能接收-个值,且能追加如复选框按钮等选项。
例:
*PARAMETERS用法
DATA :l_fname(20) TYPE c.
PARAMETERS: p_1 DEFAULT 'A',
p_2 TYPE char10,
p_3 TYPE c LENGTH 3 DEFAULT '123',
p_4 TYPE p DECIMALS 2 DEFAULT '123.456789',
p_5 LIKE sflight-carrid,
p_6 MEMORY ID sl,
p_7 MATCHCODE OBJECT zcarrid,
p_8 MODIF ID mid,
p_9 NO-DISPLAY,
p_10 DEFAULT 'a' LOWER CASE,
p_11 OBLIGATORY,
p_12 AS CHECKBOX,
p_13 RADIOBUTTON GROUP radi,
p_13_2 RADIOBUTTON GROUP radi,
p_14(10) VISIBLE LENGTH 3 DEFAULT '1234567890',
p_15 LIKE sflight-carrid VALUE CHECK,
p_16 LIKE (l_fname),
p_17 LIKE sflight-carrid AS LISTBOX VISIBLE LENGTH 3,
p_18 AS CHECKBOX USER-COMMAND abc.
2、SELECT-OPTIONS
PARAMETERS 是只能接收一个值的 INPUT 字段,与之相反,SELECT-OPTIONS 可以通过2个INPUT字段接收多种条件值 (Selection Criteria)。拥有与 RANGE 变量相同的结构(内表)。
例:
*select-options 用法
TABLES: sflight.
DATA: gs_scarr TYPE scarr.
DATA: gv_val TYPE char20.
SELECT-OPTIONS:
s_1 FOR sflight-carrid DEFAULT 'AC',
s_2 FOR gs_scarr-carrid DEFAULT 'AA*' OPTION EQ SIGN I,
s_3 FOR gv_val DEFAULT '111' TO '9999',
s_4 FOR gv_val DEFAULT 'AAAA' TO 'ZZZZ' OPTION BT SIGN E,
s_5 FOR sflight-carrid MEMORY ID scl,
s_6 FOR gv_val MATCHCODE OBJECT zcarrid,
s_7 FOR sflight-carrid MODIF ID car,
s_8 FOR sflight-carrid NO-DISPLAY,
s_9 FOR sflight-carrid LOWER CASE,
s-10 FOR sflight-carrid OBLIGATORY,
s_11 FOR sflight-carrid NO-EXTENSION,
s_12 FOR sflight-carrid NO INTERVALS,
s_13 FOR sflight-carrid VISIBLE LENGTH 1.
3、SELECTION-SCREEN
使用PARAMETER和 SELECTION-OPTION,ABAP 程序会自动调节字段描述与长度生成画面(SELECTION SCREEN)。若想调节系统自动生成的画面,则可以利用 SELECTIONSCREEN语句。
例:
*select-screen 用法
TABLES : scarr,sscrfields.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(10) TEXT-001 FOR FIELD p_1.
PARAMETERS:p_1 LIKE scarr-carrid.
SELECTION-SCREEN POSITION POS_LOW.
PARAMETERS : p_2 LIKE scarr-carrname.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN SKIP 2.
SELECTION-SCREEN ULINE.
SELECTION-SCREEN ULINE /1(10).
SELECTION-SCREEN ULINE pos_low(10).
SELECTION-SCREEN ULINE pos_high(10).
SELECTION-SCREEN PUSHBUTTON /pos_low(10) TEXT-002 USER-COMMAND btn01.
SELECTION-SCREEN BEGIN OF BLOCK block WITH FRAME TITLE TEXT-003.
PARAMETERS:p_3 TYPE c.
SELECT-OPTIONS:s_1 FOR scarr-carrid.
SELECTION-SCREEN END OF BLOCK block.
SELECTION-SCREEN BEGIN OF BLOCK block2 WITH FRAME TITLE TEXT-004
NO INTERVALS.
PARAMETERS:p_4 TYPE c.
SELECT-OPTIONS:s_2 FOR scarr-carrid.
SELECTION-SCREEN END OF BLOCK block2.
SELECTION-SCREEN FUNCTION KEY 1.
INITIALIZATION.
MOVE 'function key 1' TO sscrfields-functxt_01.
AT SELECTION-SCREEN.
IF sscrfields-ucomm = 'FCO1'.
MESSAGE'You clicked Function Key 1' TYPE 'I'.
ENDIF.
IF sscrfields-ucomm = 'BTN01'.
MESSAGE 'You clicked Fuction Key button' TYPE 'I'.
ENDIF.
4、MESSAGE-ID
若想在ABAP 程序信息栏中显示信息,则需要在报表第一行中记述MESSAGE-ID
三、程序结构——事件
1、INITIALIZATION
在事件中执行程序时最先执行的是INITIALIZATION。此事件在显示SELECTION-SCREEN之前触发,因此一般用于指定变量初始值。即在INITIALIZATION 事件中指定 SELECTION-SCREEN 中使用的字段初始值,自动输入用户经常使用的值。
例:
*INITIALIZATION 初始化
TABLES : sflight. "声明程序用到的数据库表
PARAMETER: p_carrid LIKE sflight-carrid,
p_connid LIKE sflight-connid.
SELECT-OPTIONS: s_fldate FOR sflight-fldate.
INITIALIZATION.
SET TITLEBAR 'T1000'.
SET PF-STATUS 'test'.
p_carrid = 'AA'.
p_connid = '17'.
s_fldate-low = '20150101'.
s_fldate-high = '20151231'.
APPEND s_fldate.
2、AT SELECTION-SCREEN
AT SELECTION-SCREEN 是在 SELECTION-SCREEN 中Input Field 的值有变更时执行的事件。INITIALIZATION与 START-OF-SELECTION 之间被触发,且对用户事件有回应并调节画面字段。
3、START-OF-SELECTION
若已经结束查询画面上字段的初始值设置及数据检查(Validation),就要执行从数据库读取数据的实际性操作。执行SOL语句之前最好先执行CLEAR语等准备操作后执行SELECT语句。
例:
*START-OF-SELECTION
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 gt_sflight FROM sflight.
ENDSELECT.
DESCRIBE TABLE gt_sflight LINES 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(3) 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.
4、END-OF-SELECTION
此事件作为执行环境下最后调用的事件,是在查询所有数据后最终将这些数据输出到画面之前执行。即在 SELECT 语句中读取所有数据后,画面中显示 Write 在此事件内可以做修改内表数据的操作。
例:
*END-OF-SELECTION
DATA: gs_str TYPE scarr,
gt_itab TYPE TABLE of scarr.
START-OF-SELECTION.
select * into CORRESPONDING FIELDS OF TABLE gt_itab
from scarr.
END-OF-SELECTION.
LOOP AT gt_itab into gs_str.
WRITE: / gs_str-carrid,gs_str-carrname.
ENDLOOP.
四、程序结构——List Process事件
List Process事件说明:
1、TOP-OF-PAGE
TOP-OF-PAGE 在新一页输出第一条数据之前执行。另外,在使用 NO STANDARD PAGEHEADING 选项的程序中直接输入报表表头时使用。没有特殊追加选项时只有生成基本列表时才使用。在NEW-PAGE 语句中不执行 EVENT。在当前页中指定成固定表头,因此移动滚动条也不会有变化
2、END-OF-PAGE
END-OF-PAGE 是当前页页脚触发的事件。即指定当前页页脚。LINE-SIZE.LINE-COUNT 一定要使用数字并且不能使用数据对象。在程序中,若已经追加 NEW-PAGE事件,则不会执行 END-OF-PAGE。
例:
*TOP-OF-PAGE 和 END-OF-PAGE 用法
TOP-OF-PAGE.
WRITE : sy-title,30 'page no :',sy-pagno.
ULINE.
WRITE:'enjoy abap'.
ULINE AT /(60).
END-OF-PAGE.
ULINE.
WRITE: /30 'page no:',sy-pagno.
START-OF-SELECTION.
DO 20 TIMES.
WRITE / sy-index.
ENDDO.
3、AT LINE-SELECTION
当双击报表的一行或按《F2) 键时触发的事件。此时发生的 SY-UCOMM 系统变量中被分配PICK'值。
例:
*AT LINE-SELECTION
DATA: gs_scarr TYPE scarr,
gt_scarr TYPE TABLE OF scarr,
gv_fname(20) TYPE c,
gv_value(20) TYPE c,
gv_carrid LIKE scarr-carrid,
gv_carrname LIKE scarr-carrname.
AT LINE-SELECTION.
GET CURSOR FIELD gv_fname VALUE gv_value.
CASE gv_fname.
WHEN 'gs_scarr-carrid'.
SPLIT sy-lisel AT '' INTO gv_carrid gv_carrname.
WRITE: gv_carrid,gv_carrname.
WHEN OTHERS.
ENDCASE.
START-OF-SELECTION.
SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_scarr
FROM scarr.
LOOP AT gt_scarr INTO gs_scarr.
WRITE: / gs_scarr-carrid,gs_scarr-carrname.
ENDLOOP.
*双击事件
START-OF-SELECTION.
WRITE 'first list'.
FORMAT HOTSPOT on COLOR 7.
WRITE: / 'clik this line'.
FORMAT HOTSPOT off COLOR OFF.
AT LINE-SELECTION.
WRITE:'secondary list'.
WRITE: / 'sy-ucomm = ',sy-ucomm.
4、AT USER-COMMAND
例:
*at user-command
START-OF-SELECTION.
SET PF-STATUS 'test'.
WRITE:'click the button'.
AT USER-COMMAND.
CASE sy-ucomm.
WHEN 'FCI'.
LEAVE PROGRAM.
ENDCASE.
5、TOP-OF-PAGE DURING LINE-SELECTION
在次级报表中控制表头时使用的事件。系统变量 SY-LSIND 中含有现在报表索引。每当显示次级报表(Secondary List)时SY-LSIND 会加1。Basic list的Index为0。如果使用SY-LSIND=SY-LSIND-1语句,则代表次级报表要覆盖现有画面。在次级报表中单击 Back 按或 Exit(ICON X)按钮,则索引会减 1。
6、WRITE语句:
WRITE 语句主要用于 OUTPUT 报表中显示数据及分配值 (MOVE)的功能。要用于显示的数据会保存在 LIST 缓冲器中。OUTPUT 报表中可以使用的项目有下列所示的几种。
用DATA 语句定义的字段。
用TABLES 语定义的结构体项目。
用FIELD-SYMBOL 定义的变量。
不受语言影响的 Text 文本。
五、调用程序
调用报表程序
调用报表程序与SELECTION-SCREEN
执行TYPE-1 程序首先显示包含 PARAMETERS 和SELECT-OPTION 的标准 SELECTION-SCREEN 画面。利用 SUBMIT 语可以执行向 SELECTION-SCREEN 输入字段中填值的多种选项。
1、 VIA SELECTION-SCREEN。显示被调用程序的 SELECTION SCREEN 画面。不使
用此语句,则不显示SELECTION-SCREEN 画面而直接执行被调用程序。
2、USING SELECTION-SET <var>。可以使用被调用程序的 Variant 来调用程序。
3、WITH p op f SIGN 。给 SELECTION-SCREEN 的构成要素 (PARAMETERS 和SELECT-OPTIONS) 赋值。
4、WITH FREE SELECTION freesel。可以使用动态的 Selection被调用的程序要与LDB 相连接。
5、WITH SELECTION-TABLE rspar。灵活运用结构体 RSPARAMS 的内表,可以动态为被调用程序的 SELECTION-SCREEN 输入字段赋值。
设置被调用的程序列表
被调用的程序不存在 REPORT 语句,因此不能设置列表的行数等样式。此时,可以利用SUBMIT语句修改被调用程序的列表结构。
调用事务码:
若程序存在事务码,则可以执行事务码调用其他程序。
执行上面所示语句会在结束调用的程序的同时执行新程序。结束调用程序,则会回到刚执行时的初始菜单画面。LEAVE 语句与在 COMMAND 命令窗口输入/n + t-code 一样。
此语句在保存被调用程序的数据的同时调用事务码。遇到LEAVE PROGRAM 语句退出被调用程序,则会回到原调用程序中。AND SKIP FIRST SCREEN 选项用于利用内存参数值跳过 SELECTION SCREEN,直接显示 Output List。
六、BDC程序
BDC 程序分为生成 Batch Input 会话执行的方法及在程序内使用 CALL TRANSACTOIN语句调用的方法两种。
利用CALL TRANSACTION
CALL TRANSACTION 是将用户执行事务码输入画面值的过程用程序实现,即以EXCLE 文件形式输入到标准程序的方法。在实务中经常使用,不用生成 Batch Input Session,在ABAP 程序内用 CALLTRANSACTION 语输入数据。
<tcode>:事务码。
<bdc tab>:BDCDATA 结构的内表传递给事务码。
<ctu params>:适用于 Rel4.6B 以上版本,用于设置 CALL TRANSACTION语句选项属性参见下表:
<mode>:
<update>:
Return code:执行 BDC 后给系统变量 SY-SUBRC 返回结果:
MESSTAB:保存 BDC 执行时发生的信息的 BDCMSGCOLL 类型内表: