定義屏幕:
1. 標(biāo)準(zhǔn)屏幕必須隸屬于一個類型為 L, M 或 F 的ABAP 程序,
其中需要設(shè)計的內(nèi)容包括屏幕布局以及隱含在其后的流邏輯. 流邏輯則包含ABAP代碼模塊, 實際控制著屏幕的交互, 功能,
各事務(wù)流程(如后續(xù)屏幕設(shè)定), 當(dāng)然還有設(shè)定屏幕的GUI狀態(tài), 包括菜單, 屏幕標(biāo)題行和工具欄等.
流邏輯模塊是一種處理塊, 是進行具體處理的ABAP代碼, 在 MODULE/ENDMODULE之間定義.
對話屏幕中的字段則必須在ABAP程序中有相關(guān)的同名字段, 并在其間相互傳輸,
程序通過程序中的同名字段來控制屏幕字段的輸出值, 并且接受用戶在屏幕字段中的輸入.
3. 屏幕調(diào)用序列.
4. 屏幕屬性.
5. 布局設(shè)計.
屏幕元素的屬性可以在程序中動態(tài)進行控制, 方法為在屏幕輸出之前的一個PBO模塊代碼部分對系統(tǒng)內(nèi)表
Screen的值進行修改.
上面的代碼應(yīng)屬于一個PBO模塊, 并在屏幕的PBO邏輯中被調(diào)用.
Screen 結(jié)構(gòu).
Name
GROUP1
GROUP2
GROUP3
GROUP4
ACTIVE
REQUIRED
INPUT
OUTPUT
INTENSIFIED
INVISIBLE
LENGTH
6. 屏幕字段
除系統(tǒng)自動生成屏幕字段外, 還需要由程序員定義相應(yīng)的ABAP程序字段, 二者要有相同的名稱以及長度, 類型.
定義相應(yīng)的ABAP字段的目的是用戶屏幕和程序之間的數(shù)據(jù)傳輸,
在PBO處理邏輯中, 系統(tǒng)將程序字段的值傳輸給屏幕字段進行輸出;
在PAI中, 系統(tǒng)把用戶的輸入數(shù)據(jù)傳遞給程序.
除去與屏幕輸入輸出元素對應(yīng)的字段外, 還有一個特殊的屏幕字段-----OK 代碼字段,
其作用是返回在屏幕和GUI狀態(tài)中用戶觸發(fā)的功能代碼. 在交互式報表中可以通過 SY-UCOMM返回用戶選擇的功能代碼,
程序通過功能代碼來在PAI模塊中接收對應(yīng)的功能代碼.
7. 流控制邏輯.
在流邏輯定義中, Process 語句用于說明模塊何時被調(diào)用, MODULE 語句中指定模塊名,
告訴系統(tǒng)該事件調(diào)用的具體ABAP模塊, 每一個流邏輯模塊的內(nèi)容都是由普通的ABAP代碼組成的.
流邏輯中有四種典型的處理塊, 由PROCESS引導(dǎo), 在不同的情況下被觸發(fā).
Process before output.
...
在當(dāng)前屏幕輸出之前被觸發(fā).可用于屏幕初始化工作, 例如數(shù)據(jù)庫選擇, 屏幕元素動態(tài)設(shè)定等. 當(dāng)所有的PBO模塊結(jié)束后,
系統(tǒng)將顯示當(dāng)前用戶屏幕.
Process after input. (PAI)
...
該事件在用戶在屏幕中執(zhí)行功能后被觸發(fā), 所有的PAI模塊結(jié)束后, 屏幕可能調(diào)用后續(xù)屏幕或者回到上一個屏幕序列.
Process on help-request. (POH)
...
當(dāng)用戶要求查看幫助信息時(F1)被觸發(fā), 事件結(jié)束后, 返回當(dāng)前屏幕.
Process on value-request. (POV)
...
當(dāng)用戶按下查詢幫助按鈕時(F4)被觸發(fā), 事件結(jié)束后交繼續(xù)處理當(dāng)前屏幕.
流邏輯語句.
流控制語言不同于普通的ABAP語言.
PROCESS
MODULE
FIELD
ON
VALUES
CHAIN
ENDCHAIN
CALL
LOOP
定義和調(diào)用對話模塊.
在ABAP模塊池和可執(zhí)行程序中, 可以在MODULE和ENDMODULE語句之間定義對話模塊.
在屏幕PBO中調(diào)用的模塊需要在其后加下OUTPUT. 在PAI模塊則使用INPUT.
對話模塊不專屬于某個屏幕, 而是可以被程序中的任意多個屏幕所調(diào)用. 通過系統(tǒng)變量 sy-dynnr的返回值,
可以確定是哪個屏幕正在對其調(diào)用.
對話模塊經(jīng)常被存儲在模塊池中, 一個模塊池中一般需要包含四個引用程序. 命名規(guī)則分別是:
這種做法可以讓程序結(jié)構(gòu)非常清晰. 這些引用程序應(yīng)該先于流邏輯模塊創(chuàng)建, 流邏輯模塊添加時,
系統(tǒng)將詢問添加至哪個引用程序之中, 由程序員選擇正確的位置.
需要注意的地方是在模塊化的結(jié)構(gòu)之中, 不存在局部數(shù)據(jù)對象, 所有定義在MODULE和ENDMODULE
語句之間的數(shù)據(jù)對象將被放置到整個程序的公用數(shù)據(jù)區(qū)域, 因此最好不要在該結(jié)構(gòu)中出現(xiàn)數(shù)據(jù)的定義和聲明語句,
而應(yīng)將所有的數(shù)據(jù)聲明放置在TOP引用程序的相關(guān)部分.
調(diào)用對話模塊:
在屏幕邏輯語言中, 使用MODULE語句對在模塊池等ABAP程序中定義的模塊進行調(diào)用.
需要注意的是不要將屏幕流邏輯語句MODULE和ABAP中的模塊定義語句相混淆.
屏幕一旦被調(diào)用, 系統(tǒng)就會觸發(fā)PBO事件, 其中屏幕流邏輯將依次調(diào)用相應(yīng)的ABAP PBO模塊并運行其中的代碼.
所有的PBO模塊調(diào)用結(jié)束之后, 屏幕及其中所有元素顯示給用戶, 此后系統(tǒng)將控制權(quán)由應(yīng)用服務(wù)器轉(zhuǎn)交給顯示服務(wù)器, 以接受用戶的輸入,
直至用戶行為觸發(fā)PAI事件. PAI事件觸發(fā)后, 控制權(quán)又交給應(yīng)用服務(wù)器, 并按次序調(diào)用其中的PAI模塊對輸入的數(shù)據(jù)進行處理,
所有的PAI事件運行結(jié)束之后將觸發(fā)后續(xù)屏幕的PBO事件.
無條件調(diào)用:
通常情況下, 模塊的調(diào)用順序取決于在屏幕流邏輯中的出現(xiàn)次序. 在PAI事件塊中, 系統(tǒng)首先將進行默認(rèn)的輸入正確性檢查,
這意味著在調(diào)用第一個PAI模塊之前, 用戶在屏幕中輸入時, 至少所有在屬性被設(shè)為Required Filed 的字段均必須輸入,
而且對于參照數(shù)據(jù)字典聲明的字段, 還必須滿足字典中定義的可能值列表和約束表中的限定.
但在某些情況下, 用戶可能僅僅是為了退出當(dāng)前屏幕, 卻要輸入很多數(shù)據(jù), 或者不知道如何輸入正確的數(shù)據(jù), 又無法結(jié)束該事務(wù),
為了避免這類情況, 可以使用一種與特殊功能代碼模塊, 無條件調(diào)用模塊, 無論用戶輸入滿足系統(tǒng)檢查與否,
該模塊都將先被調(diào)用.
ABAP 模塊代碼:
MODULE back INPUT.
ENDMODULE.
數(shù)據(jù)傳輸控制:
用戶在屏幕中輸入的數(shù)據(jù)可以通過系統(tǒng)自動控制和使用流邏輯語句控制兩種不同的方式傳遞給程序.
系統(tǒng)自動傳遞:
在SAP系統(tǒng)中, 從當(dāng)前屏幕的PAI開始到輸出下個屏幕的PBO事件結(jié)束, 稱為一個對話步驟.
語句控制傳遞:
如果在流控制邏輯中使用了Field語句, 在Field語句中指定的字段的數(shù)據(jù)傳輸被延遲,
數(shù)據(jù)不是在PAI的起點被傳輸至ABAP程序, 而是直到實際執(zhí)行該語句時, 指定字段的值才被傳輸?shù)匠绦蛑?
如果屏幕字段出現(xiàn)在多條Field語句中, 則在出現(xiàn)該字段的第一條Field語句執(zhí)行時傳送字段值.
增加了Field語句之后(不論Field語句的位置), 只有位于該語句后面的模塊才可以得到屏幕中被更新的數(shù)據(jù)值.
模塊的條件調(diào)用:
有時, 同一個屏幕的PBO和PAI將反復(fù)循環(huán)出現(xiàn), 如果每一次均將執(zhí)行所有的ABAP模塊并不十分必要. a.) 單字段條件調(diào)用.
使用FIELD語句的ON INPUT附加項,
可以指定某模塊只在給定字段具有非初始值時才被調(diào)用.
FIELD dynfield MODULE mod ON
INPUT.
只有字段 dynfield 包含非初始值時, 才調(diào)用ABAP模塊mod.
還有一種:
FIELD dynfield MODULE mod ON
REQUEST.
只有在該字段中輸入值時(包括空值和原值), 才調(diào)用ABAP模塊, 系統(tǒng)將以下設(shè)置字段的方式視為有值輸入:
如查一個模塊的條件調(diào)用與多個屏幕字段有關(guān)(即當(dāng)一組屏幕字段中的任意一個滿足某種條件, 則調(diào)用該模塊),
需要用 CHAIN/ENDCHAIN結(jié)構(gòu)將FIELD語句和字段及模塊組合起來.
CHAIN.
ENDCHAIN.
Example:
如果字段 a, b, c 中任何一個具有不同于初始值的值, 則調(diào)用模塊 mod1, 而模塊 mod2
則始終被調(diào)用.
我們還可以在 CHAIN 語句鏈中, 將條件限制至特定字段, 可以將 MODULE 語句連接到相關(guān) FIELD
語句.
Example:
只有當(dāng)字段 c 包含非初始值時, 才調(diào)用模塊 x.
Example:
當(dāng)字段 a, b, c 中任一字段包含非初始值時, 都調(diào)用模塊 mod1.
輸入檢查:
使用 FIELD 語句或者 FIELD 和 CHAIN 的語句組合, 可以實現(xiàn)在 ABAP/4
中進行字段輸入檢查.
a.)單個值檢查:
屏幕流邏輯.
PROCESS AFTER INPUT.
ABAP 代碼如下:
MODULE check_fr_airport INPUT.
ENDMODLE.
當(dāng)有錯誤時, 屏幕重新顯示, 只有 spfli-airpfrom 字段可接受新的輸入.
b.) 檢查多個字段.
放在 CHAIN/ENDCHAIN 鏈中, 在 CHAIN 鏈中所有字段相互依賴, 鏈內(nèi)部任一字段發(fā)生錯誤輸入時,
會重新顯示屏幕, 并允許輸入鏈中的任意字段.
CHAIN.
ENDCHAIN.
在選擇屏幕之后, 按了回車或F8會觸發(fā) At
selection-screen 事件, 如果按了F8,這個事件塊執(zhí)行后, 繼續(xù)觸發(fā)start-of-selection,
如果按回車, 則重新顯示當(dāng)前選擇屏幕.
在處理 at selection-screen 事件前,
用戶輸入會自動傳給輸入變量, 因此可以在這個事件塊里面處理輸入檢查和權(quán)限檢查.
MODULE module_name AT
EXIT-COMMAND:只能在PAI中使用,會由于以"/E"開頭或者E型的function而觸發(fā)(一般就是Back、Exit、Cancel)
8. 調(diào)用屏幕.
實現(xiàn)屏幕動態(tài)調(diào)用的ABAP語句.
SET SCREEN next_screen_number.
為當(dāng)前屏幕指定后續(xù)屏幕.
CALL SCREEN screen_number.
CALL TRANCTION tcode.
掛起當(dāng)前屏幕序列, 進入新的屏幕或事務(wù).
LEAVE SCREEN.
如果需要未完成當(dāng)前屏幕控制流就要轉(zhuǎn)入后續(xù)屏幕.
LEAVE TO SCREEN screen_number.
LEAVE TO TRANCTION tcode.
未完成當(dāng)前屏幕就轉(zhuǎn)入后續(xù)屏幕.
LEAVE TO SCREEN 0.
SET SCREEN 0.
LEAVE SCREEN. 中止當(dāng)前屏幕.
9. 調(diào)用GUI狀態(tài).
SET PF-STATUS stat.
SET TITLEBAR stat.
10. ABAP事件執(zhí)行順序.
|
|