分享

ABAP表控制Table Control设计

 一骑当千_30 2018-05-02
表控制(Table Control)是SAP应用中最重要的对象之一,业务单据的输入、基础数据的表格输入等都是使用Table Control控件,本章主要介绍:
(1)在屏幕设计中通过向导来制作表控件对象,由系统生成程序;
(2)非向导设计Table Control控件;
(3)通过系统生成数据表维护程序,并在程序中调用;
(4)表格设计技巧;
(5)通过表格维护变更内表数据,并将内表数据提交数据库。

1、使用向导制作Table Control

本节先建立一个内表,通过向导建立一个表格控件使用该内表。

1.1、建立程序

先建立程序,定义内表,屏幕有退出按钮,主程序代码如下

  1. REPORT  YTEST20160615002.  
  2.   
  3. DATA: OK_CODE TYPE SY-UCOMM,  
  4.       SAVE_OK LIKE OK_CODE.  
  5.   
  6. *定义内表,注意两种写法一样  
  7. *DATA SH1 LIKE YTJAYSCHOOL OCCURS 0 WITH HEADER LINE.  
  8. DATA SH1 LIKE TABLE OF YTJAYSCHOOL WITH HEADER LINE.  
  9. *增加内表数据  
  10. SELECT * INTO CORRESPONDING FIELDS OF TABLE SH1 FROM YTJAYSCHOOL.  
  11.   
  12. *测试输出数据  
  13. LOOP AT SH1.  
  14.   WRITE:/ SH1-YCT_ID, SH1-YSH_ID, SH1-YSH_NAME, SH1-YSH_ADDR.  
  15. ENDLOOP.  
  16.   
  17. *直接调用窗口  
  18. CALL SCREEN 100.  
  19.   
  20. *用户交互  
  21. MODULE USER_COMMAND_0100 INPUT.  
  22.   SAVE_OK = OK_CODE.  
  23.   CLEAR OK_CODE.  
  24. *退出按钮时退出程序  
  25.   CASE SAVE_OK.  
  26.     WHEN 'CANCEL'.  
  27.       LEAVE PROGRAM.  
  28.     ENDCASE.  
  29. ENDMODULE.  
  30.   
  31. MODULE STATUS_0100 OUTPUT.  
  32.   SET PF-STATUS 'STATUS1'.  
  33. ENDMODULE.  
REPORT YTEST20160615002. DATA: OK_CODE TYPE SY-UCOMM, SAVE_OK LIKE OK_CODE. *定义内表,注意两种写法一样 *DATA SH1 LIKE YTJAYSCHOOL OCCURS 0 WITH HEADER LINE. DATA SH1 LIKE TABLE OF YTJAYSCHOOL WITH HEADER LINE. *增加内表数据 SELECT * INTO CORRESPONDING FIELDS OF TABLE SH1 FROM YTJAYSCHOOL. *测试输出数据 LOOP AT SH1. WRITE:/ SH1-YCT_ID, SH1-YSH_ID, SH1-YSH_NAME, SH1-YSH_ADDR. ENDLOOP. *直接调用窗口 CALL SCREEN 100. *用户交互 MODULE USER_COMMAND_0100 INPUT. SAVE_OK = OK_CODE. CLEAR OK_CODE. *退出按钮时退出程序 CASE SAVE_OK. WHEN 'CANCEL'. LEAVE PROGRAM. ENDCASE. ENDMODULE. MODULE STATUS_0100 OUTPUT. SET PF-STATUS 'STATUS1'. ENDMODULE.
逻辑流程序

  1. PROCESS BEFORE OUTPUT.  
  2.  MODULE STATUS_0100.  
  3.   
  4. PROCESS AFTER INPUT.  
  5.  MODULE USER_COMMAND_0100.  
PROCESS BEFORE OUTPUT. MODULE STATUS_0100. PROCESS AFTER INPUT. MODULE USER_COMMAND_0100.

1.2、使用向导建立Table Control控件

启动屏幕编辑器,选“表控件”按钮,在屏幕上建立该对象后,系统自动导航界面,如图


输入Table Control的名称,继续


选择从内表建立,输入内表名称SH1(在主程序中已建立该内表)


如果程序没有激活,会提示需要激活,此时再打开一个SESSION激活程序,此前我们已经激活该程序。

选择表字段,继续


选择表格控件能输入(Input control)、有表头(With column headers)、单选纪录(Single)


设定属性无滚动条,继续


维护生成程序的名称,使用默认的名称


单击“完成”按钮,完成设计


完成后,设计界面如图


选择主程序并执行,系统输出如图


