ABAP彈出框
SAP中可以使用function,顯示彈窗。根據不同彈窗類型,SAP對彈出框進行了分組,例如:SPO1,SPO2等。SAP系統中有一些這些分組的函數的樣例函數,可以通過 RS+分組+* 進行搜索,例如SPO4的彈窗樣例,使用RSSPO4*進行搜索。所有的function源碼都在Package:SZP下。
1.SP01類型
包含一些提示信息,讓用戶確認的彈窗。
示例1:POPUP_TO_CONFIRM函數使用

"顯示彈窗 FORM spo1_pop. "接收選擇結果 DATA:ANSWER(1) TYPE C. "傳入表,沒啥用 DATA:parm LIKE TABLE OF SPAR WITH HEADER LINE. "使用popup_to_confirm,一個確認彈窗 CALL FUNCTION 'POPUP_TO_CONFIRM' EXPORTING "彈窗標題 TITLEBAR = '請確認' "額外文本,可以使用se61維護Dialog Text, "示例中使用:TEXT1_ZUM_POPUP_TO_CONFIRM DIAGNOSE_OBJECT = '' "彈窗顯示確認問題文本 TEXT_QUESTION = '這是彈窗顯示確認問題' "最左邊按鈕文本,默認yes TEXT_BUTTON_1 = 'yes' "最左邊按鈕圖標:Table:Icon,Tcode:Icon都可以查看圖標,傳入icon名 ICON_BUTTON_1 = 'ICON_CHECKED' "中間按鈕文本,默認no TEXT_BUTTON_2 = 'No' "中間按鈕圖標 ICON_BUTTON_2 = 'ICON_INCOMPLETE' "初始選中按鈕 DEFAULT_BUTTON = '1' "是否顯示cancel按鈕 DISPLAY_CANCEL_BUTTON = 'X' "顯示一個info按鈕,幫助信息,但是se61找不到對應值 USERDEFINED_F1_HELP = 'TEST_TEXT_ZUR_SPO1' "彈窗開始列 START_COLUMN = 25 "彈窗開始行 START_ROW = 6 "彈窗文本左邊圖標 POPUP_TYPE = 'ICON_MESSAGE_INFORMATION' "未知功能 * IV_QUICKINFO_BUTTON_1 = '' * IV_QUICKINFO_BUTTON_2 = '' IMPORTING "選擇值1:yes;2:no;A:cancel; ANSWER = ANSWER TABLES "傳入table,源碼沒使用? PARAMETER = parm * EXCEPTIONS * TEXT_NOT_FOUND = 1 * OTHERS = 2 . IF SY-SUBRC <> 0. MESSAGE s000 WITH 'error'. ELSE. MESSAGE s000 WITH answer. ENDIF. ENDFORM.
示例2:POPUP_TO_CONFIRM_STEP使用

FORM spo1_pop1. "提示do not use "接收選擇結果 DATA:ANSWER(1) TYPE C. CALL FUNCTION 'POPUP_TO_CONFIRM_STEP' EXPORTING DEFAULTOPTION = 'Y' "顯示兩行文本 TEXTLINE1 = 'textline 1' TEXTLINE2 = 'textline 2' "彈窗標題 TITEL = 'popup title' START_COLUMN = 25 START_ROW = 6 "是否顯示cancel按鈕 CANCEL_DISPLAY = '' IMPORTING "返回值J:yes;N:no;A:cancel ANSWER = ANSWER. IF SY-SUBRC <> 0. MESSAGE s000 WITH 'error'. ELSE. MESSAGE s000 WITH answer. ENDIF. ENDFORM.
示例3:POPUP_TO_CONFIRM_WITH_VALUE函數使用

FORM spo1_pop2. "提示do not use "接收選擇結果 DATA:ANSWER(1) TYPE C. CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_VALUE' EXPORTING "默認按鈕 DEFAULTOPTION = 'Y' "顯示文本 OBJECTVALUE = '100' "文本后綴 TEXT_AFTER = '%' "文本前綴 TEXT_BEFORE = '百分比:' TITEL = 'title' START_COLUMN = 25 START_ROW = 6 CANCEL_DISPLAY = 'X' IMPORTING ANSWER = ANSWER. IF SY-SUBRC <> 0. MESSAGE s000 WITH 'error'. ELSE. MESSAGE s000 WITH answer. ENDIF.
類似還有函數:POPUP_TO_CONFIRM_WITH_MESSAGE,POPUP_TO_CONFIRM_LOSS_OF_DATA,但是都不推薦使用,這種提示信息的直接使用POPUP_TO_CONFIRM就夠了。
2.SPO2類型
和SPO1類似,顯示一些信息供用戶確認。
示例1:POPUP_TO_DECIDE函數使用

