1. 程式人生 > >天堂楓葉的SAP專欄(自家用)

天堂楓葉的SAP專欄(自家用)


原文連結:http://www.cnblogs.com/jiangzhengjun/p/4292250.html
對話螢幕Dynpro(SE51). 11
螢幕元素... 11
螢幕屬性... 11
PAI事件的觸發、螢幕元素Function Code設定... 12
螢幕流邏輯Screen Flow Logic. 12
對話螢幕中的欄位命名大小寫問題... 13
示例:螢幕元素自動參考資料詞典(或程式)中的表或結構欄位... 14
Function Codes的讀寫機制... 16
ok_code的定義... 17
為什麼要將ok_code拷貝一次?... 17
圖形化使用者介面 GUI18
GUI Status(Menu Painter). 19
Normal Status(Menu Painter詳解)... 20
Dialog BoxStatus. 24
Context Menu Status. 25
Dialog Status for Lists. 26
快速建立(Status模板)... 26
標準Status拷貝... 26
兩種方式建立螢幕欄位... 28
從詞典中獲取... 28
從程式中獲取... 28
對話螢幕與程式之間的資料傳輸... 29
工具欄中按鍵之間的分隔符... 30
Calling ABAP Dialog Modules. 30
通過Module 對螢幕欄位進行檢驗... 31
Module的簡單呼叫(所有螢幕欄位都會被傳輸到ABAP程式中)... 31
螢幕欄位傳輸時間點控制元件(FIELD)... 32
AT EXIT-COMMAND.. 33
帶執行條件的MODULE. 35
FIELD… MODULE…(單個螢幕欄位)... 36
CHAIN…ENDCHAIN(多個螢幕欄位)... 37
ON INPUT與ON CHAIN-INPUT區別... 38
AT CURSOR-SELECTION滑鼠雙擊時呼叫... 38
ABAP Statements for Screens. 41
SET PF-STATUS. 41
SET TITLEBAR、啟用Title Bar. 41
GET CURSORFIELD.. 42
SET CURSOR FIELD.. 44
輸入檢測... 44
自動輸入檢測... 44
螢幕邏輯流中進行檢測FIELD…VALUES.. 45
在ABAP Dialog Modules進行檢測... 45
Search help (F4)... 47
對話螢幕欄位繫結搜尋幫助... 47
Domain固定值fixed values. 48
檢查表Check Table --- Value Table. 48
SE11建立基本搜尋幫助(Elementary Search Help),及引數說明... 51
F4IF_SHLP_EXIT_EXAMPLE出口函式引數說明及例項... 59
建立集合搜尋幫助(Collective Search Help)... 67
表/結構欄位繫結搜尋幫助的兩種方式... 71
Search help繫結方式... 71
Search Help Hierarchy(優先順序). 73
SE11測試Search Help. 74
通過程式繫結表字段中的搜尋幫助、動態生成搜尋幫助(繫結到某個內表)並聯動... 74
通過TR_F4_HELP實現簡單Search Help(資料來源於內表). 78
Search Help三種不同繫結方(表字段、Check Table、Struct)式實現同樣效果... 82
動態修改螢幕... 87
複合螢幕元素... 97
圖示Status Icons(ICON_CREATE)... 97
右鍵選單Context Menus for Screen. 99
子螢幕Subscreens. 105
Tabstrip(Tab條)... 110
靜態的Tabstrip(多個子螢幕區域)... 112
動態的Tabstrip(共用一個子螢幕區域)... 112
靜態Tabstrip示例... 113
動態Tabstrip示例... 115
選擇螢幕中的 Tabstrip. 116
通過嚮導建立Tabstrip. 116
Custom Controls(自定義控制元件)... 120
Table Controls表格控制元件... 131
程式建立... 131
通過嚮導建立... 137
Tree Control 樹... 146
ALV Grid Control148
多行文字編輯器... 148
Call螢幕... 155
彈出確認對話方塊
對話螢幕Dynpro(SE51) 螢幕元素 螢幕屬性


l  螢幕序號(Screen number)。四個數字組成的序列號,用於在程式中確定螢幕,該序號在同一個ABAP程式內部是唯一的。
l  螢幕型別(Screen type)。ABAP中的螢幕型別包括普通螢幕、模式對話方塊、選擇螢幕和子螢幕等。普通螢幕一般佔據整個使用者視窗,而模態對話方塊只佔據使用者視窗的一部分;選擇螢幕是根據程式中定義的select-option和parameters自動生成的,一般不用於對話程式設計中;子螢幕則可以顯示在不同螢幕的某個區域之中。
l  後續螢幕(Next screen)。定義當前螢幕的後續螢幕序號,即系統的對話處理器結束當前螢幕的處理之後,應前往的下一個螢幕。通過後續螢幕,可以把事務中的一系統螢幕連線起來,形成一個螢幕序列,如果某個螢幕的後續螢幕值為0或沒有設定,則表明該螢幕是一個螢幕序列的結束。該屬性可以在程式中動態控制。
l  游標位置(Cursor position)。螢幕初始狀態的游標位置,一般預設狀態下,游標位於螢幕中的第一個輸出欄位。在程式設計中,可以動態地替換屬性中定義的初始游標位置。
l  螢幕組(Screen group)。可以將一系列的螢幕組合在一個4字元的螢幕組中,螢幕組ID執行期間儲存於系統欄位sy-dyngr中,用於程式對多個螢幕整體操作。
l  行列範圍(Lines/columns)。用於設定螢幕所佔據的空間,如果螢幕較大,系統將自動生成滾動條。
l  上下文選單(Context memu),用於設定屬於整個螢幕的上下文選單(右鍵選單)。
每一個螢幕都有一個OK_CODE欄位,但不顯示在螢幕上。使用者觸發PAI事件的操作所對應的Function Code就會儲存到這個欄位中,然後再傳遞到ABAP程式中相同名稱的全域性變數中,必須為每個螢幕分配這個名叫OK_CODE的螢幕元素,否則雖然可以觸發事件,但Function Code不能在螢幕與ABAP程式之間進行傳遞了
在螢幕中也可以像ABAP程式那樣讀寫系統預置的系統變數,但是,在螢幕中系統變數是通過結構SYST來管裡的,而不是SY,所以,你必須使用SYST-<name>來定位它們
PAI事件的觸發、螢幕元素Function Code設定
1.         如果複選框與單選按鈕沒有設定Function Code,則它們就會像普通的輸入框一樣,即使狀態發生了改變,也不會觸發PAI事件。但是對於按鈕,即使沒有設定Function Code,也會觸發PAI事件,此時的Function Code 為空。
2.         如果複選框與單選按鈕設定Function Code,則複選框與單選按鈕不只是簡單的輸入元素,而且還會觸發PAI事件。
3.         以下螢幕元素可以觸發PAI事件
?       點選螢幕上的某個按鈕
?       點選了某個已分配了Function Code的單選按鈕或複選框
?       點選了某個選單或標準工具條、應用工具條件上的按鈕
?       快捷鍵
?       從下拉框中選擇條目
4.         不同的螢幕元素的Function Code的設定方式如下:
?       螢幕中的按鈕、複選框、單選按鈕、下拉框的Function Code都是通過螢幕元素 attributes來設定的(注:如果是選擇螢幕,則通過USER-COMMAND選項來設定)
?       而選單、standard toolbar、application toolbar中的Function Code是通過GUI status來設定的
?       快捷鍵所對應的Function Code也是通過GUI status來設定的
螢幕流邏輯Screen Flow Logic
螢幕流邏輯包括四種事件塊:
PROCESS BEFORE OUTPUT.
...
PROCESS AFTER INPUT.
...
PROCESS ON HELP-REQUEST.
...
PROCESS ON VALUE-REQUEST.
...
前兩個一定要有,當都出現時請按上面順序寫
當你建立一個新螢幕時,頭兩個事件塊會自動的建立。執行時觸發時間點如下:
?       PROCESS BEFORE OUTPUT (PBO)
在前一螢幕的PAI事件後或當前螢幕顯示之前自動觸發,你可以在這個塊中對資料進行初始化賦值。在PBO結束時,螢幕將會顯示出來。
?       PROCESS AFTER INPUT (PAI)
當用戶操作(如F8,點選按鈕,回車、或點選帶Function Code的單選/複選按鈕,可選擇帶Function Code下拉框中的某選項時)了螢幕上某個功能元素時就會觸發,你可以在這個塊中如對輸入值的檢查。PAI事件結束後,系統將會呼叫一下螢幕或者返回到螢幕呼叫處(ABAP程式)繼續執行
?       PROCESS ON HELP-REQUEST (POH) and PROCESS ON VALUE-REQUEST (POV)
當用戶按F1與F4時觸發,處理完之後返回到當前螢幕
對話螢幕中的欄位命名大小寫問題
在對話螢幕中為輸入欄位命名時,名字一定要大小,否則在螢幕邏輯流中用到該欄位時則會出錯:


原因就是在螢幕設計介面中,命名時寫成了小寫了:


所以螢幕欄位命名時一定要大寫(好像小寫時,如果不在螢幕邏輯流中使用時也是可行的,但一旦用在螢幕邏輯流中進,就會出問題),正確的做法是在輸入名稱之後,回車一下,則名稱會自動轉換為大小:


即Element list中的命名為大小即可:


示例:螢幕元素自動參考資料詞典(或程式)中的表或結構欄位
如果螢幕上的元素欄位參考的是資料詞典的欄位(螢幕元素的名稱為表名-欄位名的形式)時,必須在ABAP程式裡使用TABLES語句來定義這個表介面,這樣就可以通過這個表介面在螢幕與ABAP程式之間自動的進行資料傳遞:


另外,也可以是隻引用一個或幾個資料詞典中某個表中一個或幾個欄位,不一定要引用整張表。再次,這些參照詞典中的欄位需要將以下鉤上:


當給某個螢幕欄位命名時,如果這個欄位的名稱為“表名(或結構)-欄位名”形式時,回車時系統會提示:


當點選Yes後,該欄位的Parameter ID會自動的設定為 MARA-MATNR欄位所對應Data Element所設定的Parameter ID,另外,From dict.也會自動被鉤上,但時,SET Parameter與GET Parameter 沒有自動鉤上,如果需要通過SAP Memory傳遞值,則需要將這兩個手動鉤上:


Data Element中的Parameter ID對選擇螢幕是沒有任何作用的,如下面的語句不能用來在SAP Memory中傳遞值:
PARAMETERS: m TYPE mara-matnr.
除非使用MEMORY ID 選項才起作用:
PARAMETERS: m TYPE mara-matnr MEMORY ID mat.”注,這裡的MEMORY ID不一定要設定成與MATNR所對應的Data Element設定的Parameter ID一樣,這裡可以隨便設定,如XXX
所以選擇螢幕中的引數選項 MEMORY ID的作用就等同於對話螢幕中的SET/GET Parameter,它們是作用是相同的(都是針對SAP Memory),只不過一個用於選擇螢幕中,一個用於對話螢幕。


ABAP程式如下:
TABLES: spfli.
DATA: wa_spfli TYPE spfli. "只要與螢幕欄位名字首結構同名即可自動繫結
CALL SCREEN 200.
MODULE get_data INPUT.
  SELECT SINGLE countryfr cityfrom airpfrom INTO CORRESPONDING FIELDS OF spfli
    FROM spfli WHERE carrid =  spfli-carrid AND connid  = spfli-connid.
ENDMODULE.
執行程式,輸入條件後回車,結果螢幕如下:


注:由於Airline配置了Check Table,如果輸入的Airline不合法,則不會執行PAI事件,所以在執行PAI事件前,資料詞典中所設定的資料有效性會先進行檢查。
Function Codes的讀寫機制
當用戶在對話螢幕上觸發一個命令時,會將命令所對應的Function Code複製到對話螢幕上一個特殊的隱藏欄位OK_CODE中,如果在ABAP中具有一個與對話螢幕這個隱藏欄位同名的OK_CODE時,則在螢幕欄位向記憶體欄位進行同名拷貝時,螢幕上的這個隱藏欄位OK_CODE的值也將會被自動拷貝到程式中的這個欄位中,然後就可以在PAI事件塊裡呼叫ABAP中的Module中使用此隱藏欄位
如果觸發PAI時的Function Code為空,則不會放入到對話螢幕中定義的OK_CODE 欄位中(SYST- UCOMM與SY-UCOMM也不會發生改變:還是保留上次PAI的Function Code),


注意,此圖還有點問題,如果是針對回車鍵(命令列中未輸入內容時回車)是對的,但如果按的是螢幕中的未分配Function Code的按鈕時,雖然不會重置OK_CODE,但還是會重置SYST- UCOMM 與 SY-UCOMM。
ok_code的定義


為什麼要將ok_code拷貝一次?
在程式中你應該使用OK_CODE來代替SY-UCOMM,這有兩種原因:第一,ABAP程式可以完全控制在它裡面定義的變數,第二,你不應該修改ABAP系統變數的值。然而,你必須在ABAP程式中清空OK_CODE,因為以下幾個原因:如果一個螢幕中的某個按鈕未設定Function Code時也是可以觸發PAI事件時,並且由於其Function Code此時為空而不會去設定OK_CODE(但此時SYST- UCOMM 或 SY-UCOMM會被重新設定為空),這樣的話OK_CODE中的值還為上一次觸發PAI時所設定的Function Code。所以一般情況下在使用OK_CODE之前,先將OK_CODE拷貝到SAVE_OK變數中,並隨後將OK_CODE清空,以便為下一次PAI事件所使用做準備(比如下一螢幕直接在螢幕上按回車時,Function Code為空,因為在回車時命令框裡沒有輸入任何命令,則此時OK_CODE欄位不會被設定,所以還回沿用上次所設定的OK_CODE,所以就會出現問題),並在MODULE 中針對SAVE_OK來進行程式設計:
DATA: ok_code LIKE sy-ucomm,
     save_ok LIKE ok_code.