向导生成的Table Control对象已经能够正常地浏览数据。
分析生成的代码
主程序代码如下:

  1. REPORT  YTEST20160615002.  
  2.   
  3. DATA: OK_CODE TYPE SY-UCOMM,  
  4.       SAVE_OK LIKE OK_CODE.  
  5.   
  6. *定义内表,注意两种写法一样  
  7. *DATA SH1 LIKE YTJAYSCHOOL OCCURS 0 WITH HEADER LINE.  
  8. DATA SH1 LIKE TABLE OF YTJAYSCHOOL WITH HEADER LINE.  
  9. *增加内表数据  
  10. SELECT * INTO CORRESPONDING FIELDS OF TABLE SH1 FROM YTJAYSCHOOL.  
  11.   
  12. *测试输出数据  
  13. LOOP AT SH1.  
  14.   WRITE:/ SH1-YCT_ID, SH1-YSH_ID, SH1-YSH_NAME, SH1-YSH_ADDR.  
  15. ENDLOOP.  
  16.   
  17. *直接调用窗口  
  18. CALL SCREEN 100.  
  19.   
  20. *用户交互  
  21. MODULE USER_COMMAND_0100 INPUT.  
  22.   SAVE_OK = OK_CODE.  
  23.   CLEAR OK_CODE.  
  24. *退出按钮时退出程序  
  25.   CASE SAVE_OK.  
  26.     WHEN 'CANCEL'.  
  27.       LEAVE PROGRAM.  
  28.     ENDCASE.  
  29. ENDMODULE.  
  30.   
  31. MODULE STATUS_0100 OUTPUT.  
  32.   SET PF-STATUS 'STATUS1'.  
  33. ENDMODULE.  
  34.   
  35. *&SPWIZARD: DECLARATION OF TABLECONTROL 'TBL' ITSELF  
  36. CONTROLS: TBL TYPE TABLEVIEW USING SCREEN 0100.  
  37.   
  38. *&SPWIZARD: OUTPUT MODULE FOR TC 'TBL'. DO NOT CHANGE THIS LINE!  
  39. *&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR  
  40. MODULE TBL_CHANGE_TC_ATTR OUTPUT.  
  41.   DESCRIBE TABLE SH1 LINES TBL-lines.  
  42. ENDMODULE.  
  43.   
  44. *&SPWIZARD: INPUT MODULE FOR TC 'TBL'. DO NOT CHANGE THIS LINE!  
  45. *&SPWIZARD: MODIFY TABLE  
  46. MODULE TBL_MODIFY INPUT.  
  47.   MODIFY SH1  
  48.     INDEX TBL-CURRENT_LINE.  
  49. ENDMODULE.  
REPORT YTEST20160615002. DATA: OK_CODE TYPE SY-UCOMM, SAVE_OK LIKE OK_CODE. *定义内表,注意两种写法一样 *DATA SH1 LIKE YTJAYSCHOOL OCCURS 0 WITH HEADER LINE. DATA SH1 LIKE TABLE OF YTJAYSCHOOL WITH HEADER LINE. *增加内表数据 SELECT * INTO CORRESPONDING FIELDS OF TABLE SH1 FROM YTJAYSCHOOL. *测试输出数据 LOOP AT SH1. WRITE:/ SH1-YCT_ID, SH1-YSH_ID, SH1-YSH_NAME, SH1-YSH_ADDR. ENDLOOP. *直接调用窗口 CALL SCREEN 100. *用户交互 MODULE USER_COMMAND_0100 INPUT. SAVE_OK = OK_CODE. CLEAR OK_CODE. *退出按钮时退出程序 CASE SAVE_OK. WHEN 'CANCEL'. LEAVE PROGRAM. ENDCASE. ENDMODULE. MODULE STATUS_0100 OUTPUT. SET PF-STATUS 'STATUS1'. ENDMODULE. *&SPWIZARD: DECLARATION OF TABLECONTROL 'TBL' ITSELF CONTROLS: TBL TYPE TABLEVIEW USING SCREEN 0100. *&SPWIZARD: OUTPUT MODULE FOR TC 'TBL'. DO NOT CHANGE THIS LINE! *&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR MODULE TBL_CHANGE_TC_ATTR OUTPUT. DESCRIBE TABLE SH1 LINES TBL-lines. ENDMODULE. *&SPWIZARD: INPUT MODULE FOR TC 'TBL'. DO NOT CHANGE THIS LINE! *&SPWIZARD: MODIFY TABLE MODULE TBL_MODIFY INPUT. MODIFY SH1 INDEX TBL-CURRENT_LINE. ENDMODULE.
逻辑流代码如下:

  1. PROCESS BEFORE OUTPUT.  
  2. *&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'TBL'  
  3.   MODULE TBL_CHANGE_TC_ATTR.  
  4. *&SPWIZARD: MODULE TBL_CHANGE_COL_ATTR.  
  5.   LOOP AT   SH1  
  6.        WITH CONTROL TBL  
  7.        CURSOR TBL-CURRENT_LINE.  
  8. *&SPWIZARD:   MODULE TBL_CHANGE_FIELD_ATTR  
  9.   ENDLOOP.  
  10.   
  11.  MODULE STATUS_0100.  
  12. *  
  13. PROCESS AFTER INPUT.  
  14. *&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'TBL'  
  15.   LOOP AT SH1.  
  16.     CHAIN.  
  17.       FIELD SH1-YCT_ID.  
  18.       FIELD SH1-YSH_ID.  
  19.       FIELD SH1-YSH_NAME.  
  20.       FIELD SH1-YSH_ADDR.  
  21.       MODULE TBL_MODIFY ON CHAIN-REQUEST.  
  22.     endchain.  
  23.   ENDLOOP.  
  24. *&SPWIZARD: MODULE TBL_CHANGE_TC_ATTR.  
  25. *&SPWIZARD: MODULE TBL_CHANGE_COL_ATTR.  
  26.   
  27.  MODULE USER_COMMAND_0100.  
