先添加一个GUI状态,点击工具栏的“显示对象清单”,右键菜单“Create->GUI Status”,新建一个工具栏。
或在系统自带的ALV中COPY一个,/ose38 然后输入“BCALV*”按F4,然后找一个COPY。
工具栏的“菜单栏”或“应用工具条”中添加按钮。
显示工具栏
在ALV中设置 i_callback_pf_status_set = 'PF_STATUS_SET'
*工具栏
FORM pf_status_set USING pt_extab TYPE slis_t_extab.
SET PF-STATUS 'STATUS002'.
ENDFORM.
添加按钮事件 i_callback_user_command = 'PROCESS_USER_COMMAND'
*按钮事件
FORM process_user_command USING pr_ucomm LIKE sy-ucomm
ps_selfield TYPE slis_selfield.
* 屏幕自动刷新
DATA: lob_grid TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lob_grid.
CALL METHOD lob_grid->check_changed_data.
ps_selfield-refresh = 'X'.
CASE pr_ucomm.
WHEN '&IC1'."双击事件。
CLEAR w_loop.
w_loop = ps_selfield-tabindex.
READ TABLE my_makt INDEX ps_selfield-tabindex INTO wa_makt.
PERFORM double_click.
WHEN 'SEL'.
LOOP AT my_makt.
my_makt-checkbox = 'X'.
MODIFY my_makt.
ENDLOOP.
WHEN 'UNSEL'.
LOOP AT my_makt.
my_makt-checkbox = ' '.
MODIFY my_makt.
ENDLOOP.
WHEN 'SAVE'.
PERFORM save_click.
WHEN 'PRINT'.
PERFORM display_form.
ENDCASE.
CLEAR: pr_ucomm.
* 屏幕自动刷新
ps_selfield-refresh = 'X'.
ENDFORM. "process_user_command
添加窗体
se51
输入和se38一样的程序名,输入屏幕编号点创建。
点击“格式”进入设计页面。
文本框之类在名称中输入ALV中的变量或内表字段,就可以把值直接显示过来。
按钮中输入“功能码”,用于按钮事件中判断哪个按钮点击,程序中功能码注意大写。保存激活。
在元素清单中为“OK”添加名称“OK_CODE”。
在逻辑流中去掉PBO和PAI的注释,双击在主程序中生成PBO和PAI的代码。
PROCESS BEFORE OUTPUT.
MODULE STATUS_1001.“LOAD
PROCESS AFTER INPUT.
MODULE USER_COMMAND_1001."按钮事件
用代码 CALL SCREEN 1001 STARTING AT 27 5
ENDING AT 60 12. 调用窗体。
默认会显示ALV中的工具栏,需要为窗体建自己的工具栏(同上),可将“应用工具栏”中的按钮都删除。在窗体LOAD中加入设置工具栏代码。窗体属性中需选中“Withou application toolbar”。
创建打印报表smartforms
事件代码smartforms
选择表格输入报表名创建。
“表格接口”用于接收程序中的变量或内表。建好中字段列表中可看到。
在新页面中新建窗体,在新窗体中新建文本设置报表表头。
在MAIN主窗口中新建表格显示数据。
选择新建的表,在右面的表中点细节设置表列。
在表头中新建表行,选择刚才建的表列,在每列中设置列名。
在主要区域中新建表行,每列中新建文本。将字段列表中的字段拖到文本中。
保存激活。
不能拖动的解决方法
在se38中运行“RSCPSETEDITOR”去掉“SAPscript”和"Smart Forms"的打钩,点击“Activate”即可。
程序中调用
DATA: fm_name TYPE rs38l_fnam.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'ZDTFORMTEST1' "报表名
* VARIANT = ' '
* DIRECT_CALL = ' '
IMPORTING
fm_name = fm_name
* EXCEPTIONS
* NO_FORM = 1
* NO_FUNCTION_MODULE = 2
* OTHERS = 3
.
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
EXPORTING
title = '练习' "表格接口变量
TABLES
my_makt = my_makt "表格接口内表
EXCEPTIONS
formamtting_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.
以下是完整的程序代码
*&---------------------------------------------------------------------*
*& Report ZDTALVTEST1
*&
*&---------------------------------------------------------------------*
*&练习
*&dhj
*&---------------------------------------------------------------------*
REPORT zdtalvtest1.
*变量定义
TABLES: makt.
DATA: BEGIN OF my_makt OCCURS 0.
INCLUDE STRUCTURE makt.
DATA: checkbox(01).
DATA: END OF my_makt.
DATA: it_makt LIKE TABLE OF makt WITH HEADER LINE.
DATA: w_loop LIKE sy-tabix.
DATA: wa_makt LIKE LINE OF my_makt.
DATA: ok_code LIKE sy-ucomm.
* ALV stuff 定义--通用
TYPE-POOLS: slis.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv,
gs_layout TYPE slis_layout_alv,
gt_sort TYPE slis_t_sortinfo_alv,
gt_list_top_of_page TYPE slis_t_listheader.
DATA: ls_fieldcat TYPE slis_fieldcat_alv.
*用户输入框
SELECT-OPTIONS: s_matnr FOR makt-matnr.
*初始值
INITIALIZATION.
s_matnr-sign = 'I'.
s_matnr-option = 'BT'.
s_matnr-low = 'AS-10'.
s_matnr-high = 'AS-30'.
APPEND s_matnr.
*主程序逻辑开始
START-OF-SELECTION.
PERFORM read_data.
PERFORM alv_grid.
* PERFORM display_form.
*主程序逻辑结束
END-OF-SELECTION.
*过程定义
FORM read_data .
SELECT *
UP TO 20 ROWS
INTO CORRESPONDING FIELDS OF TABLE my_makt
FROM makt
WHERE makt~matnr IN s_matnr.
*表操作
* CLEAR it_makt.
* REFRESH it_makt[].
* LOOP AT my_makt.
* MOVE-CORRESPONDING my_makt TO it_makt.
* APPEND it_makt.
* ENDLOOP.
* APPEND LINES OF my_makt to it_makt.
ENDFORM. " READ_DATA
*---------------------------------------------------------------
* FORM alv_grid
*---------------------------------------------------------------
FORM alv_grid.
IF gt_fieldcat[] IS INITIAL.
PERFORM fieldcat_init.
PERFORM layout_init.
ENDIF.
PERFORM grid_display.
ENDFORM. "alv_grid
*---------------------------------------------------------------
* FORM fieldcat_init 显示字段 字段必须大写
*---------------------------------------------------------------
FORM fieldcat_init.
PERFORM append_fc_alv USING: 'MATNR' 'X' '物料号' 20 'N' 1 '' '',
'SPRAS' 'X' '语言' 10 '' 2 '' '',
'MAKTX' '' '描述1' 10 '' 4 '' '',
'MAKTG' '' '描述2' 10 '' 3 '' '',
'CHECKBOX' '' '选择' 10 '' 10 'X' 'X'.
ENDFORM. "fieldcat_init
*---------------------------------------------------------------
* FORM append_fc_alv 显示字段参数
*---------------------------------------------------------------
FORM append_fc_alv USING fieldname TYPE slis_fieldcat_alv-fieldname
key TYPE slis_fieldcat_alv-key
reptext_ddic TYPE slis_fieldcat_alv-reptext_ddic
outputlen TYPE slis_fieldcat_alv-outputlen
inttype TYPE slis_fieldcat_alv-inttype
col_pos TYPE sy-cucol
checkbox TYPE slis_fieldcat_alv-checkbox
edit TYPE slis_fieldcat_alv-edit.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = fieldname.
ls_fieldcat-key = key. "程序中打“X”就是主键
ls_fieldcat-reptext_ddic = reptext_ddic.
ls_fieldcat-outputlen = outputlen.
ls_fieldcat-inttype = inttype.
ls_fieldcat-col_pos = col_pos.
ls_fieldcat-checkbox = checkbox.
ls_fieldcat-edit = edit.
APPEND ls_fieldcat TO gt_fieldcat.
ENDFORM. " append_fc_alv
*---------------------------------------------------------------
* FORM layout_init
*---------------------------------------------------------------
FORM layout_init.
gs_layout-zebra = 'X'.
gs_layout-cell_merge = 'X'.
gs_layout-colwidth_optimize = 'X'.
gs_layout-no_vline = ' '.
gs_layout-totals_before_items = ' '.
ENDFORM. " layout_init
*---------------------------------------------------------------
* FORM grid_display 显示数据
*---------------------------------------------------------------
FORM grid_display.
DATA : l_funame TYPE rs38l_fnam. " LIKE HEADER_FB-NAME.
l_funame = 'REUSE_ALV_GRID_DISPLAY'.
CALL FUNCTION l_funame
EXPORTING
is_layout = gs_layout
it_fieldcat = gt_fieldcat
i_callback_program = sy-repid
i_callback_pf_status_set = 'PF_STATUS_SET'
* i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
i_callback_user_command = 'PROCESS_USER_COMMAND'
i_default = ' '
i_save = 'X'
TABLES
t_outtab = my_makt
EXCEPTIONS
program_error = 1
OTHERS = 2.
* CLEAR: my_makt.
* REFRESH: my_makt[].
ENDFORM. "grid_display
*工具栏
FORM pf_status_set USING pt_extab TYPE slis_t_extab.
SET PF-STATUS 'STATUS002'.
ENDFORM. "pf_status_set
*按钮事件
FORM process_user_command USING pr_ucomm LIKE sy-ucomm
ps_selfield TYPE slis_selfield.
* 屏幕自动刷新
DATA: lob_grid TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lob_grid.
CALL METHOD lob_grid->check_changed_data.
ps_selfield-refresh = 'X'.
CASE pr_ucomm.
WHEN '&IC1'.
CLEAR w_loop.
w_loop = ps_selfield-tabindex.
READ TABLE my_makt INDEX ps_selfield-tabindex INTO wa_makt.
PERFORM double_click.
WHEN 'SEL'.
LOOP AT my_makt.
my_makt-checkbox = 'X'.
MODIFY my_makt.
ENDLOOP.
WHEN 'UNSEL'.
LOOP AT my_makt.
my_makt-checkbox = ' '.
MODIFY my_makt.
ENDLOOP.
WHEN 'SAVE'.
PERFORM save_click.
WHEN 'PRINT'.
PERFORM display_form.
ENDCASE.
CLEAR: pr_ucomm.
* 屏幕自动刷新
ps_selfield-refresh = 'X'.
ENDFORM. "process_user_command
*调用打印的smartforms中的ZDTFORMTEST1
FORM display_form.
DATA: fm_name TYPE rs38l_fnam.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'ZDTFORMTEST1'
* VARIANT = ' '
* DIRECT_CALL = ' '
IMPORTING
fm_name = fm_name
* EXCEPTIONS
* NO_FORM = 1
* NO_FUNCTION_MODULE = 2
* OTHERS = 3
.
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
EXPORTING
title = '练习'
TABLES
my_makt = my_makt
EXCEPTIONS
formamtting_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. "display_form
*保存事件
FORM save_click.
* UPDATE makt FROM TABLE my_makt.
CLEAR it_makt.
REFRESH it_makt[].
LOOP AT my_makt WHERE checkbox = 'X'.
MOVE-CORRESPONDING my_makt TO it_makt.
APPEND it_makt.
ENDLOOP.
UPDATE makt FROM TABLE it_makt.
* read table my_makt into it_makt with key checkbox = 'X'."只复制表头
* CLEAR it_makt.
* REFRESH it_makt[].
* LOOP AT my_makt.
* IF my_makt-checkbox = 'X'.
* MOVE-CORRESPONDING my_makt TO it_makt.
* APPEND it_makt.
* ENDIF.
* ENDLOOP.
* UPDATE makt FROM TABLE it_makt.
* APPEND LINES OF my_makt to it_makt.
ENDFORM.
*调用窗体
FORM double_click.
CALL SCREEN 1001 STARTING AT 27 5
ENDING AT 60 12.
* CALL SCREEN 1001.
ENDFORM. "double_click
*窗体初始化
MODULE status_1001 OUTPUT.
SET PF-STATUS '001'.
* SET TITLEBAR 'xxx'.
ENDMODULE. " STATUS_1001 OUTPUT
*----------------------------------------------------------------------*
* MODULE USER_COMMAND_1001 INPUT
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
MODULE user_command_1001 INPUT.
* BREAK-POINT.
CASE ok_code.
WHEN 'BTNOK'.
wa_makt-checkbox = 'X'.
MODIFY my_makt FROM wa_makt INDEX w_loop.
LEAVE TO SCREEN 0.
WHEN 'NO' OR '&F12' OR '&F03' OR 'BACK' OR 'EXIT' OR 'CANCEL' OR 'BTNC'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE. " USER_COMMAND_1001 INPUT
评论