
- SAP ABAP 教程
- SAP ABAP - 首頁
- SAP ABAP - 概述
- SAP ABAP - 環境
- SAP ABAP - 螢幕導航
- SAP ABAP - 基本語法
- SAP ABAP - 資料型別
- SAP ABAP - 變數
- SAP ABAP - 常量和字面量
- SAP ABAP - 運算子
- SAP ABAP - 迴圈控制
- SAP ABAP - 決策
- SAP ABAP - 字串
- SAP ABAP - 日期和時間
- SAP ABAP - 資料格式化
- SAP ABAP - 異常處理
- SAP ABAP - 字典
- SAP ABAP - 資料域
- SAP ABAP - 資料元素
- SAP ABAP - 表
- SAP ABAP - 結構
- SAP ABAP - 檢視
- SAP ABAP - 搜尋幫助
- SAP ABAP - 鎖物件
- SAP ABAP - 模組化
- SAP ABAP - 子程式
- SAP ABAP - 宏
- SAP ABAP - 函式模組
- SAP ABAP - 包含程式
- SAP ABAP - Open SQL 概述
- SAP ABAP - Native SQL 概述
- SAP ABAP - 內部表
- SAP ABAP - 建立內部表
- ABAP - 填充內部表
- SAP ABAP - 複製內部表
- SAP ABAP - 讀取內部表
- SAP ABAP - 刪除內部表
- SAP ABAP - 面向物件
- SAP ABAP - 物件
- SAP ABAP - 類
- SAP ABAP - 繼承
- SAP ABAP - 多型性
- SAP ABAP - 封裝
- SAP ABAP - 介面
- SAP ABAP - 物件事件
- SAP ABAP - 報表程式設計
- SAP ABAP - 對話程式設計
- SAP ABAP - 智慧表單
- SAP ABAP - SAPscript
- SAP ABAP - 使用者出口
- SAP ABAP - 使用者出口
- SAP ABAP - 業務附加功能 (Business Add-Ins)
- SAP ABAP - Web Dynpro
- SAP ABAP 有用資源
- SAP ABAP - 問答
- SAP ABAP 快速指南
- SAP ABAP - 有用資源
- SAP ABAP - 討論
SAP ABAP 快速指南
SAP ABAP - 概述
ABAP 代表高階業務應用程式程式設計 (Advanced Business Application Programming),一種第四代語言 (4GL)。目前,它與 Java 一起被定位為 SAP 應用伺服器程式設計的主要語言。
讓我們從 SAP 系統的高階架構開始。典型 SAP 系統的三層客戶端/伺服器架構如下所示。

**表示層**由任何可用於控制 SAP 系統的輸入裝置組成。這可以是 Web 瀏覽器、移動裝置等等。所有中央處理都在**應用伺服器**中進行。應用伺服器本身不僅僅是一個系統,它可以是處理系統的多個例項。伺服器與通常儲存在單獨伺服器上的**資料庫層**進行通訊,這主要是出於效能原因以及安全原因。系統各層之間會進行通訊,從表示層到資料庫,然後沿鏈向上返回。
**注意** - ABAP 程式在應用伺服器級別執行。軟體的技術分發與其物理位置無關。這意味著基本上所有三個級別都可以安裝在一臺計算機上,或者每個級別可以安裝在不同的計算機或伺服器上。
ABAP 程式駐留在 SAP 資料庫中。它們在執行時系統的控制下執行,執行時系統是 SAP 核心的一部分。執行時系統處理所有 ABAP 語句,控制流程邏輯並響應使用者事件。
因此,與 C++ 和 Java 不同,ABAP 程式不儲存在單獨的外部檔案中。在資料庫中,ABAP 程式碼存在兩種形式:
可以使用 ABAP 工作臺工具檢視和編輯的**原始碼**。
**生成的程式碼**,這是一種二進位制表示。如果您熟悉 Java,則此生成的程式碼有點類似於 Java 位元組碼。
執行時系統可以被認為是虛擬機器,類似於 Java 虛擬機器。ABAP 執行時系統的一個關鍵元件是資料庫介面,它將資料庫無關語句 (Open SQL) 轉換為底層資料庫 (Native SQL) 可以理解的語句。SAP 可以與各種資料庫一起工作,並且相同的 ABAP 程式可以在所有這些資料庫上執行。
SAP ABAP - 環境
報表是熟悉一般 ABAP 原則和工具的一個很好的起點。ABAP 報表用於許多領域。在本節中,我們將看到編寫簡單的 ABAP 報表是多麼容易。
你好,ABAP
讓我們從常見的“Hello World”示例開始。
每個 ABAP 語句都以 ABAP 關鍵字開頭,以句點結尾。關鍵字之間必須至少有一個空格。使用一行還是多行對於 ABAP 語句來說並不重要。
您需要使用 ABAP 編輯器輸入程式碼,它是隨 SAP NetWeaver Application Server ABAP(也稱為“AS ABAP”)提供的 ABAP 工具的一部分。
“AS ABAP”是一個具有自己的資料庫、ABAP 執行時環境和 ABAP 開發工具(如 ABAP 編輯器)的應用伺服器。“AS ABAP”提供了一個獨立於硬體、作業系統和資料庫的開發平臺。
使用 ABAP 編輯器
**步驟 1** - 啟動事務 SE38 以導航到 ABAP 編輯器(下一節中討論)。讓我們開始建立一個報表,它是許多 ABAP 物件之一。
**步驟 2** - 在編輯器的初始螢幕上,在 PROGRAM 輸入欄位中指定報表的名稱。您可以將其名稱指定為 ZHELLO1。前面的 Z 對名稱很重要。Z 確保您的報表位於客戶名稱空間中。
客戶名稱空間包含所有以 Y 或 Z 開頭的物件。當客戶或合作伙伴建立物件(如報表)時,始終使用它來區分這些物件與 SAP 的物件,並防止與物件發生名稱衝突。
**步驟 3** - 您可以使用小寫字母鍵入報表名稱,但編輯器會將其更改為大寫。因此,ABAP 物件的名稱“不”區分大小寫。
**步驟 4** - 指定報表名稱後,單擊“建立”按鈕。將彈出 ABAP:程式屬性彈出視窗,您將在其中提供有關報表的更多資訊。
**步驟 5** - 選擇“可執行程式”作為報表型別,輸入標題“我的第一個 ABAP 報表”,然後選擇“儲存”繼續。接下來將彈出“建立物件目錄條目”視窗。選擇“本地物件”按鈕,彈出視窗將關閉。
您可以透過在 REPORT 語句下方輸入下面的 WRITE 語句來完成您的第一個報表,以便完整的報表僅包含如下所示的兩行:
REPORT ZHELLO1. WRITE 'Hello World'.
啟動報表
我們可以使用鍵盤 (Ctrl + S) 或儲存圖示(命令欄位右側)來儲存報表。ABAP 開發在 AS ABAP 中進行。
啟動報表與儲存報表一樣簡單。單擊“啟用”按鈕(啟動圖示左側),然後使用“直接處理”圖示或 F8 功能鍵啟動報表。“我的第一個 ABAP 報表”標題以及輸出“Hello World”也將顯示。以下是輸出:
My First ABAP Report Hello World
只要您不啟用新的報表或啟用對現有報表的更改,它與它們的使用者就無關。這在中央開發環境中很重要,在該環境中,您可能正在處理其他開發人員在其專案中使用的物件。
檢視現有程式碼
如果您檢視“程式”欄位並雙擊值 ZHELLO1,ABAP 編輯器將顯示您的報表程式碼。這稱為“向前導航”。雙擊物件的名稱會在相應的工具中開啟該物件。
SAP ABAP - 螢幕導航
為了理解 SAP ABAP,您需要了解登入、ABAP 編輯器、登出等基本螢幕。本章重點介紹螢幕導航和標準工具欄功能。
登入螢幕
登入到 SAP 伺服器後,SAP 登入螢幕將提示您輸入使用者 ID 和密碼。您需要提供有效的使用者 ID 和密碼並按 Enter 鍵(使用者 ID 和密碼由系統管理員提供)。以下是登入螢幕。

工具欄圖示
以下是 SAP 螢幕工具欄。

**選單欄** - 選單欄是對話方塊視窗的頂行。
**標準工具欄** - 此工具欄中提供了大多數標準功能,例如頁面頂部、頁面底部、頁面上移、頁面下移和儲存。
**標題欄** - 標題欄顯示您當前所在的應用程式/業務流程的名稱。
**應用程式工具欄** - 這裡提供了特定於應用程式的選單選項。
**命令欄位** - 我們可以在不瀏覽選單事務的情況下啟動應用程式,並且一些邏輯程式碼被分配給業務流程。在命令欄位中輸入事務程式碼以直接啟動應用程式。
ABAP 編輯器
您可以啟動事務 SE38(在命令欄位中輸入 SE38)以導航到 ABAP 編輯器。

標準鍵和圖示
**退出鍵**用於退出程式/模組或登出。它們還用於返回到上次訪問的螢幕。
以下是 SAP 中使用的標準退出鍵,如影像所示。

以下是檢查、啟用和處理報表的選項。

登出
完成工作後,始終養成從 ABAP 編輯器或/和從 SAP 系統登出的良好習慣。

SAP ABAP - 基本語法
語句
ABAP 源程式由註釋和 ABAP 語句組成。ABAP 中的每個語句都以關鍵字開頭,以句點結尾,並且 ABAP “不”區分大小寫。
程式中的第一行非註釋行以 REPORT 字開頭。報表始終是建立的任何可執行程式的第一行。該語句後跟先前建立的程式名稱。然後用句點結束該行。
語法為:
REPORT [Program_Name]. [Statements…].
這允許語句在編輯器中佔用任意多行。例如,REPORT 可能如下所示:
REPORT Z_Test123_01.
語句由命令和任何變數和選項組成,以句點結尾。只要句點出現在語句的結尾,就不會出現問題。正是這個句點標誌著語句的結束位置。
讓我們編寫程式碼。
在 REPORT 語句下面的行上,只需鍵入此語句:Write ‘ABAP 教程’。
REPORT Z_Test123_01. Write 'This is ABAP Tutorial'.
**編寫語句時要考慮的四件事**:
write 語句將引號中的內容寫入輸出視窗。
ABAP 編輯器會將所有文字轉換為大寫,但文字字串除外,文字字串用單引號括起來。
與一些較舊的程式語言不同,ABAP 不關心語句在一行中從何處開始。您可以利用這一點,並透過使用縮排表示程式碼塊來提高程式的可讀性。
ABAP 對語句的佈局沒有限制。也就是說,可以在一行上放置多個語句,或者一個語句可以跨越多行。
冒號表示法
如果每個語句的開頭都相同,則可以將連續語句連結在一起。這是透過冒號 (:) 運算子和逗號完成的,它們用於終止各個語句,就像句點結束普通語句一樣。
下面是一個可以節省一些按鍵操作的程式示例:
WRITE 'Hello'. WRITE 'ABAP'. WRITE 'World'.
使用冒號表示法,可以這樣改寫:
WRITE: 'Hello', 'ABAP', 'World'.
與任何其他 ABAP 語句一樣,佈局無關緊要。這是一個同樣正確的語句:
WRITE: 'Hello', 'ABAP', 'World'.
註釋
內聯註釋可以透過兩種方法之一在程式中的任何位置宣告:
整行註釋透過在行的第一位放置一個星號 (*) 來指示,在這種情況下,系統認為整行都是註釋。註釋不需要用句點結束,因為它們不能跨越多行:
* This is the comment line
部分行註釋透過在語句後輸入雙引號 (“) 來指示。雙引號後的所有文字都被系統視為註釋。您不需要用句點結束部分行註釋,因為它們不能跨越多行:
WRITE 'Hello'. "Here is the partial comment
注意 - ABAP 編輯器不會將註釋程式碼大寫。
抑制空格
NO-ZERO 命令位於 DATA 語句之後。它抑制包含空格的數字欄位的所有前導零。輸出通常更容易讓使用者閱讀。
示例
REPORT Z_Test123_01. DATA: W_NUR(10) TYPE N. MOVE 50 TO W_NUR. WRITE W_NUR NO-ZERO.
以上程式碼產生以下輸出:
50
注意 - 沒有 NO-ZERO 命令,輸出為:0000000050
空行
SKIP 命令有助於在頁面上插入空行。
示例
訊息命令如下:
WRITE 'This is the 1st line'. SKIP. WRITE 'This is the 2nd line'.
上述訊息命令產生以下輸出:
This is the 1st line This is the 2nd line
我們可以使用 SKIP 命令插入多行空行。
SKIP number_of_lines.
輸出將是按行數定義的幾行空行。SKIP 命令還可以將游標定位在頁面上的所需行上。
SKIP TO LINE line_number.
此命令用於動態向上和向下移動頁面上的游標。通常,此命令之後會出現 WRITE 語句,以將輸出放在所需行上。
插入行
ULINE 命令會自動在輸出中插入一條橫線。也可以控制線的長度和位置。語法很簡單:
ULINE.
示例
訊息命令如下:
WRITE 'This is Underlined'. ULINE.
以上程式碼產生以下輸出:
This is Underlined (and a horizontal line below this).
訊息
MESSAGE 命令顯示在程式開始時 REPORT 語句中指定的訊息 ID 定義的訊息。訊息 ID 是一個 2 個字元的程式碼,用於定義程式在使用 MESSAGE 命令時將訪問的 1000 條訊息集。
訊息編號從 000 到 999。每個編號都與最多 80 個字元的訊息文字相關聯。呼叫訊息編號時,將顯示相應的文字。
以下是與 Message 命令一起使用的字元:
訊息 | 型別 | 後果 |
---|---|---|
E | 錯誤 | 訊息出現,應用程式在其當前點停止。如果程式在後臺模式下執行,則作業將被取消,並且訊息將記錄在作業日誌中。 |
W | 警告 | 訊息出現,使用者必須按 Enter 鍵才能繼續應用程式。在後臺模式下,訊息將記錄在作業日誌中。 |
I | 資訊 | 將開啟一個包含訊息文字的彈出視窗,使用者必須按 Enter 鍵才能繼續。在後臺模式下,訊息將記錄在作業日誌中。 |
A | 異常終止 | 此訊息類將取消使用者當前使用的交易。 |
S | 成功 | 這會在螢幕底部提供一條資訊訊息。顯示的資訊性質積極,僅供使用者反饋。訊息不會以任何方式妨礙程式。 |
X | 中止 | 此訊息將中止程式並生成 ABAP 短轉儲。 |
錯誤訊息通常用於阻止使用者執行他們不應該執行的操作。警告訊息通常用於提醒使用者其操作的後果。資訊訊息為使用者提供有用的資訊。
示例
當我們為訊息 ID AB 建立訊息時,MESSAGE 命令 - MESSAGE E011 會給出以下輸出:
EAB011 This report does not support sub-number summarization.
SAP ABAP - 資料型別
在 ABAP 中程式設計時,我們需要使用各種變數來儲存各種資訊。變數只不過是保留的記憶體位置以儲存值。這意味著當您建立變數時,您會在記憶體中保留一些空間。您可能希望儲存各種資料型別的資訊,例如字元、整數、浮點數等。根據變數的資料型別,作業系統會分配記憶體並決定可以在保留的記憶體中儲存什麼。
基本資料型別
ABAP 為程式設計師提供了豐富的固定長度和可變長度資料型別。下表列出了 ABAP 基本資料型別:
型別 | 關鍵字 |
---|---|
位元組欄位 | X |
文字欄位 | C |
整數 | I |
浮點數 | F |
壓縮數字 | P |
文字字串 | STRING |
可以使用一個或多個名稱修改某些欄位和數字,如下所示:
- 位元組
- 數值
- 字元型
下表顯示了資料型別、儲存記憶體中值所需的記憶體大小以及可以在此類變數中儲存的最小值和最大值。
型別 | 典型長度 | 典型範圍 |
---|---|---|
X | 1 位元組 | 任何位元組值 (00 到 FF) |
C | 1 個字元 | 1 到 65535 |
N(數值文字欄位) | 1 個字元 | 1 到 65535 |
D(字元型日期) | 8 個字元 | 8 個字元 |
T(字元型時間) | 6 個字元 | 6 個字元 |
I | 4 位元組 | -2147483648 到 2147483647 |
F | 8 位元組 | 2.2250738585072014E-308 到 1.7976931348623157E+308 正數或負數 |
P | 8 位元組 | [-10^(2len -1) +1] 到 [+10^(2len -1) 1] (其中 len = 固定長度) |
STRING | 變數 | 任何字母數字字元 |
XSTRING(位元組字串) | 變數 | 任何位元組值 (00 到 FF) |
示例
REPORT YR_SEP_12. DATA text_line TYPE C LENGTH 40. text_line = 'A Chapter on Data Types'. Write text_line. DATA text_string TYPE STRING. text_string = 'A Program in ABAP'. Write / text_string. DATA d_date TYPE D. d_date = SY-DATUM. Write / d_date.
在這個例子中,我們有一個型別為 C 的字元字串,預定義長度為 40。STRING 是一種可以用於任何可變長度字元字串(文字字串)的資料型別。對於固定長度不重要的字元型內容,通常應使用型別 STRING 資料物件。
以上程式碼產生以下輸出:
A Chapter on Data Types A Program in ABAP 12092015
DATE 型別用於儲存日期資訊,可以儲存八位數字,如上所示。
複雜型別和引用型別
複雜型別分為結構型別和表型別。在結構型別中,基本型別和結構(即嵌入在結構中的結構)組合在一起。您可以只考慮基本型別的分組。但是您必須瞭解結構巢狀的可用性。
當基本型別組合在一起時,可以將資料項作為分組資料項訪問,也可以訪問單個基本型別資料項(結構欄位)。表型別在其他程式語言中更被稱為陣列。陣列可以是簡單陣列或結構陣列。在 ABAP 中,陣列稱為內部表,與其他程式語言相比,它們可以以多種方式宣告和操作。下表顯示了內部表的特徵引數。
序號 | 引數和描述 |
---|---|
1 | 行型別 內部表的一行可以是基本型別、複雜型別或引用型別。 |
2 | 鍵 指定一個欄位或一組欄位作為內部表的鍵,用於標識錶行。鍵包含基本型別的欄位。 |
3 | 訪問方法 描述 ABAP 程式如何訪問單個表條目。 |
引用型別用於引用類的例項、介面和執行時資料項。ABAP OOP 執行時型別服務 (RTTS) 允許在執行時宣告資料項。
SAP ABAP - 變數
變數是用於在程式分配的記憶體區域中儲存值的命名資料物件。顧名思義,使用者可以藉助 ABAP 語句更改變數的內容。ABAP 中的每個變數都有一個特定型別,該型別決定變數記憶體的大小和佈局;可以儲存在該記憶體中的值的範圍;以及可以應用於變數的操作集。
必須在使用變數之前宣告所有變數。變數宣告的基本形式為:
DATA <f> TYPE <type> VALUE <val>.
此處<f>指定變數的名稱。變數的名稱最多可以包含 30 個字元。<type>指定變數的型別。任何具有完全指定技術屬性的資料型別都稱為<type>。<val>指定<f>變數的初始值。如果您定義基本固定長度變數,則 DATA 語句會自動使用型別特定的初始值填充變數的值。<val>的其他可能值可以是文字、常量或顯式子句,例如 Is INITIAL。
以下是變數宣告的有效示例。
DATA d1(2) TYPE C. DATA d2 LIKE d1. DATA minimum_value TYPE I VALUE 10.
在上段程式碼中,d1 是 C 型別的變數,d2 是 d1 型別的變數,minimum_value 是 ABAP 整數型別 I 的變數。
本章將解釋 ABAP 中可用的各種變數型別。ABAP 中有三種變數:
- 靜態變數
- 引用變數
- 系統變數
靜態變數
靜態變數在子例程、函式模組和靜態方法中宣告。
生命週期與宣告的上下文相關聯。
使用“CLASS-DATA”語句,您可以在類中宣告變數。
“PARAMETERS”語句可用於宣告與選擇螢幕上的輸入欄位連結的基本資料物件。
您還可以使用“SELECT-OPTIONS”語句宣告與選擇螢幕上的輸入欄位連結的內部表。
以下是命名變數時使用的約定:
不能使用“t”和“,”等特殊字元來命名變數。
預定義資料物件的名稱不能更改。
變數的名稱不能與任何 ABAP 關鍵字或子句相同。
變數的名稱必須傳達變數的含義,無需進一步註釋。
連字元保留用於表示結構的元件。因此,您應該避免在變數名稱中使用連字元。
下劃線字元可用於分隔複合詞。
此程式演示如何使用 PARAMETERS 語句宣告變數:
REPORT ZTest123_01. PARAMETERS: NAME(10) TYPE C, CLASS TYPE I, SCORE TYPE P DECIMALS 2, CONNECT TYPE MARA-MATNR.
此處,NAME 表示 10 個字元的引數,CLASS 指定具有預設位元組大小的整數型別引數,SCORE 表示具有最多兩位小數的值的壓縮型別引數,CONNECT 指的是 ABAP 字典的 MARA-MATNF 型別。
以上程式碼產生以下輸出:

引用變數
宣告引用變數的語法為:
DATA <ref> TYPE REF TO <type> VALUE IS INITIAL.
REF TO 附加項宣告引用變數 ref。
REF TO 後的規範指定引用變數的靜態型別。
靜態型別限制了 <ref> 可以引用的物件集。
引用變數的動態型別是它當前引用的資料型別或類。
靜態型別總是比動態型別更通用或相同。
TYPE 附加用於建立繫結引用型別並作為起始值,並且在 VALUE 附加之後只能指定 IS INITIAL。
示例
CLASS C1 DEFINITION. PUBLIC SECTION. DATA Bl TYPE I VALUE 1. ENDCLASS. DATA: Oref TYPE REF TO C1 , Dref1 LIKE REF TO Oref, Dref2 TYPE REF TO I . CREATE OBJECT Oref. GET REFERENCE OF Oref INTO Dref1. CREATE DATA Dref2. Dref2→* = Dref1→*→Bl.
在上面的程式碼片段中,聲明瞭一個物件引用 Oref 和兩個資料引用變數 Dref1 和 Dref2。
這兩個資料引用變數都是完全型別的,可以使用解引用運算子 →* 在運算元位置進行解引用。
系統變數
ABAP 系統變數可從所有 ABAP 程式訪問。
這些欄位實際上是由執行時環境填充的。
這些欄位中的值指示系統在任何給定時間點的狀態。
您可以在 SAP 的 SYST 表中找到系統變數的完整列表。
SYST 結構的各個欄位可以使用“SYST-”或“SY-”訪問。
示例
REPORT Z_Test123_01. WRITE:/'SY-ABCDE', SY-ABCDE, /'SY-DATUM', SY-DATUM, /'SY-DBSYS', SY-DBSYS, /'SY-HOST ', SY-HOST, /'SY-LANGU', SY-LANGU, /'SY-MANDT', SY-MANDT, /'SY-OPSYS', SY-OPSYS, /'SY-SAPRL', SY-SAPRL, /'SY-SYSID', SY-SYSID, /'SY-TCODE', SY-TCODE, /'SY-UNAME', SY-UNAME, /'SY-UZEIT', SY-UZEIT.
以上程式碼產生以下輸出:
SY-ABCDE ABCDEFGHIJKLMNOPQRSTUVWXYZ SY-DATUM 12.09.2015 SY-DBSYS ORACLE SY-HOST sapserver SY-LANGU EN SY-MANDT 800 SY-OPSYS Windows NT SY-SAPRL 700 SY-SYSID DMO SY-TCODE SE38 SY-UNAME SAPUSER SY-UZEIT 14:25:48
SAP ABAP - 常量和字面量
字面量是在程式原始碼中建立的未命名資料物件。它們完全由其值定義。您無法更改字面量的值。常量是使用宣告語句靜態建立的命名資料物件。常量透過為其賦值來宣告,該值儲存在程式的記憶體區域中。在程式執行期間,不能更改分配給常量的值。這些固定值也可以視為字面量。字面量有兩種型別:數字和字元。
數字字面量
數字字面量是數字序列,可以帶有字首符號。在數字字面量中,沒有小數分隔符,也沒有尾數和指數表示法。
以下是一些數字字面量的示例:
183. -97. +326.
字元字面量
字元字面量是 ABAP 程式原始碼中用單引號括起來的字母數字字元序列。用引號括起來的字元字面量具有預定義的 ABAP 型別 C,並被描述為文字欄位字面量。用“反引號”括起來的字面量具有 ABAP 型別 STRING,並被描述為字串字面量。欄位長度由字元數定義。
注意 - 在文字欄位字面量中,尾隨空格將被忽略,但在字串字面量中將被考慮在內。
以下是一些字元字面量的示例。
文字欄位字面量
REPORT YR_SEP_12. Write 'Tutorials Point'. Write / 'ABAP Tutorial'.
字串欄位字面量
REPORT YR_SEP_12. Write `Tutorials Point `. Write / `ABAP Tutorial `.
以上兩種情況下的輸出相同:
Tutorials Point ABAP Tutorial
注意 - 當我們嘗試更改常量的值時,可能會發生語法或執行時錯誤。在類的宣告部分或介面中宣告的常量屬於該類或介面的靜態屬性。
CONSTANTS 語句
我們可以藉助 CONSTANTS 語句宣告命名資料物件。
語法如下:
CONSTANTS <f> TYPE <type> VALUE <val>.
CONSTANTS 語句類似於 DATA 語句。
<f> 指定常量的名稱。TYPE <type> 表示名為 <f> 的常量,它繼承與現有資料型別 <type> 相同的技術屬性。VALUE <val> 為宣告的常量名 <f> 分配初始值。
注意 - 我們應該在 CONSTANTS 語句中使用 VALUE 子句。“VALUE”子句用於在宣告常量時為其分配初始值。
我們有三種類型的常量,例如基本常量、複雜常量和引用常量。以下語句顯示瞭如何使用 CONSTANTS 語句定義常量:
REPORT YR_SEP_12. CONSTANTS PQR TYPE P DECIMALS 4 VALUE '1.2356'. Write: / 'The value of PQR is:', PQR.
輸出為:
The value of PQR is: 1.2356
這裡它指的是基本資料型別,被稱為基本常量。
以下是複雜常量的示例:
BEGIN OF EMPLOYEE, Name(25) TYPE C VALUE 'Management Team', Organization(40) TYPE C VALUE 'Tutorials Point Ltd', Place(10) TYPE C VALUE 'India', END OF EMPLOYEE.
在上面的程式碼片段中,EMPLOYEE 是一個由 Name、Organization 和 Place 欄位組成的複雜常量。
以下語句宣告一個常量引用:
CONSTANTS null_pointer TYPE REF TO object VALUE IS INITIAL.
我們可以使用常量引用進行比較,或者將其傳遞給過程。
SAP ABAP - 運算子
ABAP 提供了一套豐富的運算子來操作變數。所有 ABAP 運算子都分為四類:
- 算術運算子
- 比較運算子
- 位運算子
- 字元字串運算子
算術運算子
算術運算子與在代數中使用的運算子一樣,用於數學表示式。以下列表描述了算術運算子。假設整數變數 A 保持 20,變數 B 保持 40。
序號 | 算術運算子和說明 |
---|---|
1 | +(加法) 將運算子兩側的值相加。例如:A + B 將得到 60。 |
2 | -(減法) 從左運算元中減去右運算元。例如:A - B 將得到 -20。 |
3 | *(乘法) 將運算子兩側的值相乘。例如:A * B 將得到 800。 |
4 | /(除法) 將左運算元除以右運算元。例如:B / A 將得到 2。 |
5 | MOD(模) 將左運算元除以右運算元並返回餘數。例如:B MOD A 將得到 0。 |
示例
REPORT YS_SEP_08. DATA: A TYPE I VALUE 150, B TYPE I VALUE 50, Result TYPE I. Result = A / B. WRITE / Result.
以上程式碼產生以下輸出:
3
比較運算子
讓我們討論不同運算元的各種比較運算子。
序號 | 比較運算子和說明 |
---|---|
1 | =(相等性測試)。替代形式為 EQ。 檢查兩個運算元的值是否相等,如果相等,則條件變為真。例如 (A = B) 為假。 |
2 | <>(不相等性測試)。替代形式為 NE。 檢查兩個運算元的值是否相等。如果值不相等,則條件變為真。例如 (A <> B) 為真。 |
3 | >(大於測試)。替代形式為 GT。 檢查左運算元的值是否大於右運算元的值。如果是,則條件變為真。例如 (A > B) 為假。 |
4 | <(小於測試)。替代形式為 LT。 檢查左運算元的值是否小於右運算元的值。如果是,則條件變為真。例如 (A < B) 為真。 |
5 | >=(大於或等於)替代形式為 GE。 檢查左運算元的值是否大於或等於右運算元的值。如果是,則條件變為真。例如 (A >= B) 為假。 |
6 | <=(小於或等於測試)。替代形式為 LE。 檢查左運算元的值是否小於或等於右運算元的值。如果是,則條件變為真。例如 (A <= B) 為真。 |
7 | a1 BETWEEN a2 AND a3(區間測試) 檢查 a1 是否位於 a2 和 a3 之間(包含)。如果是,則條件變為真。例如 (A BETWEEN B AND C) 為真。 |
8 | IS INITIAL 如果變數的內容沒有改變並且已自動分配其初始值,則條件變為真。例如 (A IS INITIAL) 為假 |
9 | IS NOT INITIAL 如果變數的內容已更改,則條件變為真。例如 (A IS NOT INITIAL) 為真。 |
注意 - 如果變數的資料型別或長度不匹配,則會執行自動轉換。在比較不同資料型別的兩個值時,會對一個或兩個值執行自動型別調整。轉換型別由資料型別和資料型別的優先順序順序決定。
優先順序順序如下:
如果一個欄位的型別為 I,則另一個欄位將轉換為型別 I。
如果一個欄位的型別為 P,則另一個欄位將轉換為型別 P。
如果一個欄位的型別為 D,則另一個欄位將轉換為型別 D。但 C 和 N 型別不會轉換,它們直接進行比較。型別 T 也類似。
如果一個欄位的型別為 N,另一個欄位的型別為 C 或 X,則兩個欄位都將轉換為型別 P。
如果一個欄位的型別為 C,另一個欄位的型別為 X,則 X 型別將轉換為 C 型別。
示例 1
REPORT YS_SEP_08. DATA: A TYPE I VALUE 115, B TYPE I VALUE 119. IF A LT B. WRITE: / 'A is less than B'. ENDIF
以上程式碼產生以下輸出:
A is less than B
示例 2
REPORT YS_SEP_08. DATA: A TYPE I. IF A IS INITIAL. WRITE: / 'A is assigned'. ENDIF.
以上程式碼產生以下輸出:
A is assigned.
位運算子
ABAP 還提供一系列位邏輯運算子,可用於構建布林代數表示式。位運算子可以使用括號等組合成複雜的表示式。
序號 | 位運算子和說明 |
---|---|
1 | BIT-NOT 一元運算子,它將十六進位制數中的所有位翻轉到相反的值。例如,將此運算子應用於具有位級值 10101010(例如 'AA')的十六進位制數將給出 01010101。 |
2 | BIT-AND 此二元運算子使用布林 AND 運算子逐位比較每個欄位。 |
3 | BIT-XOR 二元運算子,使用布林 XOR(異或)運算子逐位比較每個欄位。 |
4 | BIT-OR 二元運算子,使用布林 OR 運算子逐位比較每個欄位。 |
例如,下表是真值表,它顯示了對欄位 A 和欄位 B 中包含的兩個位值應用布林 AND、OR 或 XOR 運算子時生成的值。
欄位 A | 欄位 B | AND | OR | XOR |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
字元字串運算子
以下是一些字元字串運算子:
序號 | 字元字串運算子和說明 |
---|---|
1 | CO(僅包含) 檢查 A 是否僅由 B 中的字元組成。 |
2 | CN(不只包含) 檢查 A 是否包含 B 中不存在的字元。 |
3 | CA(包含任何) 檢查 A 是否至少包含 B 的一個字元。 |
4 | NA(不包含任何) 檢查 A 是否不包含 B 的任何字元。 |
5 | CS(包含字串) 檢查 A 是否包含字元字串 B。 |
6 | NS(不包含字串) 檢查 A 是否不包含字元字串 B。 |
7 | CP(包含模式) 它檢查 A 是否包含 B 中的模式。 |
8 | NP(不包含模式) 它檢查 A 是否不包含 B 中的模式。 |
示例
REPORT YS_SEP_08. DATA: P(10) TYPE C VALUE 'APPLE', Q(10) TYPE C VALUE 'CHAIR'. IF P CA Q. WRITE: / 'P contains at least one character of Q'. ENDIF.
以上程式碼產生以下輸出:
P contains at least one character of Q.
SAP ABAP - 迴圈控制
您可能需要多次執行程式碼塊的情況。通常,語句是按順序執行的:函式中的第一個語句首先執行,然後是第二個語句,依此類推。
程式語言提供各種控制結構,允許更復雜的執行路徑。一個迴圈語句允許我們多次執行語句或語句組,以下是在大多數程式語言中迴圈語句的一般形式。

ABAP 程式語言提供以下型別的迴圈來處理迴圈需求。
序號 | 迴圈型別和說明 |
---|---|
1 | WHILE 迴圈
當給定條件為真時,重複語句或語句組。它在執行迴圈體之前測試條件。 |
2 | DO 迴圈
DO 語句可用於重複特定任務特定次數。 |
3 | 巢狀迴圈
您可以在任何其他 WHILE 或 DO 迴圈內使用一個或多個迴圈。 |
迴圈控制語句
迴圈控制語句將其執行從正常順序更改。ABAP 包含允許迴圈過早結束的控制語句。它支援以下控制語句。
序號 | 控制語句和說明 |
---|---|
1 | CONTINUE
使迴圈跳過其主體的其餘部分並開始下一個迴圈。 |
2 | CHECK
如果條件為假,則CHECK後的剩餘語句將被忽略,系統開始下一輪迴圈。 |
3 | EXIT
完全終止迴圈,並將執行轉移到迴圈後緊跟的語句。 |
SAP ABAP - 決策
決策結構包含一個或多個條件,由程式進行評估或測試,以及如果條件確定為真則要執行的語句(一個或多個),以及可選的,如果條件確定為假則要執行的其他語句。
以下是大多數程式語言中典型的決策結構的一般形式:

ABAP程式語言提供以下型別的決策語句。
序號 | 語句與描述 |
---|---|
1 | IF語句
IF語句由一個邏輯表示式和一個或多個語句組成。 |
2 | IF...Else語句
IF語句後面可以跟一個可選的ELSE語句,當表示式為假時執行。 |
3 | 巢狀IF語句
可以在另一個IF或ELSEIF語句內使用一個IF或ELSEIF語句。 |
4 | CASE控制語句
當我們需要比較兩個或多個欄位或變數時,使用CASE語句。 |
SAP ABAP - 字串
字串在ABAP程式設計中被廣泛使用,是一系列字元。
我們使用資料型別C變數來儲存字母數字字元,最小1個字元,最大65,535個字元。預設情況下,這些字元左對齊。
建立字串
以下宣告和初始化建立一個包含單詞“Hello”的字串。字串的大小正好是單詞“Hello”中字元的數量。
Data my_Char(5) VALUE 'Hello'.
下面的程式是建立字串的示例。
REPORT YT_SEP_15. DATA my_Char(5) VALUE 'Hello'. Write my_Char.
以上程式碼產生以下輸出:
Hello
字串長度
為了查詢字元字串的長度,我們可以使用STRLEN語句。STRLEN()函式返回字串中包含的字元數。
示例
REPORT YT_SEP_15. DATA: title_1(10) VALUE 'Tutorials', length_1 TYPE I. length_1 = STRLEN( title_1 ). Write: / 'The Length of the Title is:', length_1.
以上程式碼產生以下輸出:
The Length of the Title is: 9
ABAP支援各種操作字串的語句。
序號 | 語句與用途 |
---|---|
1 | CONCATENATE 將兩個字串連線起來形成第三個字串。 |
2 | CONDENSE 此語句刪除空格字元。 |
3 | STRLEN 用於查詢欄位的長度。 |
4 | REPLACE 用於替換字元。 |
5 | SEARCH 在字元字串中執行搜尋。 |
6 | SHIFT 用於將字串的內容向左或向右移動。 |
7 | SPLIT 用於將欄位的內容拆分為兩個或多個欄位。 |
以下示例使用了一些上述語句:
示例
REPORT YT_SEP_15. DATA: title_1(10) VALUE 'Tutorials', title_2(10) VALUE 'Point', spaced_title(30) VALUE 'Tutorials Point Limited', sep, dest1(30), dest2(30). CONCATENATE title_1 title_2 INTO dest1. Write: / 'Concatenation:', dest1. CONCATENATE title_1 title_2 INTO dest2 SEPARATED BY sep. Write: / 'Concatenation with Space:', dest2. CONDENSE spaced_title. Write: / 'Condense with Gaps:', spaced_title. CONDENSE spaced_title NO-GAPS. Write: / 'Condense with No Gaps:', spaced_title.
以上程式碼產生以下輸出:
Concatenation: TutorialsPoint Concatenation with Space: Tutorials Point Condense with Gaps: Tutorials Point Limited Condense with No Gaps: TutorialsPointLimited
注意:
在連線的情況下,“sep”在欄位之間插入一個空格。
CONDENSE語句刪除欄位之間的空格,但只保留1個字元的空格。
“NO-GAPS”是CONDENSE語句的可選附加項,它刪除所有空格。
SAP ABAP - 日期和時間
ABAP隱式引用格里高利曆,在世界大部分地區有效。我們可以將輸出轉換為特定國家的日曆。日期是相對於日曆精確到某一天、一週或一個月的時間。時間是相對於一天精確到秒或分的時間。ABAP始終以24小時制儲存時間。輸出可以具有特定國家的格式。日期和時間通常被解釋為當前時區有效的本地日期。
ABAP提供兩種內建型別來處理日期和時間:
- D資料型別
- T資料型別
以下是基本格式:
DATA: date TYPE D, time TYPE T. DATA: year TYPE I, month TYPE I, day TYPE I, hour TYPE I, minute TYPE I, second TYPE I.
這兩種型別都是固定長度的字元型別,分別採用YYYYMMDD和HHMMSS的形式。
時間戳
除了這些內建型別外,其他兩種型別TIMESTAMP和TIMESTAMPL在許多標準應用程式表中用於以UTC格式儲存時間戳。下表顯示了ABAP中可用的基本日期和時間型別。
序號 | 資料型別與描述 |
---|---|
1 | D 一種內建的固定長度日期型別,格式為YYYYMMDD。例如,值20100913表示2010年9月13日。 |
2 | T 一種內建的固定長度時間型別,格式為HHMMSS。例如,值102305表示上午10:23:05。 |
3 | TIMESTAMP(型別P – 長度8,無小數位) 此型別用於表示YYYYMMDDhhmmss形式的短時間戳。例如,值20100913102305表示2010年9月13日上午10:23:05。 |
4 | TIMESTAMPL(型別P – 長度11,小數位7) TIMESTAMPL以YYYYMMDDhhmmss,mmmuuun的形式表示長時間戳。這裡附加的數字“mmmuuun”表示秒的幾分之一。 |
當前日期和時間
以下程式碼片段檢索當前系統日期和時間。
REPORT YR_SEP_15. DATA: date_1 TYPE D. date_1 = SY-DATUM. Write: / 'Present Date is:', date_1 DD/MM/YYYY. date_1 = date_1 + 06. Write: / 'Date after 6 Days is:', date_1 DD/MM/YYYY.
以上程式碼產生以下輸出:
Present Date is: 21.09.2015 Date after 6 Days is: 27.09.2015
變數date_1被賦值為當前系統日期SY-DATUM的值。接下來,我們將日期值增加6。在ABAP中的日期計算方面,這意味著我們將日期物件的日分量增加了6天。ABAP執行時環境足夠智慧,可以在日期值達到月末時進行翻轉。
時間計算類似於日期計算。以下程式碼使用基本時間算術將當前系統時間增加75秒。
REPORT YR_SEP_15. DATA: time_1 TYPE T. time_1 = SY-UZEIT. Write /(60) time_1 USING EDIT MASK 'Now the Time is: __:__:__'. time_1 = time_1 + 75. Write /(60) time_1 USING EDIT MASK 'A Minute and a Quarter from Now, it is: __:__:__'.
以上程式碼產生以下輸出:
Now the Time is 11:45:05 A Minute and a Quarter from Now, it is: 11:46:20
使用時間戳
您可以使用GET TIME STAMP檢索當前系統時間並將其儲存在時間戳變數中,如下面的程式碼所示。GET TIME STAMP語句根據所使用的時間戳資料物件的型別,以長格式或短格式儲存時間戳。時間戳值使用UTC標準編碼。
REPORT YR_SEP_12. DATA: stamp_1 TYPE TIMESTAMP, stamp_2 TYPE TIMESTAMPL. GET TIME STAMP FIELD stamp_1. Write: / 'The short time stamp is:', stamp_1 TIME ZONE SY-ZONLO. GET TIME STAMP FIELD stamp_2. Write: / 'The long time stamp is:', stamp_2 TIME ZONE SY-ZONLO.
以上程式碼產生以下輸出:
The short time stamp is: 18.09.2015 11:19:40 The long time stamp is: 18.09.2015 11:19:40,9370000
在上面的示例中,我們使用WRITE語句的TIME ZONE附加項顯示時間戳。此附加項根據指定時區的規則格式化時間戳的輸出。系統欄位SY-ZONLO用於顯示使用者首選項中配置的本地時區。
SAP ABAP - 資料格式化
ABAP提供了各種格式化選項來格式化程式的輸出。例如,您可以建立一個包含不同顏色或格式樣式的各種專案的列表。
WRITE語句是用於在螢幕上顯示資料的格式化語句。WRITE語句有不同的格式化選項。WRITE語句的語法為:
WRITE <format> <f> <options>.
在此語法中,<format>表示輸出格式規範,它可以是正斜槓(/),表示從新行開始顯示輸出。除了正斜槓外,格式規範還包括列號和列長度。例如,WRITE/04(6)語句顯示新行從第4列開始,列長度為6,而WRITE 20語句顯示當前行第20列。引數<f>表示資料變數或編號文字。
下表描述了用於格式化的各種子句:
序號 | 子句與描述 |
---|---|
1 | LEFT-JUSTIFIED 指定輸出左對齊。 |
2 | CENTERED 表示輸出居中。 |
3 | RIGHT-JUSTIFIED 指定輸出右對齊。 |
4 | UNDER <g> 輸出直接在欄位<g>下方開始。 |
5 | NO-GAP 指定拒絕欄位<f>後的空格。 |
6 | USING EDIT MASK <m> 表示格式模板<m>的規範。不使用編輯掩碼:這指定在ABAP字典中指定的格式模板被停用。 |
7 | NO-ZERO 如果欄位只包含零,則用空格代替。 |
以下是數字型別欄位的格式化選項:
序號 | 子句與描述 |
---|---|
1 | NO-SIGN 指定螢幕上不顯示前導符號。 |
2 | EXPONENT <e> 指定在型別F(浮點欄位)中,指數在<e>中定義。 |
3 | ROUND <r> 型別P欄位(打包數字資料型別)首先乘以10**(-r),然後四捨五入到整數值。 |
4 | CURRENCY <c> 表示根據儲存在TCURX資料庫表中的貨幣<c>值進行格式化。 |
5 | UNIT <u> 指定小數位數根據型別P的T006資料庫表中指定的<u>單位固定。 |
6 | DECIMALS <d> 指定必須在小數點後顯示<d>位數字。 |
例如,下表顯示了日期欄位的不同格式化選項:
格式化選項 | 示例 |
---|---|
DD/MM/YY | 13/01/15 |
MM/DD/YY | 01/13/15 |
DD/MM/YYYY | 13/01/2015 |
MM/DD/YYYY | 01/13/2015 |
DDMMYY | 130115 |
MMDDYY | 011315 |
YYMMDD | 150113 |
這裡,DD代表兩位數的日期,MM代表兩位數的月份,YY代表兩位數的年份,YYYY代表四位數的年份。
讓我們來看一個實現上述一些格式化選項的ABAP程式碼示例:
REPORT ZTest123_01. DATA: n(9) TYPE C VALUE 'Tutorials', m(5) TYPE C VALUE 'Point'. WRITE: n, m. WRITE: / n, / m UNDER n. WRITE: / n NO-GAP, m. DATA time TYPE T VALUE '112538'. WRITE: / time, /(8) time Using EDIT MASK '__:__:__'.
以上程式碼產生以下輸出:
Tutorials Point Tutorials Point TutorialsPoint 112538 11:25:38
SAP ABAP - 異常處理
異常是在程式執行期間出現的問題。當發生異常時,程式的正常流程被打斷,程式應用程式異常終止,這是不推薦的,因此需要處理這些異常。
異常提供了一種將控制從程式的一部分轉移到另一部分的方法。ABAP異常處理基於三個關鍵字:RAISE、TRY、CATCH和CLEANUP。假設一個塊會引發異常,一個方法使用TRY和CATCH關鍵字的組合捕獲異常。TRY-CATCH塊放置在可能生成異常的程式碼周圍。以下是使用TRY-CATCH的語法:
TRY. Try Block <Code that raises an exception> CATCH Catch Block <exception handler M> . . . . . . . . . CATCH Catch Block <exception handler R> CLEANUP. Cleanup block <to restore consistent state> ENDTRY.
RAISE:引發異常以指示已發生某些異常情況。通常,異常處理程式嘗試修復錯誤或查詢替代解決方案。
TRY:TRY塊包含要處理異常的應用程式程式碼。此語句塊按順序處理。它可以包含進一步的控制結構和過程或其他ABAP程式的呼叫。它後面是一個或多個catch塊。
CATCH:程式在程式中要處理問題的地方使用異常處理程式捕獲異常。CATCH關鍵字表示捕獲異常。
CLEANUP:每當TRY塊中發生未被同一TRY-ENDTRY結構的處理程式捕獲的異常時,都會執行CLEANUP塊的語句。在CLEANUP子句中,系統可以將物件恢復到一致狀態或釋放外部資源。也就是說,可以為TRY塊的上下文執行清理工作。
引發異常
可以在方法、函式模組、子例程等的任何點引發異常。異常可以以兩種方式引發:
由ABAP執行時系統引發的異常。
例如Y = 1 / 0。這將導致型別為CX_SY_ZERODIVIDE的執行時錯誤。
由程式設計師引發的異常。
同時引發並建立異常物件。第一種情況是在已存在的異常物件上引發異常。語法為:RAISE EXCEPTION exep。
捕獲異常
使用處理器來捕獲異常。
讓我們來看一段程式碼片段:
DATA: result TYPE P LENGTH 8 DECIMALS 2, exref TYPE REF TO CX_ROOT, msgtxt TYPE STRING. PARAMETERS: Num1 TYPE I, Num2 TYPE I. TRY. result = Num1 / Num2. CATCH CX_SY_ZERODIVIDE INTO exref. msgtxt = exref→GET_TEXT( ). CATCH CX_SY_CONVERSION_NO_NUMBER INTO exref. msgtxt = exref→GET_TEXT( ).
在上面的程式碼片段中,我們嘗試將 Num1 除以 Num2,並將結果儲存在一個浮點型變數中。
可能會產生兩種型別的異常。
數字轉換錯誤。
除以零異常。處理器捕獲 CX_SY_CONVERSION_NO_NUMBER 異常和 CX_SY_ZERODIVIDE 異常。這裡使用異常類的 GET_TEXT( ) 方法獲取異常的描述。
異常的屬性
以下是異常的五個屬性和方法:
序號 | 屬性和描述 |
---|---|
1 | Textid 用於定義異常的不同文字,也影響 get_text 方法的結果。此屬性可以儲存原始異常,允許您構建異常鏈。 |
2 | 上一頁 此屬性可以儲存原始異常,允許您構建異常鏈。 |
3 | get_text 根據系統的語言返回異常的文字表示形式(字串)。 |
4 | get_longtext 返回異常文字表示形式的長格式(字串)。 |
5 | get_source_position 給出引發異常的程式名稱和行號。 |
示例
REPORT ZExceptionsDemo. PARAMETERS Num_1 TYPE I. DATA res_1 TYPE P DECIMALS 2. DATA orf_1 TYPE REF TO CX_ROOT. DATA txt_1 TYPE STRING. start-of-selection. Write: / 'Square Root and Division with:', Num_1. write: /. TRY. IF ABS( Num_1 ) > 150. RAISE EXCEPTION TYPE CX_DEMO_ABS_TOO_LARGE. ENDIF. TRY. res_1 = SQRT( Num_1 ). Write: / 'Result of square root:', res_1. res_1 = 1 / Num_1. Write: / 'Result of division:', res_1. CATCH CX_SY_ZERODIVIDE INTO orf_1. txt_1 = orf_1→GET_TEXT( ). CLEANUP. CLEAR res_1. ENDTRY. CATCH CX_SY_ARITHMETIC_ERROR INTO orf_1. txt_1 = orf_1→GET_TEXT( ). CATCH CX_ROOT INTO orf_1. txt_1 = orf_1→GET_TEXT( ). ENDTRY. IF NOT txt_1 IS INITIAL. Write / txt_1. ENDIF. Write: / 'Final Result is:', res_1.
在這個例子中,如果數字大於 150,則引發異常 CX_DEMO_ABS_TOO_LARGE。對於數字 160,上述程式碼會產生以下輸出。
Square Root and Division with: 160 The absolute value of number is too high Final Result is: 0.00
SAP ABAP - 字典
如您所知,SQL 可以分為兩部分:
- DML(資料操縱語言)
- DDL(資料定義語言)
DML 部分包含查詢和更新命令,例如 SELECT、INSERT、UPDATE、DELETE 等,ABAP 程式處理 SQL 的 DML 部分。DDL 部分包含 CREATE TABLE、CREATE INDEX、DROP TABLE、ALTER TABLE 等命令,ABAP Dictionary 處理 SQL 的 DDL 部分。

ABAP Dictionary 可以被視為元資料(即關於資料的資料),它與資料庫維護的元資料一起駐留在 SAP 資料庫中。Dictionary 用於建立和管理資料定義,以及建立表、資料元素、域、檢視和型別。
ABAP Dictionary 中的基本型別
ABAP Dictionary 中的基本型別如下:
資料元素透過定義資料型別、長度和可能的十進位制位數來描述基本型別。
結構,其元件可以具有任何型別。
表型別描述內部表的結構。
Dictionary 環境中的各種物件可以在 ABAP 程式中引用。Dictionary 被稱為全域性區域。Dictionary 中的物件對所有 ABAP 程式都是全域性的,ABAP 程式中的資料可以透過引用這些 Dictionary 全域性物件來宣告。

Dictionary 支援使用者定義型別的定義,這些型別用於 ABAP 程式中。它們還定義資料庫物件(如表、檢視和索引)的結構。當這些物件被啟用時,它們的 Dictionary 定義會在底層資料庫中自動建立相應的物件。Dictionary 還提供編輯工具(如搜尋幫助)和鎖定工具(如鎖定物件)。
Dictionary 任務
ABAP Dictionary 實現以下功能:
- 強制資料完整性。
- 管理資料定義,避免冗餘。
- 與 ABAP 開發工作臺的其他部分緊密整合。
示例
任何複雜的自定義型別都可以從 Dictionary 中的 3 種基本型別構建。客戶資料儲存在一個名為“Customer”的結構中,其元件為 Name、Address 和 Telephone,如下圖所示。Name 也是一個結構,其元件為 First name 和 Last name。這兩個元件都是基本的,因為它們的型別由資料元素定義。

元件 Address 的型別由一個結構定義,其元件也是結構,而 Telephone 元件由表型別定義,因為一個客戶可以擁有多個電話號碼。型別用於 ABAP 程式,也用於定義函式模組的介面引數型別。
SAP ABAP - 資料域
在 ABAP Dictionary 中定義資料的三個基本物件是域、資料元素和表。域用於表字段的技術定義(如欄位型別和長度),而資料元素用於語義定義(簡短描述)。資料元素描述域在特定業務環境中的含義。它主要包含欄位幫助和螢幕上的欄位標籤。
域分配給資料元素,資料元素又分配給表字段或結構欄位。例如,MATNR 域(CHAR 物料號)分配給資料元素,如 MATNR_N、MATNN 和 MATNR_D,這些資料元素又分配給許多表欄位和結構欄位。
建立域
在建立新的域之前,請檢查是否存在任何現有域具有表字段所需的相同技術規範。如果是這樣,我們應該使用該現有域。讓我們討論建立域的過程。
步驟 1 - 轉到事務 SE11。
步驟 2 - 在 ABAP Dictionary 的初始螢幕中選擇域單選按鈕,並輸入域的名稱,如下圖所示。單擊“建立”按鈕。您可以在客戶名稱空間下建立域,物件的名稱始終以“Z”或“Y”開頭。

步驟 3 - 在域維護螢幕的短文字欄位中輸入描述。在本例中,它是“客戶域”。注意 - 在輸入此屬性之前,您無法輸入任何其他屬性。
步驟 4 - 在“定義”選項卡的“格式”塊中輸入資料型別、字元數和小數位數。按輸出長度鍵,它會提出並顯示輸出長度。如果您覆蓋建議的輸出長度,則在啟用域時可能會看到警告。如果需要,您可以填寫“轉換例程”、“符號”和“小寫”欄位。但這些始終是可選屬性。
步驟 5 - 選擇“值範圍”選項卡。如果域僅限於具有固定值,則輸入固定值或區間。如果系統必須在定義引用此域的欄位的外部索引鍵時提出此表作為檢查表,則定義值表。但所有這些都是可選屬性。

步驟 6 - 儲存您的更改。“建立物件目錄條目”彈出窗口出現並要求輸入包。您可以輸入您正在使用的包名稱。如果您沒有任何包,您可以在物件導航器中建立它,或者您可以使用“本地物件”按鈕儲存您的域。
步驟 7 - 啟用您的域。單擊啟用圖示(火柴圖示)或按 CTRL + F3 啟用域。出現一個彈出視窗,列出當前處於非活動狀態的 2 個物件,如下圖所示:

步驟 8 - 在此步驟中,需要啟用名為 ZSEP_18 的標記為“DOMA”的頂部條目。由於此條目已突出顯示,請單擊綠色勾號按鈕。此視窗將消失,狀態列將顯示訊息“物件已啟用”。
如果在啟用域時出現錯誤訊息或警告,則會自動顯示啟用日誌。啟用日誌顯示有關啟用流程的資訊。您也可以使用“實用程式(M)”→“啟用日誌”呼叫啟用日誌。
SAP ABAP - 資料元素
資料元素描述 ABAP 資料字典中的各個欄位。它們是複雜型別的最小不可分割單元,用於定義表字段的型別、結構元件或表的行型別。有關表字段含義的資訊以及有關編輯相應螢幕欄位的資訊可以分配給資料元素。此資訊會自動提供給所有引用資料元素的螢幕欄位。資料元素描述基本型別或引用型別。

建立資料元素
在建立新的資料元素之前,您需要檢查是否存在任何現有資料元素具有表字段所需的相同語義規範。如果是這樣,您可以使用該現有資料元素。您可以將資料元素分配給預定義型別、域或引用型別。
以下是建立資料元素的過程:
步驟 1 - 轉到事務 SE11。
步驟 2 - 在 ABAP Dictionary 的初始螢幕中選擇資料型別單選按鈕,並輸入資料元素的名稱,如下所示。
步驟 3 - 單擊“建立”按鈕。您可以在客戶名稱空間下建立資料元素,物件的名稱始終以“Z”或“Y”開頭。

步驟 4 - 在出現具有三個單選按鈕的“建立型別”彈出視窗上,選中“資料元素”單選按鈕。

步驟 5 - 單擊綠色勾號圖示。您將被定向到資料元素的維護螢幕。
步驟 6 - 在資料元素維護螢幕的短文字欄位中輸入描述。在本例中,它是“客戶資料元素”。注意 - 在輸入此屬性之前,您無法輸入任何其他屬性。

步驟 7 - 為資料元素分配型別。您可以透過選中基本型別來建立一個基本資料元素,或者透過選中引用型別來建立一個引用資料元素。您可以在“基本型別”中將資料元素分配給域或預定義型別,在“引用型別”中分配給“引用型別名稱”或“對預定義型別的引用”。
步驟 8 - 在“欄位標籤”選項卡中輸入短文字、中文字、長文字和標題的欄位。您可以按 Enter 鍵,這些標籤的長度將自動生成。

步驟 9 - 儲存您的更改。“建立物件目錄條目”彈出窗口出現並要求輸入包。您可以輸入您正在使用的包名稱。如果您沒有任何包,您可以在物件導航器中建立它,或者您可以使用“本地物件”按鈕儲存您的資料元素。
步驟 10 - 啟用您的資料元素。單擊啟用圖示(火柴圖示)或按 CTRL + F3 啟用資料元素。出現一個彈出視窗,列出當前處於非活動狀態的 2 個物件,如下圖所示。

步驟 11 - 在此步驟中,需要啟用名為 Z_CUST 的標記為“DTEL”的頂部條目。由於此條目已突出顯示,請單擊綠色勾號按鈕。此視窗將消失,狀態列將顯示訊息“物件已啟用”。
如果在啟用資料元素時出現錯誤訊息或警告,則會自動顯示啟用日誌。啟用日誌顯示有關啟用流程的資訊。您也可以使用“實用程式(M)”→“啟用日誌”呼叫啟用日誌。
SAP ABAP - 表
可以在 ABAP Dictionary 中獨立於資料庫定義表。當在 ABAP Dictionary 中啟用表時,其欄位的類似副本也會在資料庫中建立。在 ABAP Dictionary 中定義的表會自動轉換為與資料庫相容的格式,因為表的定義取決於 SAP 系統使用的資料庫。
表可以包含一個或多個欄位,每個欄位都定義了其資料型別和長度。儲存在表中的大量資料分佈在表中定義的多個欄位之間。
表字段型別
一張表由多個欄位組成,每個欄位包含多個元素。下表列出了表字段的不同元素:
序號 | 元素及描述 |
---|---|
1 | 欄位名 這是賦予欄位的名稱,最多可包含 16 個字元。欄位名可以由數字、字母和下劃線組成,但必須以字母開頭。 |
2 | 鍵標誌 確定欄位是否屬於鍵欄位。 |
3 | 欄位型別 為欄位分配資料型別。 |
4 | 欄位長度 欄位中可以輸入的字元數。 |
5 | 小數位數 定義允許在小數點後出現的數字位數。此元素僅用於數字資料型別。 |
6 | 簡短文字 描述相應欄位的含義。 |
在 ABAP 字典中建立表
步驟 1 − 轉到事務 SE11,選擇“資料庫表”單選按鈕,並輸入要建立的表的名稱。在本例中,我們輸入了名稱 ZCUSTOMERS1。單擊“建立”按鈕。“字典:維護表”螢幕出現。此處預設選中“交付和維護”選項卡。
步驟 2 − 在“簡短描述”欄位中輸入解釋性簡短文字。
步驟 3 − 單擊“交付類”欄位旁邊的搜尋幫助圖示。選擇“A [應用表(主資料和事務資料)]”選項。
步驟 4 − 從“資料瀏覽器/表檢視維護”下拉選單中選擇“允許顯示/維護”選項。“字典:維護表”螢幕出現。