在第一個PAI module中,需要將ok_code放在save_ok中,並清空ok_code,其他PAI module中就直接使用save_ok即可
MODULE user_command_0100 INPUT.
  save_ok = ok_code.
  CLEAR ok_code.
  CASE save_ok.
    WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
      LEAVE PROGRAM.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.
其實還有一種方案可能替換這種使用前拷貝方案:就是還是針對OK_CODE程式設計,不另外定義save_ok,而是在每個螢幕的 PBO 裡將ABAP中的OK_CODE清空。
另外如果在Command Line
未輸入內容時就按回車(其實游標在螢幕上輸入框裡按回庫也是這樣,只要命令列沒有輸入內容時),此時的Function Code也是空,此時除OK_CODE還是不會被重置, 並且SYST- UCOMM 與 SY-UCOMM也不會被重新設定為空。
每個螢幕的OK欄位都可以用不同的名字,但是,最好的做法是每個螢幕中的OK欄位都叫OK_CODE,這樣的話ABAP程式中只需要定義一個名稱為OK_CODE的變數即可以接受所螢幕中的OK欄位值(即Function Code)
圖形化使用者介面 GUI
GUI主要有:
1、 標題欄:當前螢幕的標題,GUI Title
2、 選單條:包含了可擴充套件的選單,其中每個子選單項都指向一個應用程式的功能,其中“System”、“Help”兩個選單項不能被應用程式更改和擴充套件,因此這類選單荋以及其中的子選單項將出現在每一個應用的螢幕中。
每個螢幕都會有系統標準工具條(Standard Toolbar),包含的按鈕代表了所有螢幕中都會用到的系統功能,如儲存、回退、取消等。可以為選單項和工具條項分配功能鍵(FunctionKeys),這樣當用戶在螢幕按下相應的功能鍵時,相當於執行了已經分配了這個功能的選單項。
應用工具條(ApplicationToolbar)是與特定應用相關的工具條,集成了當前螢幕常用的功能。


將選單條、標準工具條、功能鍵的設定以及應用工具條統稱為“GUI Status”,使用SETPF-STATUS xxx來設定的。使用SET TITLEBAR xxx設定標題。
若為ABAP螢幕分配一個GUI Status、GUI Title,則該螢幕的所有後續螢幕預設都有了該Status、Title,如果想在後續的子螢幕中更換成另外一個不同的Title,則需要重新設定
ABAP中維護GUI Status的工具叫Menu Painter。
除開“System”與“Help”選單,最多還可以建立6個選單項


GUI Status(Menu Painter)
GUI status為使用者提供了螢幕範圍內的功能,每一種功能都有一個Function Code,並且當用戶選擇這個功能時,就會觸發PAI事件,在每PAI事件裡,這些Function Code將會放到系統變數SYST-UCOMM(SY-UCOMM)中,並且分配給OK_CODE隱藏欄位。在Screen中使用OK_CODE之前,必須在Screen Painter中給它分配一個名字。
(注:這裡講的是對話螢幕上的Status,如果是List Status,則不會有什麼PAI事件,也不會將Function Code儲存到什麼OK_CODE,而是直接觸發ABAP報表程式中的 AT USER-COMMAND 事件,可以在此事件中通過ABAP系統全域性變數SY-UCOMM來接收傳遞過來的Function Code)
ABAP程式中的所有Function Code,除了按鈕(還有複選框、單選按鈕)的Function Code是在Screen Painter中分配的,其他都是在Menu Painter中進行定義與管理的:


GUI Status可以是讓使用者很方便的操作螢幕,它代替了命令列
中的輸入。當然我們可以不點選Menu bars、Standard toolbars、Application toolbars或者螢幕中的按鈕,直接在Command Line中輸入這些選單、工具條與按鈕所對應的Function Code,回車後也可以觸發PAI事件。
Normal Status(Menu Painter詳解)


此種類型的Status用在如下型別的普通螢幕中:

 

通過Menu Bar可以建立新的選單,在建立時不需要分配鍵盤快捷鍵,但可以在Function Keys設定部分中的Freely Assigned Function Keys(此型別的Function Key——快捷鍵,可由使用者自己自由分配)中為選單設定一個鍵盤快捷鍵,這樣不需要通過滑鼠點選選單而是通過所設定的快捷鍵來代替滑鼠;
通過Application Toolbar建立應用工具條件上的按鈕的過程中,會彈出一個設定快捷鍵的對話方塊要求設定快捷鍵,所以建立自定義應用工具條時一定要分配一個鍵盤快捷鍵;
Function Keys中的Standard Toolbar不需要設定快捷鍵(正是因為這些為標準工具條,已經為這些固有的圖示綁定了快捷鍵,並且這些快捷鍵被系統所保留使用),因為這些是預設的標準工具條(因為標準工具條上有哪些功能圖示是不能再由我們自己定義了,只能使用上面預設的那幾個,如果要使用,只需要輸入相應的Function code就代表開啟此按鈕了),並且已經固定分配了相應的快捷鍵,系統預設的快捷鍵如下:
Functionkey
Icon
Purpose
Ctrl+Sor F11


Save
F3


Back
Shift+F3


Exit
Esc or F12


Cancel
Ctrl+P


Print
Ctrl+F


Find
Ctrl+G


Find next
Ctrl+PgUp


Firstpage
PgUp


Previous page
PgDn


Nextpage
Ctrl+PgDn


Lastpage
具體的內建快捷鍵可以通過以下方式來檢視:


另外,也可以設定一個與選單或工具條按鈕無關的純粹的快捷鍵,如上面的Function Code為 SHORTCUT 的快捷鍵。
不管是選單、工具條按鈕、還是快捷鍵最終都會觸發PAI事件,並且會將所對應的Function Code會儲存到SY-UCOMM系統變數中。
上面的Recommended Function Key Setting(此型別的Function Key——快鍵捷,已經被系統推薦使用,所以最好不要另作其它用途,如F2為檢視詳情,相當於滑鼠雙擊)部分的為推薦部分,當不輸入FunctionCode時,相應的功能不會被啟用,只要輸入了Function code則會啟用相應功能,Function Code可以任意,相應功能不需要我們寫程式碼去實現了,因為系統已具備這樣的功能。
Standard Toolbar欄中預設的圖示按鈕在預設情況是不會被啟用的,只有當輸入相應Function Code才會被啟用,但此時在Standard Toolbar中只能點選它,具體的功能還是需要在ABAP程式中寫程式碼來實現相應功能,這與Recommended Function Key Setting部分是不一樣的。
一般情況下,需至少啟用Standard Toolbar中的Back
 (F3), Exit
 (shift+F3), and Cancel
 (F12)中的一個功能,並實現相應程式碼,以便使用者能夠離開螢幕(如果將
的Funcode設為BACK、
設定為EXIT、
設定為BREAK時(具體什麼值與螢幕的型別有關係:選擇螢幕、List列表輸出螢幕、對話螢幕都是不一樣,如要使用系統提供的預設實現,則一定要按要求值給出,具體值請參考後面),會自動的leave program.對話螢幕好像就不行???,選擇螢幕好像已自動實現)
下面這些Function Keys不會觸發PAI事件,它們被保留下來用作其他的功能:
?       F1 calls the field help呼叫欄位的幫助
?       F4 calls the input help呼叫輸入幫助
?       F10 places the cursor in the menu bar將游標定位到選單條上
回車:standard toolbar中的回車鍵 
 預設就是被啟用的,即使根本沒有給螢幕設定過GUI status。只要使用者在命令列中按回車鍵後(不管是否輸入了內容),都會觸發相應螢幕的PAI事件,並且輸入的內容會被當作Function Code傳遞給SY-UCOMM或OK_CODE(在Screen中)欄位(如果未輸入,則不會輸入到SY-UCOMM或OK_CODE中,但會觸發PAI事件)
