首頁 > 軟體

APAP ALV進階寫法及優化詳解

2022-09-12 18:01:33

先導

上一期講了在ABAP中,ALV的普通寫法,流程以及相關屬性,還講了基本DEMO ,但是在真正開發中,不會寫這麼多的程式碼.原則上是一切從簡. o( ̄︶ ̄)oo( ̄︶ ̄)o.今天講下如何用少的程式碼,標準套路,實現ALV基本功能,滿足開發生產需求.

流程搭建

萬變不離其宗,首先書寫的還是流程,比如讓你寫一個某某查詢報表. 上來啥都不用想你先這麼寫

*資料準備
*常規定義變數,內表結構,工作區,內表,包。。。。
你的程式碼
*系統變數準備
*如layout,fieldcat 等 系統變數
你的程式碼
*選擇螢幕
你的程式碼
*INITIALIZATION
*at SELECTION-SCREEN .
"START-OF-SELECTION
"End-OF-SELECTION .
「子例程及自定義宏

流程講解

INITIALIZATION.

該事件在螢幕未顯示之前執行,對程式設定值及螢幕元素進行初始化賦值。一般作用就是初始值設定,如選擇螢幕的資料賦值,預設引數賦值等。

at SELECTION-SCREEN!

1:選擇螢幕事件,有很多引數,代表不同的擴充套件資訊

2:在這個事件響應中,可以對螢幕欄位進行有效性檢驗,控制螢幕元素的屬性等。

START-OF-SELECTION

該事件在單擊按鈕後觸發,一般是資料初始化,資料處理操作的地方

End-OF-SELECTION .

該事件應用於所有資料選擇處理完成,

即START-OF-SELECTION相關執行事件執行完成,

但輸出螢幕還未顯示之前 在實際的應用於一些執行結果的檢驗等。

一般做為ALV展示及使用者操作按鈕事件等。

演練

這裡寫一個簡單的物料明細查詢報表 ,知識點用到了,宏,迴圈,opensql,使用者事件等內容。

資料準備

TABLES : MARA .
*資料準備
"定義結構
TYPES : BEGIN OF gw_Data ,
    MATNR TYPE MATNR ,
    MEINS TYPE MEINS ,
    MAKTX TYPE MAKTX ,
  end of gw_Data .
"定義工作區及內表
data : gs_data TYPE gw_Data .
data :gt_data TYPE table of gw_Data .
"alv 資料
*--------------------------------------------------------------------*
*  通用ALV變數
*--------------------------------------------------------------------*
DATA: wa_layout   TYPE lvc_s_layo.
DATA:wa_fieldcat TYPE lvc_s_fcat,
     gt_fieldcat TYPE lvc_t_fcat.
DATA:gs_glay TYPE  lvc_s_glay.
DATA : gv_error TYPE c.
DATA : BS1 TYPE C.

選擇螢幕

SELECTION-SCREEN BEGIN OF BLOCK BLOCK  WITH FRAME TITLE TEXT-001 .
  PARAMETERS  p_p1  TYPE mara-matnr OBLIGATORY.   "料號
  SELECTION-SCREEN END OF BLOCK BLOCK .

INITIALIZATION  .

INITIALIZATION  .
%_p_p1_%_app_%-text = '物料號'.  "設定選擇螢幕初始化名稱

at SELECTION-SCREEN .

at SELECTION-SCREEN .
PERFORM check_auth .  "許可權檢查

START-OF-SELECTION    .

START-OF-SELECTION    .
PERFORM get_DAta  .  "獲取資料屬性

END-OF-SELECTION .

End-OF-SELECTION .
PERFORM diaplay_data.   "展示alv

子程式和宏

以下程式都使用新語法.不懂新語法後續會出相關內容

"獲取資料子程式
FORM get_DAta . 
select a~matnr,a~MEINS,b~maktx   
from mara as a inner join makt as b 
on a~matnr = b~MATNR where a~ZMATNR = @p_p1 into table @data(lt_outdata) .
ENDFORM .
*展示alv 子程式 直接複製
FORM diaplay_data . 
PERFORM set_alv_layout.   "樣式設定
PERFORM bulid_fieldcat.   "格式設定
PERFORM call_alv_func.    "alv 函數
ENDFORM.
"樣式設定  直接複製
FORM set_alv_layout .
 CLEAR: wa_layout.
 wa_layout-zebra      = 'X'.      "斑馬線
 wa_layout-cwidth_opt = 'X'.      "自動列寬
