第四课 内表

文章展示了在ABAP编程中如何定义和使用结构体,包括两种定义方式,以及结构体的赋值方法。同时,文章详细解释了内表的创建,如标准表、排序表和哈希表,并演示了内表的追加、读取和数据处理操作,如二分查找和分类汇总。
摘要由CSDN通过智能技术生成

*&---------------------------------------------------------------------*
*& 结构体的定义
*&---------------------------------------------------------------------*

* 第一种方式
DATA:
  BEGIN OF ST_ADD1,
    FLAG    TYPE CHAR01,                         " 标识
    ID      TYPE ZWMQ_E_CODE,                    " ID
    NAME1   TYPE ZSTD_WMQ001-Z_NAME,             " 名称
    Z_SCHID TYPE ZSTD_WMQ001-Z_SCHID,            " 城市
  END OF ST_ADD1,
  BEGIN OF ST_ADD3,
    FLAG     TYPE CHAR01,                         " 标识
    ID       TYPE ZWMQ_E_CODE,                    " ID
    NAME1    TYPE ZSTD_WMQ001-Z_NAME,             " 名称
    Z_SCHID  TYPE ZSTD_WMQ001-Z_SCHID,            " 城市
    Z_SCHID2 TYPE ZSTD_WMQ001-Z_SCHID,            " 城市
  END OF ST_ADD3.

* 第二种方式(推荐方式)
TYPES:
  BEGIN OF TS_ADD,
    FLAG     TYPE CHAR01,                         " 标识
    ID       TYPE ZWMQ_E_CODE,                    " ID
    NAME1    TYPE ZSTD_WMQ001-Z_NAME,             " 名称
    Z_SCHID  TYPE ZSTD_WMQ001-Z_SCHID,            " 城市
    Z_SCHFEE TYPE ZSCH_WMQ001-Z_SCHFEE,            " 城市
  END OF TS_ADD.
DATA:
  ST_ADD2 TYPE TS_ADD.

*&---------------------------------------------------------------------*
*& 结构体的赋值
*&---------------------------------------------------------------------*
WRITE:'结构体的赋值'.
ST_ADD1-FLAG = ABAP_TRUE.
ST_ADD1-ID = 1001.
ST_ADD1-NAME1 = 'TEXT01'.
ST_ADD1-Z_SCHID = '101'.
WRITE:/ ST_ADD1-FLAG,
      ST_ADD1-ID,
      ST_ADD1-NAME1,
      ST_ADD1-Z_SCHID.

*相同的结构体之间赋值
SKIP.
WRITE:'相同的结构体之间赋值'.
MOVE ST_ADD1 TO ST_ADD2.
ST_ADD2 = ST_ADD1.
WRITE: / ST_ADD2-FLAG,
      ST_ADD2-ID,
      ST_ADD2-NAME1,
      ST_ADD2-Z_SCHID.

SKIP.
WRITE:'存在差异的结构体之间赋值'.
MOVE-CORRESPONDING ST_ADD1 TO ST_ADD3.

WRITE: / ST_ADD3-FLAG,
      ST_ADD3-ID,
      ST_ADD3-NAME1,
      ST_ADD3-Z_SCHID,
      ST_ADD3-Z_SCHID2.

*&---------------------------------------------------------------------*
*& 内表的定义
*&---------------------------------------------------------------------*
DATA:
  I_ADD1 TYPE TABLE OF TS_ADD, "标准表
  I_ADD2 TYPE STANDARD TABLE OF TS_ADD, "标准表
  I_ADD3 TYPE SORTED TABLE OF TS_ADD WITH UNIQUE KEY FLAG, "排序表
  I_ADD4 TYPE HASHED TABLE OF TS_ADD WITH UNIQUE KEY FLAG. "哈希表

* 带表头的内表
DATA I_ADD5 LIKE TABLE OF ST_ADD3 WITH HEADER LINE.
DATA I_ADD6 TYPE TABLE OF TS_ADD WITH HEADER LINE.
DATA:
  BEGIN OF I_ADD7 OCCURS 0,
    FLAG    TYPE CHAR01,                         " 标识
    ID      TYPE ZWMQ_E_CODE,                    " ID
    NAME1   TYPE ZSTD_WMQ001-Z_NAME,             " 名称
    Z_SCHID TYPE ZSTD_WMQ001-Z_SCHID,            " 城市
  END OF I_ADD7.

* 往内表追加数据
APPEND ST_ADD1 TO I_ADD1.
ST_ADD1-ID = 1002.
APPEND ST_ADD1 TO I_ADD1.
ST_ADD1-ID = 1003.
APPEND ST_ADD1 TO I_ADD1.


WRITE:/ '输出内表数据'.
LOOP AT I_ADD1 INTO ST_ADD1.
  WRITE: / SY-TABIX.
  WRITE: / ST_ADD1-FLAG,
        ST_ADD1-ID,
        ST_ADD1-NAME1,
        ST_ADD1-Z_SCHID.

