系统默认类型为表格,在文本框中键入ZTESTtFM_DHW_001,然后单击创建,即打开表格设计器,初始功能为表格属性设置,下图即为主界面,修改描述为“课堂练习-航班计划表”。
表格设计器左侧为导航树,右侧为属性维护区,点击右侧维护区的【输出选项】选项卡,可以看到表格的默认输出页格式为DINA4,即为A4纸张幅面输出,如果需要修改,可单击右侧按钮在弹出框中选择其他幅面格式,本练习中页格式采用默认的DINA4即可;
然后单击【全局数据】选项卡,定义全局变量,一个是内表对象GT_OUT,一个是对应的工作区对象GS_OUT。前者用以存放报表程序中待输出的内表数据,后者则用以逐行获得每行数据。两个变量的参考打印类型均为刚刚定义的结构类型:ITAB_OUT。
。字符串变量field的取值,需要注意,括号内为要调用当前表格的报表程序名称,后边紧跟着的就是该报表程序中存放待输出数据的内表对象名称,如果该内表带有表投行,那么必须增加[]显式区别要访问的是内表。
比如本练习中“(ZTEST_XXX_ALV_01)GT_OUT[]”
5、 窗口输出设置
单击左侧导航树页面和窗口—>新页面节点前的小箭头,可以展开页面下级节点,默认已经有一个主窗口节点,双击该节点,单击右侧【输出选项】选项卡,修改左边距为1CM,宽度为19CM.,然后保存。
注意:此处的左边距与宽度之和不得大于表格属性中选择的页格式定义的宽度,
上边距与高度之和也不能大于表格属性中页格式定义的高度。
6、 新建表节点
在左侧的导航树中选中主窗口节点后单击鼠标右键,选择创建—>表,窗口节点下会自动出现一个新表1节点,如图
修改表节点名称和描述如下图,表节点下自行创建了表头、主要区域和脚标三个输出区域。
7、 表绘制器和行类型
在导航树中双击刚刚创建的表节点,单击右侧【表】选项卡,可以看到右侧的表绘制器中已经有一个名称为%LTYPE1的行类型,鼠标移动在表格行上单击右键选择重命名,修改行类型名称为LTYPE_TITLE,点击
确定修改。
表绘制器的使用
鼠标选中表绘制器上
按钮,切换鼠标到绘制行列状态,然后按下鼠标后横向移动
即可看到绘制区会出现横向分割线,松开鼠标左键后即可创建新的行类型;垂直拖拽鼠标则
出现竖向分割线,松开鼠标后即可创建新的单元格,而拖动竖向分割线还可以调整单元格的宽度。
行类型细节编辑
也可以点击表绘制器右上方的细节按钮,切换到细节编辑界
面直接输入行类型及列数,并可以精确指定单元格宽度,如下图。
表宽度不得大于窗口属性中设定的宽度,各行类型的单元格宽度之和必须等于表宽度。
总共创建四个行类型,分别划出若干单元格,其详细信息如下:
行类型 LTYPE_TITLE LTYPE_HERDER LTYPE_DATA LTYPE_BOTTOM
表格线 无 无 有 无 单元格数 1 2 6 2 19 4 2,80 9 单元格宽度(CM) 4 2,26 15 3,23 3,25 3,46 10 表格框线的设置
点击表绘制器按钮
,可以切换回图形编辑界面,单击工具栏上
行列绘制按钮,将鼠标切换到选择状态;然后按住键盘上SHIFT键的同时,单击鼠标左键选中LTYPE_DATA行,然后先后点击外部框架
和内部框架
两个按钮,即为
LTYPE_DATA行类型增加表格框线。最终效果如下图:
8、 在表节点中创建表行
在导航树中选中表节点下表头节点,然后单击鼠标右键,选择创建—>表行,系统自动在表头区节点下增加表行节点,我们修改其名称和描述为ROW_TITLE和“标题”,并在右
侧属性区中指定行类型为LTYPE_TITLE后,可以看到系统自动在当前行节点下增加一个单元列节点,同样修改节点名称和描述为CELL_TITLE和“标题”。
按照同样方法,在标题行节点后依次创建抬头行ROW_TABLEHEADER和列头行ROW_LISTHEADER,行类型分别为LTYPE_HERDER和LTYPE_DATA。
在主要区域节点下创建表格数据行ROW_DATA,行类型为LTYPE_DATA。 在脚标节点下创建页码行ROW_BOTTOM,行类型为LTYPE_BOTTOM,如下图:
9、 创建标题文本及抬头文本
选中导航树中CELL_TITLE节点,单击鼠标右键选择创建—>文本,系统自动在选中节点下增加一个文本节点,我们修改节点名称和描述为TEXT_TITLE和“标题”。
然后单击表格设计器上方的
按钮,打开左下侧的字段列表,展开导入接口,可以看
到之前在表格接口中自定义的参数列表,用鼠标左键点击选中G_TITLE并拖拽到右侧的文本输入区中,并选择段落格式为C7,即指定标题显示格式为宋体三号居中。
用同样方法,在抬头行ROW_TABLEHEADER的第二个单元格节点下创建文本节点,
将导入接口中的变量G_AUDAT拖入文本输入区内,选择段落格式为RB,即指定统计周期显示为宋体五号居右。
10、 创建表格列头行文本及相应静态内容设置
用同样方法,在表头节点表头行ROW_LISTHEADER的第一个单元格节点下创建文本节点,将其文本输入区内直接输入内容:航线承运人ID,选择段落格式为CB,即指定统计周期显示为宋体五号居中。
在表头行ROW_LISTHEADER的第二个单元格节点下创建文本节点,将其文本输入区内直接输入内容:航班连接ID,选择段落格式为CB。
在表头行ROW_LISTHEADER的第三个单元格节点下创建文本节点,将其文本输入区内直接输入内容:航班日期,选择段落格式为CB。
在表头行ROW_LISTHEADER的第四个单元格节点下创建文本节点,将其文本输入区内直接输入内容:航空运费,选择段落格式为CB。
在表头行ROW_LISTHEADER的第五个单元格节点下创建文本节点,将其文本输入区内直接输入内容:飞机类型,选择段落格式为CB。
在表头行ROW_LISTHEADER的第六个单元格节点下创建文本节点,将其文本输入区内直接输入内容:最大容量,选择段落格式为CB。
11、 创建表格数据行文本及相应动态数据设置
采用相同方法,在主要区域节点下表格数据行ROW_DATA的第一个单元格节点下创建文本节点,修改其节点名称和描述为:CELL_CARRID和航班承运人ID;然后在字段列表中展开全局数据后,打开工作区变量GS_OUT,选中CARRID字段拖入右侧文本输入区,然后选择段落格式为
。
在表头行表格数据行ROW_DATA的第二个单元格节点下创建文本节点,修改相应节点名称和描述,然后从字段列表将GS_OUT-CONNID字段拖入右侧文本输入区,然后选择段落格式为CB。
在表头行表格数据行ROW_DATA的第三个单元格节点下创建文本节点,修改相应节点名称和描述,然后从字段列表将GS_OUT-FLDATE字段拖入右侧文本输入区,然后选择段落格式为CB。
在表头行表格数据行ROW_DATA的第四个单元格节点下创建文本节点,修改相应节点名称和描述,然后从字段列表将GS_OUT-PLANETYPE字段拖入右侧文本输入区,然后选择段落格式为RB。
在表头行表格数据行ROW_DATA的第五个单元格节点下创建文本节点,修改相应节点名称和描述,然后从字段列表将GS_OUT-PRICE字段拖入右侧文本输入区,然后选择段落格式为CB。
在表头行表格数据行ROW_DATA的第六个单元格节点下创建文本节点,修改相应节点名称和描述,然后从字段列表将GS_OUT-SEATSMAX字段拖入右侧文本输入区,然后选择段落格式为CB。
12、 创建页码文本及系统字段设置
依然采用同样方法,在脚标区页码行ROW_PAGE的第二个单元格点下创建文本节点,修改其节点名称和描述为:DATA_PAGE和页码;然后在字段列表中展开系统字段后,打开系统对象SFSY,选中PAGE字段拖入右侧文本输入区,然后选择段落格式为LB,即指定页码显示为宋体五号居左。
13、 激活SMARTFORMS
保存并激活SMARTFORMS,这个过程中系统会自动进行语法检查,倘若表格设计过程有问题,会给出提示要求进行修改,如果没有问题即完成表格设计。
第二部分:集成到报表程序
1、 调出原有报表程序
打开SE38编辑器,输入原订货明细报表程序名称ZTEST_XXX_ALV_01,然后点击修改按钮,在程序中增加打印事件处理完成打印调用
2、 定义自定义工具条并绑定到ALV控件中
在程序中创建状态条对象:STANDARD
点击工具条上按钮
打开左侧对象清单列表,选中报表程序名称根节点,然后单
击鼠标右键,选择创建—>GUI STATUS,在弹出窗口中状态名称输入STANDARD,短文本描述输入工具条,然后确定即可打开状态条编辑界面。
状态条编辑界面如下图
展开应用工具条,可以看到全是空白的,选其中一个单元格,输入字符串PRT,并双击该字符串,弹出如下窗口:
默认为静态文本,无需改动,直接点击
确认创建函数文本
完成以下输入,函数文本:打印,图标:ICON_PRINT,信息文本:打印当前报表;然后点击确认,在下图中分配一个功能键给当前按钮
确定功能键分配后在后续弹出的窗口,可以输入快捷键P
然后点击确认,即完成自定义工具条和打印按钮的创建,如下图
我们通常采用相同的方法将ALV控件内置的系统功能按钮分别创建到自定义工具条中,如下图,最后会附上其相应的功能码一览表供开发时候参考。
状态条中应用工具条的自定义已经创建完成,接下来需要对系统工具条的默认功能键创建到自定义的状态条中;展开功能键列表,可以看到标准工具条中有所有图标,但功能码均为空,所以,在相应的图标上填入对应的预置功能码即可。
至此,自定义状态条的设计完成,保存并激活,然后在程序运行中的最终结果即如下图:
ALV控件内置功能码一览表 功能代码: &ETA &EB9 &REFRESH &ALL &SAL &OUP &ODN &ILT &UMC &SUM &RNT_PREV &VEXCEL &AQW %PC %SL &ABC &GRAPH &OL0 &OAD &AVE &INFO 函数文本: 细节 调用报告... 刷新 全部选择 取消全选 按升序排列 按降序排列 设置过滤器 总计 小计... 打印预览 Microsoft Excel 字处理... 本地文件 ... 邮件收件人 ABC 分析 图形 更改布局... 选择格式... 保存格式... 信息 图标名称: ICON_SELECT_DETAIL ICON_TABLE_SETTINGS ICON_REFRESH ICON_SELECT_ALL ICON_DESELECT_ALL ICON_SORT_UP ICON_SORT_DOWN ICON_FILTER ICON_SUM ICON_INTERMEDIATE_SUM ICON_LAYOUT_CONTROL ICON_XLS ICON_WORD_PROCESSING ICON_EXPORT ICON_MAIL ICON_ABC ICON_GRAPHICS ICON_ALV_VARIANTS ICON_ALV_VARIANT_CHOOSE ICON_ALV_VARIANT_SAVE ICON_INFORMATION
在报表程序中定义菜单处理子程序FRM_SET_MENU
在报表程序中增加如下代码段,完成菜单处理子程序的创建
*&-------------------------------------------------------------* *& Form frm_set_menu
*&-------------------------------------------------------------* * 实现ALV自定义状态条的绑定处理
*--------------------------------------------------------------* form FRM_SET_MENU using rt_extab type slis_t_extab.
set pf-status 'STANDARD'. \"引号内字符串为状态条对象的名称 endform. \" FRM_SET_MENU
在调用函数模块进行ALV报表显示时增加相应参数调用
修改报表程序中关于ALV报表显示的原有代码段,增加菜单处理参数 call function 'REUSE_ALV_GRID_DISPLAY' exporting
i_callback_program = g_repid
it_fieldcat = it_field is_layout = gs_layout
it_events = e03_lt_events[] i_callback_pf_status_set = 'FRM_SET_MENU' \"参数内容必须为大写 … …
3、 定义用户命令处理子程序并绑定到ALV事件响应处理中
定义用户命令处理子程序FRM_USER_COMMAND
在报表程序中增加如下代码段,完成用户命令处理子程序的创建
*&----------------------------------------------------------------* *& Form frm_user_command
*&----------------------------------------------------------------* * 实现对用户命令的响应
*-----------------------------------------------------------------* * -->R_UCOMM text
* -->RS_SELFIELD slis_selfield
*-----------------------------------------------------------------* form FRM_USER_COMMAND using p_ucomm like sy-ucomm selfield type slis_selfield. case p_ucomm.
when 'PRT'.\"响应自定义工具条中的自定义按钮事件 if not gt_out[] is initial.
perform frm_print_selected. \"调用打印输出子程序 else.
message e888 with '没有可打印的数据!'. endif.
when 'BACK'.\"返回 leave program. endcase.
endform. \"frm_user_command
在调用函数模块进行ALV报表显示时增加相应参数调用
修改报表程序中关于ALV报表显示的原有代码段,增加用户命令处理参数 call function 'REUSE_ALV_GRID_DISPLAY' exporting
i_callback_program = g_repid it_fieldcat = it_field is_layout = gs_layout
it_events = e03_lt_events[] i_callback_pf_status_set = 'FRM_SET_MENU'
i_callback_user_command = 'FRM_USER_COMMAND'
… …
4、 定义打印输出子程序
在报表程序中增加如下代码段,完成打印处理子程序的创建
*&-----------------------------------------------------------------* *& Form frm_print_selected
*&-----------------------------------------------------------------* * 实现对SmartForm的调用
*------------------------------------------------------------------* * --> p1 text * <-- p2 text
*------------------------------------------------------------------* form frm_print_selected .
data: fm_name type rs38l_fnam.
call function 'SSF_FUNCTION_MODULE_NAME' exporting
formname = ' ZTESTFM_DHW_001 ' \"参数传值为要调用的Form名称 importing
fm_name = fm_name. if sy-subrc <> 0.
message id sy-msgid type sy-msgty number sy-msgno with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. endif.
call function fm_name \"参数列表与Form中定义的接口对象需完全一致 exporting
g_title = g_title g_audat = g_audat exceptions
formatting_error = 1 internal_error = 2 send_error = 3 user_canceled = 4 others = 5.
if sy-subrc <> 0. if sy-subrc <> 4.
message id sy-msgid type sy-msgty number sy-msgno with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. endif. endif.
endform. \" frm_print_selected
五、打印预览效果图:
*&---------------------------------------------------------------------* *& Report ZTEST_DHW_ALV_001 *&
*&---------------------------------------------------------------------* *&
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_DHW_ALV_001.
TABLES:SFLIGHT. TYPE-POOLS:SLIS.
TYPES:
BEGIN OF TYP_OUT,
CARRID LIKE SFLIGHT-CARRID, CONNID LIKE SFLIGHT-CONNID, FLDATE LIKE SFLIGHT-FLDATE, PLANETYPE LIKE SFLIGHT-PLANETYPE, PRICE LIKE SFLIGHT-PRICE, SEATSMAX LIKE SFLIGHT-SEATSMAX, END OF TYP_OUT.
DATA: G_AUDAT TYPE STRING,
G_TITLE TYPE STRING, TD_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV, TH_FIELDCAT TYPE SLIS_FIELDCAT_ALV, TD_SFLIGHT TYPE TABLE OF TYP_OUT, TH_SFLIGHT TYPE TYP_OUT.
PARAMETERS:
P_PRICE TYPE SFLIGHT-PRICE DEFAULT '500'. SELECT-OPTIONS:
S_FLDATE FOR SFLIGHT-FLDATE.
INITIALIZATION. S_FLDATE-SIGN = 'I'. S_FLDATE-OPTION = 'BT'. S_FLDATE-LOW = '20070601'. S_FLDATE-HIGH = '20070630'.
APPEND S_FLDATE.
START-OF-SELECTION.
PERFORM FRM_GET_HEAD_RTN. PERFORM FRM_GET_DATA.
IF TD_SFLIGHT IS INITIAL.
MESSAGE S888(SABAPDOCU) DISPLAY LIKE 'E' WITH '没有符合条件数据!'. LEAVE LIST-PROCESSING. ELSE.
PERFORM FRM_DISPLAY_ALV. ENDIF.
*&---------------------------------------------------------------------* *& Form frm_get_head_rtn
*&---------------------------------------------------------------------* FORM FRM_GET_HEAD_RTN .
G_TITLE = '航班计划表'.
CONCATENATE S_FLDATE-LOW+0(4) '年' S_FLDATE-LOW+4(2) '月' S_FLDATE-LOW+6(2) '日至' S_FLDATE-HIGH+0(4) '年' S_FLDATE-HIGH+4(2) '月' S_FLDATE-HIGH+6(2)'日'
INTO G_AUDAT.
ENDFORM. \" frm_get_head_rtn
*&---------------------------------------------------------------------* *& Form FRM_GET_DATA
*&---------------------------------------------------------------------* * text
*----------------------------------------------------------------------* * --> p1 text
* <-- p2 text
*----------------------------------------------------------------------* FORM FRM_GET_DATA . SELECT CARRID CONNID FLDATE
PLANETYPE
PRICE
SEATSMAX FROM SFLIGHT
INTO TABLE TD_SFLIGHT WHERE PRICE > P_PRICE AND FLDATE IN S_FLDATE.
ENDFORM. \" FRM_GET_DATA *&---------------------------------------------------------------------* *& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------* * text
*----------------------------------------------------------------------* * --> p1 text * <-- p2 text
*----------------------------------------------------------------------* FORM FRM_DISPLAY_ALV .
DATA:
TH_LAYOUT TYPE SLIS_LAYOUT_ALV.
PERFORM FRM_ADD_FILEDCAT USING 1 'CARRID' '航线承运人ID'.
TH_LAYOUT-ZEBRA = 'X'. TH_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING
I_CALLBACK_PROGRAM = SY-CPROG I_CALLBACK_PF_STATUS_SET = 'FRM_SET_STATUS'
I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND' I_GRID_TITLE = '航班价格表' IS_LAYOUT = TH_LAYOUT IT_FIELDCAT = TD_FIELDCAT TABLES
T_OUTTAB = TD_SFLIGHT EXCEPTIONS
PROGRAM_ERROR = 1 OTHERS = 2. IF SY-SUBRC <> 0.
PERFORM FRM_ADD_FILEDCAT USING 2 'CONNID' '航班连接 Id'. PERFORM FRM_ADD_FILEDCAT USING 3 'FLDATE' '航班日期'. PERFORM FRM_ADD_FILEDCAT USING 4 'PLANETYPE' '飞机类型'. PERFORM FRM_ADD_FILEDCAT USING 5 'PRICE' '航空运费'.
PERFORM FRM_ADD_FILEDCAT USING 6 'SEATSMAX' '最大容量'.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF.
ENDFORM. \" FRM_DISPLAY
*&---------------------------------------------------------------------* *& Form FRM_ADD_FILEDCAT
*&---------------------------------------------------------------------* * text
*----------------------------------------------------------------------* * -->I_POS text * -->I_FILEDNAME text * -->I_FILED_TEXT text
*----------------------------------------------------------------------* FORM FRM_ADD_FILEDCAT USING I_POS TYPE I
I_FIELDNAME TYPE SLIS_FIELDNAME I_FIELD_TEXT TYPE DD03P-SCRTEXT_L. CLEAR TH_FIELDCAT. TH_FIELDCAT-COL_POS = I_POS.
TH_FIELDCAT-FIELDNAME = I_FIELDNAME. TH_FIELDCAT-SELTEXT_L = I_FIELD_TEXT.
APPEND TH_FIELDCAT TO TD_FIELDCAT.
ENDFORM. \" FRM_ADD_FILEDCAT
*&---------------------------------------------------------------------* *& Form FRM_SET_STATUS
*&---------------------------------------------------------------------* * text
*----------------------------------------------------------------------* * -->RT_EXTAB text
*----------------------------------------------------------------------*
FORM FRM_SET_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB. SET PF-STATUS 'STANDARD'. ENDFORM. \"FRM_SET_STATUS
*&---------------------------------------------------------------------* *& Form FRM_USER_COMMAND
*&---------------------------------------------------------------------* * text
*----------------------------------------------------------------------* * -->P_UCOMM text
* -->SELFIELD text
*----------------------------------------------------------------------*
FORM FRM_USER_COMMAND USING P_UCOMM LIKE SY-UCOMM SELFIELD TYPE SLIS_SELFIELD. CASE P_UCOMM.
WHEN 'PRT'.\"响应自定义工具条中的自定义按钮事件
IF NOT TD_SFLIGHT[] IS INITIAL.
PERFORM FRM_PRINT_SELECTED. \"调用打印输出子程序 ELSE.
MESSAGE E888(SABAPDOCU) WITH '没有可打印的数据!'. ENDIF.
WHEN 'BACK'.\"返回 LEAVE PROGRAM. ENDCASE.
ENDFORM. \"frm_user_command *&---------------------------------------------------------------------* *& Form FRM_PRINT_SELECTED
*&---------------------------------------------------------------------* * text
*----------------------------------------------------------------------* * --> p1 text
* <-- p2 text
*----------------------------------------------------------------------* FORM FRM_PRINT_SELECTED . DATA: FM_NAME TYPE RS38L_FNAM.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING
FORMNAME = 'ZTESTFM_DHW_001' \"参数传值为要调用的Form名称 IMPORTING
FM_NAME = FM_NAME.
IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF.
*参数列表与Form中定义的接口对象需完全一致 CALL FUNCTION FM_NAME EXPORTING
G_TITLE = G_TITLE G_AUDAT = G_AUDAT EXCEPTIONS FORMATTING_ERROR = 1
INTERNAL_ERROR = 2 SEND_ERROR = 3 USER_CANCELED = 4 OTHERS = 5.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF.
ENDFORM. \" FRM_PRINT_SELEC