"顯示三行文本彈窗 FORM spo2_pop1. "do not use "接收選擇結果 DATA:ANSWER(1) TYPE C. "顯示彈窗 CALL FUNCTION 'POPUP_TO_DECIDE' EXPORTING "默認按鈕 DEFAULTOPTION = '1' "三行文本 TEXTLINE1 = 'first line' TEXTLINE2 = 'second line' TEXTLINE3 = 'third line' "按鈕1,2的文本 TEXT_OPTION1 = 'yes' TEXT_OPTION2 = 'no' "按鈕1,2的圖標 * ICON_TEXT_OPTION1 = ' ' * ICON_TEXT_OPTION2 = ' ' "彈窗標題 TITEL = 'title' "開始行列 START_COLUMN = 25 START_ROW = 6 "是否顯示cancel按鈕 CANCEL_DISPLAY = 'X' IMPORTING "選擇返回1:按鈕1;2:按鈕2;A:cancel按鈕 ANSWER = ANSWER. IF SY-SUBRC <> 0. MESSAGE s000 WITH 'error'. ELSE. MESSAGE s000 WITH answer. ENDIF. ENDFORM.
示例2:POPUP_TO_DECIDE_WITH_MESSAGE函數使用

FORM spo2_pop2. "do not use "接收選擇結果 DATA:ANSWER(1) TYPE C. "顯示彈窗 CALL FUNCTION 'POPUP_TO_DECIDE_WITH_MESSAGE' EXPORTING "默認按鈕 DEFAULTOPTION = '1' "diagno文本,必須有一個 DIAGNOSETEXT1 = 'dia1' * DIAGNOSETEXT2 = 'dia2' * DIAGNOSETEXT3 = 'dia3' "text文本行,至少有一個 TEXTLINE1 = 'text1' * TEXTLINE2 = 'text2' * TEXTLINE3 = 'text3' "按鈕文本 TEXT_OPTION1 = 'yes' TEXT_OPTION2 = 'no' "按鈕圖標 * ICON_TEXT_OPTION1 = * ICON_TEXT_OPTION2 = "標題 TITEL = 'title' START_COLUMN = 25 START_ROW = 6 CANCEL_DISPLAY = 'X' IMPORTING ANSWER = answer. IF SY-SUBRC <> 0. MESSAGE s000 WITH 'error'. ELSE. MESSAGE s000 WITH answer. ENDIF. ENDFORM.
3.SPO4類型
接收用戶輸入信息彈窗。
示例1:使用POPUP_GET_VALUES函數
使用table類型參數fields結構:
tabname:接收值所在數據庫表名
fieldname:字段名
value:值,用戶輸入或預設
field_obl:是否必輸欄位
fieldtext:欄位文本

"顯示輸入值彈窗 FORM spo4_pop. "接收值的字段 DATA:fileds TYPE TABLE OF sval WITH HEADER LINE. DATA:retcode(1) TYPE C. "設置字段 CLEAR fileds. fileds-tabname = 'SPFLI'. fileds-fieldname = 'CARRID'. fileds-value = '02'. * fileds-fieldtext = '航班id'. APPEND fileds. CLEAR fileds. fileds-tabname = 'SPFLI'. fileds-fieldname = 'CONNID'. fileds-field_obl = 'X'. APPEND fileds. CALL FUNCTION 'POPUP_GET_VALUES' EXPORTING "是否值檢查 NO_VALUE_CHECK = '' "標題 POPUP_TITLE = 'title' "設置位置 START_COLUMN = '5' START_ROW = '5' IMPORTING "點擊cancel,返回A RETURNCODE = retcode TABLES "接收值的字段內表 FIELDS = fileds. IF SY-SUBRC <> 0. * Implement suitable error handling here MESSAGE s000 WITH retcode. ELSE. MESSAGE s000 WITH retcode. LOOP AT fileds. WRITE: / fileds-fieldname,fileds-value. ENDLOOP. ENDIF. ENDFORM.
示例2:POPUP_GET_VALUES_DB_CHECKED函數,填寫數據會驗證是否在數據庫中存在