ENDLOOP.

IF SY-SUBRC = 0.

  MESSAGE '数据遍历成功' TYPE 'S'." S 成功 W 警告 I 提示 都是没问题  E 错误 A 异常 有错误的

ELSE.
*  MESSAGE '数据遍历失败' TYPE 'E'.
  MESSAGE '数据遍历失败' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.

*这个时候是把它当成结构使用
I_ADD5-FLAG      = 'X' .
I_ADD5-ID        = '1005'.
I_ADD5-NAME1     = 'TEST05'.
I_ADD5-Z_SCHID   = '101'.
I_ADD5-Z_SCHID2  = '101'.

*APPEND I_ADD5.
APPEND I_ADD5 TO I_ADD5[].
SKIP.
WRITE '输出带表头的内表'.
LOOP AT I_ADD5[] INTO I_ADD5.

  WRITE: / I_ADD5-FLAG,
        I_ADD5-ID,
        I_ADD5-NAME1,
        I_ADD5-Z_SCHID.

ENDLOOP.
*&---------------------------------------------------------------------*
*& 读取内表数据
*&---------------------------------------------------------------------*
CLEAR ST_ADD1.
READ TABLE I_ADD1 INTO ST_ADD1
  WITH KEY ID = '1003'.

SKIP.
WRITE: '读取内表数据1'.
WRITE: / ST_ADD1-FLAG,
      ST_ADD1-ID,
      ST_ADD1-NAME1,
      ST_ADD1-Z_SCHID.

* 二分查找法(内表排序)
SORT I_ADD1 BY FLAG ASCENDING ID ASCENDING."ASCENDING 升序 默认升序
*SORT I_ADD1 BY FLAG  ID ."ASCENDING 升序 默认升序
*SORT I_ADD1 BY FLAG DESCENDING ID DESCENDING."DESCENDING 降序
CLEAR ST_ADD1.
READ TABLE I_ADD1 INTO ST_ADD1
  WITH KEY FLAG = ABAP_TRUE
           ID = '1002'
  BINARY SEARCH.
SKIP.
WRITE: '二分查找法'.
WRITE: / ST_ADD1-FLAG,
      ST_ADD1-ID,
      ST_ADD1-NAME1,
      ST_ADD1-Z_SCHID.

* 指定行次读取
CLEAR ST_ADD1.
READ TABLE I_ADD1 INTO ST_ADD1 INDEX 1.
SKIP.
WRITE: '指定行次读取INDEX 1'.
WRITE: / ST_ADD1-FLAG,
      ST_ADD1-ID,
      ST_ADD1-NAME1,
      ST_ADD1-Z_SCHID.

* 读取TRANSPORTING
*CLEAR ST_ADD1.
*READ TABLE I_ADD1 INTO ST_ADD1 INDEX 1 TRANSPORTING FLAG ID.
*SKIP.
*WRITE: '指定行次读取INDEX 1 TRANSPORTING FLAG ID'.
*WRITE: / ST_ADD1-FLAG,
*      ST_ADD1-ID,
*      ST_ADD1-NAME1,
*      ST_ADD1-Z_SCHID.
*
*READ TABLE I_ADD1 TRANSPORTING NO FIELDS
*  WITH KEY ID = '1002'.
*
*IF SY-SUBRC = 0.
*  WRITE:'存在'.
*ELSE.
*  WRITE:'不存在'.
*ENDIF.

* 内表分类汇总(COLLECT TABLE …)

*这个时候是把它当成结构使用

CLEAR:I_ADD2,"清空内表
      ST_ADD2."清空结构体
ST_ADD2-FLAG      = 'X' .
ST_ADD2-ID        = '1005'.
ST_ADD2-NAME1     = 'TEST05'.
ST_ADD2-Z_SCHID   = '101'.
ST_ADD2-Z_SCHFEE  = 1000.
COLLECT ST_ADD2 INTO I_ADD2.

CLEAR ST_ADD2.
ST_ADD2-FLAG      = 'X' .
ST_ADD2-ID        = '1005'.
ST_ADD2-NAME1     = 'TEST05'.
ST_ADD2-Z_SCHID   = '101'.
ST_ADD2-Z_SCHFEE  = 2000.
COLLECT ST_ADD2 INTO I_ADD2.

LOOP AT I_ADD2 INTO DATA(ST_ADD2_2)
  WHERE ID <> '1002'.

  WRITE: / '测试collect'.
  WRITE: / ST_ADD2_2-FLAG,
        ST_ADD2_2-ID,
        ST_ADD2_2-NAME1,
        ST_ADD2_2-Z_SCHID,
        ST_ADD2_2-Z_SCHFEE.
  EXIT."退出循环语句
ENDLOOP.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值