PROCESS BEFORE OUTPUT. *&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'TBL' MODULE TBL_CHANGE_TC_ATTR. *&SPWIZARD: MODULE TBL_CHANGE_COL_ATTR. LOOP AT SH1 WITH CONTROL TBL CURSOR TBL-CURRENT_LINE. *&SPWIZARD: MODULE TBL_CHANGE_FIELD_ATTR ENDLOOP. MODULE STATUS_0100. * PROCESS AFTER INPUT. *&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'TBL' LOOP AT SH1. CHAIN. FIELD SH1-YCT_ID. FIELD SH1-YSH_ID. FIELD SH1-YSH_NAME. FIELD SH1-YSH_ADDR. MODULE TBL_MODIFY ON CHAIN-REQUEST. endchain. ENDLOOP. *&SPWIZARD: MODULE TBL_CHANGE_TC_ATTR. *&SPWIZARD: MODULE TBL_CHANGE_COL_ATTR. MODULE USER_COMMAND_0100.

2、手工制作Table Control

先建立一个有退出按钮的程序,进入屏幕编辑器,选中控制对象,并在屏幕上创建


建立的对象显示粉红色,表示属性未设置正确。输入名称属性后,表头会转为灰色。表格的创建与常规编程软件不同,需要选中一个输入输出字段,然后在表身创建

输入名称后整个表格都转为灰色(表示已设置正确)。调整输入字段的其他属性,如图


手工调整字段名称和内表对应的名称一致后,第一个字段建立完成,然后为该字段加上表头,制作方式和输入字段一样,选中一个文本字段,创建在该字段上方的表头


接着创建等信息,并添加垂直水平分格符,完成后如图


逻辑流程序如下

  1. PROCESS BEFORE OUTPUT.  
  2.  MODULE STATUS_0100.  
  3. *处理LOOP从内表读到表控制  
  4.  LOOP WITH CONTROL TBL1.  
  5.    MODULE FILLTBL1.  
  6.  ENDLOOP.  
  7.   
  8. PROCESS AFTER INPUT.  
  9. *处理LOOP从表控制更新内表  
  10.  LOOP WITH CONTROL TBL1.  
  11.    MODULE READTBL1.  
  12.  ENDLOOP.  
  13.  MODULE USER_COMMAND_0100.  
