SAP ABAP選擇屏幕開發


SAP ABAP選擇屏幕開發

原文地址:http://blog.sina.com.cn/s/blog_7c7b16000101cr1w.html

用戶通過屏幕操作來實現與SAP數據的交互, 而SAP的屏幕開發一般分為兩種:

第一種是通過SAP ABAP 語法創建屏幕元素, 稱之為選擇屏幕.
第二種是通過SAP的屏幕編輯器開發.
 
1. 屏幕元素創建的語法.
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 在程序中生成一個含有四個組件的內表---選擇表, 該表具體格式如下:
DATA: BEGIN OF seltab OCCURS 0,
        SING(1),
        OPTION(2),
        LOW LIKE f,
        HIGH LIKE F,
ENND OF seltab.
 
SIGN 是標志位, 允許值為 I 和 E, 其意義為確定儲存在字段 OPTION 中的運算符是否需要取反, I 表示"包含", E 表示"排除", 等於在邏輯表達式中加一個NOT.
OPTION 包含選擇運算符. 如果 HIGH 字段為空, 則可以填充  EQ(=), NE(<>), GT(>), GE(>=), LT(<), LE(<=), CP, NP. 其中 CP 和 NP 只有當在輸入字段中使用了通配符("*"或"+")時它們才有效. 
如果 HIGH 字段不為空, 則可以使用 BT (位於) 和 NB(不位於), 其功能相當於 BETWEEN 和 NOT BETWEEN.
 
選擇表可以進行多行選擇標准的設定.
基本規則是: 如果選擇表為空, 則選擇所有的數據; 如果選擇表有多行, 則將所有的 SIGN 為 "I" 數據選出后, 再排除掉其中所有的滿足標志為 "E" 的數據行. 具體規則如下:
  • 如果選擇表為空, 即用戶未輸入任何數據, 則條件 f IN seltab 恆為真.
  • 如果選擇表中只包含 SIGN 為 I 的行 "i1" ... , "in", 則相當於條件( i1 OR ... OR in ) 的組合.
  • 如果選擇表中只包含 SIGN 為 E 的行 "e1" ... , "em", 則相當於條件( NOT e1 ) AND ... AND ( NOT em) 的組合.
  • 如果選擇表中即包含 SIGN 為 I 的行 "i1" ... , "in", 又包含 SIGN 為 E 的行 "e1" ..., "em" ,則相當於條件(i1 OR ... OR in ) AND ( NOT e1 ) AND ... AND ( NOT em) 的組合.
 
動態定義輸入域的參考對象.
DATA: name TYPE string.
SELECT-OPTIONS: s_name for (name).
AT SELECTION-SCREEN OUTPUT.
  name = 'MARA-MATNR'.
 
