ABAP

**ABAP**（高級商務應用編程）是一種高級語言，由德國軟體公司 SAP 開發。目前，和最近引入的 Java 一起，ABAP 主要用作 SAP 的編程。這個伺服器軟體是 SAP NetWeaver 平台的一部分，這個平台主要用來開發商務應用。ABAP 支持有面向過程和物件導向。

## 歷史

ABAP 作為一種面向特定應用的第四代程式語言最早在 20 世紀 80 年代開發。它原本是作為一種報表語言應用在 SAP R/2 上，這是一個幫助大型公司在大型機上建立原材料管理和財務會計管理商務應用的平台。ABAP 本來也是德語_**A**llgemeiner **B**erichts**a**ufbereitungs**p**rozessor_ 的縮寫，意思是「通用報表預處理器」。ABAP 第一次引入了「邏輯資料庫」的概念，它在基本的資料庫層提供了更高級的抽象。

ABAP 程式語言最初被 SAP 的開發者用於開發 SAP R/3 平台。但它也被設計讓 SAP 的客戶用於增強 SAP 的軟體應用–客戶可以用 ABAP 編程開發自定義的報表和界面。這個程式語言對於程式設計師來說很容易學習但並不是一個非程序設計人員可以直接使用的工具。編寫 ABAP 程序需要良好的編程技巧和關係資料庫方面的知識，如果知道物件導向設計的概念更好。

雖然 SAP 最早於 1992 年就發布了 R/3，但 ABAP 現在仍可以用於為 R/3 系統編寫程序。在 20 世紀 90 年代，隨著計算機硬體的發展，越來越多的 SAP 的應用軟體和系統都用 ABAP 來實現。一直到 2001 年，幾乎所有的基本功能都是由 ABAP 編程實現的。在 1999 年，SAP 在發布 R/3 4.6 版的同時也發布了一個對 ABAP 的物件導向擴展，叫做 ABAP Objects。

SAP 最新的開發平台 NetWeaver 同時支持 ABAP 和 Java。

## 實現

### ABAP 程序運行在哪裡？

所有的 ABAP 程序都駐留在 SAP 資料庫里。他們不像 Java 或者 C++ 程序那樣存儲在一個單獨的外部文件里，在資料庫里所有的 ABAP 代碼都以兩種形式存在：可以用 ABAP workbench 查看和編輯的原始碼和由 ABAP 運行環境載入和解釋的「編譯」代碼（技術上更精確地說是「產生」代碼）。當一段 ABAP 原始碼第一次被調用時會隱含的進行代碼產生。如果稍後原始碼改變了或者程序訪問的對象改變了（比如資料庫的表添加了新的欄位），產生代碼就會自動重新產生。

ABAP 程序在運行時系統（SAP 核心的一部分）的控制下運行在 SAP 應用伺服器里。運行時系統負責處理 ABAP 語句，控制顯示的邏輯序列和響應事件（比如，用戶按一下屏幕上的一個按鈕）。ABAP 運行時系統的一個關鍵組件是資料庫接口，它把 ABAP 的資料庫無關語句（「開放 SQL」）變成底層資料庫管理系統可以理解的語句（「本地 SQL」）。資料庫接口處理 ABAP 程序和關係資料庫之間所有的通信；它也有一些其他的作用，比如把經常訪問的數據緩存到應用伺服器本地的存儲器里。

### SAP 系統和部署方案

所有的 SAP 數據和軟體都存在／運行於 **SAP 系統**的環境中。這個系統包括一個中心關係資料庫和一個或多個訪問該資料庫里的數據和程序的應用伺服器（「實例」）。一個 SAP 系統至少包括一個實例，但可以更多，主要看大小和性能上的需求。在一個多實例系統中，負載平衡機制來保證負載比較平均的分攤到各個可用的應用伺服器上。 
典型安裝的 Web 應用伺服器（**部署方案**）包括三個系統：一個用於開發，一個用於測試和質量保證，一個用於生產。這個部署方案可以包含更多的系統，比如一個單獨用於單元測試和產前測試的系統，或者也可以不完全包含這三個系統，比如只有開發和生產，沒有單獨的質量保證系統；但三個是最常見的。ABAP 程序的創建和首次運行都在開發系統裡。然後被分發到部署方案的其他系統裡。這些都是在變化和傳輸系統（CTS）的控制下進行的。CTS 是一個負責並發控制（比如防止兩個開發人員同時修改同一段代碼），版本管理和在質量保證和產品系統上部署程序的系統。

Web 應用伺服器有三層組成：資料庫層，應用層和表現層。這些層可以在同一台或不同的物理機器上運行。資料庫層包括關係資料庫及相關軟體。應用層包括系統的實例。所有應用相關的過程，包括業務事務和 ABAP 開發，都運行在應用層。表現層處理和系統的用戶之間的交互。對 ABAP 應用伺服器的在線訪問可以通過專用圖形接口 SAPGUI 或者瀏覽器進行。

## ABAP 程序的類型

ABAP 有兩種不同類型的程序：

### 報表程序

**報表程序**遵循一個相對簡單的編程模型，用戶可選的輸入一系列參數（比如，在一個數據子集上的選擇），然後程序根據輸入的參數以一個交互式列表的形式產生一張報表。報表程序的輸出之所以是交互式的是因為它不是一個被動的顯示；它允許用戶使用 ABAP 語言通過深入挖掘功能以獲得某個數據更細節的視圖，或者通過菜單命令觸發更深入的處理，比如按不同的方式排序數據或者按某種選擇條件過濾數據。這種表現報表的方法有很大的優勢，特別是對於那些需要處理大量信息但又要以很靈活的方式來檢查這些信息的用戶，這樣他們就不會再被限制到一種固定的顯示形式或者大小上無法管理的列表形式的報表中了。這種方便的開發交互式報表的方式是 ABAP 語言的一大重要閃光點。 
「報表」這個詞有時會給人一種誤解，其實創建數據可以在底層資料庫修改而不僅僅是只讀的報表程序是完全可以的。

### 在執行緒序

**在執行緒序**（也叫模塊池）不產生列表。這些程序使用一系列的屏幕來定義更複雜的用戶交互模式。術語「屏幕」是指用戶看到的實際的物理圖像。每個屏幕還有一個「流邏輯」；這是指由屏幕觸發的 ABAP 代碼，比如初始化屏幕，響應用戶請求的應答和控制模塊池的屏幕之間的序列的邏輯。每個屏幕都有自己的流邏輯，每個流邏輯都分為「PBO」（輸出前處理）和「PAI」（輸入後處理）部分。在 SAP 的文檔中，術語「dynpro」（動態程序）用來表示這種屏幕和流邏輯的結合。 
在執行緒序並不是通過名字調用的，而是和一段事務代碼聯繫在一起。用戶可以通過自定義，角色依賴，事務菜單來觸發它們。

除了報表和在執行緒序外，以類庫，功能庫和子程序池的形式開發共享代碼段也是可以的。

## ABAP Workbench

ABAP Workbench 有幾個不同的工具用於編輯容器對象。這些工具可以為你提供涵蓋整個軟體開發周期各階段的輔助。創建和編輯容器對象的最重要的工具有： 
**ABAP Editer**：編寫程序代碼 
**ABAP Dictionary**：處理資料庫表定義，檢索全局類型 
**Menu Painter**：設計用戶界面（包括菜單欄，標準工具欄，應用欄，配置功能鍵） 
**Screen Painter**：為用戶對話框設計屏幕（動態程序） 
**Function Builder**：顯示和處理功能模塊 
**Class Builder**：顯示和處理 ABAP 對象類

## 參看

* ERP software
* asXML

## 外部連結

* SAP Help Portal（頁面存檔備份，存於網際網路檔案館）
* ABAPin the SAP Developer NetworkPortuguese Web Archive 的存檔，存檔日期 2008-10-22
* Useful SAP articles
* SAP Tutorials（頁面存檔備份，存於網際網路檔案館）
* ABAP Objects（頁面存檔備份，存於網際網路檔案館）