1. 程式人生 > >ABAP實戰螢幕SCREEN設計(二)

ABAP實戰螢幕SCREEN設計(二)

螢幕(SCREEN)是ABAP設計最重要的工作之一,SAP的單據、主資料維護等業務功能都使用螢幕,一個程式可以包含多個螢幕。
上一篇博文“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.
執行結果如圖
當選擇某一行,輸出結果如圖