• SAP 内表


    内表与结构体基本类似,它同样是程序运行中被临时创建的一个存储空间,它是一个可包含多条记录的数据表。

        内表共有3种类型:

        1)Standard:标准表

        2)Sorted:排序表

        3)Hashed:哈希表,一般用的比较少

        本篇文件将重点介绍Standart型内表的定义及功能

        1.内表的定义

        通过关键字DATA对内表进行创建,内一的定义可以直接参考结构体或者其它内表及透明表,也可以直接定义字段,其中关键字如下:

        UNIQUE|NON-UNIQUE:指定关键字,只能应用于排序表或者哈希表。

        INITIAL SIZE n:指定初始化内表大小。

        WITH HEADER LINE:定义内表是否有表头。

        具体定义有以下几种方式:

        DATA <内表名> TYPE <结构类型> WITH [UNIQUE|NON-UNIQUE] [INITIAL SIZE n] [WITH HEADER LINE]。

        DATA <内表名> LIKE TABLE OF <内表或者透明表> WITH [UNIQUE|NON-UNIQUE] [INITIAL SIZE n] [WITH HEADER LINE]。

        DATA BEGIN OF itab OCCURS n,

           ......

        END OF itab [VALID BETWEEN f1 AND f2]。

        FOR EXAMPLE:

        TABLES:USER21.  “参考某一透明表时,必须先引用定义。类型于C#的USING。

        TYPES:BEGIN OF EMP,

                  NAME LIKE USER21-BNAME,

                  TELNUM  LIKE USER21-PERSNUMBER,

                  ADDR  LIKE USER21-ADDRNUMBER,

         END OF EMP。

        *参考该结构定义一个初始化大小为10,并且有HEADER LINE的内表

        DATA:EMPTAB TYPE STANDARD TABLE  OF EMP INITIAL SIZE 10 WITH HEADER LINE.

        *参考上例已建立内表,重新定义大小为20并且没有HEADER LINE的内表

        DATA:EMPTAB2 LIKE STANDARD TABLE OF TMPTAB INITIAL SIZE 20.

        *该方法定义初始化值为10,并有HEADER LINE的内表

        DATA:EMPTAB3 LIKE EMPTAB OCCURS10.

         *定义一个排序表,以NAME为关键字,该内表中NAME字段数据不能重复

        DATA:EMPTAB4 LIKE SORTED TABLE OF EMPTAB WITH UNIQUE KEY NAME INITIAL SIZE 10 WITH HEADER LINE.

        *定义一个初始化大小为0的哈希表

        DATA:EMPTAB5 LIKE HASHED TABLE OF EMPTAB WITH UNIQYE KEY NAME WITH HEADER LINE.

        通过第三种方式定义的内表可指定具体字段及初始化大小,默认内表存在HEADER LINE。

        TABLES:USER21.

        TYPES:BEGIN OF EMP OCCURS 0,

                 NAME LIKE USER21-BNAME,

          TELNUM   LIKE USER21-PERSNUMBER,

          ADDR  LIKE USER21-ADDRNUMBER,

          END OF EMP.

         2.内表的赋值

          上面曾介绍过,内表分为有无HEADER LINE两种。对于有HEADER LINE的内表,可以通过填充HEADER LINE数据后或通过外部的Work Area向内表存储空间中追加数据,相关语法如下:

           APPEND (<work area> into) <ITAB>.

           FOR EXAMPLE:

           TABLES:USER21.

           DATA:BEGIN OF EMP OCCURES 0,

          NAME  LIKE USER21-BNAME,

          TELNUM  LIKE USER21-PERSNUMBER,

          ADDR  LIKE USER21-ADDRNUMBER,

           END OF EMP.

           EMP-NAME='JERY'.

           EMP-TELNUM='010-123888'.

       EMP-ADDR='BEIJING'.

           APPEND EMP.  "数据被赋给内表HEADER LINE后再APPEND到表中最后一行。

           对于没有HEADER LINE的内表,只能通表外部WORK AREA来传递数据,如下所示:

           TABLES:USER21.

           DATA:BEGIN OF EMPTAB,

            NAME  LIKE USER21-BNAME,

          TELNUM  LIKE USER21-PERSNUMBER,

            ADDR  LIKE USER21-ADDRNUMBER,

            END OF TMPTAB.

            DATA:EMP LIKE STANDART TABLE OF EMPTAB.

            EMP-NAME='JERY'.

            EMP-TELNUM='010-123888'.

        EMP-ADDR='BEIJING'.

            APPEND EMPTAB TO EMP.  ”数据被赋给WORK AREA后再APPEND到表中。

           除了上述的赋值方式外,还可以通过OPEN SQL将数据表中的数据按条件查询后放入内表中,对于OPEN SQL的具体用法,将后在后面介绍。

           FOR EXAMPLE:

           TABLES:USER21.

           DATA:BEGIN OF EMP OCCURES 0,

                    NAME LIKE USER21-BNAME,

                    TELNUM  LIKE USER21-PERSNUMBER,

                    ADDR   LIKE  USER21-ADDRNUMBER,

           END OF EMP.

           SELECT BNAME AS NAME PERSNUMBER AS TELNUM  ADDRNUMBER   AS ADDR

           INTO TABLE EMP FROM USER21.  "通过OPEN SQL将从数据表中抓取的数据直接复制给内表。

          3.内表数据管理

          1.内表的清空

          对内表数据的清空共包括4种模式

          CLEAR <ITAB>:仅清空HEADER LINE,对内表数据存储空间不影响。

          REFRESH <ITAB>:清空内表数据存储空间,对HEADER LINE不影响。

          REFRESH <itab> FROM TABLE <dbtab>:清空内表存储空间,填充从数据库表所获数据。

          FREE <ITAB>:清空内表数据存储空间,对HEADER LINE不影响。

          FOR EXAMPLE:

          TABLES:USER21.

          DATA:BEGIN OF EMP OCCURS 0,

                   NAME LIKE USER21-BNAME,

                   TELNUM  LIKE  USER21-PERSNUMBER,

                   ADDR  LIKE  USER21-ADDRNUMBER,

           END OF EMP.

           SELECT BNAME AS NAME PERSNUMBER AS TELNUM  ADDRNUMBER AS ADDR INTOTABLE EMP FROM USER21.

           USER21-BNAME='JERY'.

           REFRESH EMP FROM TABLE USER21. "清除EMP的存储空间,并从USER21中查找数据填充到内表。

           2.INSERT(向内表插入数据)

           可以按内表的具体字段向表中插入一行或者多行数据,具体语法如下:

           INSERT [wa INTO|INITIAL LINE INTO] itab [INDEX idx].

           INSERT [wa INTO|INITIAL LINE INTO] TABLE itab.

           INSERT LINES OF itab1 [FROM idx] [TO idx2] INTO itab2 [INDEX idx3].

           FOR EXAMPLE:

           TABLES:USER21.

           DATA:BEGIN OF EMP OCCURS 0,

                    NAME LIKE USER21-BNAME,

           END OF EMP.

           DATA:EMPTAB1 LIKE EMP.

       DATA:EMPTAB2 LIKE EMP OCCURS 10.

         

          EMP='JERY'.

          INSERT EMP INDEX 1."若内表有多行数据,该语句将新记录新增到第一行。

         

          EMPTAB1='TOM'.

          INSERT EMPTAB1 INTO TABLE EMP.  “将结构体中数据新增到内表

      

      SELECT BNAME AS NAME INTO TABLE EMPTAB2 FROM USER21.

          INSERT LINES OF EMPTAB2 FROM 10 INTO EMP."将数据表EMPTAB2从第10行开始的所有数据插入到表EMP中。

          3.MODIFY(直接修改内表数据)

          按内表位置或者具体内表字段值相等条件修改内表数据。

          MODIFY itab [FROM wa] [INDEX idx] [TRANSPORTING f1...fn] WHERE cond.

          FOR EXAMPLE:

          TABLES:USER21.

       DATA:BEGIN OF EMP OCCURS 0,

             NAME LIKE USER21-BNAME,

           TELNUM LIKE USER21-PERSNUMBER,

       END OF EMP.

           SELECT BNAME AS NAME PERSNUMBER AS TELNUM INTO TABLE EMP FROM USER21.

           EMP-NAME='JERY'.

        EMP-TELNUM='010-888888'.

        MODIFY EMP INDEX 1."修改内表第一行数据为设定值   

        EMP-TELNUM='0755-888888'.

           *查找内表中NAME等于TOM的数据,并按设定修改其TELNUM字段,有多行值时会同时修改。

           MODIFY EMP TRANSPORTING TELNUMBER WHERE NAME='TOM'.

     

           4.COLLECT(内表数据分类汇总)

            将内表中相同的字段合并,若有类型为I的字段,则将其值加总。

            COLLECT [wa INTO] itab.

            FOR EXAMPLE:

            TYPES:BEGIN OF COMPANY,

                      NAME(20) TYPE C,

           SALES TYPE n,

        ENF OF COMPANY.

            DATA:COMP TYPE COMPANY,COMPTAB TYPE COMPANY OCCURS 0.

            COMP-NAME = 'MOBILE'. COMP-SALES = 10. COLLECT COMP INTO COMPTAB.

          COMP-NAME = 'NOTEBOOK'. COMP-SALES = 20. COLLECT COMP INTO COMPTAB.

            COMP-NAME = 'MOBILE'.COMP-SALES = 30.COLLECT COMP INTO COMPTAB.

          5.SORT(内表数据排序)

            对内表进行排序,可以指定具体的排序字段、排序方式(升/降),语法如下:

            SORT itab [BY f2 f2...fn] [ASCENDING/DESCENDING]

        6.READ(读取)

           依据具体行数或字段值等条件读取某一内表的数据。

        READ TABLE itab FROM wa.

        READ TABLE itab WITH [TABLE] KEY k1=v1...kn=vn [BINARY SEARCH].

        READ TABLE itab INDEX i.

           使用READ操作的表必须的HEADER LINE作为查找出的数据存储窗口,BINARY SEARCH 可以提高内表数据查找的速度,但是使用前必须先对内表进行排序。

           7.LOOP....ENDLOOP(循环读取内表数据)

           循环读取内表数据,在循环中使用系统变量SY-TABIX可获取当前所执行的行数。

       LOOP AT ITAB FROM n1 TO n2.:读取内表具体行数间数据。

       LOOP AT ITAB WHERE logexp.:按具体字段条件读取内表。

           FOR EXAMPLE:

       TABLES:USER21.

       DATA:BEGIN OF EMP OCCURS 0,

          NAME LIKE USER21-BNAME,

          TELNUM LIKE USER21-PERSNUMBER,

       END OF EMP.

       SELECT BNAME AS NAME PERSNUMBER AS TELNUM INTO TABLE EMP FROM USER21.

       *读取内表的1-10行数据。

           LOOP AT EMP FROM 1 TO 10.

        WRITE:EMP.

            ENDLOOP.

           *按NAME条件读取内表。

        LOOP AT EMP WHERE NAME='JERY'.

           WRITE:EMP.

        ENDLOOP.

           8.AT...ENDAT(设置内表循环触发条件)

       该语法为事件控制函数,应用于LOOP循环语句中,用于获取内表的数据变化事件。

       AT NEW f.:当某个字段数据与上一行数据值不同时触发该事件。

          AT END OF f.:当内表中某个字段当前行值与下一行值不同时触发该事件。

          AT FIRST.:当执行内表第一行时触发该事件。

      AT LAST.:当执行内表最后一行时触发该事件。

        9.AT..DELETE(删除内表数据)

        DELETE TABLE itab WITH TABLE KEY k1=v1...kn=vn.:按具体值删除。

      DELETE TABLE itab [FROM wa].:参照其它内表值删除。

      DELETE itab INDEX idx.:删除具体行数据。

      DELETE itab FROM idx1 TO idx2.:删除具体行数范围间数据。

      DELETE ADJACENT DUPLICATES FROM itab.:删除重复数据,执行此条件前必须先排序。

          10.DESCRIBE(获取内表的具体属性)

       DESCRIBE TABLE itab LINES n:获取内表当前总行数,n为整型。

       DESCRIBE TABLE itab OCCURS n:获取内表初始化行数,n为整形。

       DESCRIBE TABLE itab KIND K.:获取内表类型:T:Standard,S:SORTED,H:HASHED。

           FOR EXAMPLE:

           DATA:N1 TYPE I,N2 TYPE I,K TYPE C.

       DATA:BEGIN OF EMP OCCURS 10,

           NAME LIKE USER21-BNAME,

           TELNUM LIKE USER21-PERSNUMBER,

           END OF EMP.

           DESCRIBE TABLE EMP LINES N1. ”表中无数据,回执为0

           DESCRIBE TABLE EMP OCCURS N2. “表初始化大小为10,回执为10

       DESCRIBE TABLE EMP KIND K. ”默认为STANDARD表,回执为T

    2.内表和内表结构

    2.1  结构体(Structure)

    2.1.1 结构体的定义

    ABAP 中可以定义结构来包含多个基本类型,便于整理及操作;

    结构体不属于数据字典对象(数据字典中可以定义结构体,但不能存储数据),在程序运行时会被作为临时对象存储在内存空间;

    在创建内表时,可参考直接定义的结构体作为内表结构

    结构体的定义,可以通过两种方式实现:
    1.第一种方式

    语法:
    DATA:  BEGIN OF <name>

    <field1> . . .

    <field2> . . .

    . . .

    END OF <name>.

    如:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    TABLES: TABNA.
     
    DATA: BEGIN OF ADDRESS,
           FLAG   TYPE C,
           ID     LIKE TABNA-ID,
           NAME1  LIKE TABNA-NAME1,
           CITY   LIKE TABNA-CITY,
          END OF ADDRESS.
     
    * 为结构体字段赋值
      MOVE 'X'            TO ADDRESS-FLAG.
      MOVE '0001'         TO ADDRESS-ID.
      MOVE 'Smith'        TO ADDRESS-NAME1.
      MOVE 'Philadelphia' TO ADDRESS-CITY.
     
      WRITE ADDRESS.

    2.第二种方式

    语法:
    TYPES: BEGIN OF <name1>,

    <field1> . . . ,

    <field2> . . . ,

    . . .  ,

    END OF <name1>.

    DATA: <name2> TYPE <name1>.

    如:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    TYPES: BEGIN OF ADDR,
            FLAG,
            ID      LIKE EMPLOYEE-ID,
            NAME1   LIKE EMPLOYEE-NAME1,
            CITY    LIKE EMPLOYEE-CITY,
           END OF ADDR.
     
    DATA: ADDRESS TYPE ADDR.
     
    MOVE'X'            TO ADDRESS-FLAG,
           '00001'        TO ADDRESS-ID,
           'Smith'        TO ADDRESS-NAME1,
           'Philadelphia' TO ADDRESS-CITY.
     
    WRITE ADDRESS.

    2.1.2  结构体的赋值

    相同结构体之间可以通过 MOVE … TO … 语句进行赋值;

    如若存在类型差异的结构体,则可以通过 MOVE-CORRESSPONDING … TO … 语句将两个结构体之间相同字段自动匹配赋值:

    abap_05_Structure_Set_Value

    与基本变量定义类似,结构体的初始化操作也可以通过 CLEAR 语句实现。

    如:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    TABLES: employee.
     
    DATA: BEGIN OF address,
            flag,
            id      LIKE employee-id,
            name    LIKE employee-name1,
            city    LIKE employee-city,
          END OF ADDRESS.
     
    SELECT * FROM employee.
     
         MOVE-CORRESPONDING employee TO address.
     
         WRITE: / address-flag,  address-id,
                address-name, address-city.
     
         CLEAR address.
    ENDSELECT.

    2.2  内表(Internal Table)

    内表与结构体基本类似,同样在程序运行过程中存储在临时创建的内存空间,它是一个可以存储多条记录的数据

    2.2.1 内表的定义

    通过关键字DATA定义内表,可以直接参考结构体或者其他内表及透明表结构,也可以直接定义结构字段。

    语法:

    ①.DATA <NAME> TYPE <STRUCTURE>        WITH [UNIQUE|NON-UNIQUE] [INITIAL SIZE n] [WITH HEADER LINE].

    ②.DATA <NAME> LIKE TABLE OF <TABLE> WITH [UNIQUE|NON-UNIQUE] [INITIAL SIZE n] [WITH HEADER LINE].

    ③.DATA: BEGIN OF itab OCCURS n,

    <field>

    <field>

    END OF itab.

    其中,关键字说明如下:

    [UNIQUE|NON-UNIQUE]: 指定关键字,只用于排序表,使用NON-UNIQUE关键字的话,排序表数据记录允许重复关键字字段;

    [INITIAL SIZE n]:指定初始化内表大小,比较少用,一般默认即可;

    [WITH HEADER LINE]: 定义内表是否带表头;

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    *--------------------------------------------------------------------*
    * 通过定义结构体并参考该结构定义内表
    *--------------------------------------------------------------------*
    TABLES: employee.                           "参考某一透明表,必须先引用定义
     
    TYPESBEGIN OF emp,
             id          LIKE employee-id,
             name1       LIKE employee-name1,
             country     LIKE employee-country,
            END OF emp.
     
    *--------------------------------------------------------------------*
    * 参考EMP 结构定义一个初始化大小为10,并有HEADER LINE的内表
    *--------------------------------------------------------------------*
    DATA: emptab TYPE STANDARD TABLE OF emp INITIAL SIZE 10 WITH HEADER LINE.
     
     
    *--------------------------------------------------------------------*
    * 参考EMPTAB内表,重新定义没有HEADER LINE的内表
    *--------------------------------------------------------------------*
    DATA: emptab_n LIKE STANDARD TABLE OF emptab.
     
     
    *--------------------------------------------------------------------*
    * 定义一个允许重复KEY,并且没有HEADER LINE的排序表
    *--------------------------------------------------------------------*
    DATA: emptab_s TYPE SORT TABLE OF emp WITH NON-UNIQUE KEY id.
     
     
    *--------------------------------------------------------------------*
    * 通过第三种方式定义的内表,可指定具体字段,默认内表存在HEADER LINE
    *--------------------------------------------------------------------*
    TYPESBEGIN OF emp OCCURS 0,
              id         LIKE employee-id,
              name1      LIKE employee-name1,
              country    LIKE employee-country,
            END OF emp.

    2.2.2  内表有无 HEADER LINE 的区别

    对于有HEADER LINE的内表,可以通过填充HEADER LINE数据后或通过 外部Work Area 向内表存储空间中追加数据。

    abap_05_Internal_Table_With_Header_Line

    对于没有HEADER LINE的内表,只能通过 外部Work Area来传递数据:

    abap_05_Internal_Table_Without_Header_Line

    语法:

    ①.APPEND [<Work Area> INTO] <ITAB>.

    如:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    TABLES: employee.
     
    TYPES: BEGIN OF emp,
        id  LIKE employee-id,
        name1   LIKE employee-name1,
        country LIKE employee-country,
           END OF emp.
     
    * 有 HEADER LINE 的内表
    DATA: emptab  TYPE STANDARD TABLE OF emp INITIAL SIZE 10 WITH HEADER LINE.
     
    * 没有 HEADER LINE 的内表
    DATA: emptab2 TYPE STANDARD TABLE OF emp INITIAL SIZE 10,        
     
    * Work Area
          emptab_wa TYPE emp.                                                                          
     
    SELECT * FROM employee.
     
        MOVE-CORRESPONDING employee TO emptab.
        APPEND emptab.
     
        MOVE-CORRESPONDING employee TO emptab_wa.
        APPEND emptab_wa TO emptab2.
     
    ENDSELECT.

    由于没有HEADER LINE的内表通过Work Area 传递数据在性能上会优于HEADER LINE直接填充HEADER LINE,

    所以,一般基本都使用没有 HEADER LINE 的内表。

    除非一些特殊情况,才会使用 HEADER LINE 内表。

    2.2.3 内表数据处理

    1. 遍历读取内表数据 (LOOP … ENDLOOP.)

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    LOOP AT emptab WHERE country BETWEEN ‘A’ AND ‘D’.
     
         WRITE:  / emptab-country, emptab-name1, emptab-sales.
     
    ENDLOOP.
     
    IF sy-subrc NE 0.  
     
         WRITE: / ‘NO ENTRIES’.  
     
    ENDIF.

    解析:

    a.LOOP 语句后,允许使用WHERE语句筛选数据。

    b.程序中,出现 sy-subrc 变量,这是系统全局变量,用于检查是否符合条件,

    如若符合条件 sy-subrc 返回0 ,如果不符合,则返回4.

    2. 读取内表数据 (READ TABLE …)

    在数据内表,可以通过READ TABLE关键字根据具体行数或主键字段读取内表中的某行记录:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    TABLES: employee.
     
    TYPESBEGIN OF emp,
             country     LIKE employee-country,
             name1       LIKE employee-name1,
            END OF emp.
     
    DATA: emptab TYPE STANDARD TABLE OF emp INITIAL SIZE 10 WITH HEADER LINE.
     
    SELECT * FROM EMPLOYEE.
     
        MOVE-CORRESPONDING employeeTO emptab.
        APPEND EMPTAB.
     
    ENDSELECT.
     
    READ TABLE ….

    READ TABLE 选项:

    1) READ TABLE <EMPTAB>.

    2) READ TABLE <EMPTAB>  WITH KEY <k1> = <v1>…  <kn> = <vn>.

    3) READ TABLE <EMPTAB>  WITH TABLE KEY <k1> = <v1> …  <kn> = <vn>.

    4) READ TABLE <EMPTAB>  WITH KEY  = <value>

    5) READ TABLE <EMPTAB>  WITH KEY . . .  BINARY SEARCH.

    6) READ TABLE <EMPTAB>  INDEX <i>.

    7) READ TABLE <EMPTAB> COMPARING <f1> <f2> . . . .

    8) READ TABLE <EMPTAB> COMPARING ALL FIELDS.

    9) READ TABLE <EMPTAB> TRANSPORTING <f1> <f2> . . . .

    10) READ TABLE <EMPTAB> TRANSPORTING NO FIELDS.

    关键字说明:

    [KEY|TABLE KEY]: 通过内表的主键字段查找

    [BINARY SEARCH]: 二分法查找,使用该方法时,在READ TABLE之前,必须对内表排序

    [INDEX]: 根据内表索引查找

    [COMPARING]:只查找设置的字段

    [COMPARING ALL FIELDS]:查找内表所有的字段

    [TRANSPORTING]: 只输出设置的字段数据

    [TRANSPORTING NO FIELDS]: 不输出任何数据

    3. 内表排序

    对内表进行排序,指定具体排序的排序字段、排序方式(升序/降序)

    默认情况下,为升序。

    语法:

    SORT itab [BY <f1> <f2> …] [ASCENDING|DESCENDING]

    4. 内表分类汇总(COLLECT TABLE …

    通过COLLECT TABLE关键字,可以对内表中相同记录合并,若有数字类型(I、P、F)的字段,会将其合并汇总。

    语法:

    COLLECT [<work area> INTO] itab.

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    TABLES: EMPLOYEE.
     
    TYPESBEGIN OF EMP,
          COUNTRY    LIKE EMPLOYEE-COUNTRY,
          SALES      LIKE EMPLOYEE-SALES,
            END OF EMP.
     
    DATA:  EMPTAB   TYPE STANDARD TABLE OF EMP INITIAL SIZE 10 WITH HEADER LINE,
           EMPTAB_C TYPE STANDARD TABLE OF EMP INITIAL SIZE 10 WITH HEADER LINE.
     
    DATA:  EMPTAB_WA TYPE EMP.
     
    * 赋值
    EMPTAB-COUNTRY = 'D'.
    EMPTAB-SALES         = 400.
    APPEND EMPTAB.
     
    EMPTAB-COUNTRY = 'USA'.
    EMPTAB-SALES         = 1000.
    APPEND EMPTAB.
     
    EMPTAB-COUNTRY = 'GB'.
    EMPTAB-SALES         = 500.
    APPEND EMPTAB.
     
    EMPTAB-COUNTRY = 'D'.
    EMPTAB-SALES         = 7800.
    APPEND EMPTAB.
     
    SORT EMPTAB BY COUNTRY.
     
    LOOP EMPTAB.
          
         MOVE-CORRESPONDING EMPTAB TO EMPTAB_WA.
     
         COLLECT EMPTAB INTO EMPTAB_C.
     
    ENDLOOP.

    输出结果:

    D       8200

    GB       500

    USA    1000

    或者直接从数据表取数汇总:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    SELECT * FROM EMPLOYEE.
     
       MOVE-CORRESPONDING EMPLOYEE TO EMPTAB.
       COLLECT EMPTAB.
     
    ENDSELECT.
     
    LOOP AT EMPTAB.
     
       WRITE:  / EMPTAB-COUNTRY, EMPTAB-SALES.
     
    ENDLOOP.

    5.系统字段 SY-TABIX

    与前面提到的 SY-SUBRC 字段一样,SY-TABIX 也为系统的全局变量;

    用于在循环遍历内表时,当前记录的索引值:

    1
    2
    3
    4
    5
    6
    7
    8
    SELECT * FROM EMPLOYEE
       INTO CORRESPONDING FIELDS OF TABLE EMPTAB.
     
    LOOP AT EMPTAB.
     
       WRITE:  / SY-TABIX, EMPTAB-COUNTRY, EMPTAB-NAME1.
     
    ENDLOOP.

    2.2.4 维护内表数据

    1.通过索引值维护内表

    语法:

    INSERT   <EMPTAB> INDEX <i

    MODIFY <EMPTAB> INDEX <i>.

    DELETE   <EMPTAB> INDEX <i>.

    说明:

    INSERT: 向内表数据I处插入数据记录

    MODIFY:修改内表数据I处记录

    DELETE:删除内表I处数据记录

    如:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    SELECT * FROM EMPLOYEE.
       MOVE-CORRESPONDING EMPLOYEE TO EMPTAB.
       APPEND EMPTAB.
    ENDSELECT.
     
    READ TABLE EMPTAB INDEX 1.
    MOVE 'ABC' TO EMPTAB-NAME1.
    MODIFY EMPTAB INDEX SY-TABIX.
     
    * 每次执行完之后,判断SY-SUBRC是否为0
    IF SY-SUBRC NE 0.
     
       WRITE:  / ‘Attempt to modify failed.’.
     
    ELSE.
     
      WRITE:  / EMPTAB-COUNTRY, EMPTAB-NAME1.
     
    ENDIF.
     
    INSERT EMPTAB INDEX 1.
    DELETE EMPTAB INDEX SY-TABIX.

    2. 维护没有HEADER LINE的内表

    APPEND <work area> TO <internal table>.

    COLLECT <work area> INTO <internal table>

    INSERT <work area> INTO <internal table>.

    MODIFY <internal table> FROM <work area>.

    READ TABLE <internal table> INTO <work area>.

    LOOP AT <internal table> INTO <work area>.

    说明:

    APPEND: 向内表追加数据

    COLLECT:内表数据分类汇总

    INSERT:向内表插入数据

    MODIFY:修改内表数据

    READ TABLE:读取内表数据

    LOOP AT:遍历内表数据

    3. 清空内表

    清空内表有4种方式:

    CLEAR <internal table> :仅清空HEADER LINE,对内表数据存储空间不影响

    REFRESH <internal table>:清空内表数据存储空间,对HEADER LINE不影响

    FREE <internal table>:清空内表数据存储空间,对HEADER LINE不影响

    4.获取内表信息

    可以通过 DESCRIBE 关键字获取内表的相关信息。

    语法:

    DESCRIBE TABLE <internal table> [LINES <var1>] [OCCURS <var2>].

    说明:

    LINES: 获取内表存储记录数

    OCCURS:获取内表存储空间大小

    内表行的操作:

    1.      工作区.程序对内表的操作不能直接进行,必须通过一种接口来传输,这个接口就是工作区(WorkArea).如果程序需要从关系数据库中撮数据到内表各行中,必须先将数据读入工作区,然后把工作区中的数据赋给内表的行.工作区必须具有和内表的行一致或者可相互转换的数据结构.

    2.      表行头.在创建内表对象的同时可以隐式地定义一个同名工作区.创建了带表头的内表之后,可以认为程序中存在两个数据对象,一个是内表,另一个与内表结构相同的结构体.如果一个语句中,该名称同时代表内表或同名表的工作区,则需要在内表名称之后加“[]”。

    3.      插入行.(INSERT语句)语法:       INSERT line INTO itab INDEXidx.”通过索引插入单行.       INSERT [line INTO|INITIAL LINE INTO] TABLEitab.”一般性插入语句.对于标准表,不指定索引值,附加至表最后一行,与APPEND语句效果完全一致.对于排序表,插入的行不可以打乱 按照关键字排序的顺序,否则插入不成功.对于哈希表,插入过程中系统按照关键字对行进行定位.INSERTwa_company INTO TABLE itab_company.”将一个内表中的所有行插入到另一个内表中.

    4.      附加行.(APPEND语句)附加行是在一个已经存在的索引表中使 用APPEND语句增添新行.可以对单行或多行进行操作.语法:APPEND [lineTO|INITIAL LINE TO ]itab.”单行APPEND LINES OF Itab1 [FROM n1][TO n2]TO itab2.”多行.

    5.      聚集附加.(COLLECT语句)COLLECT line INTOitab.要求:内表必需为扁平结构,行要与工作区兼容,而且除关键字以外的字段必须为数字类型.

    6.      读取一行.(READ语句)READ TABLE itab [INTO wa| ASSIGNING<fa>] INDEXidx.读取的结果可以是结构与行类型兼容的工作区或字段符号<fs>.如果读取成功,则SY-TABIX返回该行的索引.一般在 访问目标工作区之前,要先用SY-SUBRC字段查看一下读取成功与否.READTABLE itab FROM key [INTO wa|ASSIGNING<fs>].目标数据结构中的关键字段必须已经被预赋值,内表中相同关键字的首个数据行中的其他字段将被读入目标区 域中.READTABLE itab WITH TABLE KEY k1 = f1 …ki = fi [INTO wa |ASSIGNING<fs>].指定表中的所有表关键字段的值,目标结构在操作前可以为任何值,内表数据行整体读入目标区 域.READTABLE itab WITH KEY k1 = f1 …ki = fi [INTO wa|ASSIGNING<fs>].KEY列表可以为任意字段,不一定是表关键字.

    7.      修改一行.(MODIFY语句)MODIFY itab [FROM wa] [INDEX idx][TRANSPORTINGf1,f2…].使用FROM选项指定的工作区域wa代替itab中索引为idx的现有行,一般需要指定INDEX选 项.MODIFYTABLE itab FROM wa [TRANSPORTINGf1,f2…].工作区域wa在语句操作过程中起到双重作用,其一是根据其关键字段的值来确定需要替换的内表的行;其二是根据 其他非关键字段的值来替换内表行中相应字段的数据.如果只希望更新部分字段的值,可以使用TRANSPORTING选项.MODIFYitab FROM wa TRANSPORTING f1,f2…WHERE cond.使用WHERE选项修改多行.

    8.      删除一行.DELETE语句.DELETE itab INDEXidx.如果删除成功,则所有行的索引数减一,SY-SUBRC值为0,如果不存在索引行为idx,则SY-SUBRC返回 4.DELETETABLE itab FROM wa.DELETE TABLE itab WITH KEY k1 = f1…ki =fi.DELETE TABLE [FROM n1 ][TO n2][WHERE<condition>].

    9.      循环处理.LOOP AT itab <result> [FROMn1][TO n2] [WHERE<condition>].       <statement block>.ENDLOOP.

    10.   初始化内表.

    CLEARitab.该语句将内表重置为填充前的状态,该表将不包含任何行.如果内表有表头行,会同时清空内表数据行和表头行的内容.

    CLEAR itab[].只希望初始化内表本身,保留表头行的内容.REFRESHitab.如果内表有表头行,该语句确保只初始化内表本身.FREE itab.使用CLEAR或REFRESH初始化内表后,系统仍保持在内在中为内表预留的空间.该语句可以重置内表并同时释放其内存,而不必先使用 REFRESH或CLEAR语句.…itabIS INITIAL…

    11.  整体复制内表.如果想将内表的全部内容复制到另一个内表中,可以进行整体赋值操作,使用MOVE或”=”.MOVE itab1 TOitab2.Itab1 = itab2.

    12.  比较内表大小.内表可用作逻辑表达式的操作数进行比较.…itab1<operator>itab2… 其中<operator>可以为操作符EQ,=,NE,<>,><,GE,>=,LE,<=,GT,& gt;,LT,<等. 业务表的操作.

     长文本取值,调用系统函数read_text。使用 READ_TEXT(函数) 可以读出 STXL 表中的 LRAW 数据

    数据类型是LRAW,比如:STXL-CLUSTD。LRAW 类型的列,和普通列不同,其实不是简单的对应一个 主特征. 对其数据的读取,要用到 IMPORT和EXPORT...使用 内表 把要存储的数据导入进去,想读取的时候, 再把数据导出到内表,然后进行操作,删除和更新,就和一般关系型表一样. LRAW不可以进行查询操 作. 而且定义包含LRAW的表,要求很多,首先,一个表只能一个这样的列,而且是在最后一列,倒数第2列 是一个INT2类型.连名字都要求固定. 第一列 : MANDT 第二列: RELID ,char类型,2bytes.是表储存的AREA ID. 第三列: 名字可以自己定义,是这个表的KEY 第四列: SRTF2,INT4类型,存的行数 第五列""倒数第三列: 用户自己定义 倒数第二列: CLUSTR, INT2类型,存储的是最有一列的字符数 最后一列: CLUSTD,LRAW类型 其中, 1 ,4,和倒数第2列是系统自动生成.,当然可以把第1列指定为自己生成。

    对于LRAW的读取,不是SELECT语句, 而是IMPORT,举个例子 * From R/3 table zmytable insert internal table itab TYPES: BEGIN OF mytable_line, ? ? ? ? line(3000) TYPE c, ? ? ? END OF mytable_line. DATA itab ?TYPE TABLE OF mytable_line. * CLEAR itab. IMPORT itab ?FROM DATABASE zmytable(hk) ID zmytable-order_no . 说明 ? 关于我这里定义的3000,大家可以自己根据需要定义,lraw字段,定义时,最小是256,实际使用多 少没关系,LRAW的存储,是压缩存储的,所以不能select这个列 ? 以上功能,就是把R/3里面的cluster table : zmytable里面的LRAW列取出来放到ITAB里面. 这里,要先知道存贮在LRAW结构类型,然后定义一个一样的,就可以取出来值了

  • 相关阅读:
    ICEY修改实现ICEY锁血,修改data文件实现主之名关卡重现,顺便改金币
    gg修改器修改聚爆
    MOUSE_OVER 与 ROLL_OVER
    Tween 没有完毕 就停止
    如何将FLex AIR运行环境与AIR程序一起打包(转http://www.awsws.com/?p=94)
    做项目如做人
    flex 打开外部的swf 并调用其方法
    air 零散知识
    贝塞尔曲线的绘制
    air 读取sqlite的Date类型 解决方案
  • 原文地址:https://www.cnblogs.com/bolang100/p/7380760.html
Copyright © 2020-2023  润新知