• ABAP简介以及OpenSQL与NativeSQL的区别


    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 <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.

  • 相关阅读:
    20个命令行工具监控 Linux 系统性能【转载】
    机器学习及部分NLP相关网上的代码资源整理
    职场中脱颖而出的成长秘诀【转载】
    美好的诗词
    其实这是一种生活方式【转载】
    10个非常有趣的Linux命令【转载】
    如何摆脱工具类【转载】
    在线公开课 | 如何基于模型训练平台快速打造AI能力?
    企业应用架构演化探讨:从微服务到Service Mesh
    生命的价值——大型科技公司的时间“减”史
  • 原文地址:https://www.cnblogs.com/communist/p/7976086.html
Copyright © 2020-2023  润新知