PROCESS BEFORE OUTPUT. MODULE STATUS_0100. *处理LOOP从内表读到表控制 LOOP WITH CONTROL TBL1. MODULE FILLTBL1. ENDLOOP. PROCESS AFTER INPUT. *处理LOOP从表控制更新内表 LOOP WITH CONTROL TBL1. MODULE READTBL1. ENDLOOP. MODULE USER_COMMAND_0100.
主程序代码如下

  1. REPORT  YTEST20160615003.  
  2. DATA: OK_CODE TYPE SY-UCOMM,  
  3.       SAVE_OK TYPE SY-UCOMM.  
  4.   
  5. *定义内表,注意两种写法一样  
  6. *DATA SH1 LIKE YTJAYSCHOOL OCCURS 0 WITH HEADER LINE.  
  7. DATA SH2 LIKE TABLE OF YTJAYSCHOOL WITH HEADER LINE.  
  8. *定义单结构纪录  
  9. DATA SH TYPE YTJAYSCHOOL.  
  10. *增加内表数据  
  11. SELECT * INTO CORRESPONDING FIELDS OF TABLE SH2 FROM YTJAYSCHOOL.  
  12. *直接调用窗口  
  13. CALL SCREEN 100.  
  14. *定义表控制对象  
  15. CONTROLS TBL1 TYPE TABLEVIEW USING SCREEN 100.  
  16. *输出数据,看内表有无改变  
  17. LOOP AT SH2.  
  18.   WRITE:/ SH2-YCT_ID, SH2-YSH_ID, SH2-YSH_NAME, SH2-YSH_ADDR.  
  19. ENDLOOP.  
  20.   
  21. MODULE STATUS_0100 OUTPUT.  
  22.   SET PF-STATUS 'STATUS1'.  
  23. ENDMODULE.  
  24.   
  25. MODULE USER_COMMAND_0100 INPUT.  
  26.   SAVE_OK = OK_CODE.  
  27.   CLEAR OK_CODE.  
  28.   CASE SAVE_OK.  
  29.     WHEN 'CANCEL'.  
  30.       LEAVE TO SCREEN 0.  
  31.   ENDCASE.  
  32. ENDMODULE.  
  33.   
  34. *逐行从内表填写表控制  
  35. MODULE FILLTBL1 OUTPUT.  
  36.   READ TABLE SH2 INTO SH INDEX TBL1-CURRENT_LINE.  
  37. ENDMODULE.  
  38.   
  39. *逐行从内表控制更新内表  
  40. MODULE READTBL1 INPUT.  
  41.   MODIFY SH2 FROM SH INDEX TBL1-CURRENT_LINE.  
  42. ENDMODULE.  
REPORT YTEST20160615003. DATA: OK_CODE TYPE SY-UCOMM, SAVE_OK TYPE SY-UCOMM. *定义内表,注意两种写法一样 *DATA SH1 LIKE YTJAYSCHOOL OCCURS 0 WITH HEADER LINE. DATA SH2 LIKE TABLE OF YTJAYSCHOOL WITH HEADER LINE. *定义单结构纪录 DATA SH TYPE YTJAYSCHOOL. *增加内表数据 SELECT * INTO CORRESPONDING FIELDS OF TABLE SH2 FROM YTJAYSCHOOL. *直接调用窗口 CALL SCREEN 100. *定义表控制对象 CONTROLS TBL1 TYPE TABLEVIEW USING SCREEN 100. *输出数据,看内表有无改变 LOOP AT SH2. WRITE:/ SH2-YCT_ID, SH2-YSH_ID, SH2-YSH_NAME, SH2-YSH_ADDR. ENDLOOP. MODULE STATUS_0100 OUTPUT. SET PF-STATUS 'STATUS1'. ENDMODULE. MODULE USER_COMMAND_0100 INPUT. SAVE_OK = OK_CODE. CLEAR OK_CODE. CASE SAVE_OK. WHEN 'CANCEL'. LEAVE TO SCREEN 0. ENDCASE. ENDMODULE. *逐行从内表填写表控制 MODULE FILLTBL1 OUTPUT. READ TABLE SH2 INTO SH INDEX TBL1-CURRENT_LINE. ENDMODULE. *逐行从内表控制更新内表 MODULE READTBL1 INPUT. MODIFY SH2 FROM SH INDEX TBL1-CURRENT_LINE. ENDMODULE.
输出结果如图

调整前两行数据,如图

退出编辑屏幕,程序输出内表数据,屏幕显示数据已更改


上述表格控件是没有垂直滚动条的,原因是没有定义表格的记录数,因而在PBO中还需要添加以下代码,添加完代码后如下:

  1. REPORT  YTEST20160615003.  
  2. DATA: OK_CODE TYPE SY-UCOMM,  
  3.       SAVE_OK TYPE SY-UCOMM.  
  4.   
  5. DATA: NUMS TYPE I.  
  6.   
  7. *定义内表,注意两种写法一样  
  8. *DATA SH1 LIKE YTJAYSCHOOL OCCURS 0 WITH HEADER LINE.  
  9. DATA SH2 LIKE TABLE OF YTJAYSCHOOL WITH HEADER LINE.  
  10. *定义单结构纪录  
  11. DATA SH TYPE YTJAYSCHOOL.  
  12. *增加内表数据  
  13. SELECT * INTO CORRESPONDING FIELDS OF TABLE SH2 FROM YTJAYSCHOOL.  
  14. *直接调用窗口  
  15. CALL SCREEN 100.  
  16. *定义表控制对象  
  17. CONTROLS TBL1 TYPE TABLEVIEW USING SCREEN 100.  
  18. *输出数据,看内表有无改变  
  19. LOOP AT SH2.  
  20.   WRITE:/ SH2-YCT_ID, SH2-YSH_ID, SH2-YSH_NAME, SH2-YSH_ADDR.  
  21. ENDLOOP.  
  22.   
  23. MODULE STATUS_0100 OUTPUT.  
  24.   SET PF-STATUS 'STATUS1'.  
  25.   IF NUMS = 0.  
  26.     DESCRIBE TABLE SH2 LINES NUMS.  
  27.     TBL1-LINES = NUMS.  
  28.   ENDIF.  
  29. ENDMODULE.  
  30.   
  31. MODULE USER_COMMAND_0100 INPUT.  
  32.   SAVE_OK = OK_CODE.  
  33.   CLEAR OK_CODE.  
  34.   CASE SAVE_OK.  
  35.     WHEN 'CANCEL'.  
  36.       LEAVE TO SCREEN 0.  
  37.   ENDCASE.  
  38. ENDMODULE.  
  39.   
  40. *逐行从内表填写表控制  
  41. MODULE FILLTBL1 OUTPUT.  
  42.   READ TABLE SH2 INTO SH INDEX TBL1-CURRENT_LINE.  
  43. ENDMODULE.  
  44.   
  45. *逐行从内表控制更新内表  
  46. MODULE READTBL1 INPUT.  
  47.   MODIFY SH2 FROM SH INDEX TBL1-CURRENT_LINE.  
  48. ENDMODULE.  
