一、 内表
内表是内存中建立的一个临时表,你可以在程序运行时对表中的数据进行,插入,修改,删除等操作,程序跑完了,就会被释放。
内表是一种十分灵活的大批量数据管理形式,用于在程序运行期间存储多行结构相同的数据。内表的行结构可以是一个简单类型数据,也可以是复杂的结构体甚至内表。而内表的行数是动态的,添加数据后可以循环读取每行数据或者整体操作。内表的使用在 SAP 程序设计中相当重要,因而 ABAP 中提供许多内表处理语句,可以说没有一个实际应用程序中不需要使用到内表。
内表的定义
DATA <ITAB OBJECT> TYPE <LINE TYPE> OCCURS <N>.
DATA <ITAB OBJECT> TYPE <ITAB TYPE>.
DATA:BEGIN OF <ITAB OBJECT> OCCURS <N>,
…,
END OF <ITAB OBJECT>.
1.1 内表的种类
- 标准表,表类型关键字为 STANDARD TABLE,系统为该表的每一行数据生成一个逻辑索引。填充标准表时,可以将数据附加在现有行之后,也可以插入到指定的位置,程序对内表行的寻址操作可通过关键字或索引进行。在对表进行插入、删除等操作时,各数据行在内存中的位置不变,系统仅重新排列各数据行的索引值。
- 排序表,表类型关键字为 SORTED TABLE,也具有一个逻辑索引,不同之处是排序表总是按其表关键字升序排序后再进行存储,其访问方式与标准表相同。
- 哈希表,表类型关键字为 HASHED TABLE,没有索引,只能通过关键字来访问。系统用哈希算法管理表中的数据,因而其寻址一个数据行的时间与表的行数无关。
1.2 表关键字
内表的表关键字在访问内表和内表排序的过程中起着相当重要的作用,在内表定义语句中,使用WITH key指定表关键字,该项为可选项,如果不指定,则系统会使用默认(标准)关键字,如果程序员指定表关键字,则有下列形式:
如果内表行结构是结构体,则可以指定结构体中的某几个字段作为内表关键字,该字段不能是内表或者引用类型,但可以是嵌套结构体。
... WITH [UNIQUE NON-UNIQUE] KEY comp: ... comp,
如果内表的整个行都是由基本类型字段组成的,则可以把内表整行指定为表关键字。如果内表字段本身是结构化类型,则不宜指定整行作为关键字段。
... WITH [UNIQUE NON-UNIQUE]KEY TABLE LINE
如果不指定任何关键字,则可以使用默认的标准关键字,该选项为默认选项。
... WITH [UNIQUE NON-UNIQUE]DEFAULT KEY
标准表:TYPE TABLE OF、TYPE STANDARD TABLE OF
排序表:TYPE SORTED TABLE OF MARC WITH NON-UNIQUE (UNIQUE) KEY K1 K2 KN.
哈希表:TYPE HASHED TABLE OF WITH UNIQUE KEY K1 K2 KN.
1.3 初始内存大小
... INITIAL SIZE n
n值可以为0或者任何正数,除非系统管理员限定一个最大值。无论n值选择为多大,都不会影响程序的正确性,但可能会影响程序效率。如果初始n值小于所需,系统会根据需要自动要求增加内存大小,这个过程需要占用一定的时间,如果n值过大,实际数据的行数少于定义,则会造成内存分配的浪费。所以n值的选择应该尽量接近于实际的需要。如果n值为0或不指定的话,程序会为内表对象分配8KB大小的内存。所以,如果内表比较小,不要把该值设为0,以避免内存浪费。
二、 工作区
程序对内表的行操作不能直接进行,必须通过一种接口来传输,这个接口就是工作区(Work Area,见图)。比如某程序需要从关系数据库中提取数据到内表各行中,必须先将数据读入工作区,然后把工作区中的数据赋给内表的行。工作区必须具有和内表行一致或者可相互转换的数据结构(一般是与内表行类型相同的结构体)。
因此在定义内表对象的同时,还需要定义一个与该内表行结构相同的工作区对象供程序使用,将数据写入内表时,必须首先给工作区赋值,然后在工作区添加或者插入内表。
表头行
ABAP 为程序员提供了一种简单的方法:在创建内表对象的同时可以隐式地定义一个同名工作区,这个同名工作区就叫做表头行或标题行(Header Line),也称作内表工作区。
DATA itab ... WITH HEADER LINE ...
创建内表时,程序员通过该附加项可以决定内表带表头行或不带表头行。
用LIKE定义的内表没有表头,所以使用LIKE定义内表的时候,通常要增加WITH HEADER LINE。
DATA ITAB_COMPANY LIKE TABLE OF COMPANY
WITH UNIQUE KEY NAMEW
WITH HEADER LINE.
创建了带表头行的内表之后,可以认为程序中存在两个数据对象,一个是内表,另一个是与内表行类型相同的结构体。在所有用于操作内表的 ABAP 语句中,均需要指定工作区。但对于带表头行的内表,则可以忽略这一指定,系统隐式使用表头行作为工作区,不等于没有用到工作区。不带表头行的内表没有隐式的工作区,所以要访问没有表头行的内表,必须在相应的 ABAP 语句中显式指定工作区(见图)。
这在给内表操作带来方便的同时也明显增加了混淆,对于既可以操作内表、又可以操作工作区的语句来说,有时不能单独从语法上判断操作对象,需要进行逻辑分析。如果一个语句中,该名称同时可能代表内表或者同名表工作区,则需要在内表名称之后加“[]”指明当前操作的是内表对象。
itab[]
因此笔者不提倡读者使用带有表头行的内表,而是应该总是声明结构相同的其他数据对象作为显示工作区进行内表行操作。
在实际业务中,一般使用定义结构体类型后直接参照此类型定义内表和工作区。例如:
TYPES:
BEGIN OF TY_MARC,
MATNR TYPE MARC-MATNR, "物料编号
WERKS TYPE MARC-WERKS, "工厂
BESKZ TYPE MARC-BESKZ, "采购类型
EKGRP TYPE MARC-EKGRP, "采购组
BSTMI TYPE MARC-BSTMI, "最小批量
END OF TY_MARC.
DATA:
GT_MARC TYPE STANDARD TABLE OF TY_MARC, "内表 定义基本表可省略 STANDARD
GS_MARC TYPE TY_MARC. "工作区
参照已定义的内表定义
DATA <ITAB> LIKE <内表>
参照结构或者数据库定义
DATA <ITAB> TYPE TABLE OF <结构/表>
DATA GT_MARC TYPE TABLE OF TY_MARC
DATA GT_MARC TYPE TABLE OF MARC
其他定义形式
DATA:BEGIN OF itab_company OCCURS 10,
name(20) TYPE c,
address TYPE address,
EDN OF itab_company.
实际上这段语句也声明了一个标准内表,自带工作区,并分配初始内存大小为10行,OCCURS 是ABAP3.0之前声明内表的关键字选项,不建议读者使用,但由于有时系统维护时需要接触旧的 ABAP 代码,这里简单说明一下。
例
*自定义类型内表
TYPES:
BEGIN OF TY_ITAB, "结构类型
FIELD1 TYPE CHAR10,
FIELD2 TYPE INT2,
END OF TY_ITAB.
TYPES: T_ITAB1 TYPE TY_ITAB OCCURS 0. "表类型
TYPES: T_ITAB2 TYPE TABLE OF TY_ITAB. "表类型
DATA:
ITAB1 TYPE TABLE OF TY_ITAB, "内表,参考结构
ITAB2 TYPE T_ITAB1,
ITAB3 TYPE T_ITAB2,
ITAB4 LIKE ITAB1, "参考已定义的表
ITAB11 TYPE TABLE OF MARC. "参考数据库表
*直接定义,定义内表,同时定义同名工作区
DATA:
BEGIN OF ITAB5 OCCURS 0,
FIELD1 TYPE CHAR10,
FIELD2 TYPE INT2,
END OF ITAB5.
BREAK-POINT. "断点方法
F5 单行执行,每一行都执行
F6 直接执行单行语句,不跳进函数
F7 跳出当前函数
F8 继续执行,执行完,或者到下一个断点
命名规则
数据定义(data definitions):
结构(variable type) : TY_
全局变量(global variable): GV_
局部变量(local variable ): LV_
全局内表(global internal table):GT_
全局工作区(global work area):GS_
局部内表(local internal table ): LT_
本地工作区(local work area): LS_
三、 内表操作
初始化
内表的初始化
CLEAR GS_MARC. "清空工作区
CLEAR GT_MARC. "清空内表
REFRESH GT_MARC. "清空并释放内存空间
FREE GT_MARC. "释放内表空间
INSERT
将新行插入到内表中的指定位置,需要使用 INSERT 语句。对于索引表,可以指定某行的索引,则新行将插入该索引所代表的行之前,对于哈希表而言,不能指定行的索引,系统会按照关键字将新行插入其特定位置。给内表插入行可以为单行,也可为多行,甚至可把整个内表的数据插入其他内表中。
通过索引插入
INSERT line INTO itab INDEX idx
一般性插入
INSERT line INTO TABLE itab
但语句中增加了 TABLE 关键字,对于不同的类型的内表,其意义和用法是有区别的:
- 对于标准表而言,该形式不指定索引值,附加至表最后一行,与 APPEND 语句效果完全一致;
- 对于排序表来说,插入的行不可以打乱按照关键字排序的顺序,否则插入不成功;
- 对于哈希表来说,插入过程中系统按照关键宇对行进行定位。
还可以将内表中部分或全部的数据行整体插入到另一个内表中:
INSERT LIENS OF itab1 [FROM n1] [TO n2] INTO [TABLE] itab2 [INDEX idx] .
TYPES:
BEGIN OF TY_MARC,
MATNR TYPE MARC-MATNR, "物料编号
WERKS TYPE MARC-WERKS, "工厂
BESKZ TYPE MARC-BESKZ, "采购类型
EKGRP TYPE MARC-EKGRP, "采购组
BSTMI TYPE MARC-BSTMI, "最小批量
END OF TY_MARC.
DATA:
GT_MARC TYPE TABLE OF TY_MARC, "内表
GS_MARC TYPE TY_MARC. "工作区
GS_MARC-MATNR = '11111'. "物料编号
GS_MARC-WERKS = '101'. "工厂
GS_MARC-BESKZ = 'a'. "采购类型
GS_MARC-EKGRP = 'GR'. "采购组
GS_MARC-BSTMI = '12'. "最小批量
INSERT GS_MARC INTO GT_MARC INDEX 1. "根据索引插入
*INSERT GS_MARC INTO TABLE GT_MARC. "根据关键字插入
*INSERT LIENS OF GT_MARC1 FROM 1 TO 3 INTO GT_MARC2. "插入多行 从1到3行
*INSERT LIENS OF GT_MARC1 INTO GT_MARC2. "插入多行
CLEAR GS_MARC. "一般用工作区之前或之后清除一下工作区
LOOP AT GT_MARC INTO GS_MARC.
WRITE: / GS_MARC-MATNR,GS_MARC-WERKS,GS_MARC-BESKZ,GS_MARC-EKGRP,GS_MARC-BSTMI.
ENDLOOP.
APPEND
附加行是在一个已经存在的索引表(该内表可以为空)中使用 APPEND 语句增添新行。该语句只能操作索引表,哈希表不是以索引作为行的寻址方式,没有系统索引,因而也就不能通过索引进行附加操作。APPEND 语句有几种形式,可以分别附加一或多行。
GS_MARC-MATNR = '22222'. "物料编号
GS_MARC-WERKS = '101'. "工厂
GS_MARC-BESKZ = 'a'. "采购类型
GS_MARC-EKGRP = 'GR'. "采购组
GS_MARC-BSTMI = '12'. "最小批量
APPEND GS_MARC TO GT_MARC.
*APPEND LIENS OF GT_MARC1 TO GT_MARC2."插入多行
*APPEND LIENS OF GT_MARC1 FROM 1 TO 3 TO GT_MARC2."插入多行
CLEAR GS_MARC.
COLLECT
由于在索引表中行与行之间数据具有可重复性,如果使用 APPEND 语句附加行,则多个具有相同表关键字段值的数据行(甚至完全相同的数据行)可以同时存在于一个内表对象中。如果希望在内表中表关键字段能够唯一性确定数据行(即有相同关键学段值的数据行不能重复出现),应该使用 COLLECT 语句根据表关键字附加行,该操作可以应用于所有种类的内表,但是其效果与按照索引附加行是有区别的。
操作时,系统将检查工作区中的标准关键字段值与已经存在于内表中的数据行是否相同(所有非数字字段)。如果不同,COLLECT 语句的作用与 APPEND 语句相似,将新行附加至内表末尾。如果已存在相同表关键字值的行,COLLECT 语句不附加新行,而是将工作区中数字字段的内容累加到已有数据行(该行与工作区具有相同的表关键字值)中数字字段内容之上。操作成功之后,系统字段 SY-TABIX 包含处理过的行的索引。
TYPES:
BEGIN OF TY_MARC,
MATNR TYPE MARC-MATNR, "物料编号
WERKS TYPE MARC-WERKS, "工厂
BESKZ TYPE MARC-BESKZ, "采购类型
EKGRP TYPE MARC-EKGRP, "采购组
BSTMI TYPE MARC-BSTMI, "最小批量
END OF TY_MARC,
*根据物料编号和工厂判断,两个都一致,合并COL的数据,合并数值字段。
*声明时把非数值字段放到下面 只相加i类型
BEGIN OF TY_MARC1,
MATNR TYPE MARC-MATNR, "物料编号
WERKS TYPE MARC-WERKS, "工厂
COL TYPE I, "数量
END OF TY_MARC1.
DATA:
GT_MARC TYPE STANDARD TABLE OF TY_MARC, "内表
GS_MARC TYPE TY_MARC, "工作区
GT_MARC1 TYPE STANDARD TABLE OF TY_MARC1, "内表
GS_MARC1 TYPE TY_MARC1. "工作区
GS_MARC1-MATNR = '11111'."物料编号
GS_MARC1-WERKS = '101'. "工厂
GS_MARC1-COL = 10. "数量
COLLECT GS_MARC1 INTO GT_MARC1.
CLEAR GS_MARC1.
GS_MARC1-MATNR = '11111'."物料编号
GS_MARC1-WERKS = '101'. "工厂
GS_MARC1-COL = 20. "数量
COLLECT GS_MARC1 INTO GT_MARC1.
CLEAR GS_MARC1.
GS_MARC1-MATNR = '22222'."物料编号
GS_MARC1-WERKS = '101'. "工厂
GS_MARC1-COL = 10. "数量
COLLECT GS_MARC1 INTO GT_MARC1.
CLEAR GS_MARC1.
LOOP AT GT_MARC1 INTO GS_MARC1.
WRITE: / GS_MARC1-MATNR,GS_MARC1-WERKS,GS_MARC1-COL.
ENDLOOP.
如图所示,内表 itab 中已经存在4行数据,其中CARR、CONN是表关键字段,是一个航空数据系统中的公司 ID 和航线ID,UMSATZ代表总的机票收入。如果此时添加一行新数据,该数据仍然是LH的0400航班。如果使用APPEND语句,则内表变为5行,如果使用COLLECT语句,则在LH的0400航班原有基础上将收入累加。
READ
READ TABLE GT_MARC INTO GS_MARC INDEX 1.
使用关键字读取
READ TABLE GT_MARC INTO GS_MARC WITH KEY MATNR = '11111' .
根据条件读取
READ TABLE gt_marc INTO gs_marc WITH KEY MATNR = '11111' WERKS = '101'.
IF sy-subrc = 0.
WRITE: / GS_MARC-MATNR,GS_MARC-WERKS,GS_MARC-BESKZ,GS_MARC-EKGRP,GS_MARC-BSTMI.
ELSE.
WRITE:/'取不到值'.
ENDIF.
*循环读取
LOOP AT GT_MARC INTO GS_MARC WHERE WERKS = '101'.
WRITE: / GS_MARC-MATNR,GS_MARC-WERKS,GS_MARC-BESKZ.
ENDLOOP.
MODIFY
使用MODIFY语句更改内表的数据行可以通过索引或关键字进行。根据索引更改内表的语法如下:
GS_MARC-MATNR = '44444'. "物料编号
GS_MARC-WERKS = '104'. "工厂
GS_MARC-BESKZ = 'b'. "采购类型
GS_MARC-EKGRP = 'GR'. "采购组
GS_MARC-BSTMI = '12'. "最小批量
*MODIFY GT_MARC FROM GS_MARC INDEX 2. "更改整行数据
MODIFY GT_MARC FROM GS_MARC INDEX 2 TRANSPORTING WERKS. "更改某个字段的值
MODIFY GT_MARC FROM GS_MARC TRANSPORTING WERKS WHERE MATNR = '22222'. "根据WHERE条件更改某个字段的值
CLEAR GS_MARC.
LOOP AT GT_MARC INTO GS_MARC.
IF GS_MARC-MATNR = '11111'.
GS_MARC-EKGRP = 'C01'. "CR改为C01
MODIFY GT_MARC FROM GS_MARC TRANSPORTING EKGRP. "只改EKGRP这个字段
ENDIF.
WRITE: / GS_MARC-MATNR,GS_MARC-WERKS,GS_MARC-BESKZ,GS_MARC-EKGRP,GS_MARC-BSTMI.
ENDLOOP.
*READ 的 MODIFY 需要指明 INDEX SY-TABIS 当前行
READ TABLE gt_marc INTO gs_marc WITH KEY matnr = '11111'.
IF sy-subrc = 0. "系统变量
GS_MARC-EKGRP = 'C01' "CR改为C01
MODIFY GT_MARC FROM GS_MARC INDEX SY-TABIS. "需指明当前行
WRITE: / GS_MARC-MATNR,GS_MARC-WERKS,GS_MARC-BESKZ,GS_MARC-EKGRP,GS_MARC-BSTMI.
ELSE.
WRITE:/'取不到值'.
ENDIF.
DELETE
对于索引表,可以使用有INDEX选项的DELETE语句通过索引删除行
DELETE GT_MARC INDEX 1.
通过条件删除
DELETE GT_MARC WHERE MATNR = '11111' AND WERKS = '104'.
删除重复数据,执行删除之前一定要排序
SORT GT_MARC BY MATNR.
DELETE ADJACENT DUPLICATES FROM GT_MARC. "保留删除行的第一行,根据排序字段(主键)删除重复数据
SORT GT_MARC BY MATNR. "排序字段得列出要删除的字段
DELETE ADJACENT DUPLICATES FROM GT_MARC COMPARING MATNR. "删除所列字段相同的数据
DELETE ADJACENT DUPLICATES FROM GT_MARC COMPARING ALL FIELDS. "删除所有字段相同的数据
三、 数据库
SQL( Structured Query Language )
- 结构化查询语言
- 用于定义、创建、读取数据库表数据
Native SQL(本地SQL)
- 每种关系型数据库都有其对应的 SQL,是数据库相关的
- 不同的 SAP 系统可能使用各种不 同的数据库,使用本地 SQL 的 ABAP 程序无法适应所有的 SAP 系统
- 可直接对数据库表进行修改删除等,有一定安全风险
- 能实现一些 OpenSQL 无法实现的功能
Open SQL(开放SQL)
- SAP 为 ABAP 定义的数据库无关的 SQL 标准
- 在 ABAP 程序运行时由系统动态的转化成当前数据库使用的本地 SQL
- 在编写程序时不需要考虑 SAP 系统使用的数据库差异
Open SQL 是完全集成到 ABAP 语言中的标准 SQL 子集,其优越之处在于其独立于不同类型的数据库之上,通过 SAP 的数据库接口来识别各种不同的数据库,然后由该接口把SAP的OpenSQL语句自动转换为相应数据库的特定SQL语句,这样SAP程序员就无需去阅读不同数据库的标准SQL文档,而且ABAP程序也因此实现了数据库平台无关性。标准SQL语言中DML语句主要有SELECT(数据查询)、INSERT(数据插入)、UPDATE(数据修改)和DELETE(数据删除)等,在Open SQL中,与之对应的语句包括查询语句SELECT和数据更新语句INSERT、UPDATE、MODIFY和DELETE等。但是,对于SQL语言中的数据定义DDL和数据控制DCL功能,在SAP系统中不能通过Open SQL语句来实现。
ABAP中不包含任何数据定义语句,因而SAP系统中关系数据库表的创建和维护主要是通过数据字典(Data Dictionary)进行的,项目开发人员可以在其中添加新的数据库表。除基本的表结构定义之外,数据库表的创建和维护过程中还需进行其他各种设定,包括外部关键字(外码)、索引和技术设定等。
数据库的操作
关键字 | 功能 |
---|---|
SELECT | 从数据库表中读取数据 |
INSERT | 往数据库表中追加数据 |
UPDATE | 修改数据库表的数据 |
MODIFY | 执行的是INSERT + UPDATE功能。存在此条数据 用update;不存在 就是用insert |
DELETE | 删除数据库表数据 |
SELECT
在查询数据前首先要明白的问题:
- 要读取那些数据
- 从那个表中读
- 要读到那个工作区
- 需要什么条件
SELECT select_clause
FROM from_clause
INTO into_clause
WHERE where_clause .
除了上面的基本结构外还可以添加
- GROUP BY 分组
- HAAVING 分组条件
- ORDER BY 排序(默认升序)
查询单行
DATA: GT_STU TYPE TABLE OF ZYYT_STU WITH HEADER LINE.
SELECT SINGLE
ZSTUID
ZSTUNAME
ZCARID
ZSTUTEL
FROM ZYYT_STU
INTO CORRESPONDING FIELDS OF GT_STU
WHERE ZSTUID = '202002010101'.
CHECK SY-SUBRC = 0.
WRITE: / GT_STU-ZSTUID, GT_STU-ZSTUNAME, GT_STU-ZCARID, GT_STU-ZSTUTEL.
查询多行
TYPES:
BEGIN OF TY_MARC,
MATNR TYPE MARC-MATNR, "物料编号
WERKS TYPE MARC-WERKS, "工厂
BESKZ TYPE MARC-BESKZ, "采购类型
EKGRP TYPE MARC-EKGRP, "采购组
BSTMI TYPE MARC-BSTMI, "最小批量
END OF TY_MARC.
DATA:
GT_MARC TYPE STANDARD TABLE OF TY_MARC,
GS_MARC TYPE TY_MARC.
SELECT *
FROM MARC
INTO CORRESPONDING FIELDS OF TABLE GT_MARC
WHERE WERKS = ''.
"字段顺序与定义的结构顺序要一致 下面这种效率要高一些,但对于数据量小的可以用上面的
SELECT MATNR
WERKS
BESKZ
EKGRP
BSTMI
FROM MARC
INTO TABLE GT_MARC
WHERE WERKS = ''.
"-------------------------------
TYPES:
BEGIN OF TY_MARC,
MATNR TYPE MARC-MATNR, "物料编号
WERKS TYPE MARC-WERKS, "工厂
BESKZ TYPE MARC-BESKZ, "采购类型
EKGRP TYPE MARC-EKGRP, "采购组
BSTMI TYPE MARC-BSTMI, "最小批量
END OF TY_MARC.
DATA:
GT_MARC TYPE STANDARD TABLE OF TY_MARC,
GS_MARC TYPE TY_MARC.
SELECT MATNR
WERKS
BESKZ
EKGRP
BSTMI
FROM MARC
INTO CORRESPONDING FIELDS OF TABLE GT_MARC
UP TO 100 ROWS
WHERE WERKS = '1901'.
LOOP AT GT_MARC INTO GS_MARC.
WRITE: / GS_MARC-MATNR,GS_MARC-WERKS,GS_MARC-BESKZ,GS_MARC-EKGRP,GS_MARC-BSTMI.
ENDLOOP.
Open SQL SELECT常用标准函数:
- COUNT():统计查询总数
- SUM():统计表中某个数值字段的总和
- AVG():统计表中某个数值字段的平均值
- MAX():统计表中某个字段的最大值
- MIN() :统计表中某个字段的最小值。
多表连接
多个表数据连接查询,可以用两种方法实现表连接:
在 ABAP 字典中创建视图,查询时用这个视图作为数据源
使用JOIN语句,跟平常数据库中用到的连接查询基本上相同
- INNER JOIN:查询结果包含两个连接表中彼此相对应的数据记录
- LEFT OUTER JOIN:查询结果集中包含左表中的所有数据记录,右表中仅查询出包含相对应的匹配条件的数据
- FULL OUTER JOIN:包含左右表所有的记录
TYPES:
BEGIN OF TY_MARC_MARA,
MATNR TYPE MARC-MATNR, "物料编号
WERKS TYPE MARC-WERKS, "工厂
MEINS TYPE MARA-MEINS,"基本计量单位
MAKTX TYPE MAKT-MAKTX, "物料描述
BESKZ TYPE MARC-BESKZ, "采购类型
EKGRP TYPE MARC-EKGRP, "采购组
BSTMI TYPE MARC-BSTMI, "最小批量
END OF TY_MARC_MARA.
DATA:
GT_MARC TYPE STANDARD TABLE OF TY_MARC_MARA,
GS_MARC TYPE TY_MARC_MARA.
SELECT MARC~MATNR
MARC~WERKS
MARA~MEINS
MAKT~MAKTX
MARC~BESKZ
MARC~EKGRP
MARC~BSTMI
FROM MARC
INNER JOIN MARA ON MARC~MATNR = MARA~MATNR
INNER JOIN MAKT ON MAKT~MATNR = MARA~MATNR
INTO TABLE GT_MARC
WHERE MARC~WERKS = '1901'
AND makt~spras = '1'.
LOOP AT GT_MARC INTO GS_MARC.
WRITE: / GS_MARC-MATNR,GS_MARC-WERKS,GS_MARC-MEINS,GS_MARC-MAKTX,GS_MARC-BESKZ,GS_MARC-BSTMI.
ENDLOOP.
UPDATE
用于修改数据库表一条或多条数据,根据主键进行修改,主键不可修改
UPDATE实现对数据的更新操作,语法如下:
UPDATE <dbtab> SET f1...fn (WHERE <condition>).
UPDATE <dbtab> FROM TABLE <itab> (WHERE <condition>).
UPDATE <dbtab> FROM <wa>.
UPDATE ZYYT_STU SET ZSTUNAME = '小李' WHERE ZSTUID = '202002010101'.
CHECK sy-subrc = 0.
WRITE:/ '更新成功'.
INSERT
INSERT语句用于对数据的新增操作,语法如下:
INSERT <dbtab> FROM TABLE <itab>.
INSERT <dbtab> FROM <wa>.
DATA:
GT_CLASS TYPE TABLE OF ZYYT_CLASS,
GS_CLASS TYPE ZYYT_CLASS.
*插入单条
GS_CLASS-ZCLASSID = '020106'.
GS_CLASS-ZCLASSNAME = '计算机科学与技术06'.
INSERT ZYYT_CLASS FROM GS_CLASS.
*插入多条
GS_CLASS-ZCLASSID = '090301'.
GS_CLASS-ZCLASSNAME = '数字与媒体01'.
APPEND GS_CLASS TO GT_CLASS.
GS_CLASS-ZCLASSID = '090302'.
GS_CLASS-ZCLASSNAME = '数字与媒体02'.
APPEND GS_CLASS TO GT_CLASS.
INSERT ZYYT_CLASS FROM TABLE GT_CLASS.
CHECK sy-subrc = 0.
WRITE:/ '插入成功'.
MODIFY
修改数据 MODIFY ,根据主键,修改其他值,不改其他值则为空。如果主键不存在,则插入一条新数据
MODIFY操作是用于修改数据库中的数据:
MODIFY <dbtab> FROM <wa>.
MODIFY <dbtab> FROM TABLE <itab>.
如表中不存在符合条件的数据时会添加新数据MODIFY拥有 INSERT 和 UPDATE的操作动作
通过MODIFY修改的数据效率比较低下
LS_STUDENT-ZSTUID = '10003'.
LS_STUDENT-ZSTUNAME = '小五'.
LS_STUDENT-SEX = '女'.
LS_STUDENT-ZSTUPHONE = '147258'.
LS_STUDENT-ZSCHOOLID = '102'.
LS_STUDENT-ZSCNAME = '山东大学'.
MODIFY ZTSTU_INFO FROM LS_STUDENT.
DELETE
DELETE 语句用于删除表中的数据,语法如下:
DELETE FROM <dbtab> WHERE <condition>.
DELETE FROM <dbtab>.
DELETE <dbtab> FROM TABLE <itab>.