步驟 5 − 選擇“欄位”選項卡。出現包含與“欄位”選項卡相關的選項的螢幕。
步驟 6 − 在“欄位”列中輸入表字段的名稱。欄位名可以包含字母、數字和下劃線,但必須始終以字母開頭,並且長度不能超過 16 個字元。
要建立的欄位也必須具有資料元素,因為它們從定義的資料元素中獲取屬性,例如資料型別、長度、小數位數和簡短文字。
步驟 7 − 如果要將欄位作為表鍵的一部分,請選擇“鍵”列。讓我們建立諸如 CLIENT、CUSTOMER、NAME、TITLE 和 DOB 等欄位。
步驟 8 − 第一個欄位非常重要,它標識記錄關聯的客戶端。輸入“Client”作為欄位,輸入“MANDT”作為資料元素。系統會自動填寫資料型別、長度、小數位數和簡短描述。“Client”欄位透過選中“鍵”框被設定為鍵欄位。
步驟 9 − 下一個欄位是“Customer”。選中該複選框以將其設為鍵欄位,並輸入新的資料元素“ZCUSTNUM”。單擊“儲存”按鈕。
步驟 10 − 由於資料元素“ZCUSTNUM”尚不存在,因此必須建立它。雙擊新的資料元素,“建立資料元素”窗口出現。對此回答“是”,然後出現“維護資料元素”視窗。
步驟 11 − 在“簡短描述”區域中輸入“客戶編號”。應為新的資料元素定義名為“域”的基本資料型別。因此,輸入“ZCUSTD1”,雙擊它並同意儲存所做的更改。選擇“是”以建立域,並在“簡短描述”框中鍵入域的描述。

“定義”選項卡會自動開啟。第一個欄位是“資料型別”。
步驟 12 − 單擊框內並從下拉選單中選擇“NUMC”型別。在“字元數”欄位中輸入數字 8(最多 8 個字元),並在“小數位數”區域中輸入 0。必須選擇 8 的輸出長度,然後按 Enter。“NUMC”欄位的描述必須重新出現,以確認這是一個有效的條目。
步驟 13 − 單擊“儲存”按鈕並激活物件。
步驟 14 − 按 F3 返回“維護/更改資料元素”螢幕。根據以下快照建立四個欄位標籤。之後,儲存並激活元素。

步驟 15 − 按返回按鈕返回表維護螢幕。“客戶”列具有正確的資料型別、長度、小數位數和簡短描述。這表示成功建立了資料元素以及使用的域。

同樣,我們需要建立三個附加欄位,例如 NAME、TITLE 和 DOB。
步驟 16 − 從工具欄中選擇“技術設定”。為“資料類”選擇 APPL0,為“大小”類別欄位選擇第一個大小類別 0。對於緩衝選項,必須選擇“不允許緩衝”。
步驟 17 − 單擊“儲存”。返回表並激活它。出現以下螢幕。

表“ZCUSTOMERS1”已啟用。
SAP ABAP - 結構
結構是由任何資料型別的元件組成的資料庫物件,這些元件一個接一個地儲存在記憶體中。

結構對於繪製螢幕欄位以及操作由離散數量的欄位定義的一致格式的資料非常有用。
結構在執行時可能只有一個記錄,但表可以有多個記錄。
建立結構
步驟 1 − 轉到事務 SE11。
步驟 2 − 單擊螢幕上的“資料型別”選項。輸入名稱“ZSTR_CUSTOMER1”並單擊“建立”按鈕。
步驟 3 − 在下一個螢幕中選擇“結構”選項並按 Enter。您可以看到“維護/更改結構”嚮導。
步驟 4 − 輸入以下快照中所示的簡短描述。

步驟 5 − 輸入元件(欄位名)和元件型別(資料元素)。
注意:此處元件名稱根據 SAP 建議以 Z 開頭。讓我們使用我們已在資料庫表中建立的資料元素。
步驟 6 − 提供所有元件和元件型別後,需要儲存、檢查和啟用。
出現以下螢幕:

步驟 7 − 由於“ZSTR_CUSTOMER1”已突出顯示,因此單擊綠色勾號按鈕。此視窗消失,狀態列將顯示訊息“已啟用”。
結構現在已啟用,如下面的快照所示:

SAP ABAP - 檢視
檢視僅像資料庫表一樣起作用。但它不會佔用儲存空間。檢視類似於虛擬表——一個沒有任何物理存在的表。檢視是透過組合包含有關應用程式物件的的資訊的一個或多個表的資料來建立的。使用檢視,您可以表示表中包含的資料的子集,或者您可以將多個表連線到單個虛擬表中。
與應用程式物件相關的資料透過使用資料庫檢視分佈在多個表中。它們使用內部聯接條件來連線不同表的資料。維護檢視用於顯示和修改儲存在應用程式物件中的資料。每個維護檢視都與其關聯的維護狀態相關聯。
我們使用投影檢視來遮蔽不需要的欄位,並在表中僅顯示相關欄位。投影檢視必須在一個透明表上定義。投影檢視恰好包含一個表。我們不能為投影檢視定義選擇條件。
建立檢視
步驟 1 − 在 ABAP 字典的初始螢幕上選擇“檢視”單選按鈕。輸入要建立的檢視的名稱,然後單擊“建立”按鈕。我們輸入檢視的名稱為 ZVIEW_TEST。
步驟 2 − 選擇檢視型別時選擇投影檢視單選按鈕,然後單擊“複製”按鈕。“字典:更改檢視”螢幕出現。
步驟 3 − 在“簡短描述”欄位中輸入簡短描述,並在“基本表”欄位中輸入要使用的表的名稱,如下面的快照所示。

步驟 4 − 單擊“表字段”按鈕,以將 ZCUSTOMERS1 表的欄位包含到投影檢視中。
步驟 5 − 出現“從表 ZCUSTOMERS1 中選擇欄位”螢幕。選擇您希望包含在投影檢視中的欄位,如下面的快照所示。

步驟 6 − 單擊“複製”按鈕後,“字典:更改檢視”螢幕上將顯示投影檢視的所有選定欄位。

步驟 7 − 選擇“維護狀態”選項卡以定義訪問方法。選擇“只讀”單選按鈕,並從“資料瀏覽器/表檢視維護”的下拉選單中選擇“允許顯示/維護(受限制)”選項。
步驟 8 − 儲存並激活它。在“字典:更改檢視”螢幕上,選擇“實用程式(M) > 內容”以顯示 ZVIEW_TEST 的選擇螢幕。
步驟 9 − 單擊“執行”圖示。投影檢視的輸出將顯示在以下螢幕截圖中。

表 ZCUSTOMERS1 包含 5 個欄位。此處顯示的欄位為 3 個(客戶端、客戶編號和名稱),包含 4 個條目。客戶編號從 100001 到 100004,帶有相應的名稱。
SAP ABAP - 搜尋幫助
搜尋幫助是 ABAP 字典的另一個儲存庫物件,用於以列表形式顯示欄位的所有可能值。此列表也稱為命中列表。您可以從此命中列表中選擇要輸入欄位的值,而不是手動輸入值,這既費時又容易出錯。
建立搜尋幫助
步驟 1 − 轉到事務 SE11。選擇搜尋幫助的單選按鈕。輸入要建立的搜尋幫助的名稱。讓我們輸入名稱 ZSRCH1。單擊“建立”按鈕。
步驟 2 − 系統將提示要建立的搜尋幫助型別。選擇基本搜尋幫助(預設為)。將出現以下螢幕截圖所示的建立基本搜尋幫助的螢幕。
步驟 3 − 在選擇方法中,我們需要指示我們的資料來源是表還是檢視。在本例中,它恰好是一個表。該表是 ZCUSTOMERS1。它從選擇列表中選擇。
步驟 4 − 輸入選擇方法後,下一個欄位是對話方塊型別。這控制限制性對話方塊的外觀。有一個包含三個選項的下拉列表。讓我們選擇“立即顯示值”選項。

步驟 5 − 接下來的引數區域。對於每個搜尋幫助引數或欄位,必須根據要求輸入這些列欄位。
搜尋幫助引數 − 這是來自資料來源的欄位。表中的欄位列在選擇列表中。參與搜尋幫助的欄位將被輸入,每行一個欄位。讓我們包含兩個欄位 CUSTOMER 和 NAME。這兩個欄位參與的方式在其餘列中指示。

匯入 − 此欄位是一個複選框,用於指示搜尋幫助引數是否為匯入引數。匯出或匯入是針對搜尋幫助的。
匯出 − 此欄位是一個複選框,用於指示搜尋幫助引數是否為匯出引數。匯出將是將欄位值從選擇列表傳輸到螢幕欄位。
LPos − 其值控制搜尋幫助引數或欄位在選擇列表中的物理位置。如果輸入值 1,則該欄位將出現在選擇列表的第一個位置,依此類推。
SPos − 它控制搜尋幫助引數或欄位在限制性對話方塊中的物理位置。如果輸入值為 1,則該欄位將出現在限制性對話方塊的第一個位置,以此類推。
資料元素 − 預設情況下,每個搜尋幫助引數或欄位都會分配一個數據元素,該資料元素已在資料來源(表或檢視)中分配給它。此資料元素名稱顯示在顯示模式中。
步驟 6 − 執行一致性檢查並激活搜尋幫助。按 F8 執行。“測試搜尋幫助 ZSRCH1”螢幕將顯示如下螢幕截圖所示。

步驟 7 − 讓我們在客戶的“準備輸入”螢幕欄位中輸入數字 100004。按 Enter。

顯示客戶編號 100004 和姓名“STEPHEN”。
SAP ABAP - 鎖物件
鎖定物件是 ABAP Dictionary 提供的一項功能,用於同步多個程式對同一資料的訪問。資料記錄藉助特定程式訪問。鎖定物件用於在 SAP 中避免在資料庫中插入或更改資料時出現不一致的情況。必須在鎖定物件中定義其資料記錄需要鎖定的表及其關鍵欄位。
鎖定機制
以下是使用鎖定機制完成的兩個主要功能:
程式可以與其他程式通訊,告知其正在讀取或更改的資料記錄。
程式可以防止自己讀取剛剛被另一個程式更改的資料。
程式首先生成一個鎖定請求。然後,此請求轉到排隊伺服器,並在鎖定表中建立鎖定。排隊伺服器設定鎖定,程式最終可以訪問資料。

建立鎖定物件
步驟 1 − 轉到事務程式碼 SE11。將開啟以下螢幕。

步驟 2 − 單擊“鎖定物件”單選按鈕。輸入以 E 開頭的鎖定物件名稱,然後單擊“建立”按鈕。這裡我們使用 EZLOCK12。
步驟 3 − 輸入簡短描述欄位,然後單擊“表”選項卡。
步驟 4 − 在“名稱”欄位中輸入表名,並將鎖定模式選擇為“寫鎖定”。
步驟 5 − 單擊“鎖定引數”選項卡,將出現以下螢幕。

步驟 6 − 儲存並激活。將自動生成 2 個功能模組。要檢查功能模組,可以使用“轉到”→“鎖定模組”。
步驟 7 − 單擊“鎖定模組”,將開啟以下螢幕。

鎖定物件已成功建立。
包含在鎖定物件中的表的關鍵欄位稱為鎖定引數,它們用作功能模組中的輸入引數。這些引數用於設定和刪除鎖定物件定義生成的鎖定。
SAP ABAP - 模組化
最好使程式儘可能自包含且易於閱讀。只需嘗試將大型複雜的任務分解成更小、更簡單的任務,方法是將每個任務放在其各自的模組中,開發人員可以在沒有其他干擾的情況下專注於這些任務。
在 SAP ABAP 環境中,模組化涉及將程式組織成模組化單元,也稱為邏輯塊。即使在建立程式期間和隨後的維護週期中,它也能減少冗餘並提高程式的可讀性。模組化還可以實現相同程式碼的可重用性。ABAP 已使開發人員必須進行模組化,即比基於 OOPS 的語言(具有相對更多內建模組化功能)更相對地組織程式。一旦完成、除錯等一個小型的模組化程式碼部分,就不必再返回到它,開發人員可以繼續關注其他問題。
ABAP 程式由稱為模組化處理塊的處理塊組成。它們是:
從程式外部和 ABAP 執行時環境(即事件塊和對話方塊模組)呼叫的處理塊。
從 ABAP 程式呼叫的處理塊。
除了使用處理塊進行模組化之外,原始碼模組還用於透過宏和包含程式對原始碼進行模組化。
原始碼級別的模組化:
- 區域性宏
- 全域性包含程式
透過從 ABAP 程式呼叫的處理塊進行模組化:
- 子例程
- 功能模組
模組化原始碼意味著將一系列 ABAP 語句放在模組中。可以根據使用者的需求在程式中呼叫模組化的原始碼。原始碼模組增強了 ABAP 程式的可讀性和可理解性。建立單獨的原始碼模組還可以防止一次又一次地重複編寫相同的語句,這反過來又使第一次閱讀程式碼的人更容易理解。
SAP ABAP - 子程式
子例程是可重用的程式碼段。它是程式中的一個模組化單元,其中函式以原始碼的形式封裝。您可以將程式的一部分分頁到子例程中,以便更好地概述主程式,並多次使用相應的語句序列,如下面的圖所示。

我們有程式 X,其中包含 3 個不同的原始碼塊。每個塊都具有相同的 ABAP 語句。基本上,它們是相同的程式碼塊。為了使此程式碼更易於維護,我們可以將程式碼封裝到子例程中。我們可以在程式中根據需要多次呼叫此子例程。可以使用 Form 和 EndForm 語句定義子例程。
以下是子例程定義的一般語法。
FORM <subroutine_name>. <statements> ENDFORM.
我們可以使用 PERFORM 語句呼叫子例程。控制跳轉到子例程 <subroutine_name> 中的第一個可執行語句。遇到 ENDFORM 時,控制跳轉回 PERFORM 語句後面的語句。
示例
步驟 1 − 轉到事務程式碼 SE80。開啟現有程式,然後右鍵單擊程式。在本例中,它是“ZSUBTEST”。
步驟 2 − 選擇“建立”,然後選擇“子例程”。在欄位中寫入子例程名稱,然後單擊“繼續”按鈕。子例程名稱為“Sub_Display”,如下面的螢幕截圖所示。

步驟 3 − 在 FORM 和 ENDFORM 語句塊中編寫程式碼。子例程已成功建立。
我們需要包含 PERFORM 語句來呼叫子例程。讓我們看看程式碼:
REPORT ZSUBTEST. PERFORM Sub_Display. * Form Sub_Display * --> p1 text * <-- p2 text FORM Sub_Display. Write: 'This is Subroutine'. Write: / 'Subroutine created successfully'. ENDFORM. " Sub_Display
步驟 4 − 儲存、啟用並執行程式。上述程式碼產生以下輸出:
Subroutine Test: This is Subroutine Subroutine created successfully
因此,使用子例程使您的程式更面向函式。它將程式的任務分解成子函式,以便每個子例程負責一個子函式。您的程式變得更容易維護,因為對函式的更改通常只需要在子例程中實現。
SAP ABAP - 宏
如果我們想在一個程式中多次重用同一組語句,我們需要將它們包含在一個宏中。例如,宏對於長計算或編寫複雜的 WRITE 語句很有用。我們只能在定義宏的程式中使用宏。宏定義應該在程式中使用宏之前發生。
宏是基於佔位符設計的。佔位符就像 C 語言中的指標。您可以在 DEFINE...END-OF-DEFINITION 語句中定義宏。
以下是宏定義的基本語法:
DEFINE <macro_name>. <statements> END-OF-DEFINITION. ...... <macro_name> [<param1> <param2>....].
在呼叫宏之前,必須先定義它。<param1>…. 替換 ABAP 語句中包含的宏定義中的佔位符 &1...。
宏定義中的佔位符最大數量為九個。也就是說,當程式執行時,SAP 系統會將宏替換為適當的語句,並且佔位符 &1、&2……&9 將被引數 param1、param2……param9 替換。我們可以在另一個宏中呼叫宏,但不能呼叫同一個宏。
示例
轉到事務程式碼 SE38。建立一個新的程式 ZMACRO_TEST,以及簡短文字欄位中的描述,以及適當的屬性,例如型別和狀態,如下面的螢幕截圖所示:

以下是程式碼:
REPORT ZMACRO_TEST. DEFINE mac_test. WRITE: 'This is Macro &1'. END-OF-DEFINITION. PARAMETERS: s1 type C as checkbox. PARAMETERS: s2 type C as checkbox. PARAMETERS: s3 type C as checkbox default 'X'. START-OF-SELECTION. IF s1 = 'X'. mac_test 1. ENDIF. IF s2 = 'X'. mac_test 2. ENDIF. IF s3 = 'X'. mac_test 3. ENDIF.
我們有 3 個複選框。執行程式時,讓我們選擇 S2 複選框。

以上程式碼產生以下輸出:
A Macro Program This is Macro 2
如果選擇所有複選框,則程式碼將產生以下輸出:
A Macro Program This is Macro 1 This is Macro 2 This is Macro 3
SAP ABAP - 函式模組
功能模組構成了 SAP 系統的主要部分,因為多年來 SAP 一直使用功能模組對程式碼進行模組化,從而允許程式碼本身、其開發人員以及其客戶重用程式碼。
功能模組是包含一組可重用語句以及匯入和匯出引數的子程式。與包含程式不同,功能模組可以獨立執行。SAP 系統包含多個預定義的功能模組,可以從任何 ABAP 程式中呼叫。功能組充當許多邏輯上屬於一起的功能模組的容器。例如,HR 工資系統的功能模組將組合到一個功能組中。
要檢視如何建立功能模組,必須探索功能構建器。您可以使用事務程式碼 SE37 找到功能構建器。只需鍵入部分功能模組名稱和萬用字元即可演示如何搜尋功能模組。鍵入 *amount*,然後按 F4 鍵。

搜尋結果將顯示在新視窗中。功能模組顯示在藍色背景的行中,其功能組顯示在粉紅色行中。您可以使用物件導航器螢幕(事務程式碼 SE80)進一步檢視功能組 ISOC。您可以看到功能組中包含的功能模組列表以及其他物件。讓我們考慮功能模組 SPELL_AMOUNT。此功能模組將數字轉換為文字。
建立新程式
步驟 1 − 轉到事務程式碼 SE38 並建立一個名為 Z_SPELLAMOUNT 的新程式。
步驟 2 − 輸入一些程式碼,以便可以設定引數,在其中可以輸入值並傳遞給功能模組。此處的文字元素 text-001 讀取“輸入值”。
步驟 3 − 要編寫此程式碼,請使用 CTRL+F6。之後,將出現一個視窗,其中“呼叫函式”是列表中的第一個選項。在文字框中輸入“spell_amount”,然後單擊“繼續”按鈕。

步驟 4 − 一些程式碼會自動生成。但是我們需要增強 IF 語句,以包含向螢幕寫入訊息的程式碼,例如“函式模組返回的值:sy-subrc”,並新增 ELSE 語句,以便在函式模組成功時輸出正確的結果。這裡,必須設定一個新變數來儲存從函式模組返回的值。讓我們將其稱為“result”。
以下是程式碼:
REPORT Z_SPELLAMOUNT. data result like SPELL. selection-screen begin of line. selection-screen comment 1(15) text-001. parameter num_1 Type I. selection-screen end of line. CALL FUNCTION 'SPELL_AMOUNT' EXPORTING AMOUNT = num_1 IMPORTING IN_WORDS = result. IF SY-SUBRC <> 0. Write: 'Value returned is:', SY-SUBRC. else. Write: 'Amount in words is:', result-word. ENDIF.
步驟 5 − 函式模組返回的變數稱為 IN_WORDS。在程式中設定相應的變數“result”。使用 LIKE 語句引用名為 SPELL 的結構來定義 IN_WORDS。
步驟 6 − 儲存、啟用並執行程式。輸入如下螢幕截圖所示的值,然後按 F8。

