屏幕序列Screen Sequences


屏幕序列Screen Sequences

image556

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之間的切換實例可以參考這里

某個屏幕的nextscreenzero時,所在的當前屏幕序列就會結束。如果該序列是通過CALL SCREEN開啟的,則返回到該屏幕序列首屏幕被調用的地方(CALL SCREEN XXX的地方);如果該序列是通過Tcode開啟的,將會返回到事務碼執行處;如果Next Screen0,則會執行下一屏幕的PBO事件塊。

Static Next Screen

image557image558

所有的屏幕都有Next screen靜態屬性,但這個靜態屬性可以在程序中動態的繞過這個靜態的Next screen

如果靜態屬性next screen沒有設置或設置為0,且在程序運行時沒有重寫它,則當前屏幕就是它所在屏幕序列的最后一個屏幕。當屏幕處理完后,控件權將返回到屏幕序列調用處(即屏幕序列的啟始處):如果屏幕序列是嵌套的,系統將返回到前一個屏幕序列中開啟(調用)當前屏幕序列的CALL SCREEN語句處(注意:每調用一次CALL SCREEN語句就會開啟一個新的屏幕序列,如果是在某個屏幕的PBO或是PAI塊里調用的CALL SCREEN語句,則就會形成嵌套的屏幕序列)。

注:默認選擇屏幕1000Next Screen默認是自己,即1000

Dynamic Next Screen

可以動態的使用SET SCREEN 語句來重新設置靜態定義的next screen

SET SCREEN <next screen>.

該語句只是暫的修改靜態定義的next screen,靜態next screen會保持。如果<next screen>0,則當前屏幕將會是屏幕序列中的最后一個屏幕。

注:此語句不會終止當前屏幕后續語句的執行,如是要立即離開當前屏幕不執行該語句后續語句,則要使用LEAVE語句。

image559

Leaving a Screen from a Program

如果要離開屏幕,則可能使用下面詞句:

LEAVE SCREEN.

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

image560

From an ABAP Program

CALL SCREEN <dynnr>.

image561

Inserting Screen Sequences(嵌套屏幕序列)

image562

Calling Modal Dialog Boxes(以彈出對話框顯示,非全屏幕)

CALL SCREEN<scrn>

STARTING AT <X1><Y1>

ENDING AT <X2><Y2>.

x1y1x2y2分別表示選擇屏幕顯示的左上角和右下角的列號、行號

image563

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按鈕所在的屏幕為當前屏幕序列中的第一個屏幕。

image564

為了避免產生新的SCREEN SEQUENCE,我們常常使用靜態下一屏幕或動態下一屏幕來進行屏幕之間的切換

方法如下:

1)靜態制定下一屏幕

在進行屏幕設計時制定下一個屏幕;

2)動態設置下一屏幕

SET SCREEN 200. "該語句只是動態制定下一個屏幕,但不結束當前屏幕處理(即不立即跳轉下一屏幕),只有LEAVE SCREEN才會結束屏幕的處理(后面的語句才不會執行)
LEAVE SCREEN.

或者

LEAVE TO SCREEN 200."相當於上面兩包的組合:SET SCREEN 200. LEAVE SCREEN.

請使用SET SCREEN XXX / LEAVE SCREENLEAVE TO SCREEN XXX來在同一屏幕序列里動態的進行屏幕切換跳轉,而不要使用CALL SCREEN XXX來進行屏幕序列的跳轉與切換

CALL SCREEN/SET SCREEN/LEAVE TO SCREEN區別

1、CALL SCREEN XXXX將在Screen調用棧(CALL STACK)上面添加一層調用(進棧,即重新開啟一個新的屏幕序列),調用XXXXPBOPAI,如果XXXXNext Screen不為0,那么將繼續其Next ScreenPBOPAI,如此繼續~~~當最后碰到Next Screen0時,該層調用將從調用棧中退出(出棧),然后系統將繼續執行CALL SCREEN XXXX之后的語句。

2、SET SCREEN XXXX設置調用棧當前層次的Next ScreenXXXX,它並不影響調用棧的層數(即不會重新開啟一個新的屏幕序列,只是做屏幕序列方向的扭轉換,只做屏幕之間的切換,而不是屏幕序列之間的切換),除非XXXX0,那將導致調用棧退掉一層(出棧)。要注意的是,PAISET SCREEN XXXX后的語句,系統將照樣執行,只有執行完畢該PAI整個邏輯后,才考慮Next ScreenPBOPAI

3、LEAVE TO SCREEN XXXSET SCREENXXX比較類似(也不會重新開啟一個新的屏幕序列,只是做屏幕序列方向的扭轉換,只做屏幕之間的切換,而不是屏幕序列之間的切換),所不同的是,LEAVE TO SCREEN XXXX將強行中斷當前SCREENPAI,直接執行XXXXPBOPAI。換言之,PAILEAVE TO SCREEN XXXX后面的語句,系統將不會執行到。

4、LEAVE SCREEN. 后面的語句也不會執行

注:上面語句的XXX也可以是選擇屏幕的屏幕號,而不只是對話屏幕號

CALL SCREENLEAVE TO SCREEN的區別?

CALL SCREEN是將正在運行的畫面掛起,進入所調用的畫面,當使用LEAVE TO SCREEN 0時,能夠返回原主調畫面,可理解為嵌套調用;而LEAVE TO SCREEN是立即結束本畫面的執行,調用所指定的畫面,在調用畫面中,無法再返回原主調畫面。

CALL TRANSACTION/LEAVE TO TRANSACTION/SUBMIT AND RETURN/ SUBMIT

ABAP中,CALL TRANSACTIONSUBMIT report_nameAND RETURN語句,也都是在調用棧上添加一層調用,與CALL SCREEN有點類似。而LEAVE TO TRANSACTION以及SUBMIT report_name則是在調用棧當前層次的一個跳轉(調用語句后面的語句不在執行),與LEAVE TO SCREEN類似。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM