ABAP實戰螢幕SCREEN設計(二)
阿新 • • 發佈:2019-02-06
螢幕(SCREEN)是ABAP設計最重要的工作之一,SAP的單據、主資料維護等業務功能都使用螢幕,一個程式可以包含多個螢幕。
上一篇博文“ABAP實戰螢幕SCREEN設計(一)”主要介紹了以下內容:
(1)第一個"HELLO WORLD" Screen程式
(2)工具條和選單設計
(3)螢幕物件
(4)資料字典關聯欄位
(5)邏輯流
(6)下拉框設計
本篇博文將繼續介紹剩下內容,主要包含
(1)修改螢幕狀態
(2)子視窗(Subscreen)
(3)表條目控制
(4)定製控制,上載圖片和在螢幕上顯示圖片例項
(5)文字編輯器
本節在螢幕上建立一個CHECKBOX、若干輸入欄位,將欄位分成兩個組,每一個組有一個BUTTON,單擊組BUTTON,根據CHECKBOX的值更改欄位組的屬性,設計介面如圖
1-1和1-2為NO1組,2-1和2-2為NO2組。
程式程式碼如下
視窗物件子螢幕範圍物件用來定義一個子視窗在主視窗上的大小、位置等屬性,通過邏輯流和主程式將物件關聯到子視窗。
例如:建立一個主視窗和兩個子視窗,在主視窗上再建立一個子視窗範圍,增加兩個按鈕,單擊按鈕時切換子視窗。
輸入名稱後,繼續
輸入需要建立頁面的名稱,繼續
可以在此基礎上新增圖片雙擊事件,此處就不再介紹了。
單擊“CANCEL”按鈕,退出文字編輯器螢幕,輸出內表記錄,如圖
新增一個文字欄位,並定義名稱和文字,然後建立輸入框,欄位屬性為輸入輸出欄位,再新增“確認”按鈕和“取消”按鈕,如圖
邏輯流程式如下
切換到元素清單頁面,定義變數“OK_CODE”,如圖
主程式程式碼如下
系統輸出如圖
首先建立程式YTEST20160615001,然後建立顯示螢幕,在螢幕介面單擊“字典欄位”按鈕,輸入學校表後,螢幕顯示錶欄位,選擇欄位,確認,如圖
選擇輸出位置,單擊後,系統自動建立輸入文字和輸出欄位,新增退出按鈕,如圖
邏輯流程式如圖
切換到元素清單頁面後,定義變數“OK_CODE”,如圖
主程式程式碼如下
當選擇某一行,輸出結果如圖
上一篇博文“ABAP實戰螢幕SCREEN設計(一)”主要介紹了以下內容:
(1)第一個"HELLO WORLD" Screen程式
(2)工具條和選單設計
(3)螢幕物件
(4)資料字典關聯欄位
(5)邏輯流
(6)下拉框設計
本篇博文將繼續介紹剩下內容,主要包含
(1)修改螢幕狀態
(2)子視窗(Subscreen)
(3)表條目控制
(4)定製控制,上載圖片和在螢幕上顯示圖片例項
(5)文字編輯器
(6)列表和螢幕相互呼叫
1、修改螢幕狀態
可以在程式執行時動態地設定物件的屬性,如設定一個欄位是否有效,在Screen設計時,可以將欄位分組,在PBO事件中設定屬性。本節在螢幕上建立一個CHECKBOX、若干輸入欄位,將欄位分成兩個組,每一個組有一個BUTTON,單擊組BUTTON,根據CHECKBOX的值更改欄位組的屬性,設計介面如圖
1-1和1-2為NO1組,2-1和2-2為NO2組。
程式程式碼如下
輸出結果如下圖REPORT YTEST20160613002. *功能碼返回值 DATA: OK_CODE TYPE SY-UCOMM, SAVE_OK TYPE SY-UCOMM. DATA:SGRP(20) TYPE C, SMOD(1) TYPE C. *是否修改 DATA: CANMOD(1) TYPE C. *預設可以修改 CANMOD = 'X'. *直接呼叫視窗 CALL SCREEN 100. MODULE STATUS_0100 OUTPUT. SET PF-STATUS 'STATUS1'. *根據按鈕確定欄位組 SGRP = ''. IF SAVE_OK = 'BTN1'. SGRP = 'NO1'. ELSE. SGRP = 'NO2'. ENDIF. *CHECKBOX轉換 IF CANMOD = 'X'. SMOD = '1'. ELSE. SMOD = '0'. ENDIF. *逐個掃描螢幕元素 LOOP AT SCREEN. *如果是需要修改的組,更改變數,其他組不考慮,如果正式考慮先儲存到變數 IF SCREEN-GROUP1 = SGRP. SCREEN-INPUT = SMOD. *更新到視窗元素變數 MODIFY SCREEN. ENDIF. ENDLOOP. ENDMODULE. MODULE CANCEL INPUT. LEAVE PROGRAM. ENDMODULE. MODULE USER_COMMAND_0100 INPUT. SAVE_OK = OK_CODE. CLEAR OK_CODE. CASE SAVE_OK. WHEN 'CANCEL'. LEAVE PROGRAM. ENDCASE. ENDMODULE.
當選擇不更改,單擊設定組1按鈕時,測試組1狀態變為不能編輯。
2、子視窗
一個程式可以有多個視窗,通過子視窗,可以把若干個子視窗放在一個視窗上,這樣,既保持了整體性,又方便對單個螢幕的維護。在SAP業務程式中,大量地使用了子視窗設計。視窗物件子螢幕範圍物件用來定義一個子視窗在主視窗上的大小、位置等屬性,通過邏輯流和主程式將物件關聯到子視窗。
例如:建立一個主視窗和兩個子視窗,在主視窗上再建立一個子視窗範圍,增加兩個按鈕,單擊按鈕時切換子視窗。
主視窗設計介面:
子視窗設計介面:
同樣方式定義好螢幕300
回到主螢幕100,定義邏輯流
主程式程式碼如下PROCESS BEFORE OUTPUT. MODULE STATUS_0100. *SUBSCR是定義的子螢幕範圍的名稱 CALL SUBSCREEN: SUBSCR INCLUDING SY-REPID SID1. PROCESS AFTER INPUT. MODULE CANCEL AT EXIT-COMMAND. MODULE USER_COMMAND_0100. *使子螢幕顯示 CALL SUBSCREEN SUBSCR.
REPORT YTEST20160613003.
*功能碼返回值
DATA:OK_CODE TYPE SY-UCOMM,
SAVE_OK TYPE SY-UCOMM.
*子視窗預設用200子視窗
DATA:SID1(4) TYPE N VALUE '200'.
*直接呼叫視窗
CALL SCREEN 100.
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'STATUS1'.
ENDMODULE.
MODULE CANCEL INPUT.
LEAVE PROGRAM.
ENDMODULE.
MODULE USER_COMMAND_0100 INPUT.
SAVE_OK = OK_CODE.
CLEAR OK_CODE.
CASE SAVE_OK.
*當單擊第一個按鈕,顯示200子視窗
WHEN 'BTN1'.
SID1 = '200'.
*當單擊第二個按鈕,顯示300子視窗
WHEN 'BTN2'.
SID1 = '300'.
WHEN 'CANCEL'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE.
輸出結果如圖
當單擊“顯示子視窗2”按鈕時,顯示子視窗200,如圖
3、表條目控制
表條目控制是實現將多個子螢幕以頁面形式切換的控制元件,有手工製作和嚮導生成兩種,在本節中,不再重複子螢幕建立操作,只表達操作上的特殊性,手工製作的圖示是,嚮導製作的圖示是。3.1、手工製作
進入螢幕設計,單擊按鈕,建立一個表條目控制,如圖
圖中控制元件顯示粉紅色表示其屬性未設定完成。
逐頁設定名稱、文字、功能碼屬性,接著選中“子螢幕範圍”按鈕,在第一頁建立該物件,設定好子螢幕的屬性後,第一頁就設定完成,不再顯示粉紅色,如下圖中的表一
3.2、嚮導製作
在設計螢幕上建立“表條目控制製作嚮導”物件,啟動向導程式,如圖輸入名稱後,繼續
輸入需要建立頁面的名稱,繼續
嚮導產生頁面子螢幕編號和每頁功能碼,可以在此基礎上調整,繼續
預設呼叫主螢幕的主程式名稱,繼續
系統提示所示設定引數資訊,單擊“完成"按鈕
開啟設計介面,系統自動建立完成全部頁面、邏輯流和主程式程式碼,如圖
4、通過定製控制在螢幕上顯示圖片
可以通過“定製”物件在螢幕上顯示各種控制元件,如圖片、Tree Control、ALV、編輯器等,後面的例項將會用到這個控制元件,先介紹在一個定製控制物件內顯示圖片。4.1、圖片的上傳
通過TCODE:SMW0上傳圖片,選擇應用程式的二進位制資料,單擊查詢按鈕,如圖
搜尋條件預設為空,點選執行按鈕,如圖
螢幕顯示已有物件,單擊新增按鈕,如圖
輸入物件名稱,單擊輸入按鈕,如圖
選擇需要上傳的本對圖片
SAP GUI安全性彈出視窗,單擊”允許“按鈕
此處開發類預設為空,單擊”本地物件“按鈕,如圖
產生傳輸入請求,單擊按鈕,如圖
上傳成功,螢幕顯示新產生的物件行,如圖
相關資訊在資料表“WWWDATA”可以查詢到,如圖
4.2、螢幕設計定義物件
在螢幕設計介面新增定製控制物件和“退出”按鈕,如圖4.3、圖片顯示程式
程式程式碼如下:REPORT YTEST20160614002.
DATA:OK_CODE TYPE SY-UCOMM,
SAVE_OK TYPE SY-UCOMM.
*定義控制和影象物件定義
DATA CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA PICTURE TYPE REF TO CL_GUI_PICTURE.
*初始標誌欄位定義
DATA INIT.
CALL SCREEN 100.
MODULE USER_COMMAND_0100 INPUT.
SAVE_OK = OK_CODE.
CLEAR OK_CODE.
CASE SAVE_OK.
WHEN 'CANCEL'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE.
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'STATUS1'.
*如果還未建立定製物件
IF INIT IS INITIAL.
*圖片地址欄位定義
DATA URL(255).
CLEAR URL.
*建立物件
CREATE OBJECT CONTAINER
EXPORTING CONTAINER_NAME = 'P1'.
CREATE OBJECT PICTURE
EXPORTING PARENT = CONTAINER
EXCEPTIONS ERROR = 1.
IF SY-SUBRC NE 0.
ENDIF.
*定義通用函式取得圖片地址
PERFORM LOAD_PIC_DB CHANGING URL.
*顯示圖片
CALL METHOD PICTURE->LOAD_PICTURE_FROM_URL
EXPORTING
URL = URL.
IF SY-SUBRC NE 0.
ENDIF.
*置標誌位已初始
INIT = 'X'.
ENDIF.
ENDMODULE.
*獲取圖片地址通用函式
FORM LOAD_PIC_DB CHANGING P_URL.
DATA QUERY_TABLE LIKE W3QUERY OCCURS 1 WITH HEADER LINE.
DATA HTML_TABLE LIKE W3HTML OCCURS 1.
DATA RETURN_CODE LIKE W3PARAM-RET_CODE.
DATA CONTENT_TYPE LIKE W3PARAM-CONT_TYPE.
DATA CONTENT_LENGTH LIKE W3PARAM-CONT_LEN.
DATA PIC_DATA LIKE W3MIME OCCURS 0.
DATA PIC_SIZE TYPE I.
REFRESH QUERY_TABLE.
*查詢物件資料
QUERY_TABLE-NAME = '_OBJECT_ID'.
*圖片物件名稱
QUERY_TABLE-VALUE = 'ZTESTPIC'.
APPEND QUERY_TABLE.
*讀取WWWDATA表,取得圖片物件資訊
CALL FUNCTION 'WWW_GET_MIME_OBJECT'
TABLES
QUERY_STRING = QUERY_TABLE
HTML = HTML_TABLE
MIME = PIC_DATA
CHANGING
RETURN_CODE = RETURN_CODE
CONTENT_TYPE = CONTENT_TYPE
CONTENT_LENGTH = CONTENT_LENGTH
EXCEPTIONS
OBJECT_NOT_FOUND = 1
PARAMETER_NOT_FOUND = 2
OTHERS = 3.
IF SY-SUBRC EQ 0.
PIC_SIZE = CONTENT_LENGTH.
ENDIF.
*建立圖片URL地址
CALL FUNCTION 'DP_CREATE_URL'
EXPORTING
TYPE = 'image'
SUBTYPE = CNDP_SAP_TAB_UNKNOWN
SIZE = PIC_SIZE
LIFETIME = CNDP_LIFETIME_TRANSACTION
TABLES
DATA = PIC_DATA
CHANGING
URL = URL
EXCEPTIONS
DP_INVALID_PARAMETER = 1
DP_ERROR_PUT_TABLE = 2
DP_ERROR_GENERAL = 3
OTHERS = 4.
ENDFORM.
4.4、程式輸出
程式執行,輸出結果如圖可以在此基礎上新增圖片雙擊事件,此處就不再介紹了。
5、通過定製控制文字編輯器
在SAP業務系統中,大量用到文字編輯器,用文字編輯器處理內表,所以本節在螢幕上建立文字編輯器,輸入相關內容後,在螢幕退出時輸出編輯器內容。5.1、螢幕設計定義物件
在螢幕設計介面定義控制物件,退出按鈕。5.2、文字編輯器程式
REPORT YTEST20160614003.
DATA: OK_CODE TYPE SY-UCOMM,
SAVE_OK TYPE SY-UCOMM.
*初始標誌欄位定義
*定製控制和編輯物件定義
DATA: INIT,
CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
EDITOR TYPE REF TO CL_GUI_TEXTEDIT.
DATA: M1(256) TYPE C OCCURS 0,
LINE(256) TYPE C.
*輸入初始值
LINE = '請輸入'.
APPEND LINE TO M1.
CALL SCREEN 100.
REFRESH M1.
CALL METHOD EDITOR->GET_TEXT_AS_R3TABLE
IMPORTING
TABLE = M1.
*逐行輸出
LOOP AT M1 INTO LINE.
WRITE / LINE.
ENDLOOP.
MODULE USER_COMMAND_0100 INPUT.
SAVE_OK = OK_CODE.
CLEAR OK_CODE.
CASE SAVE_OK.
WHEN 'CANCEL'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'STATUS1'.
*如果還未建立定製物件
IF INIT IS INITIAL.
INIT = 'X'.
CREATE OBJECT: CONTAINER EXPORTING CONTAINER_NAME = 'P1'.
CREATE OBJECT EDITOR
EXPORTING
PARENT = CONTAINER
WORDWRAP_MODE = CL_GUI_TEXTEDIT=>WORDWRAP_AT_FIXED_POSITION
WORDWRAP_POSITION = 256
WORDWRAP_TO_LINEBREAK_MODE = CL_GUI_TEXTEDIT=>TRUE.
ENDIF.
*讀入初始資料
CALL METHOD EDITOR->SET_TEXT_AS_R3TABLE
EXPORTING
TABLE = M1.
ENDMODULE.
5.3、輸出
程式執行後,螢幕顯示文字編輯器,在編輯框內輸入文字,如圖單擊“CANCEL”按鈕,退出文字編輯器螢幕,輸出內表記錄,如圖
6、列表和螢幕相互呼叫
6.1、從螢幕輸入條件,列表輸出資料
以表為YTJAYSCHOOL例,建立一個輸入欄位和一個查詢按鈕的螢幕,當單擊查詢按鈕時,根據該輸入欄位檢索,將資料通過列表輸出。新增一個文字欄位,並定義名稱和文字,然後建立輸入框,欄位屬性為輸入輸出欄位,再新增“確認”按鈕和“取消”按鈕,如圖
邏輯流程式如下
切換到元素清單頁面,定義變數“OK_CODE”,如圖
主程式程式碼如下
REPORT YTEST20160614004.
DATA: OK_CODE TYPE SY-UCOMM,
SAVE_OK TYPE SY-UCOMM,
CITYID(20) TYPE C.
TABLES YTJAYSCHOOL.
CALL SCREEN 100.
MODULE CANCEL INPUT.
LEAVE PROGRAM.
ENDMODULE.
MODULE USER_COMMAND_0100 INPUT.
SAVE_OK = OK_CODE.
CLEAR OK_CODE.
IF SAVE_OK EQ 'BTN1'.
LEAVE TO LIST-PROCESSING AND RETURN TO SCREEN 0.
SUPPRESS DIALOG.
SELECT *
FROM YTJAYSCHOOL WHERE YCT_ID = CITYID.
WRITE: / YTJAYSCHOOL-YCT_ID, YTJAYSCHOOL-YSH_ID,
YTJAYSCHOOL-YSH_NAME, YTJAYSCHOOL-YSH_ADDR.
ENDSELECT.
ENDIF.
WRITE:/ 'DONE'.
ENDMODULE.
輸出結果如圖所示,在輸入框輸入條件,單擊“確認”按鈕
系統輸出如圖
6.2、從列表呼叫螢幕
以YTJAYSCHOOL表為例,在螢幕上輸出列表,當雙擊某一行時,呼叫螢幕顯示資料明細。首先建立程式YTEST20160615001,然後建立顯示螢幕,在螢幕介面單擊“字典欄位”按鈕,輸入學校表後,螢幕顯示錶欄位,選擇欄位,確認,如圖
選擇輸出位置,單擊後,系統自動建立輸入文字和輸出欄位,新增退出按鈕,如圖
邏輯流程式如圖
切換到元素清單頁面後,定義變數“OK_CODE”,如圖
主程式程式碼如下
REPORT YTEST20160615001.
*功能碼返回值
DATA: OK_CODE TYPE SY-UCOMM,
SAVE_OK TYPE SY-UCOMM.
TABLES YTJAYSCHOOL.
START-OF-SELECTION.
SELECT * FROM YTJAYSCHOOL.
WRITE:/ YTJAYSCHOOL-YCT_ID, (15) YTJAYSCHOOL-YSH_ID,
(15) YTJAYSCHOOL-YSH_NAME, (15) YTJAYSCHOOL-YSH_ADDR.
HIDE: YTJAYSCHOOL-YCT_ID, YTJAYSCHOOL-YSH_ID,
YTJAYSCHOOL-YSH_NAME, YTJAYSCHOOL-YSH_ADDR.
ENDSELECT.
AT LINE-SELECTION.
CHECK NOT YTJAYSCHOOL-YSH_ID IS INITIAL.
CALL SCREEN 100.
MODULE CANCEL INPUT.
LEAVE PROGRAM.
ENDMODULE.
MODULE USER_COMMAND_0100 INPUT.
SAVE_OK = OK_CODE.
CLEAR OK_CODE.
CASE SAVE_OK.
WHEN 'CANCEL'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE.
執行結果如圖
當選擇某一行,輸出結果如圖