以上程式碼產生以下輸出:
Spelling the Amount Amount in words is: FIVE THOUSAND SIX HUNDRED EIGHTY
SAP ABAP - 包含程式
包含程式是用於模組化原始碼的全域性儲存庫物件。它們允許您在不同的程式中使用相同的原始碼。包含程式還可以幫助您井然有序地管理複雜的程式。為了在另一個程式中使用包含程式,我們使用以下語法:
INCLUDE <program_name>.
INCLUDE 語句的效果與將包含程式
編寫包含程式程式碼時,有一些限制:
- 包含程式不能呼叫自身。
- 包含程式必須包含完整的語句。
以下是建立和使用包含程式的步驟:
步驟 1 − 在 ABAP 編輯器中建立要包含的程式 (Z_TOBEINCLUDED)。要在 ABAP 編輯器中包含的程式碼為:
PROGRAM Z_TOBEINCLUDED. Write: / 'This program is started by:', SY-UNAME, / 'The Date is:', SY-DATUM, / 'Time is', SY-UZEIT.
步驟 2 − 將程式的型別設定為 INCLUDE 程式,如下面的螢幕截圖所示。

步驟 3 − 單擊“儲存”按鈕,並將程式儲存在名為 ZINCL_PCKG 的包中。
步驟 4 − 建立另一個程式,其中必須使用程式 Z_TOBEINCLUDED。這裡我們建立了另一個名為 Z_INCLUDINGTEST 的程式,並將程式的型別指定為可執行程式。
步驟 5 − Z_INCLUDINGTEST 程式的編碼使用 INCLUDE 語句包含 Z_TOBEINCLUDED 程式,如下面的程式碼所示。
REPORT Z_INCLUDINGTEST. INCLUDE Z_TOBEINCLUDED.
步驟 6 − 儲存、啟用並執行程式。
以上程式碼產生以下輸出:
This program is started by: SAPUSER The Date is: 06.10.2015 Time is 13:25:11
SAP ABAP - Open SQL 概述
開放式 SQL 指的是 ABAP 語句的子集,這些語句能夠直接訪問當前 AS ABAP 中心資料庫中的資料。開放式 SQL 語句將所有資料庫系統都支援的 SQL 資料操作語言功能對映到 ABAP 中。
開放式 SQL 語句在資料庫介面的開放式 SQL 介面中轉換為特定於資料庫的 SQL。然後,它們被傳輸到資料庫系統並執行。開放式 SQL 語句可用於訪問在 ABAP 字典中宣告的資料庫表。預設情況下訪問 AS ABAP 的中心資料庫,也可以透過輔助資料庫連線訪問其他資料庫。
每當在 ABAP 程式中使用這些語句中的任何一個時,務必檢查執行的操作是否成功。如果嘗試將記錄插入資料庫表但未正確插入,則必須瞭解這一點,以便在程式中採取適當的操作。這可以使用已經使用的系統欄位 SY-SUBRC 來完成。當語句成功執行時,SY-SUBRC 欄位將包含值 0,因此可以對此進行檢查,如果出現該值,則可以繼續執行程式。
DATA 語句用於宣告工作區。讓我們將其命名為“wa_customers1”。與其為此宣告一種資料型別,不如宣告構成表的多個欄位。最簡單的方法是使用 LIKE 語句。
INSERT 語句
這裡宣告的 wa_customers1 工作區與 ZCUSTOMERS1 表類似,具有相同的結構,但本身不成為表。此工作區只能儲存一條記錄。聲明後,可以使用 INSERT 語句將工作區及其儲存的記錄插入表中。這裡的程式碼將讀取為“INSERT ZCUSTOMERS1 FROM wa_customers1”。
必須用一些資料填充工作區。使用 ZCUSTOMERS1 表中的欄位名。這可以透過前嚮導航、雙擊程式碼中的表名或開啟新會話並使用事務 SE11 來完成。然後可以將表的欄位複製並貼上到 ABAP 編輯器中。
以下是程式碼片段:
DATA wa_customers1 LIKE ZCUSTOMERS1. wa_customers1-customer = '100006'. wa_customers1-name = 'DAVE'. wa_customers1-title = 'MR'. wa_customers1-dob = '19931017'. INSERT ZCUSTOMERS1 FROM wa_customers1.
然後可以使用 CHECK 語句,如下所示。這意味著如果記錄正確插入,系統將宣告這一點。如果沒有,則將顯示不等於零的 SY-SUBRC 程式碼。以下是程式碼片段:
IF SY-SUBRC = 0. WRITE 'Record Inserted Successfully'. ELSE. WRITE: 'The return code is ', SY-SUBRC. ENDIF.
檢查程式,儲存,啟用程式碼,然後測試它。輸出視窗應顯示為“記錄插入成功”。
CLEAR 語句
CLEAR 語句允許清除欄位或變數,以便在其位置插入新資料,從而允許重複使用它。CLEAR 語句通常用於程式中,它允許多次使用現有欄位。
在之前的程式碼片段中,工作區結構已填充資料以建立要插入 ZCUSTOMERS1 表的新記錄,然後執行驗證檢查。如果要插入新記錄,必須使用 CLEAR 語句,以便可以使用新資料再次填充它。
UPDATE 語句
如果要同時更新表中的一條或多條現有記錄,則使用 UPDATE 語句。與 INSERT 語句類似,宣告一個工作區,填充程式執行時要放入記錄中的新資料。此處將更新先前使用 INSERT 語句建立的記錄。只需編輯 NAME 和 TITLE 欄位中儲存的文字。然後在新的一行上,使用與 INSERT 語句相同的結構,這次使用 UPDATE 語句,如下面的程式碼片段所示:
DATA wa_customers1 LIKE ZCUSTOMERS1. wa_customers1-customer = '100006'. wa_customers1-name = 'RICHARD'. wa_customers1-title = 'MR'. wa_customers1-dob = '19931017'. UPDATE ZCUSTOMERS1 FROM wa_customers1.
執行 UPDATE 語句後,您可以檢視 ABAP 字典中的資料瀏覽器,以檢視記錄是否已成功更新。
MODIFY 語句
MODIFY 語句可以被認為是 INSERT 和 UPDATE 語句的組合。它可以用來插入新記錄或修改現有記錄。它遵循與前兩個語句類似的語法,從輸入工作區的資料中修改記錄。
執行此語句時,將檢查所涉及的關鍵欄位與表中的關鍵欄位。如果已存在具有這些關鍵欄位值的記錄,則將對其進行更新。如果沒有,則將建立一個新記錄。
以下是建立新記錄的程式碼片段:
CLEAR wa_customers1. DATA wa_customers1 LIKE ZCUSTOMERS1. wa_customers1-customer = '100007'. wa_customers1-name = 'RALPH'. wa_customers1-title = 'MR'. wa_customers1-dob = '19910921'. MODIFY ZCUSTOMERS1 FROM wa_customers1.
在此示例中,使用 CLEAR 語句以便可以將新條目放入工作區,然後新增客戶(編號)100007。由於這是一個新的、唯一的關鍵欄位值,因此將插入一條新記錄,並將執行另一個驗證檢查。
執行此操作並在資料瀏覽器中檢視資料後,將為客戶編號 100007 (RALPH) 建立一條新記錄。
以上程式碼產生以下輸出(表內容):

SAP ABAP - Native SQL 概述
術語“原生 SQL”指的是所有可以靜態傳輸到資料庫介面的原生 SQL 介面的語句。原生 SQL 語句不屬於 ABAP 的語言範圍,也不遵循 ABAP 語法。ABAP 僅包含用於隔離可以列出原生 SQL 語句的程式部分的語句。

