ABAP表控制Table Control设计

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

1、使用向导制作Table Control

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

1.1、建立程序

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

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.
逻辑流程序

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对象已经能够正常地浏览数据。
分析生成的代码
主程序代码如下:

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.
逻辑流代码如下:

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

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


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

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


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


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


逻辑流程序如下

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.
主程序代码如下

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中还需要添加以下代码,添加完代码后如下:

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、从程序调用生成的维护窗口

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

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、取得行号

*取得当前屏幕和行号
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、定义表格的读写属性

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)增加系统按钮”保存“,将内表数据提交数据库
逻辑流程序:
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.
主程序:
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






  • 10
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值