SAP ABAP 表控件

举报
雨绸缪 发表于 2023/08/30 17:34:17 2023/08/30
【摘要】 表控件和单步循环是添加到屏幕刷中的屏幕的屏幕表显示对象。从编程的角度来看,表控件和单步循环几乎完全相同。表控件只是改进的单步循环,其显示的数据具有与桌面应用程序中的表相关联的外观。 ABAP 表控件的功能使用表控件,用户可以:垂直和水平滚动表格调整列的宽度在字段中滚动(当字段内容比字段宽时)选择表格行或列对列序列重新排序保存当前显示设置以备将来使用表格控件还提供特殊的格式设置功能(一些自动设...

表控件和单步循环是添加到屏幕刷中的屏幕的屏幕表显示对象。

image.png

从编程的角度来看,表控件和单步循环几乎完全相同。表控件只是改进的单步循环,其显示的数据具有与桌面应用程序中的表相关联的外观。

ABAP 表控件的功能

使用表控件,用户可以:

  • 垂直和水平滚动表格
  • 调整列的宽度
  • 在字段中滚动(当字段内容比字段宽时)
  • 选择表格行或列
  • 对列序列重新排序
  • 保存当前显示设置以备将来使用

表格控件还提供特殊的格式设置功能(一些自动设置,一些可选),使表格更易于查看和使用。表控件提供:

  • 当用户调整窗口大小时自动调整表格大小(垂直和水平)
  • 行之间和列之间的分隔线(垂直和水平)
  • 所有列的列标题字段

单步循环的一个特点是它们的表行可以跨越屏幕上的多行。另一方面,表控件的一行必须始终包含在一行中(尽管可以滚动)。

通常,表控件提供的许多功能都由系统的 SAPgui 前端在本地处理,因此您无需自己对其进行编程。唯一值得注意的例外是垂直滚动。

示例(事务 TZ60

image.png

若要处理 ABAP 程序中的表控件,必须使用以下语句在程序的声明部分中为每个表控件声明一个控件:

CONTROLS <ctrl> TYPE TABLEVIEW USING SCREEN <scr>

其中 是 ABAP 程序中屏幕上的表控件的名称。该控件允许 ABAP 程序读取表控件的属性并影响控件。此处 是加载表初始值的屏幕编号。

可以通过以下方式设置表控件的光标位置:

在 PBO 中,您可以将光标设置在表控件的特定行的特定字段上。

SET CURSOR FIELD <f> LINE <lin> [OFFSET <off>]

使用可选的添加 OFFSET,您可以在字段中输入光标的偏移量,如设置光标位置中所述。

在PAI上,您可以读取当前光标位置。

GET CURSOR FIELD <f> LINE <lin> ...

除了“找出光标位置”下提供的信息外,字段还包含有关光标当前位于表控件的哪一行的信息。您也可以使用

GET CURSOR LINE <lin>.

以确定表控件的行。SY-SUBRC 允许您检查光标是否放置在表控件的一行中。

为了获取内部表的相应行:

GET CURSOR line <lin>.
ind = <table_control>-top_line + <lin> - 1.
Read table <itab> index ind.

系统变量 stepl – 在一个循环中包含当前表线索引 …结束循环。Loopc – 包含表中可见的行数

创建表控件

  1. 在屏幕上添加表控件元素
  2. 为表控件命名。在 ABAP 程序中声明一个具有相同 ( 控件类型 表视图 使用屏幕 )
  3. 为了创建字段,请转到字典/程序字段功能。
    • 输入所需字段的结构的名称。(如果您希望它从程序的字典中选择它,请单击相关的puh按钮)。
    • 在字段列表中,选择所需的字段,然后选择“确定”。
    • 在表格控制区域中单击。

如果需要选择列,请选中属性中的相应复选框并为其命名。在 ABAP 程序中创建字段。

在 PBO 中,您应该有声明

LOOP at <itab> USING CONTROL <cntrl_name>.

ENDLOOP.

在PAI中,您应该拥有:

LOOP at <itab>.

ENDLOOP.

在循环中,数据传输发生在屏幕和内部表之间。填充内部表时,请使用“描述表行”-“行”来存储控件中的行总数。FIELD 语句可用于控制数据传输发生的时间

要更改单个单元格的属性,请临时更改 PBO 中的 SCREEN 表。您可以更改由 CONTROLS 语句创建的结构的属性

<cntrl>-fixed_cols etc are the attributes of the control

<cntrl>-cols-index etc are the attributes of the columns.

<cntrl>-cols-screen-invisible etc are the screen attributes of each column.

表空间插入行代码

&---------------------------------------------------------------------*
*&      Form  FCODE_INSERT_ROW                                         *
*&---------------------------------------------------------------------*
  FORM fcode_insert_row
                USING    p_tc_name           TYPE dynfnam
                         p_table_name             .

*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
    DATA l_lines_name       LIKE feld-name.
    DATA l_selline          LIKE sy-stepl.
    DATA l_lastline         TYPE i.
    DATA l_line             TYPE i.
    DATA l_table_name       LIKE feld-name.
    FIELD-SYMBOLS <tc>                 TYPE cxtab_control.
    FIELD-SYMBOLS <table>              TYPE STANDARD TABLE.
    FIELD-SYMBOLS <lines>              TYPE i.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*

    ASSIGN (p_tc_name) TO <tc>.

*&SPWIZARD: get the table, which belongs to the tc                     *
    CONCATENATE p_table_name '[]' INTO l_table_name. "table body
    ASSIGN (l_table_name) TO <table>.                "not headerline

*&SPWIZARD: get looplines of TableControl                              *
    CONCATENATE 'G_' p_tc_name '_LINES' INTO l_lines_name.
    ASSIGN (l_lines_name) TO <lines>.

*&SPWIZARD: get current line                                           *
    GET CURSOR LINE l_selline.
    IF sy-subrc <> 0.                   " append line to table
      l_selline = <tc>-lines + 1.
*&SPWIZARD: set top line                                               *
      IF l_selline > <lines>.
        <tc>-top_line = l_selline - <lines> + 1 .
      ELSE.
        <tc>-top_line = 1.
      ENDIF.
    ELSE.                               " insert line into table
      l_selline = <tc>-top_line + l_selline - 1.
      l_lastline = <tc>-top_line + <lines> - 1.
    ENDIF.
*&SPWIZARD: set new cursor line                                        *
    l_line = l_selline - <tc>-top_line + 1.

*&SPWIZARD: insert initial line                                        *
    INSERT INITIAL LINE INTO <table> INDEX l_selline.
    <tc>-lines = <tc>-lines + 1.
*&SPWIZARD: set cursor                                                 *
    SET CURSOR LINE l_line.

  ENDFORM.                              " FCODE_INSERT_ROW

表控件删除行代码

*&---------------------------------------------------------------------*
*&      Form  FCODE_DELETE_ROW                                         *
*&---------------------------------------------------------------------*
  FORM fcode_delete_row
                USING    p_tc_name           TYPE dynfnam
                         p_table_name
                         p_mark_name   .

*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
    DATA l_table_name       LIKE feld-name.

    FIELD-SYMBOLS <tc>         TYPE cxtab_control.
    FIELD-SYMBOLS <table>      TYPE STANDARD TABLE.
    FIELD-SYMBOLS <wa>.
    FIELD-SYMBOLS <mark_field>.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*

    ASSIGN (p_tc_name) TO <tc>.

*&SPWIZARD: get the table, which belongs to the tc                     *
    CONCATENATE p_table_name '[]' INTO l_table_name. "table body
    ASSIGN (l_table_name) TO <table>.                "not headerline

*&SPWIZARD: delete marked lines                                        *
    DESCRIBE TABLE <table> LINES <tc>-lines.

    LOOP AT <table> ASSIGNING <wa>.

*&SPWIZARD: access to the component 'FLAG' of the table header         *
      ASSIGN COMPONENT p_mark_name OF STRUCTURE <wa> TO <mark_field>.

      IF <mark_field> = 'X'.
        DELETE <table> INDEX syst-tabix.
        IF sy-subrc = 0.
          <tc>-lines = <tc>-lines - 1.
        ENDIF.
      ENDIF.
    ENDLOOP.

  ENDFORM.                              " FCODE_DELETE_ROW

如果你选择用系统屏幕制作器的表控件(含向导) 的话,这些代码都会自动生成。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。