ENDFORM.
"格式設定  固定換數
FORM bulid_fieldcat .
 DEFINE add_col.
*    ADD 1 TO pos.
*    lw_fieldcat-col_pos = pos.
    wa_fieldcat-fieldname = &1.
    wa_fieldcat-ref_field = &2.
    wa_fieldcat-ref_table = &3.
    wa_fieldcat-scrtext_l = &4.
    wa_fieldcat-outputlen = &5.
    wa_fieldcat-no_zero = &6.
    wa_fieldcat-edit = &7.
    wa_fieldcat-edit_mask = &8.
    wa_fieldcat-key = &9.
   CASE  wa_fieldcat-fieldname.
      WHEN 'slbox'.
 wa_fieldcat-checkbox = 'X' .
 wa_fieldcat-edit = 'X' .
  wa_fieldcat-edit_mask = 'X'.
      WHEN OTHERS.
ENDCASE .
    APPEND wa_fieldcat TO gt_fieldcat.
  CLEAR : wa_fieldcat.
  END-OF-DEFINITION.
  REFRESH: gt_fieldcat.
  "add_col 'matnr'     space space '物料號'           space space space space space.
  add_col 'MEINS'     space space '單位'           space space space space space.
  add_col 'maktx'     space space '物料名'           space space space space space.
ENDFORM.
"重新整理 固定複製
FORM refresh_alv .
  DATA: lo_grid   TYPE REF TO cl_gui_alv_grid,
        lw_stable TYPE lvc_s_stbl.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_grid.
  lw_stable-row = 'X'.
  lw_stable-col = 'X'.
  lo_grid->refresh_table_display(
    EXPORTING
      is_stable = lw_stable
    EXCEPTIONS
      finished  = 1
      OTHERS    = 2 ).
ENDFORM.
"固定,只需要傳內表就行
FORM call_alv_func .
  gs_glay-edt_cll_cb = abap_true.     " 選中複選款,立刻觸發data changed 事件
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid           "回撥程式
      i_callback_pf_status_set = 'SET_PF_STATUS'
      i_callback_user_command  = 'USER_COMMAND'
            i_grid_settings          = gs_glay
      is_layout_lvc            = wa_layout
      it_fieldcat_lvc          = gt_fieldcat        "需要顯示的內表的列
      i_save                   = 'A'
    TABLES
      t_outtab                 =    lt_outdata      "需要顯示的資料
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
  ENDIF.
ENDFORM.
"staus  工具列 直接複製
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
  DATA : lw_tab LIKE LINE OF rt_extab.
  REFRESH rt_extab.
 SET PF-STATUS 'STD' EXCLUDING rt_extab.
ENDFORM.
"使用者事件 ,這裡沒寫. 但是如果設定函數雙擊會apap dump 
FORM user_command  USING r_ucomm LIKE sy-ucomm
                         rs_selfield TYPE slis_selfield.
  CASE r_ucomm.
*   匯入
    WHEN '&IMPLE'.
  ENDCASE.
ENDFORM.
"許可權檢查,按照不同的情況呼叫不同的函數,這裡需要更換.
*&---------------------------------------------------------------------*
*& Form check_auth
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM check_auth .
"select  SINGLE WERKS, KUNNR  into  @data(ls_t001w) from  t001w  WHERE WERKS  = @p_p1  .
 AUTHORITY-CHECK OBJECT 'M_MSEG_WMB'
  ID 'ACTVT'  DUMMY
  ID 'WERKS' FIELD p_p1 .
IF sy-subrc <> 0.
* Implement a suitable exception handling here
ENDIF.
ENDFORM.

以上就為一個alv 的寫法 ,其中 70%以上的程式碼是固定的.

自己需要寫的地方, 選擇螢幕,獲取資料 ,資料處理,使用者事件,許可權. 這四個地方.

總結

相比較上一個demo 這個例子程式碼少了很多, 但是比其他語言來講還是太複雜了.

大部分還是套路,固定這麼寫,就可以. 主要還是在程式及邏輯操作上.

使用新語法可以減少很多不必要的操作,比如定義結構,內表,關聯等.

以上就是APAP ALV進階寫法及優化詳解的詳細內容,更多關於APAP ALV寫法優化的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com