屏幕序列Screen Sequences
SY-DYNNR系統變量存儲了當前屏幕的屏號
ABAP program中的dialog modules 僅僅只能在同一程序中的screens中調用
可以在同一程序中從一個屏幕導航到別一個屏幕,也可以重復某個屏幕序列中某個屏幕N次
如果要開啟一個屏幕序列,你可以調用它的第一個屏幕。開啟屏幕序列的方法有兩種:通過Tcode(在事務碼中設置序列中的首屏幕),或者在ABAP program中通過CALLSCREEN語句。如果是通過CALLSCREEN語句來開啟的,則會將新開啟的屏幕序列嵌套到當前屏幕序列中去。
可能在Screen Painter中為每一個屏幕設置它的nextscreen,這是一種static screen sequence。但是,可以在處理塊中重寫statically-defined next screen,這就是dynamic screensequences
如果不想讓屏幕序列中的某個屏幕顯示,則可以在該屏幕是的PBO中使用SUPPRESS DIALOG語句阻止它們的顯示。當使用SUPPRESS DIALOG語句時,雖然屏幕不會顯示,但PBO 與 PAI塊還是會被處理。當你在屏幕序列中顯示一個List是很有用的(屏幕與List之間的切換實例可以參考這里)
某個屏幕的nextscreen為zero時,所在的當前屏幕序列就會結束。如果該序列是通過CALL SCREEN開啟的,則返回到該屏幕序列首屏幕被調用的地方(CALL SCREEN XXX的地方);如果該序列是通過Tcode開啟的,將會返回到事務碼執行處;如果Next Screen非0,則會執行下一屏幕的PBO事件塊。
Static Next Screen
所有的屏幕都有Next screen靜態屬性,但這個靜態屬性可以在程序中動態的繞過這個靜態的Next screen。
如果靜態屬性next screen沒有設置或設置為0,且在程序運行時沒有重寫它,則當前屏幕就是它所在屏幕序列的最后一個屏幕。當屏幕處理完后,控件權將返回到屏幕序列調用處(即屏幕序列的啟始處):如果屏幕序列是嵌套的,系統將返回到前一個屏幕序列中開啟(調用)當前屏幕序列的CALL SCREEN語句處(注意:每調用一次CALL SCREEN語句就會開啟一個新的屏幕序列,如果是在某個屏幕的PBO或是PAI塊里調用的CALL SCREEN語句,則就會形成嵌套的屏幕序列)。
注:默認選擇屏幕1000的Next Screen默認是自己,即1000
Dynamic Next Screen
可以動態的使用SET SCREEN 語句來重新設置靜態定義的next screen:
SET SCREEN <next screen>.
該語句只是暫的修改靜態定義的next screen,靜態next screen會保持。如果<next screen>為0,則當前屏幕將會是屏幕序列中的最后一個屏幕。
注:此語句不會終止當前屏幕后續語句的執行,如是要立即離開當前屏幕不執行該語句后續語句,則要使用LEAVE語句。
Leaving a Screen from a Program
如果要離開屏幕,則可能使用下面詞句:
or
LEAVE TO SCREEN <next screen>.
LEAVE SCREEN語句會結束當前屏幕並調用下一屏幕,next scree可以是static next screen,或者是dynamic next screen,如果是動態的,你必須在使用LEAVE SCREEN語句前使用SET SCREEN語句來重寫static next screen。
LEAVE TO SCREEN語句會結束當前屏幕並跳轉到指定的下一屏幕<next screen>,其作用等效於下面兩條語句:
SET SCREEN <next screen>.
LEAVE SCREEN.
這兩個語句不會結束屏幕序列,它們僅僅是轉向同一屏幕序列中的另一屏幕。屏幕序列是否結束要看<next screen>是否為0或者next screen是否設置為0。
Starting a Screen Sequence
以下情況都可以開啟一個新的屏幕序列
Using a Transaction Code
From an ABAP Program
CALL SCREEN <dynnr>.
Inserting Screen Sequences(嵌套屏幕序列)
Calling Modal Dialog Boxes(以彈出對話框顯示,非全屏幕)
CALL SCREEN<scrn>
x1、y1、x2、y2分別表示選擇屏幕顯示的左上角和右下角的列號、行號
CALL SCREEN的誤用
最近一個網友提到他在做SCREEN編程時,一旦屏幕之間切換次數過多就會出現堆棧溢出的錯誤。經過分析他提供的信息,我得出錯誤的原因是他錯誤地使用CALL SCREEN語句來做屏幕之間的切換。由於SAP系統每次碰到CALL SCREEN語句就會產生新的SCREEN SEQUENCE(參見下圖),而且SAP系統設置了SCREEN SEQUENCE堆棧不能超過50個,一旦超過就會出溢出錯誤。網友就是錯誤的使用CALL SCREEN 100 和 CALL SCREEN 200進行屏幕切換,不斷地產生新的SCREEN SEQUENCE,可想而知溢出是必然的。在SCREEN調用碰到下一屏幕為0時,SCREEN SEQUENCE的才會結束,程序在這個時候才回到CALL SCREEN的調用之處(也就是說我們可以用LEAVE TO SCREEN 0來結束當前SCREEN SEQUENCE)。
注:如果某個選擇屏幕是被其他屏幕通過CALL SELECTION-SCREEN XXX調用顯示的,則按此選擇屏幕上標准工具欄中的 Back 按鈕時,會結束掉該選擇屏幕所在的屏幕序列,返回到調用CALL SELECTION-SCREEN XXX語句所在的屏幕序列(即選擇屏幕所在序列的上一屏幕序列)。注:如果所按的Back按鈕不是最上層屏幕,則Back按鈕還是會返回到同一屏幕序列中的上一個屏幕,所以Back按鈕要想結束掉當前屏幕所在的序列,則要求Back按鈕所在的屏幕為當前屏幕序列中的第一個屏幕。
為了避免產生新的SCREEN SEQUENCE,我們常常使用靜態下一屏幕或動態下一屏幕來進行屏幕之間的切換。
方法如下:
1)靜態制定下一屏幕
在進行屏幕設計時制定下一個屏幕;
2)動態設置下一屏幕
SET SCREEN 200. "該語句只是動態制定下一個屏幕,但不結束當前屏幕處理(即不立即跳轉下一屏幕),只有LEAVE SCREEN才會結束屏幕的處理(后面的語句才不會執行)
LEAVE SCREEN.
或者
LEAVE TO SCREEN 200."相當於上面兩包的組合:SET SCREEN 200. LEAVE SCREEN.
請使用SET SCREEN XXX / LEAVE SCREEN,LEAVE TO SCREEN XXX來在同一屏幕序列里動態的進行屏幕切換跳轉,而不要使用CALL SCREEN XXX來進行屏幕序列的跳轉與切換
CALL SCREEN/SET SCREEN/LEAVE TO SCREEN區別
1、CALL SCREEN XXXX將在Screen調用棧(CALL STACK)上面添加一層調用(進棧,即重新開啟一個新的屏幕序列),調用XXXX的PBO和PAI,如果XXXX的Next Screen不為0,那么將繼續其Next Screen的PBO和PAI,如此繼續~~~當最后碰到Next Screen為0時,該層調用將從調用棧中退出(出棧),然后系統將繼續執行CALL SCREEN XXXX之后的語句。
2、SET SCREEN XXXX設置調用棧當前層次的Next Screen為XXXX,它並不影響調用棧的層數(即不會重新開啟一個新的屏幕序列,只是做屏幕序列方向的扭轉換,只做屏幕之間的切換,而不是屏幕序列之間的切換),除非XXXX為0,那將導致調用棧退掉一層(出棧)。要注意的是,PAI中SET SCREEN XXXX后的語句,系統將照樣執行,只有執行完畢該PAI整個邏輯后,才考慮Next Screen的PBO和PAI。
3、LEAVE TO SCREEN XXX與SET SCREENXXX比較類似(也不會重新開啟一個新的屏幕序列,只是做屏幕序列方向的扭轉換,只做屏幕之間的切換,而不是屏幕序列之間的切換),所不同的是,LEAVE TO SCREEN XXXX將強行中斷當前SCREEN的PAI,直接執行XXXX的PBO和PAI。換言之,PAI中LEAVE TO SCREEN XXXX后面的語句,系統將不會執行到。
4、LEAVE SCREEN. 后面的語句也不會執行
注:上面語句的XXX也可以是選擇屏幕的屏幕號,而不只是對話屏幕號
CALL SCREEN與LEAVE TO SCREEN的區別?
CALL SCREEN是將正在運行的畫面掛起,進入所調用的畫面,當使用LEAVE TO SCREEN 0時,能夠返回原主調畫面,可理解為嵌套調用;而LEAVE TO SCREEN是立即結束本畫面的執行,調用所指定的畫面,在調用畫面中,無法再返回原主調畫面。
CALL TRANSACTION/LEAVE TO TRANSACTION/SUBMIT… AND RETURN/ SUBMIT
在ABAP中,CALL TRANSACTION和SUBMIT report_nameAND RETURN語句,也都是在調用棧上添加一層調用,與CALL SCREEN有點類似。而LEAVE TO TRANSACTION以及SUBMIT report_name則是在調用棧當前層次的一個跳轉(調用語句后面的語句不在執行),與LEAVE TO SCREEN類似。