REPORT YTEST20160615003. DATA: OK_CODE TYPE SY-UCOMM, SAVE_OK TYPE SY-UCOMM. DATA: NUMS TYPE I. *定义内表,注意两种写法一样 *DATA SH1 LIKE YTJAYSCHOOL OCCURS 0 WITH HEADER LINE. DATA SH2 LIKE TABLE OF YTJAYSCHOOL WITH HEADER LINE. *定义单结构纪录 DATA SH TYPE YTJAYSCHOOL. *增加内表数据 SELECT * INTO CORRESPONDING FIELDS OF TABLE SH2 FROM YTJAYSCHOOL. *直接调用窗口 CALL SCREEN 100. *定义表控制对象 CONTROLS TBL1 TYPE TABLEVIEW USING SCREEN 100. *输出数据,看内表有无改变 LOOP AT SH2. WRITE:/ SH2-YCT_ID, SH2-YSH_ID, SH2-YSH_NAME, SH2-YSH_ADDR. ENDLOOP. MODULE STATUS_0100 OUTPUT. SET PF-STATUS 'STATUS1'. IF NUMS = 0. DESCRIBE TABLE SH2 LINES NUMS. TBL1-LINES = NUMS. ENDIF. ENDMODULE. MODULE USER_COMMAND_0100 INPUT. SAVE_OK = OK_CODE. CLEAR OK_CODE. CASE SAVE_OK. WHEN 'CANCEL'. LEAVE TO SCREEN 0. ENDCASE. ENDMODULE. *逐行从内表填写表控制 MODULE FILLTBL1 OUTPUT. READ TABLE SH2 INTO SH INDEX TBL1-CURRENT_LINE. ENDMODULE. *逐行从内表控制更新内表 MODULE READTBL1 INPUT. MODIFY SH2 FROM SH INDEX TBL1-CURRENT_LINE. ENDMODULE.
执行后结果如图


3、通过系统生成数据表维护程序

通过系统生成数据表维护程序TCODE:SE55,通过系统数据维护功能使用生成程序(TCODE:SM30),过程如下:
建立一个数据表(SE11),生成维护程序(SE55),数据维护(SM30),设计代码调用生成程序。

3.1、新建数据表

新建一个数据表YTJAYMANA,详细步骤请参阅“ABAP数据字典和数据表的读取”,表结构如图


3.2、生成维护程序

输入TCODE:SE55,输入函数组名称和屏幕号,选择权限组


单击新建按钮,选择“本地对象”,生成维护程序。

3.3、数据维护

输入TCODE:SM30,输入表名后单击维护按钮


系统进入数据维护界面


单击右下角的状态条,屏幕显示程序名为“SAPLYTJAYMANA”


生成程序的表头等信息都可以调整,输入TCODE:SE51进入屏幕编辑器,输入程序名“SAPLYTJAYMANA”,找到编号为100的屏幕,进入设计界面后,可以调整屏幕对象


保存激活后,使用界面也相应改变


3.4、从程序调用生成的维护窗口

通过函数调用生成程序,程序如下:

  1. REPORT  YTEST20160616001.  
  2. CALL FUNCTION 'VIEW_MAINTENANCE_CALL'  
  3.   EXPORTING  
  4.     ACTION = 'U'  
  5.     VIEW_NAME = 'YTJAYMANA'  
  6.   EXCEPTIONS  
  7.     FOREIGN_LOCK = 2  
  8.     NO_TVDIR_ENTRY = 8.  
  9.   
  10. IF SY-SUBRC <> 0.  
  11. *  MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO  
  12. *    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.  
  13. ENDIF.  