在原生 SQL 中,主要可以使用特定於資料庫的 SQL 語句。這些語句從原生 SQL 介面到資料庫系統幾乎沒有更改就被傳輸並執行。可以使用相關資料庫的完整 SQL 語言範圍,並且不需要在 ABAP 字典中宣告已定址的資料庫表。還有一小部分 SAP 特定的原生 SQL 語句,這些語句由原生 SQL 介面以特定方式處理。
要使用原生 SQL 語句,必須在它前面加上 EXEC SQL 語句,並在後面加上 ENDEXEC 語句。
語法如下:
EXEC SQL PERFORMING <form>. <Native SQL statement> ENDEXEC.
這些語句定義了 ABAP 程式中的一個區域,可以在其中列出一種或多種原生 SQL 語句。輸入的語句將傳遞到原生 SQL 介面,然後按如下方式處理:
所有對已定址資料庫系統的程式介面有效的 SQL 語句都可以在 EXEC 和 ENDEXEC 之間列出,特別是 DDL(資料定義語言)語句。
這些 SQL 語句從原生 SQL 介面傳遞到資料庫系統,基本上沒有改變。語法規則由資料庫系統指定,尤其是資料庫物件的區分大小寫規則。
如果語法允許在各個語句之間使用分隔符,則可以在 EXEC 和 ENDEXEC 之間包含多個原生 SQL 語句。
可以在 EXEC 和 ENDEXEC 之間指定 SAP 特定的原生 SQL 語言元素。這些語句不會直接從原生 SQL 介面傳遞到資料庫,而是會進行適當的轉換。
示例
SPFLI 是一個標準的 SAP 表,用於儲存航班時刻資訊。這取決於版本和釋出級別,可在 R/3 SAP 系統中使用。當您將表名 SPFLI 輸入相關 SAP 事務(例如 SE11 或 SE80)時,您可以檢視此資訊。您還可以使用這兩個事務檢視此資料庫表中包含的資料。
REPORT ZDEMONATIVE_SQL. DATA: BEGIN OF wa, connid TYPE SPFLI-connid, cityfrom TYPE SPFLI-cityfrom, cityto TYPE SPFLI-cityto, END OF wa. DATA c1 TYPE SPFLI-carrid VALUE 'LH'. EXEC SQL PERFORMING loop_output. SELECT connid, cityfrom, cityto INTO :wa FROM SPFLI WHERE carrid = :c1 ENDEXEC. FORM loop_output. WRITE: / wa-connid, wa-cityfrom, wa-cityto. ENDFORM.
以上程式碼產生以下輸出:
0400 FRANKFURT NEW YORK 2402 FRANKFURT BERLIN 0402 FRANKFURT NEW YORK
SAP ABAP - 內部表
內部表實際上是一個臨時表,它包含正在執行的 ABAP 程式的記錄。內部表僅在 SAP 程式的執行時存在。它們用於使用 ABAP 語言處理大量資料。當您需要從資料庫表中檢索資料時,需要在 ABAP 程式中宣告一個內部表。
內部表中的資料儲存在行和列中。每一行稱為行,每一列稱為欄位。在內部表中,所有記錄都具有相同的結構和鍵。使用索引或鍵訪問內部表的各個記錄。由於內部表一直存在到關聯程式執行完畢為止,因此當程式執行終止時,內部表的記錄將被丟棄。因此,內部表可以用作臨時儲存區或臨時緩衝區,可以在其中根據需要修改資料。這些表僅在執行時佔用記憶體,而不是在宣告時佔用記憶體。
內部表只在程式執行時存在,因此在編寫程式碼時,必須以程式能夠使用的方式來構造內部表。您會發現內部表的操作方式與結構相同。主要區別在於結構只有一行,而內部表可以根據需要擁有任意多行。
內部表可以由多個欄位組成,這些欄位對應於表的列,就像在ABAP字典中使用多個欄位建立表一樣。關鍵欄位也可以與內部表一起使用,並且在建立這些內部表時,它們提供了更大的靈活性。使用內部表,可以指定非唯一鍵,允許儲存任意數量的非唯一記錄,並允許根據需要儲存重複記錄。
內部表的大小或包含的行數不是固定的。內部表的大小會根據與內部表關聯的程式的需求而變化。但建議儘可能保持內部表的小型化。這樣做是為了避免系統在處理海量資料時執行緩慢。
內部表用於多種目的:
它們可以用來儲存計算結果,這些結果可以在程式的後面部分使用。
內部表還可以儲存記錄和資料,以便快速訪問這些資料,而無需從資料庫表中訪問這些資料。
它們非常通用。可以使用任意數量的其他已定義結構來定義它們。
示例
假設使用者想要從一個或多個大型表中建立一個包含各種客戶聯絡號碼的列表。使用者首先建立一個內部表,從客戶表中選擇相關資料,然後將資料放入內部表中。其他使用者可以直接訪問和使用此內部表來檢索所需的資訊,而無需編寫資料庫查詢來在程式執行時執行每個操作。
SAP ABAP - 建立內部表
使用DATA語句宣告內部表。程式必須知道表從哪裡開始和結束。因此,使用BEGIN OF語句,然後宣告表名。之後,使用OCCURS附加項,後跟一個數字,這裡為0。OCCURS告訴SAP正在建立內部表,而0表示它最初不包含任何記錄。它將在填充資料時擴充套件。
語法如下:
DATA: BEGIN OF <internal_tab> Occurs 0,
讓我們在新的一行上建立欄位。例如,建立“name”欄位,宣告為LIKE ZCUSTOMERS1-name。建立另一個名為“dob”的欄位,LIKE ZCUSTOMERS1-dob。最初將內部表中的欄位名稱與在其他地方建立的其他欄位名稱相同是有用的。最後,使用“END OF <internal_tab>.”宣告內部表的結束,如下面的程式碼所示:
DATA: BEGIN OF itab01 Occurs 0, name LIKE ZCUSTOMERS1-name, dob LIKE ZCUSTOMERS1-dob, END OF itab01.
這裡“itab01”在SAP中建立臨時表時常用作簡寫。OCCURS子句用於透過宣告表的欄位來定義內部表的主體。當使用OCCURS子句時,可以指定一個數值常量“n”來根據需要確定額外的預設記憶體。OCCUR 0子句使用的預設記憶體大小為8 KB。現在建立了內部表的結構,可以編寫程式碼來用記錄填充它。
可以使用或不使用標題行來建立內部表。要建立帶標題行的內部表,請在內部表的定義中,在OCCURS子句之前使用BEGIN OF子句或在OCCURS子句之後使用WITH HEADER LINE子句。要建立不帶標題行的內部表,請在不使用BEGIN OF子句的情況下使用OCCURS子句。
您還可以使用TYPES語句建立一個內部表作為區域性資料型別(僅在當前程式上下文中使用的的資料型別)。此語句使用TYPE或LIKE子句引用現有表。
建立內部表作為區域性資料型別的語法如下:
TYPES <internal_tab> TYPE|LIKE <internal_tab_type> OF <line_type_itab> WITH <key> INITIAL SIZE <size_number>.
這裡<internal_tab_type>指定內部表<internal_tab>的表型別,<line_type_itab>指定內部錶行的型別。在TYPES語句中,可以使用TYPE子句將內部表的行型別指定為資料型別,並使用LIKE子句將行型別指定為資料物件。指定內部表鍵是可選的,如果使用者沒有指定鍵,則SAP系統將定義一個具有任意鍵的表型別。
INITIAL SIZE <size_number> 透過為其分配初始記憶體量來建立內部表物件。在前面的語法中,INITIAL SIZE子句為size_number錶行預留記憶體空間。每當宣告內部表物件時,表的大小都不屬於表的 資料型別。
注意 - 當第一次填充內部表時,消耗的記憶體要少得多。
示例
步驟1 - 透過執行SE38事務程式碼開啟ABAP編輯器。出現ABAP編輯器的初始螢幕。
步驟2 - 在初始螢幕中,輸入程式名稱,選擇“原始碼”單選按鈕,然後單擊“建立”按鈕以建立新程式。
步驟3 - 在“ABAP:程式屬性”對話方塊中,在“標題”欄位中輸入程式的簡短描述,從“屬性”組框中的“型別”下拉選單中選擇“可執行程式”選項。單擊“儲存”按鈕。
步驟4 - 在ABAP編輯器中編寫以下程式碼。
REPORT ZINTERNAL_DEMO. TYPES: BEGIN OF CustomerLine, Cust_ID TYPE C, Cust_Name(20) TYPE C, END OF CustomerLine. TYPES mytable TYPE SORTED TABLE OF CustomerLine WITH UNIQUE KEY Cust_ID. WRITE:/'The mytable is an Internal Table'.
步驟5 - 像往常一樣儲存、啟用和執行程式。
在此示例中,mytable是一個內部表,並在Cust_ID欄位上定義了一個唯一鍵。
以上程式碼產生以下輸出:
The mytable is an Internal Table.
SAP ABAP - 填充內部表
在內部表中,填充包括選擇、插入和追加等功能。本章重點介紹INSERT和APPEND語句。
INSERT 語句
INSERT語句用於將單行或多行插入內部表。
以下是將單行新增到內部表的語法:
INSERT <work_area_itab> INTO <internal_tab> INDEX <index_num>.
在此語法中,INSERT語句在internal_tab內部表中插入新行。可以使用work_area_itab INTO表示式在internal_tab引數之前插入新行。當使用work_area_itab INTO表示式時,新行取自work_area_itab工作區並插入到internal_tab表中。但是,當不使用work_area_itab INTO表示式插入行時,該行取自internal_tab表的標題行。
當使用INDEX子句將新行插入內部表時,插入行之後行的索引號將加1。如果內部表包含<index_num> - 1行,則新行將新增到表的末尾。當SAP系統成功將一行新增到內部表時,SY-SUBRC變數將設定為0。
示例
以下是一個使用insert語句的示例程式。
REPORT ZCUSLIST1. DATA: BEGIN OF itable1 OCCURS 4, F1 LIKE SY-INDEX, END OF itable1. DO 4 TIMES. itable1-F1 = sy-index. APPEND itable1. ENDDO. itable1-F1 = -96. INSERT itable1 INDEX 2. LOOP AT itable1. Write / itable1-F1. ENDLOOP. LOOP AT itable1 Where F1 ≥ 3. itable1-F1 = -78. INSERT itable1. ENDLOOP. Skip. LOOP AT itable1. Write / itable1-F1. ENDLOOP.
以上程式碼產生以下輸出:
1 96- 2 3 4 1 96- 2 78- 3 78- 4
在上面的示例中,DO迴圈追加包含數字1到4的4行。標題行元件itable1-F1的值已賦值為-96。Insert語句將標題行作為新行插入到第3行之前的正文中。現有的第3行在插入後變為第4行。LOOP AT語句從內部表中檢索F1值大於或等於3的行。在每一行之前,Insert語句從其標題行插入新行。在插入之前,F1元件已更改為包含-78。
在執行每個insert語句之後,系統會重新索引插入行下方的所有行。當您在大型內部表的頂部附近插入行時,這會引入開銷。如果您需要將多行插入大型內部表,請準備另一個包含要插入行的表,並使用插入行。
在itable1的迴圈中插入itable1內的新的行時,它不會立即影響內部表。它實際上在下一個迴圈傳遞中生效。在當前行之後插入一行時,表在ENDLOOP處重新索引。sy-tabix遞增,下一個迴圈處理sy-tabix指向的行。例如,如果您在第二個迴圈傳遞中並且您在第3行之前插入一條記錄。當執行endloop時,新行變為第3行,舊的第3行變為第4行,依此類推。Sy-tabix遞增1,下一個迴圈傳遞處理新插入的記錄。
APPEND語句
APPEND語句用於向現有內部表新增單行。此語句從工作區複製單行,並將其插入內部表中最後一行之後。工作區可以是標題行或任何其他與內部錶行結構相同的欄位字串。以下是用於向內部表追加單行的APPEND語句的語法:
APPEND <record_for_itab> TO <internal_tab>.
在此語法中,<record_for_itab>表示式可以用可轉換為行型別的<work_area_itab>工作區或INITIAL LINE子句來表示。如果使用者使用<work_area_itab>工作區,則SAP系統會向<internal_tab>內部表新增新行,並用工作區的內容填充它。INITIAL LINE子句追加空白行,其中包含表結構中每個欄位的初始值。在每個APPEND語句之後,SY-TABIX變數包含追加行的索引號。
向具有非唯一鍵的標準表和已排序表追加行,無論表中是否已存在具有相同鍵的行,其工作方式都相同。換句話說,可能會出現重複條目。但是,如果使用者嘗試向具有唯一鍵的已排序表新增重複條目,或者使用者透過向其追加行來違反已排序表的排序順序,則會發生執行時錯誤。
示例
REPORT ZCUSLIST1. DATA: BEGIN OF linv Occurs 0, Name(20) TYPE C, ID_Number TYPE I, END OF linv. DATA table1 LIKE TABLE OF linv. linv-Name = 'Melissa'. linv-ID_Number = 105467. APPEND linv TO table1. LOOP AT table1 INTO linv. Write: / linv-name, linv-ID_Number. ENDLOOP.
以上程式碼產生以下輸出:
Melissa 105467
SAP ABAP - 複製內部表
當我們從具有標題行的內部表讀取記錄時,該記錄將從表本身移動到標題行。然後,程式將使用標題行。建立新記錄時也是如此。它是您使用的標題行,新記錄從中傳送到表體本身。
為了複製記錄,我們可以使用 SELECT 語句選擇表中的所有記錄,然後使用 MOVE 語句將記錄從原始表移動到新的內部表中對應的欄位。
以下是 MOVE 語句的語法:
MOVE <table_field> TO <internal_tab_field>.
示例
REPORT ZCUSLIST1. TABLES: ZCUSTOMERS1. DATA: BEGIN OF itab01 Occurs 0, name LIKE ZCUSTOMERS1-name, dob LIKE ZCUSTOMERS1-dob, END OF itab01. Select * FROM ZCUSTOMERS1. MOVE ZCUSTOMERS1-name TO itab01-name. MOVE ZCUSTOMERS1-dob TO itab01-dob. ENDSELECT. Write: / itab01-name, itab01-dob.
以上程式碼產生以下輸出:
MARGARET 02.11.1994
SELECT 迴圈一次填充一個欄位,使用 MOVE 語句將資料從一個表的欄位移動到另一個表的欄位。在上面的例子中,MOVE 語句用於將 ZCUSTOMERS1 表的內容移動到內部表中對應的欄位。您可以只用一行程式碼完成此操作。您可以使用 MOVECORRESPONDING 語句。
以下是 MOVECORRESPONDING 語句的語法:
MOVE-CORRESPONDING <table_name> TO <internal_tab>.
它告訴系統將 ZCUSTOMERS1 的欄位資料移動到 itab01 中對應的欄位。
示例
REPORT ZCUSTOMERLIST. TABLES: ZCUSTOMERS1. DATA: Begin of itab01 occurs 0, customer LIKE ZCUSTOMERS1-customer, name LIKE ZCUSTOMERS1-name, title LIKE ZCUSTOMERS1-title, dob LIKE ZCUSTOMERS1-dob, END OF itab01. SELECT * from ZCUSTOMERS1. MOVE-Corresponding ZCUSTOMERS1 TO itab01. APPEND itab01. ENDSELECT. LOOP AT itab01. Write: / itab01-name, itab01-dob. ENDLOOP.
以上程式碼產生以下輸出:
MARK 21.05.1981 JAMES 14.08.1977 AURIELE 19.06.1990 STEPHEN 22.07.1985 MARGARET 02.11.1994
這是因為兩者都有匹配的欄位名。使用此語句時,需要確保兩個欄位的資料型別和長度匹配。這之前已經透過 LIKE 語句完成了。
SAP ABAP - 讀取內部表
我們可以使用 READ TABLE 語句的以下語法讀取表的行:
READ TABLE <internal_table> FROM <work_area_itab>.
在此語法中,<work_area_itab> 表示式表示與 <internal_table> 表的行型別相容的工作區。我們可以使用 WITH KEY 子句在 READ 語句中指定搜尋鍵,但不能指定表鍵,如下面的語法所示:
READ TABLE <internal_table> WITH KEY = <internal_tab_field>.
這裡,內部表的整行用作**搜尋鍵**。表的整行內容與 <internal_tab_field> 欄位的內容進行比較。如果 <internal_tab_field> 欄位的值與表的行型別不相容,則根據表的行型別轉換這些值。搜尋鍵允許您在沒有結構化行型別的內部表中查詢條目,即行是單個欄位或內部表型別的情況。
READ 語句的以下語法用於使用 COMPARING 子句指定工作區或欄位符號:
READ TABLE <internal_table> <key> INTO <work_area_itab> [COMPARING <F1> <F2>...<Fn>].
使用 COMPARING 子句時,將結構化行型別的指定表字段 <F1>、<F2>……<Fn> 與工作區的對應欄位進行比較,然後再進行傳輸。如果指定了 ALL FIELDS 子句,則 SAP 系統會比較所有元件。當 SAP 系統根據鍵找到條目時,SY-SUBRC 變數的值設定為 0。此外,如果比較欄位的內容不同,或者 SAP 系統找不到條目,則 SY-SUBRC 變數的值設定為 2 或 4。但是,無論比較的結果如何,只要 SAP 系統找到條目,就會將條目複製到目標工作區。
示例
REPORT ZREAD_DEMO. */Creating an internal table DATA: BEGIN OF Record1, ColP TYPE I, ColQ TYPE I, END OF Record1. DATA mytable LIKE HASHED TABLE OF Record1 WITH UNIQUE KEY ColP. DO 6 Times. Record1-ColP = SY-INDEX. Record1-ColQ = SY-INDEX + 5. INSERT Record1 INTO TABLE mytable. ENDDO. Record1-ColP = 4. Record1-ColQ = 12. READ TABLE mytable FROM Record1 INTO Record1 COMPARING ColQ. WRITE: 'SY-SUBRC =', SY-SUBRC. SKIP. WRITE: / Record1-ColP, Record1-ColQ.
以上程式碼產生以下輸出:
SY-SUBRC = 2 4 9
在上面的例子中,mytable 是雜湊表型別的內部表,Record1 是工作區,ColP 是唯一鍵。最初,mytable 填充了六行,其中 ColP 欄位包含 SY-INDEX 變數的值,ColQ 欄位包含 (SY-INDEX + 5) 值。
Record1 工作區填充了 ColP 和 ColQ 欄位的值分別為 4 和 12。READ 語句使用 COMPARING 子句比較 ColP 鍵欄位的值與 Record1 工作區中的值後讀取表的行,然後將讀取的行內容複製到工作區。SY-SUBRC 變數的值顯示為 2,因為當 ColP 欄位中的值為 4 時,ColQ 中的值不是 12,而是 9。
SAP ABAP - 刪除內部表
DELETE 語句用於從內部表中刪除一個或多個記錄。內部表的記錄透過指定表鍵或條件,或透過查詢重複條目來刪除。如果內部表具有非唯一鍵幷包含重複條目,則刪除表中的第一個條目。
以下是使用 DELETE 語句從內部表中刪除記錄或行的語法:
DELETE TABLE <internal_table> FROM <work_area_itab>.
在上述語法中,<work_area_itab> 表示式是一個工作區,它應該與 <internal_table> 內部表的型別相容。刪除操作是基於可以從工作區元件中獲取的預設鍵執行的。
您還可以使用以下語法在 DELETE TABLE 語句中顯式指定表鍵:
DELETE TABLE <internal_table> WITH TABLE KEY <K1> = <F1>………… <Kn> = <Fn>.
在此語法中,<F1>、<F2>……<Fn> 是內部表的欄位,<K1>、<K2>……<Kn> 是表的鍵欄位。DELETE 語句用於根據表示式 <K1> = <F1>、<K2> = <F2>……<Kn> = <Fn> 刪除 <internal_table> 表的記錄或行。
**注意** - 如果 <F1>、<F2>……<Fn> 欄位的資料型別與 <K1>、<K2>……<Kn> 鍵欄位不相容,則 SAP 系統會自動將其轉換為相容的格式。
示例
REPORT ZDELETE_DEMO. DATA: BEGIN OF Line1, ColP TYPE I, ColQ TYPE I, END OF Line1. DATA mytable LIKE HASHED TABLE OF Line1 WITH UNIQUE KEY ColP. DO 8 TIMES. Line1-ColP = SY-INDEX. Line1-ColQ = SY-INDEX + 4. INSERT Line1 INTO TABLE mytable. ENDDO. Line1-ColP = 1. DELETE TABLE mytable: FROM Line1, WITH TABLE KEY ColP = 3. LOOP AT mytable INTO Line1. WRITE: / Line1-ColP, Line1-ColQ. ENDLOOP.
以上程式碼產生以下輸出:
2 6 4 8 5 9 6 10 7 11 8 12
在這個例子中,mytable 有兩個欄位,ColP 和 ColQ。最初,mytable 填充了八行,其中 ColP 包含值 1、2、3、4、5、6、7 和 8。ColQ 包含值 5、6、7、8、9、10、11 和 12,因為 ColP 值每次遞增 4。
DELETE 語句用於刪除 mytable 中 ColP 鍵欄位的值為 1 或 3 的行。刪除後,mytable 的 ColP 欄位包含值 2、4、5、6、7 和 8,如輸出所示。ColQ 欄位包含值 6、8、9、10、11 和 12。
SAP ABAP - 面向物件
面向物件簡化了軟體設計,使其更容易理解、維護和重用。**面向物件程式設計**(OOP) 代表了編寫軟體的一種不同思維方式。OOP 的優點在於其簡單性。OOP 的表達能力使其更容易按時交付高質量的軟體元件。
由於解決方案是根據現實世界中的物件設計的,程式設計師和業務分析師更容易交換關於使用通用領域語言的設計的想法和資訊。這些改進的溝通有助於揭示隱藏的需求,識別風險,並提高正在開發的軟體的質量。面向物件的方法側重於表示現實世界抽象或具體事物的物件。這些物件由它們的特徵和屬性定義,這些特徵和屬性由它們的內部結構和它們的屬性(資料)來表示。這些物件的行為由方法(即功能)來描述。
讓我們比較一下程序式程式設計和麵向物件程式設計:
特性 | 過程式方法 | 面向物件方法 |
---|---|---|
重點 | 重點在於任務。 | 重點在於執行這些任務的事物。 |
模組化 | 程式可以劃分為稱為函式的較小程式。 | 程式被組織成類和物件,功能被嵌入到類的成員函式中。 |
資料安全 | 大多數函式共享全域性資料。 | 資料可以隱藏,外部資源無法訪問。 |
可擴充套件性 | 修改和擴充套件現有功能比較耗時。 | 可以根據需要輕鬆新增新的資料和函式。 |
ABAP 最初是作為過程式語言開發的(類似於早期的程序式程式設計語言,如 COBOL)。但是,ABAP 現在已經透過引入 ABAP Objects 適應了面向物件正規化的原則。ABAP 中的面向物件概念,例如類、物件、繼承和多型性,與其他現代面嚮物件語言(如 Java 或 C++)的基本相同。
隨著面向物件的成型,每個類都承擔特定的角色分配。這種分工有助於簡化整體程式設計模型,允許每個類專注於解決手頭問題的特定部分。這樣的類具有高內聚性,並且每個類的操作以某種直觀的方式緊密相關。
面向物件的主要特性是:
- 有效的程式設計結構。
- 可以很好地模擬現實世界的實體。
- 強調資料安全和訪問。
- 最大限度地減少程式碼冗餘。
- 資料抽象和封裝。
SAP ABAP - 物件
物件是一種特殊的變數,具有獨特的特性和行為。物件的特性或屬性用於描述物件的狀態,而行為或方法則表示物件執行的操作。
物件是類的模式或例項。它代表一個現實世界的實體,例如一個人,或一個程式設計實體,例如變數和常量。例如,賬戶和學生是現實世界實體的例子。但是,計算機的硬體和軟體元件是程式設計實體的例子。
物件具有以下三個主要特徵:
- 具有狀態。
- 具有唯一的標識。
- 可能會也可能不會顯示行為。
物件的狀態可以描述為一組屬性及其值。例如,銀行賬戶具有一組屬性,例如賬戶號碼、姓名、賬戶型別、餘額以及所有這些屬性的值。物件的舉動是指其屬性在一段時間內發生的變化。
每個物件都有一個唯一的標識,可用於將其與其他物件區分開來。兩個物件可能表現出相同的行為,它們可能具有也可能不具有相同的狀態,但它們永遠不會具有相同的標識。兩個人可能有相同的姓名、年齡和性別,但他們並不相同。同樣,物件的標識在其整個生命週期中永遠不會改變。
物件可以透過傳送訊息相互互動。物件包含資料和用於操作資料的程式碼。物件也可以在類的幫助下用作使用者定義的資料型別。物件也稱為類型別的變數。定義類後,您可以建立任意數量屬於該類的物件。每個物件都與建立它的類型別的資料相關聯。
建立物件
物件建立通常包括以下步驟:
建立一個引用變數來引用類。其語法為:
DATA: <object_name> TYPE REF TO <class_name>.
從引用變數建立一個物件。其語法為:
CREATE Object: <object_name>.
示例
REPORT ZDEMO_OBJECT. CLASS Class1 Definition. Public Section. DATA: text1(45) VALUE 'ABAP Objects.'. METHODS: Display1. ENDCLASS. CLASS Class1 Implementation. METHOD Display1. Write:/ 'This is the Display method.'. ENDMETHOD. ENDCLASS. START-OF-SELECTION. DATA: Class1 TYPE REF TO Class1. CREATE Object: Class1. Write:/ Class1->text1. CALL METHOD: Class1->Display1.
以上程式碼產生以下輸出:
ABAP Objects. This is the Display method.
SAP ABAP - 類
類用於指定物件的表單,它將資料表示和用於操作該資料的方法組合成一個簡潔的包。類中的資料和函式稱為**類的成員**。
類定義和實現
定義類時,定義資料型別的藍圖。這實際上並沒有定義任何資料,但它確實定義了類名的含義、類的物件將包含的內容以及可以對這樣的物件執行的操作。也就是說,它定義了物件的抽象特性,例如屬性、欄位和特性。
以下語法顯示瞭如何定義類:
CLASS <class_name> DEFINITION. .......... .......... ENDCLASS.
類定義以關鍵字 CLASS 後跟類名、DEFINITION 和類體開頭。類的定義可以包含類的各種元件,例如屬性、方法和事件。當我們在類宣告中宣告方法時,必須在類實現中包含方法實現。以下語法顯示瞭如何實現類:
CLASS <class_name> IMPLEMENTATION. ........... .......... ENDCLASS.
**注意** - 類的實現包含其所有方法的實現。在 ABAP Objects 中,類的結構包含屬性、方法、事件、型別和常量等元件。
屬性
屬性是類的欄位,可以具有任何資料型別,例如 C、I、F 和 N。它們在類宣告中宣告。這些屬性可以分為兩類:例項屬性和靜態屬性。**例項屬性**定義物件的特定例項狀態。不同物件的屬性狀態不同。例項屬性使用 DATA 語句宣告。
靜態屬性定義了類的公共狀態,該狀態由類的所有例項共享。也就是說,如果您更改類的一個物件的靜態屬性,則更改也對類的所有其他物件可見。靜態屬性的宣告使用 CLASS-DATA 語句。
方法
方法是表示類中物件行為的函式或過程。類的這些方法可以訪問類的任何屬性。方法的定義也可以包含引數,以便在呼叫方法時可以向這些引數提供值。方法的定義在類宣告中宣告,並在類的實現部分實現。METHOD 和 ENDMETHOD 語句用於定義方法的實現部分。以下語法顯示瞭如何實現方法:
METHOD <m_name>. .......... .......... ENDMETHOD.
在此語法中,<m_name> 表示方法的名稱。注意 - 可以使用 CALL METHOD 語句呼叫方法。
訪問屬性和方法
類元件可以在公共、私有或受保護的可見性部分中定義,這些部分控制如何訪問這些元件。私有可見性部分用於拒絕從類外部訪問元件。此類元件只能從類內部(例如方法)訪問。
在公共可見性部分中定義的元件可以從任何上下文訪問。預設情況下,類的所有成員都是私有的。實際上,我們在私有部分定義資料,在公共部分定義相關方法,以便可以從類外部呼叫它們,如下面的程式所示。
在類中公共部分宣告的屬性和方法可以被該類和程式的任何其他類、子類訪問。
當在類中受保護部分宣告屬性和方法時,只有該類和子類(派生類)可以訪問它們。
當在類中私有部分宣告屬性和方法時,只有該類可以訪問它們,任何其他類都不能訪問。
示例
Report ZAccess1. CLASS class1 Definition. PUBLIC Section. Data: text1 Type char25 Value 'Public Data'. Methods meth1. PROTECTED Section. Data: text2 Type char25 Value 'Protected Data'. PRIVATE Section. Data: text3 Type char25 Value 'Private Data'. ENDCLASS. CLASS class1 Implementation. Method meth1. Write: / 'Public Method:', / text1, / text2, / text3. Skip. EndMethod. ENDCLASS. Start-Of-Selection. Data: Objectx Type Ref To class1. Create Object: Objectx. CALL Method: Objectx→meth1. Write: / Objectx→text1.
以上程式碼產生以下輸出:
Public Method: Public Data Protected Data Private Data Public Data
靜態屬性
靜態屬性用 CLASS-DATA 語句宣告。所有物件或例項都可以使用類的靜態屬性。靜態屬性可以直接使用類名訪問,例如 class_name⇒name_1 = 'Some Text'。
示例
以下是一個程式,我們想列印帶有行號 4 到 8 次的文字。我們定義一個類 class1,在公共部分宣告 CLASS-DATA(靜態屬性)和一個方法。在實現類和方法之後,我們直接在 Start-Of-Selection 事件中訪問靜態屬性。然後,我們只需建立類的例項並呼叫方法。
Report ZStatic1. CLASS class1 Definition. PUBLIC Section. CLASS-DATA: name1 Type char45, data1 Type I. Methods: meth1. ENDCLASS. CLASS class1 Implementation. Method meth1. Do 4 Times. data1 = 1 + data1. Write: / data1, name1. EndDo. Skip. EndMethod. ENDCLASS. Start-Of-Selection. class1⇒name1 = 'ABAP Object Oriented Programming'. class1⇒data1 = 0. Data: Object1 Type Ref To class1, Object2 Type Ref To class1. Create Object: Object1, Object2. CALL Method: Object1→meth1, Object2→meth1.
以上程式碼產生以下輸出:

建構函式
建構函式是在建立物件或訪問類的元件時自動呼叫的特殊方法。每當建立物件時,建構函式都會被觸發,但我們需要呼叫一個方法來觸發常規方法。在下面的示例中,我們聲明瞭兩個公共方法 method1 和建構函式。這兩個方法都有不同的操作。建立類的物件時,建構函式方法會觸發其操作。
示例
Report ZConstructor1. CLASS class1 Definition. PUBLIC Section. Methods: method1, constructor. ENDCLASS. CLASS class1 Implementation. Method method1. Write: / 'This is Method1'. EndMethod. Method constructor. Write: / 'Constructor Triggered'. EndMethod. ENDCLASS. Start-Of-Selection. Data Object1 Type Ref To class1. Create Object Object1.
以上程式碼產生以下輸出:
Constructor Triggered
方法中的 ME 運算子
當您在類的公共部分宣告任何型別的變數時,可以在任何其他實現中使用它。可以在公共部分宣告具有初始值的變數。我們可以在方法內部再次宣告該變數,並賦予不同的值。當我們在方法內部寫入變數時,系統將列印更改後的值。要反映變數的先前值,我們必須使用“ME”運算子。
在這個程式中,我們聲明瞭一個公共變數 text1 並初始化了一個值。我們再次聲明瞭相同的變數,但用不同的值例項化了它。在方法內部,我們使用“ME”運算子寫入該變數以獲取先前初始化的值。透過直接宣告,我們得到更改後的值。
示例
Report ZMEOperator1. CLASS class1 Definition. PUBLIC Section. Data text1 Type char25 Value 'This is CLASS Attribute'. Methods method1. ENDCLASS. CLASS class1 Implementation. Method method1. Data text1 Type char25 Value 'This is METHOD Attribute'. Write: / ME→text1, / text1. ENDMethod. ENDCLASS. Start-Of-Selection. Data objectx Type Ref To class1. Create Object objectx. CALL Method objectx→method1.
以上程式碼產生以下輸出:
This is CLASS Attribute This is METHOD Attribute
SAP ABAP - 繼承
面向物件程式設計中最重要概念之一是繼承。繼承允許我們根據另一個類來定義一個類,這使得建立和維護應用程式更容易。這也提供了重用程式碼功能和加快實現速度的機會。
建立類時,程式設計師無需編寫全新的資料成員和方法,而是可以指定新類應該繼承現有類的成員。這個現有類稱為基類或超類,新類稱為派生類或子類。
一個類的物件可以獲取另一個類的屬性。
派生類繼承超類的的資料和方法。但是,它們可以覆蓋方法並新增新方法。
繼承的主要優點是可重用性。
繼承關係使用類定義語句的“INHERITING FROM”附加項指定。
語法如下:
CLASS <subclass> DEFINITION INHERITING FROM <superclass>.
示例
Report ZINHERITAN_1. CLASS Parent Definition. PUBLIC Section. Data: w_public(25) Value 'This is public data'. Methods: ParentM. ENDCLASS. CLASS Child Definition Inheriting From Parent. PUBLIC Section. Methods: ChildM. ENDCLASS. CLASS Parent Implementation. Method ParentM. Write /: w_public. EndMethod. ENDCLASS. CLASS Child Implementation. Method ChildM. Skip. Write /: 'Method in child class', w_public. EndMethod. ENDCLASS. Start-of-selection. Data: Parent Type Ref To Parent, Child Type Ref To Child. Create Object: Parent, Child. Call Method: Parent→ParentM, child→ChildM.
以上程式碼產生以下輸出:
This is public data Method in child class This is public data
訪問控制和繼承
派生類可以訪問其基類的所有非私有成員。因此,超類成員不應被子類的成員函式訪問,應該在超類中宣告為私有。我們可以按誰可以訪問它們來總結不同的訪問型別:
訪問 | 公共 | 受保護 | 私有 |
---|---|---|---|
相同類 | 是 | 是 | 是 |
派生類 | 是 | 是 | 否 |
類外 | 是 | 否 | 否 |
從超類派生類時,可以透過公共、受保護或私有繼承進行繼承。繼承型別由如上所述的訪問說明符指定。我們幾乎不使用受保護或私有繼承,但公共繼承是常用的。使用不同型別的繼承時,會應用以下規則。
公共繼承 - 從公共超類派生類時,超類的公共成員成為子類的公共成員,超類的受保護成員成為子類的受保護成員。超類的私有成員永遠無法直接從子類訪問,但可以透過呼叫超類的公共和受保護成員來訪問。
受保護繼承 - 從受保護超類派生類時,超類的公共和受保護成員成為子類的受保護成員。
私有繼承 - 從私有超類派生類時,超類的公共和受保護成員成為子類的私有成員。
在子類中重新定義方法
超類的方法可以在子類中重新實現。重新定義方法的一些規則:
繼承方法的重新定義語句必須與原始方法的定義位於同一部分。
如果重新定義方法,則無需在子類中再次輸入其介面,只需輸入方法的名稱。
在重新定義的方法中,可以使用 super 引用訪問直接超類的元件。
偽引用 super 只能在重新定義的方法中使用。
示例
Report Zinheri_Redefine. CLASS super_class Definition. Public Section. Methods: Addition1 importing g_a TYPE I g_b TYPE I exporting g_c TYPE I. ENDCLASS. CLASS super_class Implementation. Method Addition1. g_c = g_a + g_b. EndMethod. ENDCLASS. CLASS sub_class Definition Inheriting From super_class. Public Section. METHODS: Addition1 Redefinition. ENDCLASS. CLASS sub_class Implementation. Method Addition1. g_c = g_a + g_b + 10. EndMethod. ENDCLASS. Start-Of-Selection. Parameters: P_a Type I, P_b TYPE I. Data: H_Addition1 TYPE I. Data: H_Sub TYPE I. Data: Ref1 TYPE Ref TO sub_class. Create Object Ref1. Call Method Ref1→Addition1 exporting g_a = P_a g_b = P_b Importing g_c = H_Addition1. Write:/ H_Addition1.
執行 F8 後,如果我們輸入值 9 和 10,則上述程式碼會產生以下輸出:

Redefinition Demo 29
SAP ABAP - 多型性
多型性這個術語字面意思是“多種形式”。從面向物件的角度來看,多型性與繼承一起工作,使得繼承樹中的各種型別可以互換使用。也就是說,當存在類層次結構並且它們透過繼承相關聯時,就會發生多型性。ABAP 多型性意味著對方法的呼叫將導致執行不同的方法,具體取決於呼叫方法的物件型別。
以下程式包含一個抽象類“class_prgm”,2 個子類(class_procedural 和 class_OO)以及一個測試驅動程式類“class_type_approach”。在此實現中,類方法“start”允許我們顯示程式設計型別及其方法。如果您仔細觀察方法“start”的簽名,您會發現它接收型別為 class_prgm 的匯入引數。但是,在 Start-Of-Selection 事件中,此方法在執行時使用 class_procedural 和 class_OO 型別的物件被呼叫。
示例
Report ZPolymorphism1. CLASS class_prgm Definition Abstract. PUBLIC Section. Methods: prgm_type Abstract, approach1 Abstract. ENDCLASS. CLASS class_procedural Definition Inheriting From class_prgm. PUBLIC Section. Methods: prgm_type Redefinition, approach1 Redefinition. ENDCLASS. CLASS class_procedural Implementation. Method prgm_type. Write: 'Procedural programming'. EndMethod. Method approach1. Write: 'top-down approach'. EndMethod. ENDCLASS. CLASS class_OO Definition Inheriting From class_prgm. PUBLIC Section. Methods: prgm_type Redefinition, approach1 Redefinition. ENDCLASS. CLASS class_OO Implementation. Method prgm_type. Write: 'Object oriented programming'. EndMethod. Method approach1. Write: 'bottom-up approach'. EndMethod. ENDCLASS. CLASS class_type_approach Definition. PUBLIC Section. CLASS-METHODS: start Importing class1_prgm Type Ref To class_prgm. ENDCLASS. CLASS class_type_approach IMPLEMENTATION. Method start. CALL Method class1_prgm→prgm_type. Write: 'follows'. CALL Method class1_prgm→approach1. EndMethod. ENDCLASS. Start-Of-Selection. Data: class_1 Type Ref To class_procedural, class_2 Type Ref To class_OO. Create Object class_1. Create Object class_2. CALL Method class_type_approach⇒start Exporting class1_prgm = class_1. New-Line. CALL Method class_type_approach⇒start Exporting class1_prgm = class_2.
以上程式碼產生以下輸出:
Procedural programming follows top-down approach Object oriented programming follows bottom-up approach
ABAP 執行時環境在匯入引數 class1_prgm 的賦值期間執行隱式縮小轉換。此功能有助於泛型地實現“start”方法。與物件引用變數關聯的動態型別資訊允許 ABAP 執行時環境動態地將方法呼叫與物件引用變數指向的物件中定義的實現繫結。例如,“class_type_approach”類中方法“start”的匯入引數“class1_prgm”是指向抽象型別,該型別永遠無法自行例項化。
每當使用具體的子類實現(例如 class_procedural 或 class_OO)呼叫該方法時,class1_prgm 引用引數的動態型別就會繫結到這些具體型別之一。因此,對方法“prgm_type”和“approach1”的呼叫指的是 class_procedural 或 class_OO 子類中提供的實現,而不是 class “class_prgm”中提供的未定義的抽象實現。
SAP ABAP - 封裝
封裝是面向物件程式設計 (OOP) 的一個概念,它將資料及其操作資料的函式繫結在一起,並防止外部干擾和誤用。資料封裝導致了重要的 OOP 概念資料隱藏。封裝是將資料與其使用的函式捆綁在一起的機制,而資料抽象是僅公開介面並向用戶隱藏實現細節的機制。
ABAP 透過建立稱為類的使用者定義型別來支援封裝和資料隱藏的屬性。如前所述,類可以包含私有、受保護和公共成員。預設情況下,在類中定義的所有專案都是私有的。
介面封裝
封裝實際上意味著一個屬性和方法可以在不同的類中修改。因此,資料和方法可以具有不同的形式和邏輯,這些形式和邏輯可以隱藏到單獨的類中。
讓我們考慮一下基於介面的封裝。當我們需要在不同的類中建立具有不同功能的一種方法時,就使用介面。這裡方法的名稱不需要改變。相同的方法必須在不同的類實現中實現。
示例
下面的程式包含一個介面inter_1。我們聲明瞭一個屬性和一個方法method1。我們還定義了兩個類,例如Class1和Class2。因此,我們必須在這兩個類的實現中實現方法'method1'。我們在不同的類中以不同的方式實現了方法'method1'。在程式開始處,我們為兩個類建立了兩個物件Object1和Object2。然後,我們透過不同的物件呼叫該方法,以獲得在不同類中宣告的功能。
Report ZEncap1. Interface inter_1. Data text1 Type char35. Methods method1. EndInterface. CLASS Class1 Definition. PUBLIC Section. Interfaces inter_1. ENDCLASS. CLASS Class2 Definition. PUBLIC Section. Interfaces inter_1. ENDCLASS. CLASS Class1 Implementation. Method inter_1~method1. inter_1~text1 = 'Class 1 Interface method'. Write / inter_1~text1. EndMethod. ENDCLASS. CLASS Class2 Implementation. Method inter_1~method1. inter_1~text1 = 'Class 2 Interface method'. Write / inter_1~text1. EndMethod. ENDCLASS. Start-Of-Selection. Data: Object1 Type Ref To Class1, Object2 Type Ref To Class2. Create Object: Object1, Object2. CALL Method: Object1→inter_1~method1, Object2→inter_1~method1.
以上程式碼產生以下輸出:
Class 1 Interface method Class 2 Interface method
封裝類對外部世界的依賴性不大。此外,它們與外部客戶端的互動是透過穩定的公共介面來控制的。也就是說,封裝類及其客戶端是鬆散耦合的。在大多數情況下,具有明確定義介面的類可以插入另一個上下文。如果設計正確,封裝類將成為可重用的軟體資產。
設計策略
我們大多數人都透過痛苦的經驗瞭解到,除非我們真的需要公開類成員,否則預設情況下應將其設定為私有。這只是良好的封裝。這種智慧最常應用於資料成員,也同樣適用於所有成員。
SAP ABAP - 介面
與ABAP中的類類似,介面充當物件的資料型別。介面的組成部分與類的組成部分相同。與類的宣告不同,介面的宣告不包含可見性部分。這是因為在介面宣告中定義的元件始終整合在類的公共可見性部分。
當兩個相似的類具有相同名稱的方法但功能彼此不同時,使用介面。介面可能看起來類似於類,但在介面中定義的功能是在類中實現的,以擴充套件該類的範圍。介面連同繼承特性為多型性提供了基礎。這是因為在介面中定義的方法可以在不同的類中表現出不同的行為。
以下是建立介面的通用格式:
INTERFACE <intf_name>. DATA..... CLASS-DATA..... METHODS..... CLASS-METHODS..... ENDINTERFACE.
在此語法中,<intf_name>表示介面的名稱。DATA和CLASSDATA語句可分別用於定義介面的例項和靜態屬性。METHODS和CLASS-METHODS語句可分別用於定義介面的例項和靜態方法。由於介面的定義不包含實現類,因此在介面的宣告中不需要新增DEFINITION子句。
注意 - 介面的所有方法都是抽象的。它們已完全宣告,包括其引數介面,但在介面中未實現。所有想要使用介面的類都必須實現介面的所有方法。否則,該類將成為抽象類。
我們在類的實現部分使用以下語法:
INTERFACE <intf_name>.
在此語法中,<intf_name>表示介面的名稱。請注意,此語法必須在類的公共部分使用。
以下語法用於在類的實現內部實現介面的方法:
METHOD <intf_name~method_m>. <statements>. ENDMETHOD.
在此語法中,<intf_name~method_m>表示<intf_name>介面方法的全名。
示例
Report ZINTERFACE1. INTERFACE my_interface1. Methods msg. ENDINTERFACE. CLASS num_counter Definition. PUBLIC Section. INTERFACES my_interface1. Methods add_number. PRIVATE Section. Data num Type I. ENDCLASS. CLASS num_counter Implementation. Method my_interface1~msg. Write: / 'The number is', num. EndMethod. Method add_number. ADD 7 TO num. EndMethod. ENDCLASS. CLASS drive1 Definition. PUBLIC Section. INTERFACES my_interface1. Methods speed1. PRIVATE Section. Data wheel1 Type I. ENDCLASS. CLASS drive1 Implementation. Method my_interface1~msg. Write: / 'Total number of wheels is', wheel1. EndMethod. Method speed1. Add 4 To wheel1. EndMethod. ENDCLASS. Start-Of-Selection. Data object1 Type Ref To num_counter. Create Object object1. CALL Method object1→add_number. CALL Method object1→my_interface1~msg. Data object2 Type Ref To drive1. Create Object object2. CALL Method object2→speed1. CALL Method object2→my_interface1~msg.
以上程式碼產生以下輸出:
The number is 7 Total number of wheels is 4
在上例中,my_interface1是包含'msg'方法的介面的名稱。接下來,定義並實現了兩個類num_counter和drive1。這兩個類都實現了'msg'方法以及定義其各自例項行為的特定方法,例如add_number和speed1方法。
注意 - add_number和speed1方法特定於各個類。
SAP ABAP - 物件事件
事件是在類中定義的一組結果,用於觸發其他類中的事件處理程式。觸發事件時,我們可以呼叫任意數量的事件處理程式方法。觸發器與其處理程式方法之間的連結實際上是在執行時動態確定的。
在正常的函式呼叫中,呼叫程式確定需要呼叫物件的哪個方法或類的哪個方法。由於並非為每個事件都註冊了固定的處理程式方法,因此在事件處理的情況下,處理程式方法確定需要觸發的事件。
類的事件可以透過使用RAISE EVENT語句來觸發同一類的事件處理程式方法。對於事件,可以使用FOR EVENT子句在同一類或不同類中定義事件處理程式方法,如下面的語法所示:
FOR EVENT <event_name> OF <class_name>.
與類的方法類似,事件可以具有引數介面,但它只有輸出引數。輸出引數由RAISE EVENT語句傳遞給事件處理程式方法,該語句將其作為輸入引數接收。事件透過使用SET HANDLER語句在程式中動態地與其處理程式方法連結。
當事件被觸發時,應該在所有處理類中執行相應的事件處理程式方法。
示例
REPORT ZEVENT1. CLASS CL_main DEFINITION. PUBLIC SECTION. DATA: num1 TYPE I. METHODS: PRO IMPORTING num2 TYPE I. EVENTS: CUTOFF. ENDCLASS. CLASS CL_eventhandler DEFINITION. PUBLIC SECTION. METHODS: handling_CUTOFF FOR EVENT CUTOFF OF CL_main. ENDCLASS. START-OF-SELECTION. DATA: main1 TYPE REF TO CL_main. DATA: eventhandler1 TYPE REF TO CL_eventhandler. CREATE OBJECT main1. CREATE OBJECT eventhandler1. SET HANDLER eventhandler1→handling_CUTOFF FOR main1. main1→PRO( 4 ). CLASS CL_main IMPLEMENTATION. METHOD PRO. num1 = num2. IF num2 ≥ 2. RAISE EVENT CUTOFF. ENDIF. ENDMETHOD. ENDCLASS. CLASS CL_eventhandler IMPLEMENTATION. METHOD handling_CUTOFF. WRITE: 'Handling the CutOff'. WRITE: / 'Event has been processed'. ENDMETHOD. ENDCLASS.
以上程式碼產生以下輸出:
Handling the CutOff Event has been processed
SAP ABAP - 報表程式設計
報表是以組織結構形式呈現的資料。許多資料庫管理系統都包含一個報表編寫器,使您可以設計和生成報表。SAP應用程式支援報表建立。
經典報表是透過在迴圈內使用WRITE語句中的輸出資料建立的。它們不包含任何子報表。SAP還提供一些標準報表,例如用於跨客戶端複製表的RSLTCOP和用於顯示例項引數的RSPARAM。
這些報表只有一個螢幕作為輸出。我們可以使用各種事件,例如INITIALIZATON & TOP-OF-PAGE來建立經典報表,並且每個事件在建立經典報表期間都有其自身的意義。每個事件都與特定使用者操作相關聯,並且僅在使用者執行該操作時才觸發。
下表描述了事件和描述:
序號 | 事件 & 描述 |
---|---|
1 | INITIALIZATON 在顯示選擇螢幕之前觸發。 |
2 | AT SELECTION-SCREEN 在處理選擇螢幕上的使用者輸入後觸發。此事件在程式執行之前驗證使用者輸入。處理使用者輸入後,選擇螢幕保持活動狀態。 |
3 | START-OF-SELECTION 僅在選擇螢幕處理結束後觸發;也就是說,當用戶單擊選擇螢幕上的“執行”圖示時。 |
4 | END-OF-SELECTION 在執行START-OF-SELECTON事件中的最後一個語句後觸發。 |
5 | TOP-OF-PAGE 由第一個WRITE語句觸發,以在新頁面上顯示資料。 |
6 | END-OF-PAGE 觸發以在報表的頁面末尾顯示文字。請注意,此事件是建立報表時的最後一個事件,應與REPORT語句的LINE-COUNT子句結合使用。 |
示例
讓我們建立一個經典報表。我們將使用ABAP編輯器中的一系列語句來顯示儲存在標準資料庫MARA(包含一般物料資料)中的資訊。
REPORT ZREPORT2 LINE-SIZE 75 LINE-COUNT 30(3) NO STANDARD PAGE HEADING. Tables: MARA. TYPES: Begin of itab, MATNR TYPE MARA-MATNR, MBRSH TYPE MARA-MBRSH, MEINS TYPE MARA-MEINS, MTART TYPE MARA-MTART, End of itab. DATA: wa_ma TYPE itab, it_ma TYPE STANDARD TABLE OF itab. SELECT-OPTIONS: MATS FOR MARA-MATNR OBLIGATORY. INITIALIZATION. MATS-LOW = '1'. MATS-HIGH = '500'. APPEND MATS. AT SELECTION-SCREEN. . IF MATS-LOW = ' '. MESSAGE I000(ZKMESSAGE). ELSEIF MATS-HIGH = ' '. MESSAGE I001(ZKMESSAGE). ENDIF. TOP-OF-PAGE. WRITE:/ 'CLASSICAL REPORT CONTAINING GENERAL MATERIAL DATA FROM THE TABLE MARA' COLOR 7. ULINE. WRITE:/ 'MATERIAL' COLOR 1, 24 'INDUSTRY' COLOR 2, 38 'UNITS' COLOR 3, 53 'MATERIAL TYPE' COLOR 4. ULINE. END-OF-PAGE. START-OF-SELECTION. SELECT MATNR MBRSH MEINS MTART FROM MARA INTO TABLE it_ma WHERE MATNR IN MATS. LOOP AT it_ma into wa_ma. WRITE:/ wa_ma-MATNR, 25 wa_ma-MBRSH, 40 wa_ma-MEINS, 55 wa_ma-MTART. ENDLOOP. END-OF-SELECTION. ULINE. WRITE:/ 'CLASSICAL REPORT HAS BEEN CREATED' COLOR 7. ULINE. SKIP.
以上程式碼生成的輸出包含來自標準表MARA的一般物料資料:

SAP ABAP - 對話程式設計
對話方塊程式設計處理多個物件的發展。所有這些物件都與主程式分層連結,並且按順序執行。對話方塊程式開發利用ABAP工作臺中的工具。這些工具與標準SAP應用程式開發中使用的工具相同。
以下是對話方塊程式的主要組成部分:
- 螢幕
- 模組池
- 子例程
- 選單
- 事務
工具集

