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 :

CLASS myClass DEFINITION.

PUBLIC SECTION.

Constructor IMPORTING id TYPE string.

ENDCLASS.

2. 定义变量的方式上,两者有一定的区别

Java:

private  int  myNum

ABAP:

PRIVATE SECTION.

DATA myNum TYPE i.

3. ABAP也可以抛出异常

Java:

public void getMynum(int myNum, 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 <result> [INTO <target>] [FROM<source>] [WHERE <condition>]
                [GROUP BY <fields>] [ORDER BY <sortorder>]
其中: <result>指定要抓取的字段
       <target>将读取的记录存放在work area中
       <source>指定从那个TABLE中读取资料
       <condition>抓取资料的条件
        <fields>指定按那些字段分组
        <sortorder>排序的字段及方式
相关的系统变量:
       SY-SUBRC = 0   表示读取数据成功
                <> 0 表示未找到符合条件的记录
       SY-DBLNT: 被处理过的记录的笔数.
相关的命令:
       EXIT.退出循环.
       CHECK <logisticstatement>.如果逻辑表达式成立,则继续执行,否则,开
                            始下一次循环.
◆ .利用循环方式读取所有记录
SELECT ….ENDSELECT.是循环方式读取记录的.
       例如:
TABLES MARD.
SELECT [DISTINCT] * FROM MARD WHERE MATNR =‘3520421700’.
      <Statements>.
ENDSELECT.
(从MARD中抓取所有料号=3520421700的资料)
◆读取一笔资料
TABLES MARD.
SELECT SINGLE * FROM MARD WHERE MATNR =‘3520421700’.
(从MARA中抓取一笔料号=3520421700的资料)
◆将读取的记录放在work area中,并且加入Internaltable 中.
格式有:
     ... INTO <workarea>
     ... INTO CORRESPONDINGFIELDS OF <work area>
     ... INTO (f1, ...,fn) 变量组.
     ... INTO TABLE<internal table>
     ... INTO CORRESPONDINGFIELDS OF TABLE <internal table>
     ... APPENDING TABLE<internal table>
     ... APPENDINGCORRESPONDING FIELDS OF TABLE <internal 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’.
        <Statements>.
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 <g1>    AND   <g2>
例如:    WHERE YEAR BETWEEN 1995 AND 2000.
(2) LIKE <g>
例如:    WHERE NAME LIKE ‘MIKE%’.
(‘%’是通配符号)
(3) IN (<g1>…<gn>)
是<g1>…<gn>里面的任意一个值即可.
例如: WHERE PLANT IN (‘CHUNGLI’, ‘TAOYUAN’,’LIUTU’).
(表示PLANT 只要是’CHUNGLI’或’TAOYUAN’或’LIUTU’都可以).

2. INSERT 语句
◆从workarea 加入到Internal Table中
格式: INSERT INTO <database> VALUES <work area>
例如: 
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<internal table>
例如:
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 <itab1> FROM TABLE <itab2>[ACCEPTING DUPLICATE KEY]
将<itab2>中非NULL的资料加入<itab1>中,加上[ACCEPTINGDUPLICATE KEY]能限制相同PRIMARY KEY不重复加入.

3. MODIFY 语法
MODIFY <internal table> [FROM <workarea>].

4. DELETE 语法
       DELETE <internaltable> [FROM <work area>].
      或:DELETE <internal table> [WHERE <conditions>]

5. DATABASE CURSOR
     Database Cursor是一个数据库暂存区, 将经SELECT指令读取的记录存放至此暂存区, 再由此暂存区放至Work Area中,可减少数据库读取的次数.
1.开启 Database Cursor
    语法:
          OPEN   CURSOR    <c>    FOR    SELECT…    WHERE <condition>
          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    <c>    INTO   <wa>
           Example:
                    FETCH    NEXT   CURSOR    C1    INTO    WA.
    读取下一笔Cursor位置的数据存入WA, 如果已无资料可读, SY-SUBRC <>0. 
关闭 Database Cursor
语法:
        CLOSE   CURSOR    <c>
        Example:
                CLOSE    CURSOR    C1.

6.    COMMIT WORK & ROLLBACK WORK
要确定资料成功写入数据库,可使用COMMIT WORK指令,如: 
     COMMIT    WORK.
相反的, 如果反悔要复原, 可使用ROLLBACK    WORK, 可复原在上个COMMIT WORK指令之后的数据, 如:
     ROLLBACK   WORK.

二、使用NATIVE SQL指令
语法格式:
EXEC SQL [PERFORMING <form>].
      <statements>
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 <form name>的使用:
如果NATIVE SQL的SELECT命令执行结果是抓到多笔记录,我们想要逐笔记录处理时,就用PERFORMING参数,这个FORM能被逐次调用.如果想中止调用,就用EXITFORM SQL结束调用.
例如:
DATA: F1(3), F2(3), F3(3).

F3 = '010'
EXEC SQL PERFORMING WRITE_AVERI_CLNT.
   SELECT CLIENT, ARG1 INTO :F1, :F2FROM AVERI_CLNT
          WHERE ARG2= :F3
ENDEXEC.
FORM WRITE_AVERI_CLNT.
   WRITE: / F1, F2.
ENDFORM.
注意:
a. NATIVE SQL把TABLE中的MANDT(client)字段当作一般字段使用,所以在抓取资料时必须指定特定的Client;
b.   NATIVE SQL中的SELECT语句没有CHECK权限的功能;
c. 在登入SAP R/3系统时,我们已经自动与Database连接,所以在执行NATIVE
SQL时并不需要CONNECT语句;
d. 一条NATIVE SQL语句可以以分号;结束,一般情况下是以句号.结束.
e. 某些数据库系统对TABLE名字和FIELD名字有大小写区别,要正确书写.
f. 在NATIVE SQL中,双引号”不表示注释.

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.

ABAP简介以及OpenSQL与NativeSQL的区别相关推荐

  1. ML之ME/LF:机器学习中的模型评估指标/损失函数(连续型/离散型)的简介、损失函数/代价函数/目标函数之间区别、案例应用之详细攻略

    ML之ME/LF:机器学习中的模型评估指标/损失函数(连续型/离散型)的简介.损失函数/代价函数/目标函数之间区别.案例应用之详细攻略 目录 损失函数的简介 损失函数/代价函数/目标函数之间区别 损失 ...

  2. left join 和join区别_sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇

    Object中的wait.notify.notifyAll,可以用于线程间的通信,核心原理为借助于监视器的入口集与等待集逻辑 通过这三个方法完成线程在指定锁(监视器)上的等待与唤醒,这三个方法是以锁( ...

  3. java 轻量级同步volatile关键字简介与可见性有序性与synchronized区别 多线程中篇(十二)...

    概念 JMM规范解决了线程安全的问题,主要三个方面:原子性.可见性.有序性,借助于synchronized关键字体现,可以有效地保障线程安全(前提是你正确运用) 之前说过,这三个特性并不一定需要全部同 ...

  4. ML:置信区间的简介(精密度/准确度/精确度的三者区别及其关系)、使用方法、案例应用之详细攻略

    ML:置信区间的简介(精密度/准确度/精确度的三者区别及其关系).使用方法.案例应用之详细攻略 目录 置信区间的简介 置信区间的简介 1.案例理解置信区间

  5. 总线制和多线制示意图_知识||RS485简介及与其他总线网络的区别

    点击关注仪表之家,实际可行的为仪表工/自控/热工解决检修时问题 一.RS485简介 智能仪表是随着80年代初单片机技术的成熟而发展起来的,现在世界仪表市场基本被智能仪表所垄断.究其原因就是企业信息化的 ...

  6. RSTP快速生成树简介、RSTP与STP的区别、RSTP BPDU字段信息、RSTP角色与端口状态介绍、RSTP工作过程之P/A机制详细分解)

    2.11.0 以太网 RSTP快速生成树(简介.RSTP与STP.RSTP BPDU.RSTP端口状态.RSTP工作过程之P/A机制) RSTP快速生成树 简介 RSTP.STP的区别 RSTP BP ...

  7. SAP系统的开发语言--ABAP简介

    这是我给公司内部杂志投稿的一篇文章,目的在于向不了解SAP开发的同事介绍SAP的开发技术.发在这里,希望对各位希望学习SAP开发技术的朋友有帮助. ABAP的全称是Advanced Business ...

  8. docker(虚拟化,沙箱(沙盒),简介,docker和vm的区别,安装,基本操作,基本使用) 镜像的操作 容器的操作 使用mysql镜像 使用canda创建虚拟环境

    一.docker 1.概念介绍 虚拟化: 是一种资源的管理技术,将计算机中的实体资源,进行抽象,然后呈现出来,目的是为了打破实体结构之间的不可分割障碍,使用户以更好的组态使用资源 形象化形容如下: 我 ...

  9. Nosql简介 Redis,Memchche,MongoDb的区别

    Nosql介绍 Nosql的全称是Not Only Sql,这个概念早起就有人提出,在09年的时候比较火.Nosql指的是非关系型数据库,而我们常用的都是关系型数据库.就像我们常用的mysql,sql ...

最新文章

  1. 为何 short s1 = 1; 是对的,而 float f=3.4; 是错的?
  2. The Maximum Unreachable Node Set
  3. mysql问题定位_十、MySQL的SQL优化之定位SQL的问题 - 系统的撸一遍MySQL
  4. 如何在Java JVM中处理图像和视频
  5. Meet Fabric8:基于Camel和ActiveMQ的开源集成平台
  6. 解决IntelliJ创建Maven项目一直显Loading archetype list
  7. 怎么实现hover_web前端CSS实现一个粒子动效的按钮
  8. 文件不混淆_Python代码保护 | pyc 混淆从入门到工具实现
  9. 运维人员需重视非技术能力(老鸟经验分享)
  10. netron神经网络可视化
  11. 智鼎逻辑推理题及答案_PreTalent职场说|2020常见校招笔试题型解析
  12. c语言标准库函数大全用法,C 标准库函数
  13. 基于三相VSR的SVPWM调制
  14. 人类简史 - ZhiMap思维导图 (转载)
  15. php编写一个简单计算器程序,PHP做一个简单的计算器
  16. 安卓开发培训!一次违反常规的安卓大厂面试经历,实战解析
  17. 计算机英语五人对话,英文应聘对话5人的急求一篇英语对话 关于应聘的 最好是五人的...
  18. 《炬丰科技-半导体工艺》--技术资料合集十
  19. 广东计算机专a院校,广东大专院校排名_广东省专A/专B院校排名
  20. 开源的SDN路由交换项目(翻译)

热门文章

  1. 裂变实操:1个模型+4个步骤,教你打造流量的自循环系统
  2. 技术型产品经理与系统设计
  3. PMCAFF | 知识梳理:30分钟搞定用户需求
  4. linux 服务器安装mysql5.6
  5. 横向ListView(四) —— 添加滚动条
  6. 优达学城数据分析师纳米学位——P3项目知识点整理及代码分析 xml文件解析
  7. 非常好用的两个PHP函数 serialize()和unserialize()
  8. SQL注入思维导图【新手全面非详细】
  9. 第二章 创建webGL设备和绘制缓冲区呈现 Context Creation and Drawing Buffer Presentation
  10. nginx_upsteam