REPORT YTEST20160616001. CALL FUNCTION 'VIEW_MAINTENANCE_CALL' EXPORTING ACTION = 'U' VIEW_NAME = 'YTJAYMANA' EXCEPTIONS FOREIGN_LOCK = 2 NO_TVDIR_ENTRY = 8. IF SY-SUBRC <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF.
运行后,界面如图


4、表格相关技巧

4.1、取得行号

  1. *取得当前屏幕和行号  
  2. GET CURSOR LINE LINEA.  
  3. CHECK SY-SUBRC = 0.  
  4. *当前行号 = 当前屏首行序号   当前屏行号  
  5. LINEA = TBLA - LOP_LINE - 1.  
  6. *用取得当前行号读取内表  
  7. READ TABLE YTJAYMANA INDEX LINEA.  
  8. MESSAGE S005(YMESS) WITH LINEA.  
*取得当前屏幕和行号 GET CURSOR LINE LINEA. CHECK SY-SUBRC = 0. *当前行号 = 当前屏首行序号 当前屏行号 LINEA = TBLA - LOP_LINE - 1. *用取得当前行号读取内表 READ TABLE YTJAYMANA INDEX LINEA. MESSAGE S005(YMESS) WITH LINEA.

4.2、定义表格的读写属性

  1. WHEN 'READWR'.  
  2. *当单击按钮时,第一列只读,其他列读写切换  
  3.     LOOP AT TBL1-COLS INTO ACOL WHERE INDEX GT 0.  
  4.         IF SY-TABIX = 1.  
  5.             ACOL-SCREEN-INPUT = '0'.  
  6.         ELSE.  
  7.             IF ACOL-SCREEN-INPUT = '0'.  
  8.                 ACOL-SCREEN-INPUT = '1'.  
  9.             ELSEIF ACOL-SCREEN-INPUT = '1'.  
  10.                 ACOL-SCREEN-INPUT = '0'.  
  11.             ENDIF.  
  12.         ENDIF.  
  13.     ENDLOOP.  
  14.     MODIFY TBL1-COLS FROM ACOL INDEX SY-TABIX.  
WHEN 'READWR'. *当单击按钮时,第一列只读,其他列读写切换 LOOP AT TBL1-COLS INTO ACOL WHERE INDEX GT 0. IF SY-TABIX = 1. ACOL-SCREEN-INPUT = '0'. ELSE. IF ACOL-SCREEN-INPUT = '0'. ACOL-SCREEN-INPUT = '1'. ELSEIF ACOL-SCREEN-INPUT = '1'. ACOL-SCREEN-INPUT = '0'. ENDIF. ENDIF. ENDLOOP. MODIFY TBL1-COLS FROM ACOL INDEX SY-TABIX.

5、通过表格维护变更内表数据后提交数据库

结合内表,对表格控件数据增加、修改、删除后提交到数据库,最终界面如图

步骤:
(1)用向导建立表格
(2)建立按钮“取当前行”,在事件中取表格控件当前行,并在状态条上显示当前行数据
(3)建立按钮“删除行“,在事件中删除表格上当前选择的行
(4)增加系统按钮”保存“,将内表数据提交数据库
逻辑流程序:
  1. PROCESS BEFORE OUTPUT.  
  2. *&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'TBL'  
  3.   MODULE TBL_CHANGE_TC_ATTR.  
  4. *&SPWIZARD: MODULE TBL_CHANGE_COL_ATTR.  
  5.   LOOP AT   SH1  
  6.        WITH CONTROL TBL  
  7.        CURSOR TBL-CURRENT_LINE.  
  8. *&SPWIZARD:   MODULE TBL_CHANGE_FIELD_ATTR  
  9.   ENDLOOP.  
  10.   
  11.  MODULE STATUS_0100.  
  12. *  
  13. PROCESS AFTER INPUT.  
  14. *&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'TBL'  
  15.   LOOP AT SH1.  
  16.     CHAIN.  
  17.       FIELD SH1-YCT_ID.  
  18.       FIELD SH1-YSH_ID.  
  19.       FIELD SH1-YSH_NAME.  
  20.       FIELD SH1-YSH_ADDR.  
  21.       MODULE TBL_MODIFY ON CHAIN-REQUEST.  
  22.     endchain.  
  23.   ENDLOOP.  
  24. *&SPWIZARD: MODULE TBL_CHANGE_TC_ATTR.  
  25. *&SPWIZARD: MODULE TBL_CHANGE_COL_ATTR.  
  26.   
  27.  MODULE USER_COMMAND_0100.  