FORM spo4_pop1. "接收值的字段 DATA:fileds TYPE TABLE OF sval WITH HEADER LINE. DATA:retcode(1) TYPE C. "設置字段 CLEAR fileds. fileds-tabname = 'SPFLI'. fileds-fieldname = 'CARRID'. APPEND fileds. CALL FUNCTION 'POPUP_GET_VALUES_DB_CHECKED' EXPORTING "是否檢查填寫數據是否存在 CHECK_EXISTENCE = 'X' "title POPUP_TITLE = 'title' "位置設置 START_COLUMN = '5' START_ROW = '5' IMPORTING RETURNCODE = retcode TABLES FIELDS = fileds. IF SY-SUBRC <> 0. * Implement suitable error handling here MESSAGE s000 WITH retcode. ELSE. MESSAGE s000 WITH retcode. LOOP AT fileds. WRITE: / fileds-fieldname,fileds-value. ENDLOOP. ENDIF. ENDFORM.
示例3:POPUP_GET_VALUES_USER_CHECKED函數,可以執行額外程序的子form程序,做欄位輸入檢查

FORM spo4_pop2. "接收值的字段 DATA:fileds TYPE TABLE OF sval WITH HEADER LINE. DATA:retcode(1) TYPE C. "設置字段 CLEAR fileds. fileds-tabname = 'SPFLI'. fileds-fieldname = 'CARRID'. APPEND fileds. "彈窗獲取輸入值執行額外form CALL FUNCTION 'POPUP_GET_VALUES_USER_CHECKED' EXPORTING "執行的form名 FORMNAME = 'CHECK_EXIT' POPUP_TITLE = 'title' "form所在program名 PROGRAMNAME = 'TEST_POPUP' "開始行列 START_COLUMN = '5' START_ROW = '5' "??? NO_CHECK_FOR_FIXED_VALUES = '' IMPORTING RETURNCODE = retcode TABLES FIELDS = fileds. IF SY-SUBRC <> 0. * Implement suitable error handling here MESSAGE s000 WITH retcode. ELSE. MESSAGE s000 WITH retcode. ENDIF. ENDFORM. "執行用戶自定義檢查邏輯,當error有值,顯示info彈窗 FORM check_exit TABLES fileds STRUCTURE sval CHANGING error STRUCTURE svale. LOOP AT fileds. "自定義檢查是否數據庫存在 SELECT SINGLE * FROM SPFLI WHERE CARRID = fileds-value. IF sy-subrc <> 0. "數據庫表 ERROR-ERRORTAB = 'SPFLI'. "檢查字段 ERROR-ERRORFIELD = 'CARRID'. "package:SZP下message classes中可以找到對應值 ERROR-MSGTY = 'I'. ERROR-MSGID = 'S4'. ERROR-MSGNO = '510'. ENDIF. ENDLOOP. ENDFORM.
示例4:POPUP_GET_VALUES_USER_HELP函數,可以執行額外程序的子form程序,做欄位輸入檢查,自定義f1,f4幫助

FORM spo4_pop3. "接收值的字段 DATA:fileds TYPE TABLE OF sval WITH HEADER LINE. DATA:retcode(1) TYPE C. "設置字段 CLEAR fileds. fileds-tabname = 'SPFLI'. fileds-fieldname = 'CARRID'. APPEND fileds. CALL FUNCTION 'POPUP_GET_VALUES_USER_HELP' EXPORTING "F1幫助from名 F1_FORMNAME = 'F1_HELP' "F1幫助form所在program F1_PROGRAMNAME = 'TEST_POPUP' "F4幫助form名 F4_FORMNAME = 'F4_HELP' "F4幫助所在program F4_PROGRAMNAME = 'Z_TEST_POPUP' "自定義檢查form名 * FORMNAME = ' ' POPUP_TITLE = 'title' "自定義檢查form所在program * PROGRAMNAME = ' ' "設置顯示位置 * START_COLUMN = '5' * START_ROW = '5' * NO_CHECK_FOR_FIXED_VALUES = ' ' IMPORTING RETURNCODE = retcode TABLES FIELDS = fileds. IF SY-SUBRC <> 0. * Implement suitable error handling here MESSAGE s000 WITH retcode. ELSE. MESSAGE s000 WITH retcode. ENDIF. ENDFORM. FORM f1_help USING TABNAME FIELDNAME. MESSAGE s000 WITH TABNAME FIELDNAME 'no f1 help'. ENDFORM. "F4幫助邏輯 FORM f4_help USING TABNAME FIELDNAME DISPLAY CHANGING RETURNCODE VALUE. DATA: BEGIN OF F_TAB OCCURS 10. INCLUDE STRUCTURE HELP_VALUE. DATA: END OF F_TAB, BEGIN OF V_TAB OCCURS 200, VALUE(40) TYPE C, END OF V_TAB. "字段表 F_TAB-TABNAME = 'SPFLI'. F_TAB-FIELDNAME = 'CARRID'. F_TAB-SELECTFLAG = 'X'. APPEND F_TAB. "填充值 SELECT * FROM SPFLI. V_TAB = SPFLI-CARRID. APPEND V_TAB. ENDSELECT. "顯示獲取到的值 CALL FUNCTION 'HELP_VALUES_GET_WITH_TABLE' EXPORTING * CUCOL = 0 * CUROW = 0 DISPLAY = DISPLAY FIELDNAME = FIELDNAME TABNAME = TABNAME * NO_MARKING_OF_CHECKVALUE = ' ' * TITLE_IN_VALUES_LIST = ' ' * TITEL = ' ' * SHOW_ALL_VALUES_AT_FIRST_TIME = ' ' * NO_CONVERSION = ' ' IMPORTING SELECT_VALUE = VALUE TABLES FIELDS = F_TAB VALUETAB = V_TAB. ENDFORM.
示例5:POPUP_GET_VALUES_USER_BUTTONS函數,可以執行額外程序的子form程序,自定義f1,f4幫助,多兩個功能按鈕執行額外邏輯

