系统标准demo 可参考:demo_dynpro_tabcont_loop_at DEMO_DYNPRO_TABCONT_LOOP
Demo 程序最终效果展示
实现步骤
1 创建程序 一个测试程序
2 第二步 声明 变量 用于table control
DATA:gt_zstudent TYPE STANDARD TABLE OF zls_zstudent WITH HEADER LINE.
DATA:gs_zstudent TYPE zls_zstudent.
3 CALL SCREEN 100 .
创建100屏幕
4 第四步如图示
5 给 table control 命名
6 第六步选择如图示
输入第二步的声明
跟着向导下一步
选择需要显示的字段
继续下一步如图
图示box 用于选择控制所选择的行
一直跟着向导直至完成
然后激活程序,系统会自动生成一些代码。
7 第七步 我们对生成程序进行改造
添加状态栏,自定义图标如图示
然后注释掉PAI 里面的
*MODULE zstudent_user_command.
添加 MODULE user_command_0100.
对 自定义按钮事件的实现逻辑
MODULE user_command_0100 INPUT.
DATA:lv_code TYPE sy-ucomm.
lv_code = ok_code.
CLEAR ok_code.
CASE lv_code.
WHEN '&F03' OR '&F15' OR '&F12'.
LEAVE TO SCREEN 0.
WHEN 'TOGGLE'.
*对应列
LOOP AT zstudent-cols INTO gs_cols WHERE index GT 0.
IF gs_cols-screen-input = '0'.
gs_cols-screen-input = '1'.
ELSEIF gs_cols-screen-input = '1'.
gs_cols-screen-input = '0'.
ENDIF.
MODIFY zstudent-cols FROM gs_cols INDEX sy-tabix.
ENDLOOP.
WHEN 'SORT_UP'.
READ TABLE zstudent-cols INTO gs_cols WITH KEY selected = 'X'.
*长度13是屏幕字段长度 (zls_zstudent-)
IF sy-subrc = 0.
SORT gt_zstudent STABLE BY (gs_cols-screen-name+13) ASCENDING.
gs_cols-selected = ' '.
MODIFY zstudent-cols FROM gs_cols INDEX sy-tabix.
ENDIF.
WHEN 'SORT_DOWN'.
READ TABLE zstudent-cols INTO gs_cols WITH KEY selected = 'X'.
IF sy-subrc = 0.
SORT gt_zstudent STABLE BY (gs_cols-screen-name+13) DESCENDING.
gs_cols-selected = ' '.
MODIFY zstudent-cols FROM gs_cols INDEX sy-tabix.
ENDIF.
WHEN 'DELETE'.
LOOP AT gt_zstudent INTO gs_zstudent WHERE box = 'X'.
DELETE gt_zstudent.
ENDLOOP.
WHEN 'INSERT'.
APPEND INITIAL LINE TO gt_zstudent.
ENDCASE.
ENDMODULE.
然后在程序中添加获取数据以及屏幕是否可输入控制
如下图
最后一步
在屏幕的table control 设置一下属性如图示
不然table control 没办法排序降序 以及 被选中行
删除系统自动生成的多余代码
完整代码程序如下:
*&---------------------------------------------------------------------*
*& Report ZTEST_11
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest_11.
DATA:gt_zstudent TYPE STANDARD TABLE OF zls_zstudent WITH HEADER LINE.
DATA:gs_zstudent TYPE zls_zstudent.
*&SPWIZARD: DECLARATION OF TABLECONTROL 'ZSTUDENT' ITSELF
CONTROLS: zstudent TYPE TABLEVIEW USING SCREEN 0100.
DATA gs_cols LIKE LINE OF zstudent-cols.
*&SPWIZARD: LINES OF TABLECONTROL 'ZSTUDENT'
DATA: g_zstudent_lines LIKE sy-loopc.
DATA: ok_code LIKE sy-ucomm.
START-OF-SELECTION.
*获取数据
PERFORM get_data.
PERFORM set_col_input.
CALL SCREEN 100.
*&SPWIZARD: OUTPUT MODULE FOR TC 'ZSTUDENT'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE zstudent_change_tc_attr OUTPUT.
DESCRIBE TABLE gt_zstudent LINES zstudent-lines.
ENDMODULE.
*&SPWIZARD: OUTPUT MODULE FOR TC 'ZSTUDENT'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GET LINES OF TABLECONTROL
MODULE zstudent_get_lines OUTPUT.
g_zstudent_lines = sy-loopc.
ENDMODULE.
*&SPWIZARD: INPUT MODUL FOR TC 'ZSTUDENT'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: MARK TABLE
MODULE zstudent_mark INPUT.
MODIFY gt_zstudent FROM gs_zstudent INDEX zstudent-current_line.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'ZTEST'.
* SET TITLEBAR 'xxx'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
DATA:lv_code TYPE sy-ucomm.
lv_code = ok_code.
CLEAR ok_code.
CASE lv_code.
WHEN '&F03' OR '&F15' OR '&F12'.
LEAVE TO SCREEN 0.
WHEN 'TOGGLE'.
*对应列
LOOP AT zstudent-cols INTO gs_cols WHERE index GT 0.
IF gs_cols-screen-input = '0'.
gs_cols-screen-input = '1'.
ELSEIF gs_cols-screen-input = '1'.
gs_cols-screen-input = '0'.
ENDIF.
MODIFY zstudent-cols FROM gs_cols INDEX sy-tabix.
ENDLOOP.
WHEN 'SORT_UP'.
READ TABLE zstudent-cols INTO gs_cols WITH KEY selected = 'X'.
*长度13是屏幕字段长度 (gs_zstudent-)
IF sy-subrc = 0.
SORT gt_zstudent STABLE BY (gs_cols-screen-name+12) ASCENDING.
gs_cols-selected = ' '.
MODIFY zstudent-cols FROM gs_cols INDEX sy-tabix.
ENDIF.
WHEN 'SORT_DOWN'.
READ TABLE zstudent-cols INTO gs_cols WITH KEY selected = 'X'.
IF sy-subrc = 0.
SORT gt_zstudent STABLE BY (gs_cols-screen-name+12) DESCENDING.
gs_cols-selected = ' '.
MODIFY zstudent-cols FROM gs_cols INDEX sy-tabix.
ENDIF.
WHEN 'DELETE'.
LOOP AT gt_zstudent INTO gs_zstudent WHERE box = 'X'.
DELETE gt_zstudent.
ENDLOOP.
WHEN 'INSERT'.
APPEND INITIAL LINE TO gt_zstudent.
ENDCASE.
ENDMODULE.
FORM get_data .
SELECT * FROM zstudent INTO CORRESPONDING FIELDS OF TABLE gt_zstudent.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form set_col_input
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM set_col_input .
LOOP AT zstudent-cols INTO gs_cols WHERE index GT 0.
*Set not input 0
*Set input 1
gs_cols-screen-input = '0'.
MODIFY zstudent-cols FROM gs_cols INDEX sy-tabix.
ENDLOOP.
ENDFORM.
100 屏幕 PBO / PAI