2. 屏幕輸入域顯示參數控制.
  • OBLIGATORY 必輸項控制.
  • NO-DISPLAY 顯示控制.
  • VISIBLE LENGTH vlen 顯示長度控制.
  • NO-EXTENSION 多行輸入控制. 限制 SELECT-OPTIONS 多行輸入.
  • NO-INTERVALS. 輸入范圍控制.
  • MODIFY ID modid 編輯組控制. 該參數可以將所定義的屏幕對象進行分組, 以方便在程序運行中對分組的對象屬性進行統一修改及控制.
  • VALUE CHECK 進行值檢查. 如果參數字段參照數據字典中的類型定義, 可以使用該選項檢查用戶輸入值是否符合該字段的約束表中的數據或者是否屬於數據字典中定義的值列表, 否則系統將給出錯誤消息.
  • MEMORY ID pid.
  • AS CHECKBOX. 創建復選框.
  • RADIOBUTTON GROUP radi. 創建單選按鈕組.
  • PARAMETERS <對象名> AS LISTBOX VISIBLE LENGTH vlen. 創建下拉列表.
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. 輸入值的控制.
  • 控制輸入默認值.  SELECT-OPTIONS, Default val1 [TO val2] [OPTION opt] [SIGN sgn].            
  • DEFAULT val1.    控制 PARAMETER 對象輸入的默認值.
  • LOWER CASE 容許輸入小寫字母. SAP 所有屏幕字段輸入后都會將字母默認轉換為大寫, 加上該參數后允許輸入小寫字母.
  • MATCHCODE OBJECT search_help. 為屏幕對象加上指定的 F4 幫助.
  • MEMORY ID pid 定義 SELECT-OPTIONS 內存參數. 可以將屏幕對象輸入的值保存到指定的內在參數中, 通過 GET parameter 方法可以直接從內存讀取該對象的值.
      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].  產生空行.
  • SELECTION-SCREEN ULINE [[/]jpos(len)]. 在選擇屏幕中給一行或幾行中的一部分加下划線. 其中 "/" 用於換行控制.
  • SELECTION-SCREEN COMMENT [/]pos(len) comm [ FOR FIELD f].  如果使用 FOR FIELD f. 則該注釋分配給參數或選擇標准f. 如果用戶在該元素f的注釋上請求幫助(F1), 則系統顯示分配給字段f的幫助文本.  SELECTION-SCREEN COMMENT /1(20) text-t01.
  • 組合選擇屏幕元素. SELECTION-SCREEN BEGIN OF LINE.                                                              ..........                                                                                 SELECTION-SCREEN END OF LINE.
                        這些元素將出現在屏幕的同一行中.
      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 幫助功能.
   當在SAP選擇屏幕的字段中按下 F1 鍵時, 可以調用自定義的程序或系統幫助文件. F1 幫助可以通過 ABAP 事件 AT SELECTION-SCREEN 來控制, 在自定義程序中, 可以通過調用系統標准函數 HELP_OBJECT_SHOW 或 HELP_OBJECT_SHOW_FOR_FIELD 來實現. 
 
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 鍵時, 可以調用自定義的程序或系統幫助數據. 也是通過 AT SELECTION-SCREEN 來調用. 與 F1 不同的是, F1 是進行信息提示, 而 F4 是顯示填充值的列表. 可以調用 F4IF_FIELD_VALUE_REQUEST 參照某一個具體表字段來維護 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'.   "解發事件的屏幕對象名稱.
  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. 在屏幕上輸出自定義文本及圖標.
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.
 
在文本元素中加入圖標.
每個圖標都由一個兩位長度的代碼進行標識, 在字符前面加上 "@"符號表示對該圖標進行引用. 可以通過數據字典查看 TYPE Group: ICON, 通過 ICON NAME 尋找對應的 ID 列. 或通過程序 RSTXICON 來查看SAP中所有圖標及代碼的對應關系列表.
選擇屏幕開發.

選擇屏幕開發.

7. 在屏幕中實現按鈕效果.
TYPE-POOLS: icon.
TABLES: sscrfields.  " 引用屏幕字段屬性
" 創建屏幕按鈕對象
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. 子屏幕的創建.
子屏幕分為兩種, 一種為 Include Screen, 可以通過 Report 端程序直接調用; 一種為 SubScreen, 需要通過 Screen Painter 所創建屏幕引用.
Include Screen 相關語法如下:
 
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. 在工具欄上新增功能按鈕.
按鈕的定義保存在結構體 SSCRFIELDS 中, n 為一個整數類型的序號, 例如當 n 等於1時, 按鈕的描述保存在字段 SSCRFIELDS-FUNCTXT_01 中, 按鈕的功能代碼將默認賦值為 "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. 在屏幕上創建頁簽.
SELECTION-SCREEN BEGIN OF TABBED BLOCK <block> FOR n lines.
每個頁簽都是由一個單獨的子屏幕控制, 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.
 
