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 :?
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的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ABAP】Native SQL
- 下一篇: Oracle数据库分组函数详解