`
xiang37
  • 浏览: 431805 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

ABAP 的TABLE CONTROL实践积累

阅读更多

ABAP 的TABLE CONTROL实践积累

 

 

 

TABLE CONTROL 是一个结构,

假设我们定义的TC名称为  ZTEST_TC (具体结构参照:SCXTAB_CONTROL)

那么我们定义ZTEST_TC-CURENT_LINE ,ZTEST_TC-LINES 等等都有意义,我们可以将其理解为一个DEEP STRUCTURE.

        General TC attributes: |                      Column attributes

 1.FIXED_COLS LINES TOP_LINE CURRENT_LINE.... | COLS   |  INDEX SELECTED VISLENGTH INVISIBLE..

                                                |

 2.                                           SCREEN   

                                                |  

 3. NAME GROUP1 ... GROUP4 REQUIRED INPUT OUTPUT INTENSIFIED..INVISIBLE LENGTH ACTIVE DISPLAY_3D VALUE_HELP REQUEST...

 1是一个整体的TABLE CONTROL结构

 2是 ZTEST_TC-COLS的结构内容 也就是我们经常用的LOOP AT SCREEN. ... ENDLOOP.

 3.是SCREEN结构的属性。

那么这些有什么用呢?

一、现在需求如下(我在实际项目中接触到的实例):

通过选择屏幕,将数据库表A的内容显示出来,A有一个审批字段,如果这个审批字段是对勾(CHAR4 (ICON_D) 类型字段 存储内容: @01@ 就自然被系统装换成对勾显示了 ),那么这些数据在TABLE CONTROL中试灰色的,新添加的没有被审批的数据,就可以修改。

拿导航生成代码为例:PBO

我自定义TC输出内表名称为 T_ZTEST 工作区 WA_ZTEST

  PROCESS BEFORE OUTPUT.
*&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'ZTEST_TC' 

  MODULE ZTEST_TC_CHANGE_TC_ATTR.
*&SPWIZARD: MODULE ZTESTTC_CHANGE_COL_ATTR. 
  LOOP AT   T_ZTEST 
       INTO WA_ZTEST 
       WITH CONTROL ZTEST_TC
       CURSOR ZTEST_TC-CURRENT_LINE .
    MODULE ZTEST_TC_GET_LINES.
*&SPWIZARD:   MODULE ZTESTTC_CHANGE_FIELD_ATTR 
  ENDLOOP.
  MODULE STATUS_8000.

 

 最开始接触ABAP的时候,看到有这样的一个LOOP语句我发蒙了。除了在PBO里面,在其他地方使用不了的。

在这里,我们将 我们在屏幕的上显示的数据 每一行LOOP 进工作区中WA_TEST.

WITH CONTROL ZTEST_TC 说明了这个LOOP的过程是要和TC绑定LOOP的 CURSOR ZTEST_TC-CURRENT_LINE 。通过我上面罗列的结构为基础,我们进去 MODULE ZTEST_TC_GET_LINES中,添加一段代码:

LOOP AT SCREEN.

IF SCREEN-NAME CS 'WA_ZTEST' AND WA_ZTEST-STATUS EQ '@01@'.

IF SY-SUBRC EQ 0.

SCREEN-INPUT EQ 0.

MODIFY SCREEN.

ENDIF.

ENDIF

 CURSOR 是光标在控件中的位置,这时候光标所处的位置为,LOOP的当前行的数据。

 整个逻辑如下: 首先 我们LOOP 内表一条数据,然后和TC绑定.随后LOOP AT SCREEN. 这个时候,TC只会操作CURRENT_LINE这行的属性。如果这行的标识位为 ‘@01@’那么就会不能输入(整行变灰色),如果没有标示位,则正常。由于CURSOR的作用,TC的每行属性是逐行操作的。

二、如何得到TC中更新的数据.(TC-> TABLE CONTROL)

在PAI的 模板代码中加了些代码。

   LOOP AT T_ZTEST.
    CHAIN.
      FIELD WA_ZTEST-VKORG.
      FIELD WA_ZTEST-VKBUR.
      FIELD WA_ZTEST-KUNNR MODULE KUNNR_TEXT ON INPUT.
      FIELD WA_ZTEST-MATNR MODULE MATNR_TEXT ON INPUT.
      FIELD WA_ZTEST-ZYEAR.
      .......
      MODULE ZHGXS_XSJH_TC_MODIFY ON CHAIN-REQUEST.
    ENDCHAIN.

      FIELD WA_ZHGXS_XSJH-SEL
      MODULE ZHGXS_XSJH_TC_MARK ON REQUEST.

   ENDLOOP.

 

 

FIELD .... MOUDLE ...ON INPUT 就是那个字段不为空,会触发这个ON INPUT ...MODULE

当有了INPUT操作后,会触发 MODULE.... ON REQUEST(响应MODULE).  

还有:MODULE ZHGXS_XSJH_TC_MODIFY ON CHAIN-REQUEST.

这个MOUDLE的作用,在触发PAI后,要是被CHAIN。。ENDCHAIN的数据只要有改变,TC会触发这个MODULE,然后更新最新当前行的最新值。
源代码如下    MODIFY T_ZTEST
             FROM WA_ZTEST  INDEX ZTEST_TC-CURRENT_LINE.

所以我们利用这个地方,巧妙的定义一个用来存储更新数据的内表,然后

MODIFY 更新内表统计
             FROM WA_ZTEST  INDEX ZTEST_TC-CURRENT_LINE.

这样所有改变后值得数据都会在这个内表出现,

DECRIBE 内表就知道更新多少行了。

对于TC的内表,永远是操作后的数据,非常准确。

因为他的每一个PAI都要出发LOOP 并且MODIFY改变值 原来的内表.

那么就要有一个疑问了,删除行时候,会怎样呢?

假设我使用的是导航本身生成的 - (删除行)操作,那么在PAI的时候,虽然在我们看来这行数据没有了,然是,PAI的LOOP检查会触发 一个MARK 标识位的操作,然后将内表的SEL打上X。当程序流走到PAI的INSR控件触发的事件时候,将SEL = 'X'的数据从内表删除。

所以PAI 的 CHAIN只会对存在的 操作前的数据进行LOOP,不会减少内表数据。主要的精华都在于

MODULE .... ON REQUEST的控制了。

三。对一些TABLE CONTROL的经典动态代码进行分析。

    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.

一些ABAP的动态操作,可复用性代码都是这么写的。

FIELD-SYMBOLS <TC>                 TYPE CXTAB_CONTROL.
 

    ASSIGN (P_TC_NAME) TO <TC>.

充分说明了 我自定义的TC 是一个结构。我将我自定义的TC名称,这时候声明一个引用,也就是TC的别名。

然后我就可以使用<TC>进行操作了。

插入操作和当前自己的光标位置相关,然后

INSERT INITIAL LINE INTO <TABLE> INDEX L_SELLINE. 

SET CURSOR FIELD L_SELLINE.

觉得还是有点复杂吧,但是能看明白,却说不明白。

分享到:
评论

相关推荐

    ABAP中使用TABLE CONTROL 显示数据以及操作要点小结

    ABAP中使用TABLE CONTROL 显示数据以及操作要点小结,一个完整demo

    ABAP中的Table_Control编程

    ### ABAP中的Table_Control编程详解 ...以上是关于ABAP中Table Control编程的一些关键知识点和实践技巧,通过这些内容,可以帮助开发者更好地理解和利用Table Control这一强大的工具来提升应用程序的用户体验。

    abap tablecontrol 控件动态显示列

    abap tablecontrol 控件动态显示列

    ABAP中的Table Control编程

    ABAP中的Table Control编程 Table Control是SAP系统中Screen中的一个常用控件,可以实现对多行数据的编辑。它是一组屏幕元素在Screen上的重复出现,这与普通屏幕元素的区别。Table Control的每一行是跟工作区域wa...

    SAP table control使用介绍

    在 SAP 的 ABAP 开发环境中,Table Control 是一种非常强大的工具,用于在屏幕上显示表格数据。它提供了丰富的功能来展示复杂的数据,并且允许用户进行灵活的交互操作。Table Control 可以被看作是一种特殊的屏幕...

    第07章 表控制Table Control设计.rar_ABAP实战_Table_表控制Table Control设计

    在ABAP编程中,表控制(Table Control)是一种强大的用户界面元素,用于显示和编辑数据库或内存中的数据。本章将深入探讨如何设计和使用表控制,包括通过向导创建和非向导式方法,以及如何实现数据表的维护和内表...

    SAPDialog开发教程之TableControl开发.docx

    SAP Dialog开发教程之TableControl开发主要涵盖了在SAP ABAP环境中如何创建和操作Table Control,这是一种在对话框程序中显示和编辑数据的屏幕元素。Table Control通常用于报表程序和模块池程序,允许用户查看和可能...

    abap 屏幕表控件实例

    4. 删除数据:用户可以点击‘’按钮,将右边的 TABLE_CONTROL 控件中的选择数据添加到左边的 TABLE_CONTROL 控件中,同时将右边的 TABLE_CONTROL 控件中的选择数据删除。 该实例的实现代码主要包括: 1. 事务程序...

    SAP Table Control Example

    在SAP系统中,表控件(Table Control)是一种用于在用户界面中展示数据的高级技术,它在ABAP编程环境中扮演着重要角色。表控件不仅提供了类似于桌面应用程序的表格视图,还具备一系列增强的功能,使得数据的呈现更加...

    ABAP详解(SAP)

    共12章,资深ABAP顾问倾囊巨献 ...第七章 表控制Table Control设计 第八章 ALV控件的使用 第九章 Tree Control的使用 第十章 实战Smart Forms设计 第十一章 实战Form设计 第十二章 查找业务应用使用的数据表

    table control Dialog Programming

    在IT开发领域,特别是在ABAP(Advanced Business Application Programming)环境下进行SAP GUI应用开发时,表格控件(Table Control)是一种非常重要的用户界面元素。它允许开发者以结构化的方式展示数据,并支持...

    从实例学Abap编程

    07_表控制Table Control设计.pdf 08_ALV控件的使用.pdf 09_Tree Control的使用.pdf 10_实战Smart Forms设计.pdf 11_实战Form设计.pdf 12_查找业务应用使用的数据表.pdf 13_程序权限设定.pdf 14_从实例学SAP ABAP编程...

    ABAP源代码-初学者参考 abap source codes.rar

    2. **S_TABLE_CONTROL.txt**:这可能是一个关于ABAP中的表格控制(Table Control)的示例,用于显示和编辑表格数据。表格控制允许用户在GUI上与表格交互,包括排序、过滤和选择。学习点可能包括:使用TABLE CONTROL...

    Screen Dynpro 实例总结

    2. **绑定数据源**:将Table Control与数据源(如ABAP内表或数据库表)关联,确保表格中的行对应于数据源中的记录。 3. **配置行为**:定义用户如何与Table Control交互,例如设置排序功能、编辑模式、选择行等。你...

    abap小结.docx

    【SAP ABAP知识点详解】 SAP ABAP(Advanced Business Application Programming)是SAP系统中的一种编程语言,用于开发...学习SAP ABAP需要深入了解这些概念并进行实践,以掌握创建高效、可维护的业务解决方案的技能。

    实战ABAP程序开发

    7. **第七章 表控制Table Control设计**:表控制是显示和编辑表格数据的控件,常用于报表和数据输入。这里会讲解如何创建和配置表控制,以及与之相关的事件处理。 8. **第八章 ALV控件的使用**:ALV(ABAP List ...

    从实例学SAP ABAP编程.7z

    Table Control是ABAP中的表格显示控件,用于动态显示数据。学习如何创建和配置Table Control,包括列定义、行处理、事件处理等,以及如何与后台数据进行交互。 5. **屏幕SCREEN设计.pdf**: 屏幕设计是SAP UI的...

    ABAP教程资料打包,适合初学者。

    SAP实施方配给的ABAP资料,整理好。...7、 表控制Table Control设计.pdf 8、ALV控件的使用.pdf 9、Tree Control的使用.pdf 10、实战Smart Forms设计.pdf 11、实战Form设计.pdf 12、查找业务应用使用的数据表.pdf

    ABAP ALV面向对象方法

    了解如何使用面向对象技术来构建ALV Grid Control对于任何希望提高SAP开发技能的ABAP开发者来说都是至关重要的。掌握了这些基础后,开发者可以进一步探索更多高级功能,如动态列布局调整、复杂数据绑定等,从而更好...

    ABAP 屏幕设计中添加文本编辑器

    我们使用 CALL METHOD 语句来调用编辑器的 GET_TEXT_AS_R3TABLE 方法,获取编辑框内容,并将其输出到屏幕上。 知识点7:使用 REFRESH 语句刷新数据 在输出编辑框内容时,我们使用 REFRESH 语句刷新数据,以确保...

Global site tag (gtag.js) - Google Analytics