PROCESS BEFORE OUTPUT. *&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'TBL' MODULE TBL_CHANGE_TC_ATTR. *&SPWIZARD: MODULE TBL_CHANGE_COL_ATTR. LOOP AT SH1 WITH CONTROL TBL CURSOR TBL-CURRENT_LINE. *&SPWIZARD: MODULE TBL_CHANGE_FIELD_ATTR ENDLOOP. MODULE STATUS_0100. * PROCESS AFTER INPUT. *&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'TBL' LOOP AT SH1. CHAIN. FIELD SH1-YCT_ID. FIELD SH1-YSH_ID. FIELD SH1-YSH_NAME. FIELD SH1-YSH_ADDR. MODULE TBL_MODIFY ON CHAIN-REQUEST. endchain. ENDLOOP. *&SPWIZARD: MODULE TBL_CHANGE_TC_ATTR. *&SPWIZARD: MODULE TBL_CHANGE_COL_ATTR. MODULE USER_COMMAND_0100.
主程序:
  1. REPORT  ytest20160615002.  
  2.   
  3. DATA: ok_code TYPE sy-ucomm,  
  4.       save_ok LIKE ok_code.  
  5.   
  6. *定义内表,注意两种写法一样  
  7. *DATA SH1 LIKE YTJAYSCHOOL OCCURS 0 WITH HEADER LINE.  
  8. DATA: sh1 LIKE TABLE OF ytjayschool WITH HEADER LINE,  
  9.       DELA_SCHOOL LIKE TABLE OF YTJAYSCHOOL WITH HEADER LINE.  
  10.   
  11. DATA LINEA TYPE I.  
  12.   
  13. *&SPWIZARD: DECLARATION OF TABLECONTROL 'TBL' ITSELF  
  14. CONTROLS: TBL TYPE TABLEVIEW USING SCREEN 0100.  
  15. DATA WA1 LIKE YTJAYSCHOOL.  
  16.   
  17. *增加内表数据  
  18. SELECT * FROM YTJAYSCHOOL INTO CORRESPONDING FIELDS OF TABLE SH1.  
  19.   
  20. *测试输出数据  
  21. *LOOP AT sh1.  
  22. *  WRITE:/ sh1-yct_id, sh1-ysh_id, sh1-ysh_name, sh1-ysh_addr.  
  23. *ENDLOOP.  
  24.   
  25. *直接调用窗口  
  26. CALL SCREEN 100.  
  27.   
  28. *&SPWIZARD: OUTPUT MODULE FOR TC 'TBL'. DO NOT CHANGE THIS LINE!  
  29. *&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR  
  30. MODULE tbl_change_tc_attr OUTPUT.  
  31.   DESCRIBE TABLE sh1 LINES tbl-lines.  
  32. ENDMODULE.                    'TBL_CHANGE_TC_ATTR OUTPUT  
  33.   
  34. *&SPWIZARD: INPUT MODULE FOR TC 'TBL'. DO NOT CHANGE THIS LINE!  
  35. *&SPWIZARD: MODIFY TABLE  
  36. MODULE tbl_modify INPUT.  
  37.   MODIFY sh1  
  38.   INDEX tbl-current_line.  
  39. ENDMODULE.                    'TBL_MODIFY INPUT  
  40.   
  41. *----------------------------------------------------------------------*  
  42. *  MODULE STATUS_0100 OUTPUT  
  43. *----------------------------------------------------------------------*  
  44. *  
  45. *----------------------------------------------------------------------*  
  46. MODULE status_0100 OUTPUT.  
  47.   SET PF-STATUS 'STATUS1'.  
  48. ENDMODULE.                    'STATUS_0100 OUTPUT  
  49.   
  50.   
  51.   
  52. *用户交互  
  53. MODULE user_command_0100 INPUT.  
  54.   save_ok = ok_code.  
  55.   CLEAR ok_code.  
  56. *退出按钮时退出程序  
  57.   CASE save_ok.  
  58.     WHEN 'CANCEL'.  
  59.       LEAVE PROGRAM.  
  60.     WHEN 'SAVE'.  
  61.       MODIFY YTJAYSCHOOL FROM TABLE SH1.  
  62.       IF SY-SUBRC NE 0.  
  63.         MESSAGE I005(YMESS) WITH '更新数据错误!'.  
  64.         EXIT.  
  65.       ELSE.  
  66.         MESSAGE I005(YMESS) WITH '更新数据OK!'.  
  67.       ENDIF.  
  68.       DELETE YTJAYSCHOOL FROM TABLE DELA_SCHOOL.  
  69.       IF SY-SUBRC NE 0.  
  70.         MESSAGE I005(YMESS) WITH '更新数据错误!'.  
  71.         EXIT.  
  72.       ELSE.  
  73.         MESSAGE I005(YMESS) WITH '更新数据OK!'.  
  74.       ENDIF.  
  75.     WHEN 'DELA'.  
  76.       GET CURSOR LINE LINEA.  
  77.       CHECK SY-SUBRC = 0.  
  78.       LINEA = TBL-TOP_LINE   LINEA - 1.  
  79.       READ TABLE SH1 INDEX LINEA.  
  80.       APPEND SH1 TO DELA_SCHOOL.  
  81.       DELETE SH1 INDEX : LINEA.  
  82.     WHEN 'GETDATA'.  
  83.       GET CURSOR LINE LINEA.  
  84.       CHECK SY-SUBRC = 0.  
  85.       LINEA = TBL-TOP_LINE - 1.  
  86.       READ TABLE SH1 INDEX LINEA.  
  87.       MESSAGE S006(YMESS) WITH SH1-YSH_NAME SH1-YSH_ADDR.  
  88.   ENDCASE.  
  89. ENDMODULE.                    'USER_COMMAND_0100 INPUT  
