课程目标:1)了解Open SQL和Native SQL
2)使用Open SQL对数据表进行增删查改
3)Native SQL的简单示例
4)LUW(Logical Unit of Works ,作业逻辑单元)
一、 Open SQL 和Native SQL
在ABAP中,可以使用Open SQL 或者是Native SQL进行数据库的操作。
(1) 用Native SQL访问数据库允许使用特定数据库的命令。这需要关于语法的细节知识。使用了Native SQL命令的程序在被传输到不同的系统环境(不同的数据库系统)后会需要附加的编程,因为基于特定数据库的SQL命令语法通常需要调整。
(2) Open SQL命令是与数据库无关的,它们被数据库接口自动转化为相应的SQL语句,并被传输给数据库。一个用Open SQL操作的ABAP程序就是数据库无关的,可以在任何R/3系统中使用它而无需调整。
(3) 使用Open SQL的另一个好处是可以在应用程序上缓存SAP表,以便快速的读取,这也意味着减少了数据库加载。在分别对表做了设置后,数据会自动从缓冲区读出
(4) Open SQL命令集只包含数据操作语言(DML)的操作,不包含数据定义语言(DDL)的操作,是因为这些操作包含在ABAP字典中。
(5) 只有在必须用到某些Native SQL功能,而Open SQL没有提供时,才用Native SQL实现数据库访问。
二、 Open SQL 执行的返回值 和影响的
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
数量
所有Open SQL命令都提供了关于数据库操作执行成功还是失败的返回信息。这个消息传输一个返回码给系统字段sy-subrc . sy-subrc 如果为0 意味着操作成功完成,所有其它值意味着发生了错误。另外,系统变量sy-dbcnt显示了刚才的数据库操作实际执行所影响的记录数量。
三、 Open SQL 权限检查
Open SQL命令不执行任何自动的权限检查,需要在程序中明确的执行这些权限检查。
四、 Client
(1) Client即客户端、集团。在一个SAP中可以分为多个Client,不同的Client数据完全不同。实际上一个服务器的数据都是放在相同的表中的,它们通过MADNT这个字段来保存Client信息并进行区分,所建数据为该Client独享。MADNT为SAP Table保留字,一般情况下必填。
(2) SAP 系统是客户端系统。客户端概念是就业务而言彼此独立的若干个企业可以在一个系统中并行运行。就组织而言,客户端是系统中的独立单元。每个客户端都有自己的数据环境,因此也就有自己的主数据、交易数据和分配的用户主记录。
(3) 从法律和组织的角度来说,客户端是系统中的独立单元。决定是否设置客户端之前,应该考虑以下几点:
A. 客户端之间不经常交换数据。
B. 如果有员工更改了客户端,就必须重新创建人员编号。
五、 Open SQL 访问Client相关的表
(1) 如果在Open SQL 命令中没有使用CLIENT SPECIFIED 附加关键字,在WHERE 子句中就不能指定Client,则只会访问当前运行的Client的相应数据。
(2) 如果想要处理所有其他Client的数据,必须在Open SQL 命令中指定附加关键字CLIENT SPECIFIED,并且在相应的WHERE 子句中指定Client。
(3) 注意,如果包含了附加关键字CLIENT SPECIFIED 的Open SQL 命令没有指定集团的话,就会访问所有Client。
六、 Open SQL—INSERT命令
6.1 插入单条数据
INSERT INTO <数据表> VALUES <结构>
INSERT ITNO <数据表> [CLIENT SPECIFIED] FROM <结构>
(1) 其中,<结构>必须与<数据表>结构相同;在命令被调用前把要插入的行放到结构中。
(2) 只有在指定了CLIENT SPECIFIED 附加关键字的情况下,结构中的CLIENT字段才会被使用。如果没有附加关键字,则使用当前的CLIENT。
(3) 还可以用视图来插入行。然而,视图必须已经在ABAP 字典中创建,并且维护状态设置为“读和修改”,此外还只能包含来自表的字段。
(4) INSERT 命令有以下返回码
0:成功插入行。
4:由于已经存在相同主键的行,因此无法插入。
6.2 插入多条数据
INSERT <数据表> FROM TABLE <内表> [ACCEPTING DUPLICATE KEYS]
(1) 其中,<内表> 必须跟<数据表>具有相同的行结构
(2) 与插入单条记录的时候一样,只有在指定了CLIENT SPECIFIED 附加关键字的情况下,<内表>中的Client字段才会被使用。如果没有这个附加关键字,则使用当前Clinet。
(3) 如果可以创建所有行,sy-subrc 就会设置为0;但是,即使只有一行不能被创建,也发生运行时错误这意味着整个插入操作都会被放弃(数据库回滚)。如果这时,想要把可以插入的行都真正插入数据库,就使用命令的附加关键字ACCEPTING DUPLICATE KEYS。如果发生了错误,这个附加关键字抑制运行时错误(包括数据库回滚),设置返回值(sy-subrc)为4,并且插入所有没有错误的记录。系统字段sy-dbcnt 包含了成功插入数据库的行数。
七、 Open SQL ---SELECT
例1:利用结构读取单条记录
data : wa type spfli.
select single carrid connid cityfrom cityto
into CORRESPONDING FIELDS OF wa
from spfli
where carrid = '117' and connid = '2222'.
if sy-subrc = 0.
write : / wa-carrid,wa-connid,wa-cityfrom,wa-cityto.
else.
write : / 'No Records!'.
endif.
例2:重复行的处理
DATA: itab TYPE STANDARD TABLE OF spfli,
wa LIKE LINE OF itab.
DATA: line(72) TYPE c,
list LIKE TABLE OF line(72).
line = ' CITYFROM CITYTO '.
APPEND line TO list.
SELECT DISTINCT (list)
INTO CORRESPONDING FIELDS OF TABLE itab
FROM spfli.
IF sy-subrc EQ 0.
LOOP AT itab INTO wa.
WRITE: / wa-cityfrom, wa-cityto, wa-carrid.
ENDLOOP.
ENDIF.
例3:AVG()---求平均值 SUM()---求总和
方式一:
DATA: average TYPE p DECIMALS 2,
SUM TYPE p DECIMALS 2.
SELECT AVG( luggweight ) SUM( luggweight )
INTO (average, SUM)
FROM sbook.
WRITE: / 'Average:', average,
/ 'Sum :', SUM.
方式二:
DATA: BEGIN OF luggage,
average TYPE p DECIMALS 2,
sum TYPE p DECIMALS 2,
END OF luggage.
SELECT AVG( luggweight ) AS average SUM( luggweight ) AS sum
INTO CORRESPONDING FIELDS OF luggage
FROM sbook.
WRITE: / 'Average:', luggage-average,
/ 'Sum :', luggage-sum.
例4:当where条件为动态的时候
将用户在选择屏幕上输入的值拼接成where条件,然后使用 select … from <数据表> where (<内表>)
data: cond(72) type C,
itab like table OF cond.
PARAMETERS: city1(10) type C, city2(10) type C.
data wa type spfli-cityfrom.
concatenate 'cityfrom = ''' city1 '''' into cond.
append cond to itab.
concatenate 'OR cityfrom = ''' city2 '''' into cond.
append cond to itab.
concatenate 'OR cityfrom = ''' 'BERLIN' '''' into cond.
append cond to itab.
write : / '拼接后的where条件为:'.
LOOP AT itab into cond.
write : / cond.
ENDLOOP.
SELECT cityfrom into wa FROM spfli WHERE (itab).
write / wa.
ENDSELECT.
八、 Open SQL---UPDATE命令
8.1
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
一:UPDATE <数据表> FROM
(1) 必须跟被更新的数据表具有相同的结构
(2)同样,只有指定了 CLIENT SPECIFIED 附加关键字后,存在于
中的Client字段才会被使用,否则就使用当前Client。
8.2 方法二:UPDATE <数据表> SET <字段1> = <值1>
<字段2> = <值2>
….
<字段n> = <值n>
WHERE
(1) 只有使用SET 附加关键字指定的字段会在数据库端被用指定的值覆盖。
(2) 可以在SET 附加关键字中指定数值字段的简单计算操作,例如:f = g,f = f + g,f = f - g。
8.3 方法三:UPDATE <数据表> FROM TABLE <内表>
九、 Open SQL---MODIFY命令
MODIFY [CLIENT SPECIFIED] FROM .
MODIFY [CLIENT SPECIFIED] FROM TABLE .
(1) MODIFY 命令是SAP 特有的,它覆盖了两个命令 UPDATE 和INSERT。如果在MODIFY 语句中指定的数据记录存在,这条记录就被更新;如果在MODIFY 语句中指定的数据记录不存在,这条记录就被插入。
(2) MODIFY 操作同样可以作用于视图,对视图的规定如前所述。视图必须已经在ABAP 字典中创建,并且维护状态为“允许读和写”,所有字段都必须在表中。
一十、 Open SQL---DELETE命令
DELETE <数据表> FROM <结构>
DELETE FROM <数据表> [CLINET SPECIFIED] WHERE
一十一、 示例程序(测试Open SQL中INSET DELETE UPDATE SELECT命令)
REPORT ZABAPLEAN5_3.
tables : spfli.
data : it_tab like table of spfli.
data : it_tab_wa like line of it_tab.
PARAMETERS : t_carrid like spfli-carrid OBLIGATORY,
t_connid like spfli-connid OBLIGATORY,
t_cifrom like spfli-cityfrom .
write : / '屏幕上的数据为'.
write : / 't_carrid=' , t_carrid, 't_connid=', t_connid .
"根据用户在屏幕上的选择,修改结构it_tab_wa
it_tab_wa-carrid = t_carrid.
it_tab_wa-connid = t_connid.
"将屏幕上的数据插入表spfli中.
insert into spfli values it_tab_wa.
if sy-subrc = 0.
write : / '数据插入成功'.
else.
write : / '数据插入失败'.
endif.
"查询当前表的记录
select * from spfli into CORRESPONDING FIELDS OF TABLE it_tab.
data : amount type i .
amount = lines( it_tab ).
write : / '数据库中数据条数为:',amount.
loop at it_tab into it_tab_wa.
write : / it_tab_wa-carrid ,it_tab_wa-connid .
endloop.
"删除所有carrid 为'1111'的数
delete from spfli where carrid = '111'.
"记住这个地方要重新查询数据表
select * from spfli into CORRESPONDING FIELDS OF TABLE it_tab.
amount = LINES( it_tab ).
WRITE : / '删除所有carrid 为‘111’的记录之后,数据库中数据条数为:',amount.
LOOP AT it_tab INTO it_tab_wa.
WRITE : / it_tab_wa-carrid ,it_tab_wa-connid .
ENDLOOP.
"修改carrid = '117'的记录的cityto = '纽约', cityfrom = '旧金山'
update spfli set cityto = '纽约'
cityfrom = '旧金山'
where carrid = '117'.
SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE it_tab where carrid = '117'.
amount = LINES( it_tab ).
WRITE : / 'carrid = 117的所有记录条数为:',amount.
LOOP AT it_tab INTO it_tab_wa.
WRITE : / it_tab_wa-carrid ,it_tab_wa-connid ,it_tab_wa-cityfrom,it_tab_wa-cityto.
ENDLOOP.
一十二、 Native SQL
EXEC SQL [PERFORMING