FORM spo4_pop4. "接收值的字段 DATA:fileds TYPE TABLE OF sval WITH HEADER LINE. DATA:retcode(1) TYPE C. DATA:ICON_OK_PUSH LIKE ICON-NAME VALUE ICON_OKAY. DATA:ICON_CREATE_PUSH LIKE ICON-NAME VALUE ICON_CREATE. DATA:ICON_SEARCH_PUSH LIKE ICON-NAME VALUE ICON_SEARCH. "設置字段 CLEAR fileds. fileds-tabname = 'SPFLI'. fileds-fieldname = 'CARRID'. APPEND fileds. CALL FUNCTION 'POPUP_GET_VALUES_USER_BUTTONS' EXPORTING "F1幫助from名,form所在program名 * F1_FORMNAME = ' ' * F1_PROGRAMNAME = ' ' "F4幫助from名,form所在program名 * F4_FORMNAME = ' ' * F4_PROGRAMNAME = ' ' "用戶點擊按鈕響應form,form所在program名 FORMNAME = 'USER_CODE' PROGRAMNAME = 'Z_TEST_POPUP' "title POPUP_TITLE = 'title' "ok按鈕文本,圖標及提示 OK_PUSHBUTTONTEXT = 'ok' ICON_OK_PUSH = ICON_OK_PUSH QUICKINFO_OK_PUSH = 'ok' "按鈕1文本,圖標及提示 FIRST_PUSHBUTTON = 'creat' ICON_BUTTON_1 = ICON_CREATE_PUSH QUICKINFO_BUTTON_1 = 'creat something' "按鈕2文本,圖標及提示 SECOND_PUSHBUTTON = 'seach' ICON_BUTTON_2 = ICON_SEARCH_PUSH QUICKINFO_BUTTON_2 = 'search something' * START_COLUMN = '5' * START_ROW = '5' * NO_CHECK_FOR_FIXED_VALUES = ' ' IMPORTING RETURNCODE = retcode TABLES FIELDS = fileds * EXCEPTIONS * ERROR_IN_FIELDS = 1 * OTHERS = 2 . IF SY-SUBRC <> 0. * Implement suitable error handling here MESSAGE s000 WITH retcode. ELSE. MESSAGE s000 WITH retcode. ENDIF. ENDFORM. "響應用戶選點擊按鈕 FORM USER_CODE TABLES FIELDS STRUCTURE SVAL USING CODE CHANGING ERROR STRUCTURE SVALE SHOW_POPUP. CASE CODE. "點擊ok按鈕 WHEN 'FURT'. MESSAGE s000 WITH 'button ok' code. "按鈕響應后,是否彈窗繼續顯示,為空直接關閉,為X不不關閉 SHOW_POPUP = ''. "點擊button1 WHEN 'COD1'. MESSAGE s000 WITH 'button1' code. SHOW_POPUP = 'X'. "點擊button2 WHEN 'COD2'. MESSAGE s000 WITH 'button2' code. SHOW_POPUP = 'X'. ENDCASE. ENDFORM.
4.SPO5類型
示例1:POPUP_TO_DECIDE_LIST函數,顯示彈窗包含一個選項表,供用戶選擇,單選或多選。