REPORT ytest20160615002. DATA: ok_code TYPE sy-ucomm, save_ok LIKE ok_code. *定义内表,注意两种写法一样 *DATA SH1 LIKE YTJAYSCHOOL OCCURS 0 WITH HEADER LINE. DATA: sh1 LIKE TABLE OF ytjayschool WITH HEADER LINE, DELA_SCHOOL LIKE TABLE OF YTJAYSCHOOL WITH HEADER LINE. DATA LINEA TYPE I. *&SPWIZARD: DECLARATION OF TABLECONTROL 'TBL' ITSELF CONTROLS: TBL TYPE TABLEVIEW USING SCREEN 0100. DATA WA1 LIKE YTJAYSCHOOL. *增加内表数据 SELECT * FROM YTJAYSCHOOL INTO CORRESPONDING FIELDS OF TABLE SH1. *测试输出数据 *LOOP AT sh1. * WRITE:/ sh1-yct_id, sh1-ysh_id, sh1-ysh_name, sh1-ysh_addr. *ENDLOOP. *直接调用窗口 CALL SCREEN 100. *&SPWIZARD: OUTPUT MODULE FOR TC 'TBL'. DO NOT CHANGE THIS LINE! *&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR MODULE tbl_change_tc_attr OUTPUT. DESCRIBE TABLE sh1 LINES tbl-lines. ENDMODULE. 'TBL_CHANGE_TC_ATTR OUTPUT *&SPWIZARD: INPUT MODULE FOR TC 'TBL'. DO NOT CHANGE THIS LINE! *&SPWIZARD: MODIFY TABLE MODULE tbl_modify INPUT. MODIFY sh1 INDEX tbl-current_line. ENDMODULE. 'TBL_MODIFY INPUT *----------------------------------------------------------------------* * MODULE STATUS_0100 OUTPUT *----------------------------------------------------------------------* * *----------------------------------------------------------------------* MODULE status_0100 OUTPUT. SET PF-STATUS 'STATUS1'. ENDMODULE. 'STATUS_0100 OUTPUT *用户交互 MODULE user_command_0100 INPUT. save_ok = ok_code. CLEAR ok_code. *退出按钮时退出程序 CASE save_ok. WHEN 'CANCEL'. LEAVE PROGRAM. WHEN 'SAVE'. MODIFY YTJAYSCHOOL FROM TABLE SH1. IF SY-SUBRC NE 0. MESSAGE I005(YMESS) WITH '更新数据错误!'. EXIT. ELSE. MESSAGE I005(YMESS) WITH '更新数据OK!'. ENDIF. DELETE YTJAYSCHOOL FROM TABLE DELA_SCHOOL. IF SY-SUBRC NE 0. MESSAGE I005(YMESS) WITH '更新数据错误!'. EXIT. ELSE. MESSAGE I005(YMESS) WITH '更新数据OK!'. ENDIF. WHEN 'DELA'. GET CURSOR LINE LINEA. CHECK SY-SUBRC = 0. LINEA = TBL-TOP_LINE LINEA - 1. READ TABLE SH1 INDEX LINEA. APPEND SH1 TO DELA_SCHOOL. DELETE SH1 INDEX : LINEA. WHEN 'GETDATA'. GET CURSOR LINE LINEA. CHECK SY-SUBRC = 0. LINEA = TBL-TOP_LINE - 1. READ TABLE SH1 INDEX LINEA. MESSAGE S006(YMESS) WITH SH1-YSH_NAME SH1-YSH_ADDR. ENDCASE. ENDMODULE. 'USER_COMMAND_0100 INPUT






    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多