F2(滑鼠雙擊):在預設中,F2已經與滑鼠的雙擊關聯起來了,F2已具有了滑鼠雙擊的功能。當用戶按了F2或在螢幕上雙擊了滑鼠都會觸發PAI事件,所以F2是一個很特別的鍵,一般不要拿來作其他功能使用。
Shift + F10(滑鼠右鍵):該組合鍵已經被分配給了滑鼠右擊功能,不能再用於其他用途。注意:有時滑鼠右鍵彈不出右鍵選單,這是因為選中了快捷剪下和貼上功能了,去掉即可,否則只能使用Shift + F10快捷鍵或者使用Shift+滑鼠右擊才能彈出右鍵選單:


選擇螢幕與List列表輸入螢幕上的標準工具按鈕FunctionCode需要如下輸入才能使用系統提供的預設的功能(不需要我們再實現):
選擇螢幕:


List列表:


Dialog BoxStatus

此種類型的Status用在如下型別模態螢幕中:

(注意:Dialog Box型別的Status沒有Menu Bar與Standard Toolbar兩項)


Reserved Function Keys部分為保留快捷鍵,如果要相應對應功能,只需要輸入Function Code,但要注意的是Function code一定要為上面圖中輸入的,否則功能將不會被觸發(這些功能也已經由系統實現了,我們不需要實現)。另外,如果將Reserved Function Keys部分所配置的Function Code又在Application Toolbar部分進行了分配,這些功能圖示將會在對話方塊螢幕下方出現,如:


(但不知為什麼上面紅色字型的 ENTER 沒有顯示??後來找到原因了:是因為Function Code被去激活了:


Context Menu Status


該型別的Status用作右鍵選單


可以將右鍵菜單鏈接到某些螢幕元素,包括輸入輸出欄位、文字欄位、表格控制元件以及螢幕區域等。
具體使用請參考Context Menus for Screen中的示例程式碼
Dialog Status for Lists
Dialog Status for Lists
快速建立(Status模板)
可以將系統標準GUI Status作為模板匯入到當前程式中,在Menu Painter中選擇系統選單“ExtrasàAdjusttemplate”。
將系統標準的GUI STATUS匯入到當前的GUI STATUS中作為編輯的模板:


標準Status拷貝
當需要為ALV報表或普通程式繪製Status時,我們先可以拷貝標準的Status,則在此基礎上修改即可:


上面的ALV工具條是先拷貝自標準條,再在標準條上加一按鈕,通過SE41,拷貝程式SAPLSLVC_FULLSCREEN的狀態STANDARD_FULLSCREEN過來:


如果不是ALV,是Write輸入時,拷貝:


兩種方式建立螢幕欄位 從詞典中獲取




要想在對話螢幕與ABAP程式中進行資料傳遞,則還得要在ABAP定義中作如下定義才可:
TABLES: sdyn_conn.
或者是:
DATA: sdyn_conn TYPE sdyn_conn.(注:此種方式可能會有問題,資料不能傳輸??)
從程式中獲取








對話螢幕與程式之間的資料傳輸
在ABAP對話螢幕程式設計中,對話螢幕與程式之間的資料自動傳輸發生在:螢幕欄位名與程式中定義的同名的全域性變數之間,此變數一般可以是普通的型別的單變數,但更多是定義成結構體變數。下面以結構體變數為傳輸體來了解資料傳輸過程。
使用TABLE語句來定義一個記憶體結構體變數,該結構中的欄位與對話螢幕上的各輸入欄位是一一對應的,即名稱與型別都相同。TABLE後面的資料型別可以是詞典中的結構型別或透明表型別,具定義出來的結構體變數名與後面指定的詞典結構型別及透明表型別一致,例如:
TABLES sdyn_conn.:利用結構體型別sdyn_conn定義了一個結構體變數sdyn_conn
TABLES sflight.:利用透明表型別sflight定義了一個結構體變數sflight
因為結構體變數中的各欄位與對話螢幕上的各輸入欄位具有對應關係,因此,該結構體變數被用作螢幕與程式之間的資料傳輸通道:


上圖中,使用了詞典中的結構體型別sdyn_conn定義了一個記憶體變數sdyn_conn,而對話螢幕100上的各個欄位的定義也是來自於結構體型別sdyn_conn,因此,記憶體變數sdyn_conn將作為螢幕100與呼叫它的程式之間的資料傳輸通道:即在螢幕100的PBO事件完成後,記憶體變數sdyn_conn中的各欄位值將自動傳輸給對應的螢幕欄位;當用戶在螢幕上點選確認結束輸入後,在觸發PAI事件之前,各螢幕的欄位的值將自動傳輸給記憶體變數sdyn_conn相應各同名欄位中,因此,可以在PAI事件塊中對結構體變數sdyn_conn進行處理。
工具欄中按鍵之間的分隔符
其中“分隔符”的插入方法為:在需要插入分隔符的方框內選擇選單“Edit—>Insert——>Separator line”即可插入分隔符


Calling ABAP Dialog Modules


在PBO事件塊裡,你可以使用MODULE語句來呼叫在ABAP program裡如下定義的dialog module:
MODULE <mod> OUTPUT.
  ...
ENDMODULE.
在PAI, POH, 與 POV事件塊裡,你可以使用MODULE語句來呼叫在ABAP program裡如下定義的dialog module:
MODULE <mod> [INPUT].
...
ENDMODULE.
從技術角度來說,在同一個ABAP Program裡,兩個不同型別的module(OUTPUT、INPUT)可以使用相同的名稱,但這不推薦使用。不同的螢幕可以呼叫ABAP程式裡同一個dialog module,所以可以將多個螢幕共同的程式碼寫在一個dialog module裡(如將OK_CODE拷貝到SAVE_CODE裡,將將OK_CODE清空這一過程),然後在所有的螢幕的PAI事件開頭呼叫這個dialog module。
MODULE位於ABAP主程式中,相當於該主程式中宣告的的不帶引數的子程式,因此在ABAP主程式中宣告的所有全域性變數在MODULE塊的程式中都可以進行呼叫,而且MODULE塊內部定義的變數在其他MODULE來說也是全域性的,但MODULE外面程式程式碼中不可引用,而且宣告變數的MODULE要在引用變數所在MODULE的前面:
MODULE status_0100 OUTPUT.
  DATA texttable TYPE tt_text.
  ...
ENDMODULE.
MODULE user_command_0100 INPUT.
      CALL METHOD editor->get_text_as_stream
        IMPORTING
          text = texttable. 這裡的texttable實質上引用是的上面module中宣告的變數
ENDMODULE.
SY-DYNNR系統變數裡儲存了當前螢幕的螢幕號。
在flow logic裡,有各種不同的呼叫dialog modules的方法,flow logic的語法允許你在呼叫dialog modules時附加一些條件,並且通過控制資料在screen與ABAP program之間的傳輸入:
通過Module 對螢幕欄位進行檢驗
         ABAP中的Module經常是用來對螢幕欄位輸入的值進行檢驗的,具體請參考這裡
Module的簡單呼叫(所有螢幕欄位都會被傳輸到ABAP程式中)
可以使用如下的flow logic語句來呼叫module:
MODULE <mod>.
(如果前面未指定FIELD選項,則表示此Module對所有欄位都有效,而不是針對某個螢幕欄位校驗的,相當於選擇螢幕的AT SELECTION-SCREEN事件)
如果你使用這種簡單的流邏輯語句來呼叫module,則資料在螢幕與ABAP程式之間是這樣傳輸的:
?   在PAI事件中,所有螢幕欄位會在第一個PAI module呼叫之前(前提是自動輸入檢查需要通過),就已傳遞到ABAP程式中相同名的欄位中(資料從“對話螢幕”傳遞到“ABAP程式”中進行處理)。
?   在最後一個PBO module呼叫之後與螢幕顯示之前,所有ABAP程式中的同名(與螢幕欄位)欄位將會傳回到螢幕相應欄位中(資料從“ABAP程式”傳遞到“對話螢幕”中進行顯示)。
螢幕欄位傳輸時間點控制元件(FIELD)
如果使用前一節的介紹的簡單呼叫Module的方式來呼叫dialog  module時,所有的螢幕欄位在PAI事件塊處理開始之前都會傳遞到ABAP程式。
screen flow logic 中的FIELD語句可以用來控制在什麼時候將螢幕欄位傳遞到ABAP程式中相應的欄位中。
FIELD <f>.
使用FIELD語句後,螢幕欄位<f>需要在該語句處理完後才傳遞到ABAP程式相應的欄位中,在後沒有帶module選項時,僅僅只是控制螢幕欄位傳輸到ABAP程式中的時間點,如需對螢幕欄位進行檢驗,需要在螢幕欄位值傳遞到ABAP程式之前,通過以下語句來實現檢驗:
FIELD <field_name> MODULE <module_name>:可以用來對螢幕欄位field_name進行檢驗使用,檢驗的程式碼寫在module_name中。這相當於選擇螢幕的 AT SELECTION-SCREEN ON < field_name>的作用,即Module只對<field_name>欄位起作用,因此Module是專門用來校驗此螢幕欄位的
僅只有未出現在FIELD語句中的螢幕欄位才會在PAI事件塊處理前傳輸到ABAP程式中去。所以當某個螢幕欄位出現在FIELD語句中,並且在該 FIELD語句未執行完之前,不要在PAI dialog modules中使用該螢幕欄位(該螢幕欄位相關的FIELD語句執行完成之後才可以在後續的PAI dialog modules呼叫中使用),否則,ABAP程式同名欄位中的值使用的是前一次對話螢幕中所設定的值。
FIELD可以被使用在PAI、POH、POV事件中,但在PBO中不起作用。


PROCESS BEFORE OUTPUT.
  MODULE init_screen_100.
PROCESS AFTER INPUT.
  MODULE user_command_0100.
  MODULE module_1.
  "box2螢幕欄位在該語句執行完後,且在module_2呼叫之前,才會傳遞ABAP程式中,所以
  "在該語句執行完之前ABAP程式中相應欄位是不會有值
  FIELD box2.
  MODULE module_2.
  "box1、box3螢幕欄位在該語句執行完後,且在module_3呼叫之前,才會傳遞ABAP程式中,所以
  "在該語句執行完之前ABAP程式中相應欄位是不會有值
  FIELD: box1, box3.
  MODULE module_3.
DATA: ok_code LIKE sy-ucomm,
      save_ok LIKE ok_code,
      box1, box2, box3, box4,
      mod1_result1, mod1_result2, mod1_result3, mod1_result4,
      mod2_result1, mod2_result2, mod2_result3, mod2_result4,
      mod3_result1, mod3_result2, mod3_result3, mod3_result4.
CALL SCREEN 200.
MODULE init_screen_100 OUTPUT.
  SET PF-STATUS 'SDSS'.
  CLEAR: box1, box2, box3, box4.
ENDMODULE.  
MODULE user_command_0100 INPUT.
  save_ok = ok_code.
  CLEAR ok_code.
  IF save_ok = 'CANCEL'.
    LEAVE PROGRAM.
  ENDIF.
ENDMODULE.
MODULE module_1 INPUT.
  mod1_result1 = box1.
  mod1_result2 = box2.
  mod1_result3 = box3.
  mod1_result4 = box4.
ENDMODULE.
MODULE module_2 INPUT.
  mod2_result1 = box1.
  mod2_result2 = box2.
  mod2_result3 = box3.
  mod2_result4 = box4.
ENDMODULE.                 
MODULE module_3 INPUT.
  mod3_result1 = box1.
  mod3_result2 = box2.
  mod3_result3 = box3.
  mod3_result4 = box4.
ENDMODULE.          
?      由於BOX4未在FIELD語句出現過,所以在PAI事件之前就已經傳遞到ABAP程式中,所以在module_1、module_2、module_3三個PAI dialog modules裡BOX4欄位都是有值的。
?      BOX2螢幕欄位要在FIELD BOX2.語句之後才能傳遞取ABAP相應的BOX2欄位中去,所以在module_1中是BOX2欄位是沒有值的,但在module_2、module_3中會有值。
?      而BOX1、BOX3需要在FIELD: box1, box3.語句後才能傳遞取ABAP相應的BOX1、BOX3欄位中去,所以在module_1、module_2中不會有值,只有在module_3中才有值。
AT EXIT-COMMAND
如果某個螢幕欄位有一些約束檢查(如參照的是某個資料表中的欄位),則需要先通過這些欄位的檢測,才會觸發PAI事件。如果某個螢幕欄位為必須,但沒有輸入時,點選工具條中的退出按鈕或螢幕中的按鈕時是不會起作用的,這就意味著在輸入檢測通不過的情況下,PAI事件塊裡的正常MODULE語句是不會被執行的,如螢幕中的文字框為必輸入,點選工具條中的Cancel按鈕或者是螢幕中的Cancel按鈕時無法退出程式:


為了避免這個問題:在輸入不合法的情況下也可以退出程式,可以使用以下幾步:
1.         設定成E型別的Function Codes
可以將螢幕中的按鈕與GUIstatus上的按鈕的Function Code的型別設定為E型別。
將螢幕中的按鈕的Function Code設定為E型別:


同樣,在GUI status的Standard Toolbar欄中,我們一般需要將Back
 (F3), Exit
 (shift+F3), and Cancel
 (F12)所對應的Function Code型別設定為E型別(因為這三個按鈕一般是用來退出程式來使用的):


2.         EXIT-COMMAND
對於E型別的Function Code,可以使用如下語句在PAI事件塊中來觸發:
MODULE <mod> AT EXIT-COMMAND.
不管該語句在screen flow logic的PAI事件塊裡的什麼地方,都會在欄位的約束自動檢測之前執行,因此,此時其他的螢幕欄位的值不會被傳遞到ABAP程式中去,當該MODULE執行完後,如果未退出該螢幕,則會進行正常PAI(即PAI事件塊裡沒有帶EXIT-COMMAND選項的MODULE語句)事件塊。
該語句在欄位約束自動檢測之前會被執行,一般用來正常退螢幕來使用,如果未使用LEAVE語句退出螢幕,則會在這之後還會繼續進行欄位的自動檢測,檢測完後還會繼續PAI的處理(即執行PAI事件塊中不帶EXIT-COMMAND選項的MODULE語句)
注意:PAI事件塊裡只有第一個附加EXIT-COMMAND選項的MODULE語句者會被執行(只要有一型別為E的Function Code按鈕被點選就會執行),其他附加EXIT-COMMAND選項的MODULE語句不會被執行,如:
PROCESS AFTER INPUT.
  MODULE execute1.
  "只要是E類的Function Code都會執行
  MODULE cancel AT EXIT-COMMAND.
  "永遠都不會執行
  MODULE back AT EXIT-COMMAND.
  MODULE execute2.
上面的 MODULE execute1.與MODULE execute2.兩個語句會在欄位約束自動檢測通過之後才會被執行,而MODULE cancel AT EXIT-COMMAND語句則會在欄位約束自動檢測之前就會被執行,由於MODULE back AT EXIT-COMMAND語句是第二個事EXIT-COMMAND選項的MODULE語句,所以永遠都不會被執行了。
帶執行條件的MODULE
這裡的FIELD與前面的資料傳輸控制(FIELD)的使用是一樣的:只有當FIELD <f>執行完成後,後面ABAP中<mod>中才能讀到欄位<f>的值,在這之前的module中是沒有資料的。
FIELD dynp_field MODULE mod [ {ON INPUT}
| {ON REQUEST}
| {ON *-INPUT}
| {ON {CHAIN-INPUT|CHAIN-REQUEST}}
| {AT CURSOR-SELECTION}.
1、單個欄位檢查(即呼叫module)
FIELD <FLD1> MODULE <MDL1>.
2、單個欄位被多個MODULE檢查
FIELD <FLD1> MODULE <MDL1>,MODULE <MDL2>.
3、檢查多個欄位,使用CHAIN
  CHAIN.
    FIELD <fld1>.
    FIELD <fld2>,<fld3>,<fld4>.
    MODULE <mdl1>.
    MODULE <mdl2>.
  ENDCHAIN.
表示FLD1,FLD2,FLD3,FLD4會被MDL1,MDL2檢查。
4、不是初始值(即不為空時、非初始值)才檢查,該事件適合於對螢幕新增資料的檢查
FIELD <FLD1> MODULE <MDL1> ON INPUT.
ON INPUT表示初始值改變(即不為空、非初始值)時執行。
特殊情況:
FIELD <FLD1> MODULE <MDL1> ON *-INPUT.
表示使用者輸入欄位首字輸入’*’,並切輸入欄位屬性設定了“*”的屬性,MODULE才會呼叫。
5、螢幕欄位輸入框中的值發生變化時檢查(如在原本為空值的欄位中輸入資料,或修改某欄位的值),該事件適合於螢幕中欄位的值變更時的檢查
FIELD <FLD1> MODULE <MDL1> ON REQUEST.
6、CHAIN中不是初始值檢查
  CHAIN.
    FIELD <fld1>.
    FIELD <fld2>,<fld3>,<fld4>.
    MODULE <mdl1> ON CHAIN-INPUT.
    MODULE <mdl2>.
  ENDCHAIN.
注意:CHAIN-INPUT表示FLD1,FLD2,FLD3,FLD4不是初始值時執行MDL1檢查
FIELD… MODULE…(單個螢幕欄位)
FIELD <f> MODULE <mod> ON INPUT|REQUEST|*-INPUT. 
在編輯螢幕的PAI的時候,對欄位的檢查一般用field xxx module xxx或者用chain。有兩種操作可供選擇,一種是on input,另一種是on request。
?      ON INPUT:只要該欄位不為初始值就會觸發module。不同型別欄位的初始值是不一樣的:如果是字元型別其初始值為Space;數字型別的為zero(不同型別的具體初始值請參考《ABAP BC Programming.docx》)。即使使用者在輸入框輸入了值,但這個值為初始值時也不會觸發
?      ON REQUEST:該欄位發生變化後觸發module
例如,有兩個欄位,a、b,兩個module,check_a check_b:
field a module check_a on input.
field b module chec_b on request.
無論a發生任何變化,只要a不為空,則每一次回車都會觸發check_a;
反之,只有b發生變化後才會觸發check_b,如果兩次回車中間b沒有發生變化,則不會觸發check_b。
注:此方式與CHAIN不同,不能如下寫法:
  FIELD a. " FIELD與MODULE只能寫在同一語句中
  MODULE check_a ON INPUT.
  FIELD a,b. "非Chain中時,FIELD後面不能跟多個欄位
  MODULE check_a ON INPUT.
  FIELD a.
  MODULE check_a ON CHAIN-INPUT. "但可以使用CHAIN-?是否有意思沒有測試
?      ON *-INPUT
如果螢幕欄位<f>的輸入內容第一個字元為“*”,並且該螢幕欄位<f>設定了“* Entry”屬性,且沒有ON INPUT時,則會呼叫<mod>module ,並且首字元星號不會被傳遞到ABAP程式中去。




CHAIN…ENDCHAIN(多個螢幕欄位)
不能巢狀。可以將多個螢幕欄位組織在一塊進行驗證。此語句的作用就是相當於選擇螢幕的AT SELECTION-SCREEN ON BLOCK block事件,用來對一個邏輯塊的螢幕欄位進行校驗,這裡的邏輯塊是按Module前FIELD選項指定的螢幕欄位來劃分的,如下的
CHAIN.
  FIELD: <f1>, <f2>,<fi...>.
  MODULE <mod1> ON CHAIN-INPUT|CHAIN-REQUEST.
  FIELD: <g1>, <g2>,<gi...>.
  MODULE <mod2> ON CHAIN-INPUT|CHAIN-REQUEST.
  ...
ENDCHAIN.
只要<fi>中某個欄位滿足條件(<mod1>後面的CHAIN-INPUT與CHAIN-REQUEST條件),<mod1>就會被呼叫,而只要<fi>或<gi>中的某個欄位滿足條件,則<mod2>就會被呼叫。如果在module中檢測不通過(如MESSAGE… E類訊息時),則CHAIN…ENDCHAIN之外的所有其他螢幕欄位將會被鎖定且置灰,這與選擇螢幕的AT SELECTION-SCREEN ON BLOCK校驗是一樣的
CHAIN.
  FIELD: <f1>, <f2>,<fi...>.
  FIELD <f> MODULE <mod1> ON INPUT|REQUEST|*-INPUT|CHAIN-INPUT|CHAIN-REQUEST.
  MODULE <mod2> ON CHAIN-INPUT|CHAIN-REQUEST.
ENDCHAIN.
<mod1>被呼叫的條件是所對應欄位<f>滿足ON後面指定的條件即可執行。<mod2>被呼叫的條件是隻要<fi>或<f>中的某個欄位滿足條件即可執行。


ON INPUT與ON CHAIN-INPUT區別
CHAIN.
    FIELD:f1,f2.
    FIELD: f3 MODULE mod1 ON INPUT.
  ENDCHAIN.
只有f3包含非初始值時才呼叫mod1
CHAIN.
    FIELD:f1,f2.
    FIELD:f3 MODULE mod1 ON CHAIN-INPUT.
  ENDCHAIN
f1,f2,f3中任一欄位包含非初始值時都呼叫mod1.
注意on input 與on chain-input的不同
AT CURSOR-SELECTION滑鼠雙擊時呼叫
在AT CURSOR-SELECTION語句呼叫之前,先也要通過欄位有效性檢測這一過程,這與AT EXIT-COMMAND是不一樣的(它會繞過欄位輸入有效檢測過程),螢幕欄位的值會按照FIELD語句的出現的順序傳遞到ABAP程式中,但此時Function Code不會傳遞到ABAP程式中去,所以此時SY-UCOMM與OK_CODE不受影響,存放的值還是上一次的值。
MODULE <mod> AT CURSOR-SELECTION.
當滑鼠雙擊(或F2)輸入/輸出( I/O)型別的螢幕欄位時(比如下圖中螢幕欄位型別為 I/O 的螢幕欄位)才會呼叫<mod>:


注意:要使滑鼠雙擊螢幕輸入元素時AT CURSOR-SELECTION生效,還必須在GUI Status裡設定:將F2(一般使用F2,不要使用別的快捷鍵,因為F2本來就是系統預設的滑鼠功能)所對應的Function Code為CS,並且Function Type為S,此時才能啟用滑鼠雙擊功能:


還可以與FIELD一起使用:
FIELD <f> MODULE <mod> AT CURSOR-SELECTION.
或者,針對多個螢幕欄位時:
CHAIN.
  FIELD: <f1>, <f2>,...
  MODULE <mod> AT CURSOR-SELECTION.
ENDCHAIN.
上面這兩種方式下,只有當滑鼠雙擊(或F2)I/O 型別欄位<f>或<fi>螢幕欄位時,<mod>才會被呼叫(注意:<f>或<fi>只能是I/O 型別的螢幕欄位)。
AT CURSOR-SELECTION語句呼叫優先順序:
?        如果有某個螢幕欄位可能有以下三種語句:MODULE <mod> AT CURSOR-SELECTION(包括在CHAIN…ENDCHAIN裡的語句)、FIELD <f> MODULE <mod> AT CURSOR-SELECTION有關,則帶FIELD的語句會先執行(不管FIELD語句這三者前還是後),其他的語句不再被執行。
?        對於同一個螢幕欄位<f>,如果有多條FIELD  <f>  MODULE  <mod>  AT  CURSOR-SELECTION語句,則只有第一條會被執行
?        如果有多條MODULE <mod> AT CURSOR-SELECTION 的語句,則只有最後一條語句會被執行
示例:


DATA: ok_code LIKE sy-ucomm,
      input1(20),
      input2(20),
      input3(20),
      fld(20).
CALL SCREEN 200.
MODULE init_screen_0100 OUTPUT.
  SET PF-STATUS 'STATUS_100'.
ENDMODULE.                  
MODULE cancel INPUT.
  LEAVE PROGRAM.
ENDMODULE.                  
MODULE cursor INPUT.
  GET CURSOR FIELD fld.
  MESSAGE  i001(00) WITH  'cursor: ' fld.
ENDMODULE.                  
MODULE module_1 INPUT.
  MESSAGE i001(00) WITH 'module_1'.
ENDMODULE.                  
MODULE module_2 INPUT.
  MESSAGE i001(00) WITH 'module_2 '.
ENDMODULE.                  
MODULE module_* INPUT.
  MESSAGE i001(00) WITH 'module_*'.
ENDMODULE.                
MODULE c1 INPUT.
  GET CURSOR FIELD fld.
  MESSAGE i001(00)  WITH  'c1: ' fld.
ENDMODULE.                                      
MODULE c2 INPUT.
  GET CURSOR FIELD fld.
  MESSAGE i001(00)  WITH 'c2: ' fld.
ENDMODULE. 


在GUI status STATUS_100中,
圖示被啟用,且Function Code為CANCEL,型別為E。快捷鍵F2也被啟用,Function Code為 CS型別為S。
?   只要1或2輸入框不為空時,MODULE_1將被呼叫
?   只要3個框任何一個輸入內容發生了改變,則MODULE_2就會被用呼叫
?  只要輸入框3輸入的內容以*開頭,則會呼叫MODULE_*(注意:螢幕欄位INPUT3需要設定“* Entry”屬性才能觸發)
?  當在INPUT1上按F2或雙擊時,c1會被呼叫(因為帶FIELD的要比不帶FIELD的語句呼叫優先順序要高);如果將第20行注掉,則此時cursor會被呼叫(因為有多條不帶FIELD的語句時,最後一條才會被執行,所以要想在INPUT1上雙擊時呼叫c2,則需要將19、20都注掉)
?  當在INPUT2或INPUT3上按F2或雙擊時,cursor會被呼叫,而c2不會被呼叫,因為有多條不帶FIELD的語句時,最後一條才會被執行
ABAP Statements for Screens SET PF-STATUS
SET PF-STATUS <stat> [OF PROGRAM <prog>] [EXCLUDING <f>|<itab>].
給螢幕設定STATUS(螢幕選單、工具條)
DATA fcode TYPE TABLE OF sy-ucomm.
...
MODULE status_0100 OUTPUT.
  "去啟用Function code為CHANGE、SAVE的功能
  APPEND 'CHANGE'  TO fcode.
  APPEND 'SAVE' TO fcode.
  SET PF-STATUS 'STATUS_0100' EXCLUDING fcode.
ENDMODULE.
SET TITLEBAR、啟用Title Bar
SET TITLEBAR title [OF PROGRAM prog][WITH text1 ... text9].
除非另外有一個SET TITLEBAR重新設定了Title,否則當前螢幕及後繼螢幕的Tile一樣。佔位符placeholders &1 ... &9可以被相應的text1 ... text9所替換,如果要顯示一個&,則要在Title中使用&&來代替
DATA: title  TYPE string,
      prog   TYPE string,
      p1     TYPE c LENGTH 10,
      p2     TYPE c LENGTH 10.
...
MODULE status_0100 OUTPUT.
  ...
  title = 'TITLE_0100'.
  prog  = '...'.
  p1 = '...'.
  p2 = '...'.
  SET TITLEBAR title OF PROGRAM prog WITH p1 p2.
  ...
ENDMODULE.


GET CURSORFIELD
GET CURSOR FIELD<f>[OFFSET<off>][LINE<lin>][VALUE<val>] [LENGTH<len>] [AREA area]..
當用戶在螢幕上進行操作後,我們需要知道游標操作所在哪個螢幕元素上,這個典型應用是F2(或滑鼠雙擊)。該語句就是找出游標所在螢幕元素,它會將游標所在螢幕是元素的名稱寫入<f>變數中,如果游標在螢幕欄位裡,則SY-SUBRC為0,否則為4。
?     OFFSET將游標所在螢幕元素內容中的位置寫到變數off中
?     LINE如果游標落在了table control表格控制元件中的某行,則將游標所在的行號寫到lin變數中。如果游標不在table control表格控制元件中,則lin的值為0.
?     VALUE將螢幕欄位的內容(指顯示模式下的內容,也就是說還包括格式字元)寫到val變數中
?     LENGTH將螢幕欄位的顯示長度寫入到len變數中
?     AREA
LIST螢幕的游標讀取與定位請參考GET CURSOR FIELD、GET CURSOR LINE






DATA: ok_code LIKE sy-ucomm,
      save_ok LIKE ok_code.
DATA: input_output(20) TYPE c,
      fld(20) TYPE c,
      off TYPE i,
      val(20) TYPE c,
      len TYPE i.
CALL SCREEN 200.
MODULE user_command_0100 INPUT.
  save_ok = ok_code.
  CLEAR ok_code.
  CASE save_ok.
    WHEN 'CANCEL'.
      LEAVE PROGRAM.
    WHEN 'SELE'.
      GET CURSOR FIELD fld OFFSET off VALUE val LENGTH len.
  ENDCASE.
ENDMODULE.   
MODULE init_screen_0100 OUTPUT.
  SET PF-STATUS 'SDSS'.
ENDMODULE.
SET CURSOR FIELD
游標定位一是可以通過螢幕屬性靜態的設定
二是在PBO中動態的指定游標位置:
SET CURSOR FIELD <f> [OFFSET <off>].
輸入檢測 自動輸入檢測
螢幕的自動檢測在所有螢幕欄位內容傳遞到ABAP程式中之前,也在screen flow logic處理之前發生。如果想繞過自動檢測之前就要呼叫module,則需要在呼叫時使用 AT EXIT-COMMAND選項
如果自動檢測出現了錯誤,訊息將顯示在螢幕的狀態條上顯示,相應欄位繼續等待正確的輸入,只有當所有輸入都通過了自動檢測後才會觸發PAI正常處理(AT EXIT-COMMAND選項的呼叫除外)。自動檢查以如下順序來執行:
1.      必輸欄位檢測
2.      資料格式檢測
3.      ABAP Dictionary檢測
?       如果參照的欄位為foreign key,則會進行Check Table檢測
?       fixed values檢測




發現在一個自動聯動現象:當SDYN_CONN-CARRID、SDYN_CONN-CONNID同時出現時,自動就具有聯動功能,如果輸入了SDYN_CONN-CARRID的值,則SDYN_CONN-CONNID的值會受它影響,如果不輸入就選擇SDYN_CONN-CONNID的值,則SDYN_CONN–CARRID框中的值會自動填上。
螢幕邏輯流中進行檢測FIELD…VALUES
已過時
在ABAP Dialog Modules進行檢測
當檢測不通過時,可以在相應的module中傳送warning (type W) 或者 error (type E)型別的訊息,PAI處理就會暫停,直到輸入通過檢測後才會繼續向後執行。
FIELD <f> MODULE <mod>.
當<mod>中傳送出警告或錯誤型別的資訊時,相應欄位<f>將會要求重新輸入,一旦輸入檢測通過後,將繼續後面的PAI語句的處理,以前的module不會再次呼叫。
CHAIN.
  FIELD: <f1>, <f2>,...
  MODULE <mod1>.
  FIELD: <g1>, <g2>,...
  MODULE <mod2>.
  ...
ENDCHAIN.
當<mod1>或者<mod2>中傳送出警告或錯誤型別的資訊時,所以出現在CHAIN…ENDCHAIN塊FIELD語句中的螢幕欄位將會要求重新輸入,其他螢幕欄位被鎖定且置灰不能輸入。一旦輸入檢測通過後,將繼續進後面的PAI語句的處理,以前的module不會再次呼叫



PROCESS BEFORE OUTPUT.
  MODULE init_screen_0100.
PROCESS AFTER INPUT.
  MODULE cancel AT EXIT-COMMAND.
  FIELD input1 MODULE module_1.
  FIELD input2 MODULE module_2.
  FIELD input3 MODULE module_3.
  CHAIN.
    FIELD input4.
    MODULE chain_module_1.
    FIELD input5.
    FIELD input6 MODULE chain_module_2.
  ENDCHAIN.
  MODULE execution.
DATA: ok_code LIKE sy-ucomm,
      input1 TYPE i,
      input2 TYPE i,
      input3 TYPE i,
      input4 TYPE i,
      input5 TYPE i,
      input6 TYPE i,
      sum TYPE i.
CALL SCREEN 200.
MODULE init_screen_0100 OUTPUT.
  SET PF-STATUS 'SDSS'.
ENDMODULE.
MODULE init_screen_100 OUTPUT.
  CLEAR: input1, input2, input3, input4, input5, input6.
  SET PF-STATUS 'SDSS'.
ENDMODULE.
MODULE cancel INPUT.
   LEAVE PROGRAM.
ENDMODULE.
MODULE module_1 INPUT.
  IF input1 < 50.
    MESSAGE 'module_1: input1 < 50' TYPE 'E'.
  ENDIF.
ENDMODULE.  
MODULE module_2 INPUT.
  IF input2 < 100.
    MESSAGE 'module_2: input3 < 100' TYPE 'E'.
  ENDIF.
ENDMODULE.
MODULE module_3 INPUT.
  IF input3 < 150.
    MESSAGE 'module_3: input1 < 150' TYPE 'E'.
  ENDIF.
ENDMODULE.
MODULE chain_module_1 INPUT.
  IF input4 < 10.
    MESSAGE 'chain_module_1: input4 < 10' TYPE 'E'.
  ENDIF.
ENDMODULE.  
M