屏幕元素屬性的控制.
屏幕中所有的對象都有獨立的屬性, 在SAP程序執行中, 可以通過系統變量SCREEN來讀取每個屏幕對象的具體屬性, SCREEN是一個標准的結構體, 其常用屬性及參數如下:
  • NAME: 屏幕對象的名稱.
  • INPUT: 設置屏幕輸入域對象不否允許輸入值( 0: 不可輸入, 1: 可輸入), 默認值為 1.
  • INVISIBLE: 設置對象在輸出到屏幕后時是否可見, ( 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.
 
選擇屏幕事件.
選擇屏幕的處理也是通過事件驅動的, 這些事件是一些預定義的ABAP代碼塊. 選擇屏幕中不存在任何由程序員設定的流邏輯(普通屏幕的行為由流邏輯進行控制), 取而代之的是在程序中定義一系列相關的事件塊, 由運行環境在處理選擇屏幕的過程中觸發. 選擇屏幕中各個事件在程序中出現的位置是任意的, 與其調用順序無關. 選擇屏幕事件將出現在 INITIALIZATION 事件和 START-OF-SELECTION 事件中間; 對於使用 CALL SELECTION-SCREEN 調用的自定義選擇屏幕, 這些選擇屏幕將出現在當前處理塊中.
所有的選擇屏幕事件都使用 AT SELECTION SCREEN 語句引導.
 
INITIALIZATION 事件.
該事件在屏幕未顯示之前執行, 對程序設置值及屏幕元素進行初始化賦值.
 
TOP-OF-PAGE.
創建新的 Write List 時觸發.
 
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 事件.
該事件由程序單擊執行按鈕時觸發.
 
END-OF-SELECTION 事件.
該事件應用於所有數據處理完成, 即START-OF-SELECTION相關事件執行完成,但輸出屏幕還未顯示之前.在實際開發中主要用於一些執行結果的檢驗等, 其輸出數據疊加於同一輸出屏幕中.
 
AT SELECTION-SCREEN OUTPUT事件.
選擇屏幕的PBO事件, 在每次選擇屏幕被調用之前觸發, 可以在其中進行選擇屏幕輸出之前的准備工作, 比如在程序中動態地對選擇屏幕元素的輸出屬性進行修改.
 
AT SELECTION-SCREEN 事件.
是選擇屏幕的PAI事件, 在用戶輸入的所有數據都被傳輸到程序中之后被觸發, 也是選擇屏幕中 最后被觸發的事件. 在選擇屏幕中, 用戶回車, 選擇某GUI按鈕,功能鍵或者菜單鍵之后, 如果系統檢查無誤, 將觸發該事件.
 
AT SELECTION-SCREEN ON field 事件.
是針對選擇屏幕中某字段輸入的PAI事件, 當該字段值被傳遞給程序時被觸發, 可以應用於該字段本身的正確性檢查, 如果系統提示錯誤, 則可以在該字段中重新輸入, 此時其它字段元素呈灰色, 不接受輸入.
 
AT SELECTION-SCREEN ON BLOCK block 事件.
是針對選擇屏幕某元素區域輸入的PAI事件, 當該區域內的所有字段的值被傳遞給程序時被觸發, 可以應用於該區域元素整體的正確性檢查.
 
AT SELECTION-SCREEN ON RADIOBUTTON GROUP rad1.
作為單選按鈕, 必須整體進行輸入檢查, 不能單獨使用 ON field選項進行.
 
AT SELECTION-SCREEN ON seltab.
AT SELECTION-SCREEN ON END OF seltab.
這兩個事件只有在使用多行選擇對話框時才可能被觸發, 其中 ON seltab 用於用戶逐行輸入后的正確性檢查, 而 ON END OF seltab 用於整個選擇表輸入結束后各行的檢查.
 
AT SELECTION-SCREEN ON HELP-REQUEST FOR field.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR field.
選擇屏幕中的POH和POV事件, 當光標位於某屏幕字段時, 用戶按下F1和F4鍵, 將觸發 ON HELP-REQUEST 和 
ON VLAUE-REQUEST事件.
 
AT LINE-SELECTION.
在 Write List 中雙擊某行觸發.
 
屏幕事件的中止.
EXIT: 中止當前事件模塊.
STOP: 強制中止所有事件.
REJECT: 應用於讀取邏輯數據庫的程序.


免責聲明!

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



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