FORM spo5_pop. "選擇列表 DATA: t_selist LIKE SPOPLI OCCURS 5 WITH HEADER LINE. DATA: answer TYPE C. "選擇標志 t_selist-SELFLAG = 'X'. "選項 t_selist-VAROPTION = '選項1'. "INACTIVE字段控制是否不可選 * t_selist-INACTIVE = 'X'. APPEND t_selist. t_selist-SELFLAG = ''. t_selist-VAROPTION = '選項2'. APPEND t_selist. "顯示一個選擇列表 CALL FUNCTION 'POPUP_TO_DECIDE_LIST' EXPORTING "光標所在選項行 CURSORLINE = 1 "單選按鈕,多選框 "MARK_FLAG不設置,MARK_MAX = 1單選 "MARK_FLAG="X",MARK_MAX = 0 多選checkbox * MARK_FLAG = 'X' MARK_MAX = 1 "設置彈窗位置 * START_COL = 0 * START_ROW = 0 TEXTLINE1 = 'text1' TEXTLINE2 = 'text2' TEXTLINE3 = 'text3' "title TITEL = 'title' "僅顯示 * DISPLAY_ONLY = 'X' IMPORTING ANSWER = answer TABLES T_SPOPLI = t_selist. IF SY-SUBRC <> 0. * Implement suitable error handling here MESSAGE s000 WITH answer. ELSE. MESSAGE s000 WITH answer. ENDIF. ENDFORM.
5.SPO6類型
示例1:POPUP_DISPLAY_TEXT函數,顯示se61創建文本

FORM spo6_pop. DATA: CANCELLED(1) TYPE C. "顯示文本text,只能是se61創建text CALL FUNCTION 'POPUP_DISPLAY_TEXT' EXPORTING "語言 * LANGUAGE = SY-LANGU "標題 POPUP_TITLE = 'title' "位置 * START_COLUMN = 10 * START_ROW = 3 "文本對象,se61,dialog text類型創建 TEXT_OBJECT = 'SPO_EXAMPLE_1' "helpmodal * HELP_MODAL = 'X' IMPORTING CANCELLED = CANCELLED. IF SY-SUBRC <> 0. * Implement suitable error handling here MESSAGE s000 WITH CANCELLED. ELSE. MESSAGE s000 WITH CANCELLED. ENDIF. "POPUP_DISPLAY_TEXT_WITH_PARAMS函數 "text_objext = 'SPO_EXAMPLE_2',可以在se61中找到,參數名規則:"&參數名&" "定義參數表,可以在文本中插入參數 "DATA:params LIKE SPAR OCCURS 0 WITH HEADER LINE. "PARAM字段:參數名;VALUE字段:參數值 ENDFORM.
示例2:POPUP_DISPLAY_TEXT函數,顯示se61創建文本,顯示自定義按鈕button

FORM spo6_pop1. DATA:params LIKE SPAR OCCURS 0 WITH HEADER LINE. DATA:USER_BUTTONS LIKE SMP_DYNTXT OCCURS 0 WITH HEADER LINE. DATA:answer LIKE RSNEWLENG-FCODE. params-PARAM = 'V1'. params-VALUE = '參數1'. APPEND params. "設置自定義按鈕 USER_BUTTONS-TEXT = 'tips1'. USER_BUTTONS-ICON_ID = ICON_CLOSE. USER_BUTTONS-ICON_TEXT = 'exit'. APPEND USER_BUTTONS. CALL FUNCTION 'POPUP_DISPLAY_TEXT_USER_BUTTON' EXPORTING "語言 * LANGUAGE = SY-LANGU "title POPUP_TITLE = 'title' "位置 * START_COLUMN = 5 * START_ROW = 5 * DOCU_CLASS = 'DT' "文本對象,se61建立dialog text類型創建 TEXT_OBJECT = 'SPO_EXAMPLE_2' "是否顯示ok,cancel按鈕 DISPLAY_OK_BUTTON = 'X' DISPLAY_CANCEL_BUTTON = 'X' IMPORTING ANSWER = answer TABLES "用戶自定義按鈕 USER_BUTTONS = USER_BUTTONS PARAMETER = params. IF SY-SUBRC <> 0. * Implement suitable error handling here MESSAGE s000 WITH answer. ELSE. MESSAGE s000 WITH answer. ENDIF. ENDFORM.