ABAP的全称是Advanced Business Application Programming-高级业务应用编程语言,mySAP ECC 6.0的底层源代码,全部是使用ABAP编写的。因此,想要对系统进行二次开发,包括功能开发,报表开发,接口开发,都要使用到ABAP语言。
首先,我介绍一下APAB开发平台的相关特性
从某种意义上讲,ABAP不仅仅是一门开发语言,ABAP DEVELOP WORKBENCH(ABAP开发平台)不仅仅是一个开发工具,而更像是一套基于SAP myERP软件套件的完整的client/server开发环境。对比一下,微软的Visiual Studio就是一个开发环境,VB,VC++等是开发工具。
我们看一下SAP开发环境的三层架构示意图
1. Presentation(表示层)---------由很多的SCREEN组成
2. Application(应用层)--------处理用户逻辑,一般的开发是在Application层面进行的
3. Database(数据库层)-----向应用层提供数据
Presentation(表示层)是面向用户的程序界面,由很多的SCREEN组成,Application(应用层)处理用户逻辑,向下连接Database(数据库层)获取数据。一般的开发是在Application层面进行的,根据用户需求的不同修改或添加相应的业务逻辑。当某些业务要求无法通过系统默认的输入界面实现的时候,也可以在Presentation层添加特定的用户界面。
得益于和SAP的紧密结合,ABAP在报表开发方面效率很高。
在数据库访问方面,ABAP可以使用native SQL和open SQL两种方式。使用native SQL,开发环境会把SQL语句直接发送给底层的数据库,可以获得较快的执行速度,但是由于没有经过开发环境的校验,出现错误的时候很难跟踪。open SQL是集成在ABAP开发环境中的SQL语言,可以和ABAP代码写在一起,结合使用。在ABAP字典中实现了透明表对底层数据库表的映射,我们在ABAP中使用open SQL进行操作的时候是与具体数据库类型无关的。open SQL通过读取透明表,实现对数据库表的操作。
下面从编程语言本身讲一下ABAP的语言特点。
ABAP是一种解释型语言,和VB有一点类似,可以跟踪程序的执行过程,还可以在跟踪过程中对变量赋值,这对于追踪程序的Bug是很有帮助的。当然,由于解释型语言的自身缺陷,相对于编译型的语言,ABAP的执行速度比较慢。最初几个版本的ABAP,并不支持面向对象技术,所编写的程序都是面向过程的。随着技术的发展,ABAP在新的版本中,加入了对面向对象技术的支持。
现在Java作为通用的开发语言,为众人所熟悉,我们看一下ABAP与Java在语法和所支持的特性方面,有那些相同点和不同点。
ABAP与Java相似,支持类的定义:
Java:Class myClass{
Public myClass(string id){
}
}
ABAP:CLASSmyClass DEFINITION.
PUBLIC SECTION.
Constructor IMPORTING id TYPEstring.
ENDCLASS.
2. 定义变量的方式上,两者有一定的区别
Java:privateintmyNum
ABAP:PRIVATE SECTION.
DATA myNum TYPE i.
3. ABAP也可以抛出异常
Java:public void getMynum(intmyNum, myClass example)
Throws myClassException.
ABAP: PUBLIC SECTION.
METHODS:
getMynum IMPORTING
myNum
example TYPE REF TO myClass
RAISINGcx_myClass
从以上几点可以看出,ABAP和Java除了语法格式的不同,在面向对象技术的支持方面有着很大的相似性。
当然,两者之间还是存在很多的区别的,最大的区别是,ABAP是集成在SAP系统上的,底层是SAP的ABAP虚拟机,用来开发C/S架构的程序。Java属于通用的开发语言,可以进行各种领域各种平台的开发,底层是JVM,一般开发基于B/S架构的程序
我们在编写ABAP4程序的时候,经常需要从TABLE中根据某些条件读取数据,.读取数据最常用的方法就是通过SQL语法实现的.
ABAP/4中可以利用SQL语法创建或读取TABLE,SQL语法分为DDL(DATA DEFINE LANGUAGE)语言和DML(DATAMULTIPULATION LANGUAGE)语言,DDL语言是指数据定义语言,例如CREATE等,DML语言是数据操作语言,例如SELECT,INSERT等语句. SQL语句有OPENSQL语句和NATIVE SQL语句. OPEN SQL语句不是标准SQL语句,是ABAP/4语言,利用OPENSQL语句能在Databases 和Command 之间产生一个BUFFER,所以它有一个语言转换的过程.
而NATIVE SQL语句则是标准的SQL语句,它直接针对Databases操作.
一. OPEN SQL
OPEN SQL 语句包含有: SELECT,INSERT,UPDATE,MODIFY,DELETE,OPEN CURSOR, FETCH,CLOSECURSOR,COMMIT WORK,ROLLBACK WORK等.
1. SELECT语句
语法格式:
SELECT
[GROUP BY
其中:
指定从那个TABLE中读取资料
相关的系统变量:
SY-SUBRC = 0 表示读取数据成功
<> 0 表示未找到符合条件的记录
SY-DBLNT: 被处理过的记录的笔数.
相关的命令:
EXIT.退出循环.
CHECK
始下一次循环.
◆ .利用循环方式读取所有记录
SELECT ….ENDSELECT.是循环方式读取记录的.
例如:
TABLES MARD.
SELECT [DISTINCT] * FROM MARD WHERE MATNR =‘3520421700’.
ENDSELECT.
(从MARD中抓取所有料号=3520421700的资料)
◆读取一笔资料
TABLES MARD.
SELECT SINGLE * FROM MARD WHERE MATNR =‘3520421700’.
(从MARA中抓取一笔料号=3520421700的资料)
◆将读取的记录放在work area中,并且加入Internaltable 中.
格式有:
... INTO
... INTO CORRESPONDINGFIELDS OF
... INTO (f1, ...,fn) 变量组.
... INTO TABLE
... INTO CORRESPONDINGFIELDS OF TABLE
... APPENDING TABLE
... APPENDINGCORRESPONDING FIELDS OF TABLE
举例一:
TABLES MARD.
DATA: BEGIN OF ITAB OCCURS 10,
MATNR LIKE MARD-MATNR,
WERKS LIKE MARD-WERKS,
LGORT LIKE MARD-LGORT,
LABST LIKE MARD-LABST,
END OFITAB.
SELECT MATNR WERKS LGORT LABST
INTO CORRESPONDING FIELDS OF ITAB
FROM MARD
WHERE MATNR = ‘3520421700’.
APPENDITAB.
CLEAR ITAB.
ENDSELECT.
(将读取的结果放在Internal table ITAB中)
举例二.
TABLES MARD.
SELECT MATNR MTART MAKTX INTO (t_matnr, t_mtart, maktx)
FROM MARD
WHERE MATNR = ‘3520421700’.
ENDSELECT.
(从MARD中抓取料号=3520421700的料号、类型和描述,放在变量t_matnr,t_mtart, maktx中)。
◆按指定的字段排序
TABLES SBOOK.
SELECT * FROM SBOOK WHERECARRID = ‘LH’ AND
CONNID = ‘0400’ AND
FLDATE = ‘19950228’
ORDER BY BOOKID [ASCENDING/DESCENDING].
WRITE: /SBOOK-BOOKID, SBOOK-CUSTOMID,
SBOOK-CUSTTYPE, SBOOK-SMOKER,
SBOOK-LUGGWEIGHT, SBOOK-WUNIT,
SBOOK-INVOICE.
ENDSELECT.
(利用参数ORDER BY所指定的字段排序)
◆抓取数据的条件叙述
(1) BETWEEN
例如: WHERE YEAR BETWEEN 1995 AND 2000.
(2) LIKE
例如: WHERE NAME LIKE ‘MIKE%’.
(‘%’是通配符号)
(3) IN (
是
例如: WHERE PLANT IN (‘CHUNGLI’, ‘TAOYUAN’,’LIUTU’).
(表示PLANT 只要是’CHUNGLI’或’TAOYUAN’或’LIUTU’都可以).
2. INSERT 语句
◆从workarea 加入到Internal Table中
格式: INSERT INTO
例如:
DATA: BEGIN OF WA,
CODE(6) TYPE C,
NAME(30) TYPE C,
END OF WA.
DATA: VEN LIKE WA OCCURS 10.
…
WA-CODE = ‘530120’.
WA-NAME = ‘XINGDAELECTRONICS CO.,LTD’.
INSERT INTO VEN VALUES WA .
如果work area的名称就是internal table的名称,可以直接写成:
INSERT
例如:
DATA: BEGIN OF WA OCCURS 10,
CODE(6) TYPE C,
NAME(30) TYPE C,
END OF WA.
…
WA-CODE = ‘530120’.
WA-NAME = ‘XINGDAELECTRONICS CO., LTD’.
INSERT WA.
◆从另外一个Internal table中INSERT 资料
格式:
INSERT
将
3. MODIFY 语法
MODIFY
4. DELETE 语法
DELETE
或:DELETE
5. DATABASE CURSOR
Database Cursor是一个数据库暂存区, 将经SELECT指令读取的记录存放至此暂存区, 再由此暂存区放至Work Area中,可减少数据库读取的次数.
1.开启 Database Cursor
语法:
OPEN CURSOR
Example:
TABLES SPFLI.
DATA: WA LIKE SPFLI,
C1 TYPE CURSOR.
OPEN CURSOR C1 FORSELECT * FROM SPFLI
WHERE AREA =’TAIWAN’.
2.读取Database Cursor的资料存入 Work Area
语法:
FETCH NEXT CURSOR
Example:
FETCH NEXT CURSOR C1 INTO WA.
读取下一笔Cursor位置的数据存入WA, 如果已无资料可读, SY-SUBRC <>0.
关闭 Database Cursor
语法:
CLOSE CURSOR
Example:
CLOSE CURSOR C1.
6. COMMIT WORK & ROLLBACK WORK
要确定资料成功写入数据库,可使用COMMIT WORK指令,如:
COMMIT WORK.
相反的, 如果反悔要复原, 可使用ROLLBACK WORK, 可复原在上个COMMIT WORK指令之后的数据, 如:
ROLLBACK WORK.
二、使用NATIVE SQL指令
语法格式:
EXEC SQL [PERFORMING
ENDEXEC.
举例一.
EXEC SQL.
CREATE TABLE AVERI_CLNT (
CLIENT CHAR(3) NOT NULL,
ARG1 CHAR(3) NOT NULL,
ARG2 CHAR(3) NOT NULL,
FUNCTIONCHAR(10) NOT NULL,
PRIMARYKEY (CLIENT, ARG1, ARG2)
)
ENDEXEC.
举例二.
DATA: F1(3), F2(3), F3(3).
F3 = ' 1 '
EXEC SQL.
SELECT CLIENT, ARG1 INTO :F1, :F2FROM AVERI_CLNT
WHERE ARG2= :F3
ENDEXEC
PERFORMING
REPORT ZUPDATABATCH.
EXEC SQL.
UPDATE MCH1 set CHARG = 'FRANK1' where MATNR = 'Z11' and CHARG = 'frank1' and MANDT = '001'
UPDATE MCHA set CHARG = 'FRANK1' where MATNR = 'Z11' and CHARG = 'frank1' and MANDT = '001'
UPDATE MCHB set CHARG = 'FRANK1' where MATNR = 'Z11' and CHARG = 'frank1' and MANDT = '001'
endexec.