|
用戶通過屏幕操作來實現(xiàn)與SAP數(shù)據(jù)的交互, 而SAP的屏幕開發(fā)一般分為兩種:
第一種是通過SAP ABAP 語法創(chuàng)建屏幕元素, 稱之為選擇屏幕.
第二種是通過SAP的屏幕編輯器開發(fā).
1. 屏幕元素創(chuàng)建的語法.
SELECT-OPTIONS: 對象名稱 FOR 參考對象.
PARAMETERS: 對象名
TYPE/LIKE 參考對象.
例如:
TABLES: mara.
SELECT-OPTIONS: s_matnr for mara-matnr.
PARAMETERS: s_matnr like
mara-matnr.
PARAMETERS: s_matnr type
matnr.
SELECT-OPTIONS 在程序中生成一個含有四個組件的內(nèi)表---選擇表, 該表具體格式如下:
DATA: BEGIN OF seltab OCCURS 0,
SING(1),
OPTION(2),
LOW LIKE f,
HIGH LIKE F,
ENND OF seltab.
SIGN 是標(biāo)志位, 允許值為 I 和 E, 其意義為確定儲存在字段 OPTION 中的運(yùn)算符是否需要取反,
I 表示"包含", E 表示"排除", 等于在邏輯表達(dá)式中加一個NOT.
OPTION 包含選擇運(yùn)算符. 如果 HIGH 字段為空, 則可以填充 EQ(=),
NE(<>), GT(>),
GE(>=), LT(<), LE(<=),
CP, NP. 其中 CP 和 NP
只有當(dāng)在輸入字段中使用了通配符("*"或"+")時它們才有效.
如果 HIGH 字段不為空, 則可以使用 BT (位于) 和 NB(不位于), 其功能相當(dāng)于 BETWEEN 和 NOT
BETWEEN.
選擇表可以進(jìn)行多行選擇標(biāo)準(zhǔn)的設(shè)定.
基本規(guī)則是: 如果選擇表為空, 則選擇所有的數(shù)據(jù); 如果選擇表有多行, 則將所有的 SIGN 為 "I" 數(shù)據(jù)選出后,
再排除掉其中所有的滿足標(biāo)志為 "E" 的數(shù)據(jù)行. 具體規(guī)則如下:
- 如果選擇表為空, 即用戶未輸入任何數(shù)據(jù), 則條件 f IN seltab 恒為真.
- 如果選擇表中只包含 SIGN 為 I 的行 "i1" ... , "in", 則相當(dāng)于條件( i1 OR ... OR in
) 的組合.
- 如果選擇表中只包含 SIGN 為 E 的行 "e1" ... , "em", 則相當(dāng)于條件( NOT e1 ) AND ...
AND ( NOT em) 的組合.
- 如果選擇表中即包含 SIGN 為 I 的行 "i1" ... , "in", 又包含 SIGN 為 E 的行 "e1"
..., "em" ,則相當(dāng)于條件(i1 OR ... OR in ) AND ( NOT e1 ) AND ... AND (
NOT em) 的組合.
動態(tài)定義輸入域的參考對象.
DATA: name TYPE string.
SELECT-OPTIONS: s_name for (name).
AT SELECTION-SCREEN OUTPUT.
name = 'MARA-MATNR'.
2. 屏幕輸入域顯示參數(shù)控制.
- OBLIGATORY 必輸項控制.
- NO-DISPLAY 顯示控制.
- VISIBLE LENGTH vlen 顯示長度控制.
- NO-EXTENSION 多行輸入控制. 限制 SELECT-OPTIONS 多行輸入.
- NO-INTERVALS. 輸入范圍控制.
- MODIFY ID modid 編輯組控制. 該參數(shù)可以將所定義的屏幕對象進(jìn)行分組,
以方便在程序運(yùn)行中對分組的對象屬性進(jìn)行統(tǒng)一修改及控制.
- VALUE CHECK 進(jìn)行值檢查. 如果參數(shù)字段參照數(shù)據(jù)字典中的類型定義,
可以使用該選項檢查用戶輸入值是否符合該字段的約束表中的數(shù)據(jù)或者是否屬于數(shù)據(jù)字典中定義的值列表, 否則系統(tǒng)將給出錯誤消息.
- MEMORY ID pid.
- AS CHECKBOX. 創(chuàng)建復(fù)選框.
- RADIOBUTTON GROUP radi. 創(chuàng)建單選按鈕組.
- PARAMETERS <對象名> AS LISTBOX
VISIBLE LENGTH vlen. 創(chuàng)建下拉列表.
SELECT-OPTIONS: p1 FOR mara-matnr MODIF ID g1,
p2 FOR mara-matnr MODIF ID g1,
p3 FOR mara-matnr MODIF ID g2,
p4 FOR mara-matnr MODIF ID g2.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF NOT screen-group1 IS INITIAL.
IF screen-group1 = 'G2'.
screen-input = 0.
screen-invisible = 0.
MODIFY SCREEN.
ENDIF.
ENDIF.
ENDLOOP.
******************************************
下拉列表.
PARAMETER: p_lang(20) AS LISTBOX VISIBLE LENGTH 22.
AT SELECTION-SCREEN OUTPUT.
PERFORM setlist.
FORM setlist .
TYPE-POOLS vrm.
DATA values TYPE vrm_values WITH HEADER LINE.
values-key = 'CHINESE'.
values-text = '中國人'.
APPEND values.
values-key = 'AMERICAN'.
values-text = '美國人'.
APPEND values.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'P_LANG'
values = values[]
EXCEPTIONS
id_illegal_name = 1
OTHERS = 2.
ENDFORM.
3. 輸入值的控制.
- 控制輸入默認(rèn)值. SELECT-OPTIONS, Default val1 [TO
val2] [OPTION opt] [SIGN sgn].
- DEFAULT val1. 控制 PARAMETER
對象輸入的默認(rèn)值.
- LOWER CASE 容許輸入小寫字母. SAP 所有屏幕字段輸入后都會將字母默認(rèn)轉(zhuǎn)換為大寫,
加上該參數(shù)后允許輸入小寫字母.
- MATCHCODE OBJECT search_help. 為屏幕對象加上指定的 F4 幫助.
- MEMORY ID pid 定義 SELECT-OPTIONS 內(nèi)存參數(shù). 可以將屏幕對象輸入的值保存到指定的內(nèi)在參數(shù)中,
通過 GET parameter 方法可以直接從內(nèi)存讀取該對象的值.
DATA: s_date TYPE d.
SELECT-OPTIONS: d1 FOR sy-datum MEMORY ID m1 NO INTERVALS.
START-OF-SELECTION.
GET PARAMETER ID 'M1' FIELD s_date.
WRITE s_date.
4. 其它選擇屏幕元素.
- SELECTION-SCREEN SKIP [n]. 產(chǎn)生空行.
- SELECTION-SCREEN ULINE [[/]jpos(len)]. 在選擇屏幕中給一行或幾行中的一部分加下劃線.
其中 "/" 用于換行控制.
- SELECTION-SCREEN COMMENT [/]pos(len) comm [ FOR FIELD
f]. 如果使用 FOR FIELD f.
則該注釋分配給參數(shù)或選擇標(biāo)準(zhǔn)f. 如果用戶在該元素f的注釋上請求幫助(F1), 則系統(tǒng)顯示分配給字段f的幫助文本.
SELECTION-SCREEN COMMENT /1(20) text-t01.
- 組合選擇屏幕元素. SELECTION-SCREEN BEGIN OF LINE.
..........
SELECTION-SCREEN END OF
LINE.
這些元素將出現(xiàn)在屏幕的同一行中.
SELECTION-SCREEN BEGIN OF BLOCK block [WITH FRAME [TITLE title]]
[NO INTERVALS].
.........
SELECTION-SCREEN END OF BLOCK block.
5. 屏幕對象的F1/F4輸入幫助功能.
1). HELP-REQUEST [
FOR LOW|HIGH ]. 字段的 F1 幫助功能.
當(dāng)在SAP選擇屏幕的字段中按下 F1
鍵時, 可以調(diào)用自定義的程序或系統(tǒng)幫助文件. F1 幫助可以通過 ABAP 事件 AT SELECTION-SCREEN 來控制,
在自定義程序中, 可以通過調(diào)用系統(tǒng)標(biāo)準(zhǔn)函數(shù) HELP_OBJECT_SHOW 或 HELP_OBJECT_SHOW_FOR_FIELD
來實現(xiàn).
SELECT-OPTIONS: s_date FOR sy-datum.
AT SELECTION-SCREEN ON HELP-REQUEST FOR s_date-low.
PERFORM show_f1.
FORM show_f1 .
DATA: t_link LIKE STANDARD TABLE OF tline WITH HEADER LINE.
CALL FUNCTION 'HELP_OBJECT_SHOW'
EXPORTING
dokclass = 'DE'
doklangu = sy-langu
dokname = 'SYDATUM'
TABLES
links = t_link .
ENDFORM.
2). VALUE-REQUEST [ FOR LOW|HIGH ].
字段的 F4 鍵幫助.
在指定的字段按 F4 鍵時, 可以調(diào)用自定義的程序或系統(tǒng)幫助數(shù)據(jù). 也是通過 AT
SELECTION-SCREEN 來調(diào)用. 與 F1 不同的是, F1 是進(jìn)行信息提示, 而 F4 是顯示填充值的列表. 可以調(diào)用
F4IF_FIELD_VALUE_REQUEST 參照某一個具體表字段來維護(hù) F4 幫助.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_date-low.
PERFORM show_f4.
FORM show_f4 .
CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
EXPORTING
tabname = 'SYST'
"參照表
fieldname = 'DATUM'
"參照字段
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'S_DATE'.
"解發(fā)事件的屏幕對象名稱.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_file1.
PERFORM get_file_name USING s_file1 'O'.
FORM get_file_name USING p_path LIKE rlgrap-filename mode TYPE c.
DATA tmp_filename LIKE rlgrap-filename.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
def_path = 'D:\ '
mask = ',*.*,*.*.'
mode = mode
IMPORTING
filename = tmp_filename
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
IF sy-subrc = 0.
p_path = tmp_filename.
ENDIF.
ENDFORM.
6. 在屏幕上輸出自定義文本及圖標(biāo).
TYPE-POOLS: icon.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (12) mytext.
PARAMETER: name LIKE sy-uname.
SELECTION-SCREEN END OF LINE.
INITIALIZATION.
CONCATENATE icon_manager '輸入人員編號' INTO mytext.
在文本元素中加入圖標(biāo).
每個圖標(biāo)都由一個兩位長度的代碼進(jìn)行標(biāo)識, 在字符前面加上 "@"符號表示對該圖標(biāo)進(jìn)行引用.
可以通過數(shù)據(jù)字典查看 TYPE Group: ICON, 通過 ICON NAME 尋找對應(yīng)的 ID 列. 或通過程序
RSTXICON 來查看SAP中所有圖標(biāo)及代碼的對應(yīng)關(guān)系列表.
7. 在屏幕中實現(xiàn)按鈕效果.
TYPE-POOLS: icon.
TABLES: sscrfields. " 引用屏幕字段屬性
" 創(chuàng)建屏幕按鈕對象
SELECTION-SCREEN: PUSHBUTTON 2(10) but1 USER-COMMAND cli1,
PUSHBUTTON 20(30) but2 USER-COMMAND cli2 VISIBLE LENGTH 10.
INITIALIZATION.
CONCATENATE icon_message_information '按鈕1' INTO but1.
CONCATENATE icon_message_information '按鈕2' INTO but2.
AT SELECTION-SCREEN.
CASE sscrfields. " 捕捉按鈕功能代碼, 也可以用 SY-UCOMM.
WHEN 'CLI1'.
MESSAGE '按鈕1事件' TYPE 'I'.
WHEN 'CLI2'.
MESSAGE '按鈕2事件' TYPE 'I'.
ENDCASE.
8. 子屏幕的創(chuàng)建.
子屏幕分為兩種, 一種為 Include Screen, 可以通過 Report 端程序直接調(diào)用;
一種為 SubScreen, 需要通過 Screen Painter 所創(chuàng)建屏幕引用.
Include Screen 相關(guān)語法如下:
PARAMETERS: type as CHECKBOX.
CALL SELECTION-SCREEN 123 STARTING AT 10 10 ENDING AT 80 10.
SELECTION-SCREEN BEGIN OF SCREEN 123 as WINDOW TITLE text-t01.
PARAMETERS: matnr LIKE mara-matnr.
PARAMETERS: werks like marc-werks.
SELECTION-SCREEN END OF SCREEN 123.
9. 在工具欄上新增功能按鈕.
按鈕的定義保存在結(jié)構(gòu)體 SSCRFIELDS 中, n 為一個整數(shù)類型的序號, 例如當(dāng) n 等于1時,
按鈕的描述保存在字段 SSCRFIELDS-FUNCTXT_01 中, 按鈕的功能代碼將默認(rèn)賦值為 "FC01", 保存在字段
SSCRFIELDS-UCOMM 中.
TABLES: sscrfields.
PARAMETERS: parm LIKE mara-matnr.
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN FUNCTION KEY 2.
INITIALIZATION.
MOVE 'BUTTON1' TO sscrfields-functxt_01.
MOVE 'BUTTON2' TO sscrfields-functxt_02.
AT SELECTION-SCREEN.
IF SSCRFIELDS-UCOMM = 'FC01'.
MESSAGE '按鈕1事件' TYPE 'I'.
ELSEIF SSCRFIELDS-UCOMM = 'FC02'.
MESSAGE '按鈕2事件' TYPE 'I'.
ENDIF.
10. 在屏幕上創(chuàng)建頁簽.
SELECTION-SCREEN BEGIN OF TABBED BLOCK
<block> FOR n lines.
每個頁簽都是由一個單獨(dú)的子屏幕控制, n 代表分頁控件的高度, 屏幕載入進(jìn)必須先通過 INITIALIZATION
事件對其屬性初始化.
TABLES: mara.
" 定義子屏幕 100
SELECTION-SCREEN BEGIN OF SCREEN 100 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK bk1 WITH FRAME TITLE text-t01.
SELECT-OPTIONS: mat1 FOR mara-matnr NO INTERVALS.
SELECTION-SCREEN SKIP 1.
PARAMETERS: chk1 AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK bk1.
SELECTION-SCREEN END OF SCREEN 100.
" 定義子屏幕 200
SELECTION-SCREEN BEGIN OF SCREEN 200 AS SUBSCREEN.
PARAMETERS: mat2 LIKE mara-matnr.
SELECTION-SCREEN END OF SCREEN 200.
" 定義一個TAB空間, 取名為MYTAB, 控件高為5, 共有兩個頁簽.
" 兩個頁簽的功能代碼分別為 PUSH1, PUSH2.
SELECTION-SCREEN: BEGIN OF TABBED BLOCK mytab FOR 5 LINES,
TAB (20) button1 USER-COMMAND push1,
TAB (20) button2 USER-COMMAND push2,
END OF BLOCK mytab.
" 為TAB控件分配初始化值.
INITIALIZATION.
button1 = text-010.
button2 = text-020.
mytab-prog = sy-repid.
mytab-dynnr = 100.
AT SELECTION-SCREEN.
CASE sy-ucomm.
WHEN 'PUSH1'.
mytab-dynnr = 100.
mytab-activetab = 'BUTTON1'.
WHEN 'PUSH2'.
mytab-dynnr = 200.
mytab-activetab = 'BUTTON2'.
ENDCASE.
屏幕元素屬性的控制.
屏幕中所有的對象都有獨(dú)立的屬性, 在SAP程序執(zhí)行中,
可以通過系統(tǒng)變量SCREEN來讀取每個屏幕對象的具體屬性, SCREEN是一個標(biāo)準(zhǔn)的結(jié)構(gòu)體,
其常用屬性及參數(shù)如下:
- NAME: 屏幕對象的名稱.
- INPUT: 設(shè)置屏幕輸入域?qū)ο蟛环裨试S輸入值( 0: 不可輸入, 1: 可輸入), 默認(rèn)值為 1.
- INVISIBLE: 設(shè)置對象在輸出到屏幕后時是否可見, ( 0: 可見, 1: 不可見).
PARAMETERS: mat1 like mara-matnr.
INITIALIZATION.
LOOP AT SCREEN.
IF screen-name = 'MAT1'.
screen-input = '0'.
screen-invisible = '0'.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
選擇屏幕事件.
選擇屏幕的處理也是通過事件驅(qū)動的, 這些事件是一些預(yù)定義的ABAP代碼塊.
選擇屏幕中不存在任何由程序員設(shè)定的流邏輯(普通屏幕的行為由流邏輯進(jìn)行控制), 取而代之的是在程序中定義一系列相關(guān)的事件塊,
由運(yùn)行環(huán)境在處理選擇屏幕的過程中觸發(fā). 選擇屏幕中各個事件在程序中出現(xiàn)的位置是任意的, 與其調(diào)用順序無關(guān). 選擇屏幕事件將出現(xiàn)在
INITIALIZATION 事件和 START-OF-SELECTION 事件中間; 對于使用 CALL
SELECTION-SCREEN 調(diào)用的自定義選擇屏幕, 這些選擇屏幕將出現(xiàn)在當(dāng)前處理塊中.
所有的選擇屏幕事件都使用 AT SELECTION SCREEN 語句引導(dǎo).
INITIALIZATION 事件.
該事件在屏幕未顯示之前執(zhí)行, 對程序設(shè)置值及屏幕元素進(jìn)行初始化賦值.
TOP-OF-PAGE.
創(chuàng)建新的 Write List 時觸發(fā).
TOP-OF-PAGE DURING LINE-SELECTION.
An event block is triggered for the corresponding events
during the creation of details lists.
You have to use system fields like sy-lsind to distinguish
between the individual details lists.
START-OF-SELECTION 事件.
該事件由程序單擊執(zhí)行按鈕時觸發(fā).
END-OF-SELECTION 事件.
該事件應(yīng)用于所有數(shù)據(jù)處理完成,
即START-OF-SELECTION相關(guān)事件執(zhí)行完成,但輸出屏幕還未顯示之前.在實際開發(fā)中主要用于一些執(zhí)行結(jié)果的檢驗等,
其輸出數(shù)據(jù)疊加于同一輸出屏幕中.
AT SELECTION-SCREEN OUTPUT事件.
選擇屏幕的PBO事件, 在每次選擇屏幕被調(diào)用之前觸發(fā), 可以在其中進(jìn)行選擇屏幕輸出之前的準(zhǔn)備工作,
比如在程序中動態(tài)地對選擇屏幕元素的輸出屬性進(jìn)行修改.
AT SELECTION-SCREEN 事件.
是選擇屏幕的PAI事件, 在用戶輸入的所有數(shù)據(jù)都被傳輸?shù)匠绦蛑兄蟊挥|發(fā), 也是選擇屏幕中最后被觸發(fā)的事件.
在選擇屏幕中, 用戶回車, 選擇某GUI按鈕,功能鍵或者菜單鍵之后, 如果系統(tǒng)檢查無誤, 將觸發(fā)該事件.
AT SELECTION-SCREEN ON field 事件.
是針對選擇屏幕中某字段輸入的PAI事件, 當(dāng)該字段值被傳遞給程序時被觸發(fā), 可以應(yīng)用于該字段本身的正確性檢查,
如果系統(tǒng)提示錯誤, 則可以在該字段中重新輸入, 此時其它字段元素呈灰色, 不接受輸入.
AT SELECTION-SCREEN ON BLOCK block 事件.
是針對選擇屏幕某元素區(qū)域輸入的PAI事件, 當(dāng)該區(qū)域內(nèi)的所有字段的值被傳遞給程序時被觸發(fā),
可以應(yīng)用于該區(qū)域元素整體的正確性檢查.
AT SELECTION-SCREEN ON RADIOBUTTON GROUP rad1.
作為單選按鈕, 必須整體進(jìn)行輸入檢查, 不能單獨(dú)使用 ON field選項進(jìn)行.
AT SELECTION-SCREEN ON seltab.
AT SELECTION-SCREEN ON END OF seltab.
這兩個事件只有在使用多行選擇對話框時才可能被觸發(fā), 其中 ON seltab 用于用戶逐行輸入后的正確性檢查, 而 ON
END OF seltab 用于整個選擇表輸入結(jié)束后各行的檢查.
AT SELECTION-SCREEN ON HELP-REQUEST FOR field.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR field.
選擇屏幕中的POH和POV事件, 當(dāng)光標(biāo)位于某屏幕字段時, 用戶按下F1和F4鍵, 將觸發(fā) ON HELP-REQUEST
和
ON VLAUE-REQUEST事件.
AT LINE-SELECTION.
在 Write List 中雙擊某行觸發(fā).
屏幕事件的中止.
EXIT: 中止當(dāng)前事件模塊.
STOP: 強(qiáng)制中止所有事件.
REJECT: 應(yīng)用于讀取邏輯數(shù)據(jù)庫的程序.
|