應透過物件瀏覽器(事務:SE80)開發對話方塊程式,以便所有物件都連結到主程式,而無需顯式指向每個物件。高階導航技術增強了從一個物件移動到另一個物件的過程。
螢幕由螢幕屬性、屏幕布局、欄位和流程邏輯組成。模組池包含放置在對話方塊程式的包含程式中的模組化語法。這些模組可以由流程邏輯呼叫,該流程邏輯由對話方塊處理器處理。
建立新的對話方塊程式
步驟1 - 在事務SE80中,從下拉列表中選擇“程式”,併為您的自定義SAP程式輸入Z名稱,例如“ZSCREENEX”。
步驟2 - 按Enter鍵,選擇“With TOP INCL”,然後單擊“是”按鈕。

步驟3 - 為您的頂級包含程式輸入名稱“ZSCRTOP”,然後單擊綠色勾號。
步驟4 - 在屬性螢幕中,只需輸入標題並單擊儲存按鈕。
向對話方塊程式新增螢幕
步驟1 - 要向程式新增螢幕,請右鍵單擊程式名稱,然後選擇“建立”→“螢幕”選項。
步驟2 - 輸入螢幕編號“0211”,然後單擊綠色勾號。

步驟3 - 在下一個螢幕中,輸入簡短標題,設定為普通螢幕型別,然後單擊頂部應用程式工具欄上的儲存按鈕。
屏幕布局和新增“Hello World”文字
步驟1 - 單擊應用程式工具欄中的佈局按鈕,將出現螢幕繪製器視窗。
步驟2 - 新增文字欄位並輸入一些文字,例如“Hello World”。

步驟3 - 儲存並激活螢幕。
建立事務
步驟1 - 要為您的程式建立事務程式碼,只需右鍵單擊程式名稱,然後選擇“建立”→“事務”選項,並輸入事務程式碼“ZTRANEX”。

步驟2 - 輸入事務文字、程式和您剛剛建立的螢幕(ZSCREENEX和0211),並在“GUI支援”部分選中“SAPGUI for Windows”複選框。
執行程式
儲存並激活所有內容。您可以執行程式。程式執行時,您輸入的文字將顯示在螢幕上,如下面的螢幕截圖所示。

SAP ABAP - 智慧表單
SAP Smart Forms工具可用於列印和傳送文件。此工具可用於開發表單、PDF檔案、電子郵件和網際網路文件。該工具提供了一個介面來構建和維護表單的佈局和邏輯。SAP還提供了一些用於業務流程的表單,例如那些用於客戶關係管理 (CRM)、銷售和分銷 (SD)、財務會計 (FI) 和人力資源 (HR) 的表單。
此工具允許您使用簡單的圖形工具來修改表單,而無需使用任何程式設計工具。這意味著沒有程式設計知識的使用者可以輕鬆地為業務流程配置這些表單資料。
在Smart Form中,資料是從靜態表和動態表中檢索的。表標題和小計由觸發的事件指定,然後在最終輸出之前對資料進行排序。Smart Form允許您合併圖形,這些圖形可以作為表單的一部分顯示,也可以作為背景顯示。您也可以在打印表單時根據需要隱藏背景圖形。
SAP系統中提供的一些標準Smart Forms示例如下:
SF_EXAMPLE_01代表包含客戶航班預訂的表格輸出的發票。
SF_EXAMPLE_02代表類似於SF_EXAMPLE_01的發票,但包含小計。
SF_EXAMPLE_03指定類似於SF_EXAMPLE_02的發票,但在應用程式程式中可以選擇多個客戶。
建立表單
讓我們使用SAP Smart Forms工具建立一個表單。在本教程中,您還將學習如何在Smart Form中新增節點以及如何測試表單。這裡我們首先建立SF_EXAMPLE_01表單的副本。SF_EXAMPLE_01表單是SAP系統中提供的標準Smart Form。
步驟 1 − 智慧表單構建器是用於構建智慧表單的主要介面。它位於 SAP 智慧表單的初始螢幕上。我們需要在命令欄位中輸入“SMARTFORMS”事務程式碼以開啟 SAP 智慧表單的初始螢幕。在此螢幕上,在“表單”欄位中輸入表單名稱 SF_EXAMPLE_01。
步驟 2 − 選擇智慧表單→複製或單擊“複製”圖示以開啟“複製表單或文字”對話方塊。
步驟 3 − 在“目標物件”欄位中,輸入新表單的名稱。名稱必須以字母 Y 或 Z 開頭。在本例中,表單的名稱為“ZSMM1”。

步驟 4 − 單擊“繼續”圖示或在“複製表單或文字”對話方塊中按 ENTER 鍵,以便建立 ZSMM1 表單作為預定義表單 SF_EXAMPLE_01 的副本。
步驟 5 − 單擊“儲存”圖示。表單的名稱將顯示在 SAP 智慧表單初始螢幕上的“表單”欄位中。
步驟 6 − 單擊 SAP 智慧表單初始螢幕上的“建立”按鈕。ZSMM1 表單將顯示在表單構建器中。
步驟 7 − 將建立具有主視窗的第一個草稿頁。新表單的所有元件都基於預定義表單 SF_EXAMPLE_01。您只需單擊導航選單中的節點即可檢視其內容。

在表單中建立文字節點
步驟 1 − 在 SAP 表單構建器螢幕的更改模式下開啟表單,然後右鍵單擊“第一頁”節點中的“主視窗”選項,並從上下文選單中選擇“建立”→“文字”。
步驟 2 − 將“文字”欄位中的文字修改為“My_Text”,將“含義”欄位中的文字修改為“Text_Demo”。在表單構建器中心框架的文字編輯框中輸入文字“Hello TutorialsPoint.....”,如下圖所示:

步驟 3 − 單擊“儲存”按鈕儲存節點。
步驟 4 − 分別單擊“啟用”和“測試”圖示來啟用和測試節點。將顯示函式構建器的初始螢幕。
步驟 5 − 單擊“啟用”和“執行”圖示來啟用和測試函式模組。函式模組的引數將顯示在函式構建器的初始螢幕上。
步驟 6 − 單擊“執行”圖示執行函式模組。將出現“列印”對話方塊。
步驟 7 − 將輸出裝置指定為“LP01”,然後單擊“列印預覽”按鈕。
以上步驟將產生以下輸出:

SAP ABAP - SAPscript
SAP 系統的 SAPscript 工具可用於構建和管理業務表單,例如發票和採購訂單。SAPscript 工具提供了許多模板,在很大程度上簡化了業務表單的設計。
SAP 系統附帶標準 SAPscript 表單,這些表單隨 SAP 標準客戶端(通常為客戶端 000)一起交付。以下是隨客戶端 000 一起交付的標準 SAPscript 表單的一些示例:
序號 | 表單名稱和說明 |
---|---|
1 | RVORDER01 銷售訂單確認單 |
2 | RVDELNOTE 裝箱單 |
3 | RVINVOICE01 發票 |
4 | MEDRUCK 採購訂單 |
5 | F110_PRENUM_CHCK 預編號支票 |
SAPscript 表單的結構包含兩個主要元件:
內容 − 這可以是文字(業務資料)或圖形(公司徽標)。
佈局 − 這由表單內容顯示的一組視窗定義。
SAPscript – 表單繪製器工具
表單繪製器工具提供 SAPscript 表單的圖形佈局和各種操作表單的功能。在下面的示例中,我們將透過複製其佈局結構從標準 SAPscript 表單 RVINVOICE01 建立發票表單,並透過訪問表單繪製器工具來顯示其佈局。
步驟 1 − 開啟表單繪製器。您可以透過導航 SAP 選單或使用 SE71 事務程式碼來請求螢幕。
步驟 2 − 在表單繪製器請求螢幕中,分別在“表單”和“語言”欄位中輸入 SAPscript 表單的名稱和語言。讓我們分別在這些欄位中輸入“RVINVOICE01”和“EN”。

步驟 3 − 在“子物件”組框中選擇“頁面佈局”單選按鈕。
步驟 4 − 選擇“實用程式”→“從客戶端複製”以建立 RVINVOICE01 表單的副本。“在客戶端之間複製表單”螢幕將出現。
步驟 5 − 在“在客戶端之間複製表單”螢幕中,在“表單名稱”欄位中輸入表單的原始名稱“RVINVOICE01”,在“源客戶端”欄位中輸入源客戶端號“000”,在“目標表單”欄位中輸入目標表單的名稱“ZINV_01”。確保其他設定保持不變。

步驟 6 − 接下來,單擊“在客戶端之間複製表單”螢幕中的“執行”圖示。“建立物件目錄條目”對話方塊將出現。單擊“儲存”圖示。
ZINV_01 表單將從 RVINVOICE01 表單複製,並在“在客戶端之間複製表單”螢幕中顯示,如下面的快照所示:

步驟 7 − 單擊兩次後退圖示,然後導航回到表單繪製器:請求螢幕,其中包含已複製表單 ZINV_01 的名稱。
步驟 8 − 單擊“顯示”按鈕後,“表單 ZINV_01:第一頁佈局”視窗和“表單:更改頁面佈局:ZINV_01”螢幕將出現,如下面的螢幕截圖所示。

步驟 9 − “表單 ZINV_01:第一頁佈局”視窗顯示錶單的初始佈局。表單的佈局包含五個視窗:HEADER、ADDRESS、INFO、INFO1 和 MAIN。這些視窗的描述可以在 PC 編輯器中訪問。
例如,只需選擇 MAIN 視窗並單擊“表單:更改頁面佈局:ZINV_01”螢幕中的“文字”圖示,您就可以檢視所有邊距值,如下面的螢幕截圖所示:

SAP ABAP - 使用者出口
客戶出口可以被認為是 SAP 標準程式的掛鉤。我們不需要訪問金鑰來編寫程式碼,也不需要修改 SAP 標準程式。這些出口沒有任何功能,它們是空的。可以新增業務邏輯以滿足各種客戶需求。但是,並非所有程式都提供客戶出口。
標準事務的客戶出口
以下是關於標準事務的查詢客戶出口的步驟。讓我們確定 MM01(物料主資料建立)中可用的客戶出口。

步驟 1 − 轉到事務 MM01,並透過轉到選單欄→系統→狀態來識別 MM01 的程式名稱,如上面的螢幕截圖所示。
步驟 2 − 從彈出螢幕獲取程式名稱。程式名稱為“SAPLMGMM”。
步驟 3 − 轉到事務 SE38,輸入程式名稱並單擊“顯示”。
步驟 4 − 導航到轉到→屬性,並找出此程式名稱的包。

包名稱為“MGA”。
步驟 5 − 轉到通常用於識別客戶出口的事務程式碼 SMOD。導航到實用程式→查詢(或)您也可以直接在事務程式碼 SMOD 上按 Ctrl + F。
步驟 6 − 轉到“查找出口”屏幕後,輸入我們之前獲得的包名稱,然後按 F8(執行)按鈕。

以上步驟將產生以下輸出,其中列出了物料主資料建立中可用的出口。

SAP ABAP - 使用者出口
如果標準 SAP 抽取器未提供預期的功能或所需的功能(例如授權或時間檢查),則在抽取中使用使用者出口。使用者出口通常用於銷售和分銷 (SD) 模組。SAP 在銷售、運輸、裝運和計費領域提供了許多出口。使用者出口旨在在標準 SAP 無法滿足所有需求時進行一些更改。
要訪問銷售各個領域中可用的出口,請使用以下路徑轉到 IMG:IMG → 銷售和分銷 → 系統修改 → 使用者出口。對銷售各個領域中每個出口的文件進行了詳盡的解釋。
例如,如果您想查詢銷售憑證處理(合同、報價或銷售訂單)中的使用者出口,請按照上述路徑繼續展開節點銷售中的使用者出口→使用者出口。單擊圖示文件以檢視銷售憑證處理中可用的所有使用者出口。
序號 | 使用者出口和說明 |
---|---|
1 | USEREXIT_FIELD_MODIFICATION 用於修改螢幕屬性。 |
2 | USEREXIT_SAVE_DOCUMENT 在使用者單擊“儲存”時幫助執行操作。 |
3 | USEREXIT_SAVE_DOCUMENT_PREPARE 非常有用,可以檢查輸入欄位,在欄位中放入任何值,或向用戶顯示彈出視窗並確認文件。 |
4 | USEREXIT_MOVE_FIELD_TO_VBAK 當用戶標頭更改移動到標頭工作區時使用。 |
5 | USEREXIT_MOVE_FIELD_TO_VBAP 當用戶專案更改移動到 SAP 專案工作區時使用。 |
使用者出口與客戶出口具有相同的目的,但它們僅適用於 SD 模組。出口實現為對函式模組的呼叫。使用者出口是對 SAP 標準程式的修改。
示例
REPORT ZUSEREXIT1. TABLES: TSTC, TSTCT, TADIR, TRDIR, TFDIR, ENLFDIR, MODSAPT, MODACT. DATA: JTAB LIKE TADIR OCCURS 0 WITH HEADER LINE, field1(30), v_devclass LIKE TADIR-devclass. PARAMETERS: P_TCODE LIKE TSTC-tcode OBLIGATORY. SELECT SINGLE * FROM TSTC WHERE tcode EQ P_TCODE. IF SY-SUBRC EQ 0. SELECT SINGLE * FROM TADIR WHERE pgmid = 'R3TR' AND object = 'PROG' AND obj_name = TSTC-pgmna. MOVE TADIR-devclass TO v_devclass. IF SY-SUBRC NE 0. SELECT SINGLE * FROM TRDIR WHERE name = TSTC-pgmna. IF TRDIR-subc EQ 'F'. SELECT SINGLE * FROM TFDIR WHERE pname = TSTC-pgmna. SELECT SINGLE * FROM ENLFDIR WHERE funcname = TFDIR-funcname. SELECT SINGLE * FROM TADIR WHERE pgmid = 'R3TR' AND object = 'FUGR' AND obj_name EQ ENLFDIR-area. MOVE TADIR-devclass TO v_devclass. ENDIF. ENDIF. SELECT * FROM TADIR INTO TABLE JTAB WHERE pgmid = 'R3TR' AND object = 'SMOD' AND devclass = v_devclass. SELECT SINGLE * FROM TSTCT WHERE sprsl EQ SY-LANGU AND tcode EQ P_TCODE. FORMAT COLOR COL_POSITIVE INTENSIFIED OFF. WRITE:/(19) 'Transaction Code - ', 20(20) P_TCODE, 45(50) TSTCT-ttext. SKIP. IF NOT JTAB[] IS INITIAL. WRITE:/(95) SY-ULINE. FORMAT COLOR COL_HEADING INTENSIFIED ON. WRITE:/1 SY-VLINE, 2 'Exit Name', 21 SY-VLINE , 22 'Description', 95 SY-VLINE. WRITE:/(95) SY-ULINE. LOOP AT JTAB. SELECT SINGLE * FROM MODSAPT WHERE sprsl = SY-LANGU AND name = JTAB-obj_name. FORMAT COLOR COL_NORMAL INTENSIFIED OFF. WRITE:/1 SY-VLINE, 2 JTAB-obj_name HOTSPOT ON, 21 SY-VLINE , 22 MODSAPT-modtext, 95 SY-VLINE. ENDLOOP. WRITE:/(95) SY-ULINE. DESCRIBE TABLE JTAB. SKIP. FORMAT COLOR COL_TOTAL INTENSIFIED ON. WRITE:/ 'No of Exits:' , SY-TFILL. ELSE. FORMAT COLOR COL_NEGATIVE INTENSIFIED ON. WRITE:/(95) 'User Exit doesn’t exist'. ENDIF. ELSE. FORMAT COLOR COL_NEGATIVE INTENSIFIED ON. WRITE:/(95) 'Transaction Code Does Not Exist'. ENDIF. AT LINE-SELECTION. GET CURSOR FIELD field1. CHECK field1(4) EQ 'JTAB'. SET PARAMETER ID 'MON' FIELD sy-lisel+1(10). CALL TRANSACTION 'SMOD' AND SKIP FIRST SCREEN.
在處理過程中,輸入事務程式碼“ME01”並按 F8(執行)按鈕。以上程式碼將產生以下輸出:

SAP ABAP - 業務附加功能 (Business Add-Ins)
在某些情況下,需要在軟體應用程式中預定義特殊函式以增強各種應用程式的功能。許多 Microsoft Excel 載入項都可以提高 MS Excel 的功能。類似地,SAP 透過提供稱為 BADI 的業務附加功能來促進一些預定義的功能。
BADI 是一種增強技術,它使 SAP 程式設計師、使用者或特定行業能夠向 SAP 系統中的現有程式新增一些附加程式碼。我們可以使用標準或自定義邏輯來改進 SAP 系統。必須首先定義 BADI,然後才能實現它以增強 SAP 應用程式。在定義 BADI 時,將建立一個介面。BADI 由此介面實現,而介面又由一個或多個介面卡類實現。
BADI 技術在兩個方面不同於其他增強技術:
- 增強技術只能實現一次。
- 許多客戶可以同時使用此增強技術。

您還可以建立過濾器 BADI,這意味著 BADI 是基於過濾資料的,而增強技術無法實現這一點。在 SAP Release 7.0 中,BADI 的概念已重新定義,目標如下:
透過在 ABAP 語言中新增兩個新元素“GET BADI”和“CALL BADI”來增強 SAP 系統中的標準應用程式。
為增強 SAP 系統中的標準應用程式提供更多靈活的功能,例如上下文和過濾器。
建立BADI時,它包含一個介面和其他附加元件,例如選單增強和螢幕增強的功能程式碼。建立BADI允許客戶在標準SAP應用程式中包含他們自己的增強功能。增強功能、介面和生成的類位於合適的應用程式開發名稱空間中。
因此,BADI可以被認為是一種增強技術,它使用ABAP物件在SAP元件中建立“預定義點”。然後,這些預定義點由各個行業解決方案、國家變體、合作伙伴和客戶來實現,以滿足他們的特定需求。SAP實際上在4.6A版本中引入了BADI增強技術,並且該技術在7.0版本中再次進行了重新實現。
SAP ABAP - Web Dynpro
用於ABAP的Web Dynpro (WD)是由SAP AG開發的SAP標準使用者介面技術。它可用於在使用SAP開發工具和概念的SAP ABAP環境中開發基於Web的應用程式。它提供了一個前端Web使用者介面,可以直接連線到後端SAP R/3系統,以訪問資料和報告功能。
用於ABAP的Web Dynpro由一個執行時環境和一個圖形化開發環境組成,該環境具有整合在ABAP工作臺(事務:SE80)中的特定開發工具。
Web Dynpro架構
下圖顯示了Web Dynpro的整體架構:

關於Web Dynpro,需要注意以下幾點:
Web Dynpro是SAP NetWeaver的使用者介面程式設計模型。
所有Web Dynpro應用程式都按照模型-檢視-控制器(MVC)程式設計模型進行結構化。
模型定義了與主系統的介面,Web Dynpro應用程式可以訪問系統資料。
檢視負責在Web瀏覽器中顯示資料。
控制器位於檢視和模型之間。控制器格式化要在檢視中顯示的模型資料。它處理使用者進行的使用者輸入並將其返回給模型。
優勢
Web Dynpro為應用程式開發人員提供了以下優勢:
使用圖形工具可顯著減少實施工作量。
透過使用元件實現重用和更好的可維護性。
使用Web Dynpro工具可以輕鬆更改佈局和導航。
支援使用者介面可訪問性。
完全整合到ABAP開發環境中。
Web Dynpro元件和視窗
元件是Web Dynpro應用程式專案的全域性單元。建立Web Dynpro元件是開發新的Web Dynpro應用程式的初始步驟。建立元件後,它充當Web Dynpro物件列表中的節點。您可以在一個元件中建立任意數量的元件檢視,並將它們組合到任意數量的相應Web Dynpro視窗中。
每個Web Dynpro元件至少包含一個Web Dynpro視窗。Web Dynpro視窗嵌入在前端Web應用程式中顯示的所有檢視。視窗在ABAP工作臺的視窗編輯器中進行處理。
注意
元件檢視顯示應用程式的所有管理詳細資訊,包括描述、建立者的姓名、建立日期和分配的開發包。
Web Dynpro應用程式是ABAP工作臺物件列表中的獨立物件。視窗和應用程式之間的互動是由給定視窗的介面檢視建立的。