首頁 > 軟體

ABAP ALV最常規寫法及常用功能詳解

2022-09-12 18:01:31

先導

記得剛學ABAP的時候問這問那,問東問西,常常一個可能不怎麼用的東西,扣了好久好久.群裡的大佬就說,學那麼多沒必要,以後是會天天寫ALV , 講真 因為 SAP 很多東西都已經通過設定就可以實現, 我們還真就是做表單相關的東西比較多,不能說全部,也是大部分. 好巧今天看到群友問ALV 相關的內容,這裡整理一下,希望幫助更多的人 ヾ(◍°∇°◍)ノ゙.

流程順序

開發ALV的基本流程:

第1步:宣告變數

       定義ALV所要用到的型別池:TYPE-POOLS: SLIS 

       針對ALV的控制資訊資料(Layout & Fieldcat)

第2步:定義內表
       存放自定義資料檔案的資料,以及在ALV中顯示

第3步:讀取資料

       讀取資料存放至Internal Table

第4步:ALV格式控制

       建立ALV顯示樣式(layout)和顯示欄位清單(Field Catalogs)

第5步:定義事件

       建立事件清單(Event Catalogs)

第6步:顯示ALV

       呼叫ALV Function Module

第7步:使用者事件

       定義User按鍵處理事件

普通的ALV的流程如上圖,包含所有常規流程.本質上是展示資料的報表. 以及常用語法的熟練使用,資料轉換,邏輯計算等.

ALV 介面介紹

ALV組成3大部分

工具列

標題列

顯示資料的網格控制器 (必要時可以隱藏工具列和標題列)

ALV 開發注意事項

注意事項:
1、在ALV中,需要注意所有需要顯示的列,都必須在相應的內表中有對應的欄位, 欄位名字不能寫錯。
2、在SAP ABAP程式中,字串的大小寫很重要,在單引號包圍的字串中, 一般來說都應該用大寫,特別是在呼叫一些系統的方法時傳入字串引數時。 
3、傳入到ALV中的列對應的欄位名稱也必須使用大寫字母,否則資料不會顯示出來。 
4、使用宏定義或者子例程可以減少程式碼量,並且儘可能實現程式碼的複用。
5、注意在FORM裡定義的變數在離開FORM後,就會被系統釋放掉,回收記憶體空間。

ALV 基本引數

ALV 物件引數

ALV開發中兩個重要的物件——FIELDCAT和LAYOUT:
    在呼叫ALV的函數中,除了定義所輸出使用的內表之外,
    還有兩個部分是必需確認的:列欄位屬性和佈局屬性。
列欄位屬性FIELDCAT :
    設定輸出中具體欄位的名稱、型別、格式等屬性;
    對於系統結構表,函數可參照此結構自動建立列屬性,可以沒有呼叫列欄位屬性
佈局屬性LAYOUT:
    設定輸出ALV列表的整體佈局的屬性,如輸出欄位的顏色、表格中的線條等。
    沒有呼叫佈局屬性時,系統按默 認佈局輸出,不做任何調整。
兩物件同屬於型別組SLIS,在ALV開發中必須宣告型別組SLIS

ALV 引數控制Layout

佈局控制[layout]
 佈局是用來控制整個ALV的一個佈局,比如ALV的標題,是否可編輯,行顏色,列顏色.
 參照ALV的控制結構[LVC_S_LAYO],以後的例子我將詳細介紹如何設定行顏色和列顏色.
 詳細的結構說明(注意這些欄位的取值,單引號內,' '空格代表否,'X' 代表是)
 
   欄位名           描述             Value range
   CWIDTH_OPT          最佳化寬度            SPACE, 'X'
   SMALLTITLE           小標題             SPACE, 'X'
   GRID_TITLE         標題,在網格和工具條之間       最長70個字元
   NO_HEADERS          列標題隱藏              SPACE, 'X'
   NO_HGRIDLN          隱藏水平線             SPACE, 'X'
   NO_MERGING          禁用單元格合併           SPACE, 'X'
   NO_ROWMARK    禁用系統自帶的行選擇'X'為D和A的時候隱藏     SPACE, 'X'
   NO_TOOLBAR          隱藏工具條             SPACE, 'X'
   NO_VGRIDLN          隱藏垂直線             SPACE, 'X'
   SEL_MODE           選擇模式             SPACE, 'A', 'B', 'C', 'D'
   EXCP_CONDS           合計例外             SPACE, 'X'
   EXCP_FNAME         欄位名稱帶有例外編碼        最長30個字元
   EXCP_LED           例外作為 LED            SPACE, 'X'
   EXCP_ROLLN         例外檔案的資料元素          SPACE, 'X'
   CTAB_FNAME      帶有複雜單元格顏色編碼的欄位名稱     最長30個字元
   INFO_FNAME     帶有簡單行彩色程式碼的欄位名稱        最長30個字元
   ZEBRA        可選行顏色,如果設定了,出現了間隔色帶   SPACE, 'X'
   NO_TOTLINE          沒有總計             SPACE, 'X'
   NUMC_TOTAL        可以對NUMC欄位進行合計        SPACE, 'X'
   TOTALS_BEF     總計輸出在第一行,小計在新的值之前      SPACE, 'X'
   STYLEFNAME     設定單元格,比如PUSHBUTTON          最長30個字元

ALV 引數控制Fieldcat

 Fieldcat
 data: fieldcat type slis_t_fieldcat_alv with header line.
 it_fieldcat  =  fieldcat[]
 屬性
  (用來定義表單中的各個列的相關資訊)
   Fieldcat-col_pos = n.            輸出列
   Fieldcat-tabname = ‘FIELDNAME’.      對應的內表欄位名
   Fieldcat-seltext_s/m/l = ‘列名’.     輸出列文字( _s:短文字  _l:長文字)
   Fieldcat-emphasize = ‘CX10’.    帶有顏色的高亮列(其中X=(1-7)顏色同format)
   Fieldcat-hotspot = ‘X’.       作為熱點顯示可觸發滑鼠觸發事件
   Fieldcat-currency = ‘CURRKEY’.   表 TCURX 中的貨幣名稱
   Fieldcat-quantity(3)            計量單位
   Fieldcat-qfieldname           參考計量單位的欄位名稱
   Fieldcat-round = n.           四捨五入至小數位數下n 位
   Fieldcat-exponent = n.         浮點數的冪指數為n
   Fieldcat-key = ‘X’.           關鍵欄位
   Fieldcat-icon = ‘X’.          作為圖示輸出
   Fieldcat-symbol = ‘X’.        輸出作為符號
   Fieldcat-checkbox = ‘X’.      作為核取方塊輸出
   Fieldcat-just = SPACE, 'R', 'L', 'C'.   對齊方式
   Fieldcat-lzero = ‘X’.          輸出前導零
   Fieldcat-no_sign = ‘X’.        輸出抑制符號
   Fieldcat-no_zero = ‘X’.        為輸出隱藏零
   Fieldcat-edit_mask = SPACE, mask..  輸出為mask的模式
   Fieldcat-fix_column = ‘X’.      固定列
   Fieldcat-do_sum = ‘X’.        總計列值總和
   Fieldcat-no_out = ‘X’.         列不輸出
   Fieldcat-tech = ‘X’.         該欄位為技術欄位
   Fieldcat-outputlen = n        列的字元寬度為n
   Fieldcat-decimals_out = n     能控制小數點的位數為n 
   Fieldcat-datatype = C,I,N…   定義資料型別

ALV定義事件

* 建立事件清單(Event Catalogs)
*需定義事件塊,否則出錯
eventcat_ln-name  =  'TOP_OF_PAGE'.eventcat_ln-form  =  'PAGE_HEADER'.
APPEND  eventcat_ln  TO  eventcat.
事件塊:
FORM PAGE_HEADER.
ENDFORM.

ALV DEMO

1:宣告alv

程式碼

REPORT YALVDEMO1.
*第一步 :宣告alv相關 變數
TYPE-POOLS:SILS.   "引入slis 包 定義 使用專門alv
data:LT_FIELDCAT  TYPE SLIS_T_FIELDCAT_ALV,   "儲存fieldcat 內表, 列表標籤相關
      LS_FIELDCAT  TYPE SLIS_FIELDCAT_ALV,
*WA_FIELDCAT  TYPE SLIS_FIELDCAT_ALV,      "定義使用工作區
*ls_fieldcat   like LINE OF     LT_FIELDCAT,
     LS_LAYOUT    TYPE SLIS_LAYOUT_ALV,     "ALV格式控制的結構體
     LT_EVENT TYPE slis_T_event  ,  " 事件的內表
     LS_EVENT TYPE slis_alv_event.  "事件的工作區
DATA:  pgm  LIKE  sy-repid.
DATA LT_SORT TYPE SLIS_T_SORTINFO_ALV .
DATA WA_SORT TYPE SLIS_SORTINFO_ALV.
DATA LS_SETTING TYPE LVC_S_GLAY.
DATA : LV_COLPOS TYPE INT2 .

著重解釋

主要是生命變數
引入slis 包,   
建立內表,
定義變數

2:定義內表

程式碼

*第二部:定義內表
*定義型別.
TYPES:BEGIN OF ty_alvshow,
  CARRID TYPE SPFLI-CARRID,  "航執行緒式碼
  CITYFROM  type SPFLI-CITYFROM , "起飛城市.
  CITYTO TYPE SPFLI-CITYTO  , "目標城市
  FLDATE  type SFLIGHT-FLDATE  ,"起飛時間
  PLANETYPE TYPE  SFLIGHT-PLANETYPE ,"飛機型別
  SEATSMAX TYPE SFLIGHT-SEATSMAX ,"飛機容量
  END OF ty_alvshow.
*定義內表和工作區
data : LT_ALVSHOW TYPE TABLE OF ty_alvshow,  "定義內表
       WA_ALVSHOW  TYPE ty_alvshow.

著重解釋

型別 可以直接寫入欄位型別中的 型別
或者乾脆 直接寫表名-欄位  也可以. 

3:讀取資料

程式碼

*第三部:讀取資料
select
a~CARRID  CITYFROM
CITYTO FLDATE
PLANETYPE SEATSMAX
FROM spfli as a inner  join  SFLIGHT as  b on a~CARRID = b~CARRID
  into  table LT_ALVSHOW   "內表需要增加table
  UP TO 10 ROWS.

4:欄位設定 ALV格式控制.

程式碼

*第四部: ALV 的格式控制. layout
LS_LAYOUT-zebra = 'X'. "列輸出位置
LS_LAYOUT-detail_popup = 'X' ."是否彈出詳細明細視窗
LS_LAYOUT-detail_TITLEBAR = '詳細資訊'.
LS_LAYOUT-f2code = '&ETA' . "設定觸發彈窗資訊功能
LS_LAYOUT-colwidth_optimize = 'X' . "設定自動優化列寬.
"fieldcat 介面設定
lv_colpos = 1  . "欄位顯示為第幾行
ls_FIELDCAT-fieldname  = 'CARRID'.   "那個欄位
LS_FIELDCAT-col_pos = LV_COLPOS.
LS_FIELDCAT-key  = 'X'.
LS_FIELDCAT-DATATYPE = 'CHAR' .
LS_FIELDCAT-OUTPUTLEN = '10'.
LS_FIELDCAT-SELTEXT_M = '飛機id'.
APPEND LS_FIELDCAT to LT_FIELDCAT.
clear LS_FIELDCAT .
"fieldcat 介面設定
lv_colpos = LV_COLPOS + 1  . "欄位顯示為第幾行
ls_FIELDCAT-fieldname  = 'CITYFROM'.   "那個欄位
LS_FIELDCAT-col_pos = LV_COLPOS.
LS_FIELDCAT-key  = 'X'.
LS_FIELDCAT-DATATYPE = 'CHAR' .
LS_FIELDCAT-OUTPUTLEN = '30'.
LS_FIELDCAT-SELTEXT_M = '出發城市'.
APPEND LS_FIELDCAT to LT_FIELDCAT.
clear LS_FIELDCAT .
"fieldcat 介面設定
lv_colpos = LV_COLPOS + 1  . "欄位顯示為第幾行
ls_FIELDCAT-fieldname  = 'CITYTO'.   "那個欄位
LS_FIELDCAT-col_pos = LV_COLPOS.
LS_FIELDCAT-key  = 'X'.
LS_FIELDCAT-DATATYPE = 'CHAR' .
LS_FIELDCAT-OUTPUTLEN = '30'.
LS_FIELDCAT-SELTEXT_M = '到達城市'.
APPEND LS_FIELDCAT to LT_FIELDCAT.
clear LS_FIELDCAT .
"fieldcat 介面設定
lv_colpos = LV_COLPOS + 1  . "欄位顯示為第幾行
ls_FIELDCAT-fieldname  = 'FLDATE'.   "那個欄位
LS_FIELDCAT-col_pos = LV_COLPOS.
LS_FIELDCAT-key  = 'X'.
LS_FIELDCAT-DATATYPE = 'DATS' .
LS_FIELDCAT-OUTPUTLEN = '8'.
LS_FIELDCAT-SELTEXT_M = '到達時間'.
APPEND LS_FIELDCAT to LT_FIELDCAT.
clear LS_FIELDCAT .
"fieldcat 介面設定
lv_colpos = LV_COLPOS + 1  . "欄位顯示為第幾行
ls_FIELDCAT-fieldname  = 'PLANETYPE'.   "那個欄位
LS_FIELDCAT-col_pos = LV_COLPOS.
LS_FIELDCAT-key  = 'X'.
LS_FIELDCAT-DATATYPE = 'char' .
LS_FIELDCAT-EDIT = 'X'.
LS_FIELDCAT-OUTPUTLEN = '20'.
LS_FIELDCAT-SELTEXT_M = '飛機型別'.
APPEND LS_FIELDCAT to LT_FIELDCAT.
clear LS_FIELDCAT .
"fieldcat 介面設定
*lv_colpos = LV_COLPOS + 1  . "欄位顯示為第幾行
*ls_FIELDCAT-fieldname  = 'SEATSMAX'.   "那個欄位
*LS_FIELDCAT-col_pos = LV_COLPOS.
*LS_FIELDCAT-key  = 'X'.
*LS_FIELDCAT-DATATYPE = 'int4' .
*LS_FIELDCAT-OUTPUTLEN = '20'.
*LS_FIELDCAT-SELTEXT_M = '飛機容量'.
*APPEND LS_FIELDCAT to LT_FIELDCAT.
*clear LS_FIELDCAT .
"fieldcat 介面設定
lv_colpos = LV_COLPOS + 1  . "欄位顯示為第幾行
ls_FIELDCAT-fieldname  = 'SEATSMAX'.   "那個欄位
LS_FIELDCAT-col_pos = LV_COLPOS.
LS_FIELDCAT-ref_fieldname = 'SFLIGHT' .
LS_FIELDCAT-do_sum = 'X' .
LS_FIELDCAT-SELTEXT_M = '飛機容量'.
APPEND LS_FIELDCAT to LT_FIELDCAT.
Clear LS_FIELDCAT .

著重解釋

首先需要設定layout 相關內容

在設定每個欄位的fieldcat .

注意:顯示列數要設定逐級增加,並且要把內表資料覆蓋內表 ,並清空內表資料.

5:定義事件

程式碼

LS_EVENt-name  = 'USER_COMMAND' ."使用者響應事件
LS_EVENT-FORM = 'FORM_USER_COMMAND' .
APPEND LS_EVENT TO LT_EVENT .
CLEAR LS_EVENT .
LS_EVENT-name  = 'TOP_OF_PAGE' ."顯示標題
LS_EVENT-form = 'FORM_TOP_OF_PAGE' .
APPEND LS_EVENT TO LT_EVENT .
CLEAR LS_EVENT .
LS_EVENt-name  = 'PF_STATUS_SET' ."顯示狀態列
LS_EVENT-FORM = 'FORM_PF_STATUS_SET' .
APPEND LS_EVENT TO LT_EVENT .
CLEAR LS_EVENT .

6:排序(常用功能)

程式碼

*------第六步  排序
WA_SORT-fieldname = 'SEATSMAX'  .
WA_SORT-DOWN = 'X'.
APPEND WA_SORT TO LT_SORT .
CLEAR  wa_sort .   "清空工作區

7:顯示alv資料

操作

遊標要留在資料的位置,然後點 模式-->呼叫功能輸入-->REUSE_ALV_GRID_DISPLAY
-->按回車.-->自動生成程式碼

程式碼

*第七部分顯示alv
LS_SETTING-EDT_CLL_CB = 'X' .  "編輯單元格之後, 返回給程式編輯後的值.
pgm = sy-repid.  "回撥物件
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
*   I_INTERFACE_CHECK        = ' '
*   I_BYPASSING_BUFFER       = ' '
*   I_BUFFER_ACTIVE          = ' '
   I_CALLBACK_PROGRAM       = pgm
   I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
   I_CALLBACK_USER_COMMAND  = 'USER_COMMAND'
  I_CALLBACK_TOP_OF_PAGE   = 'TOP_OF_PAGE'
*   I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*   I_CALLBACK_HTML_END_OF_LIST       = ' '
*   I_STRUCTURE_NAME         =
*   I_BACKGROUND_ID          = ' '
*   I_GRID_TITLE  =
   I_GRID_SETTINGS          =  LS_SETTING  "編輯單元格之後, 返回給程式編輯後的值.
    IS_LAYOUT     = LS_LAYOUT
    IT_FIELDCAT   = LT_FIELDCAT
*   IT_EXCLUDING  =
*   IT_SPECIAL_GROUPS        =
   IT_SORT       = LT_SORT
*   IT_FILTER     =
*   IS_SEL_HIDE   =
*   I_DEFAULT     = 'X'
*   I_SAVE        = ' '
*   IS_VARIANT    =
    IT_EVENTS     = LT_EVENT
*   IT_EVENT_EXIT =
*   IS_PRINT      =
*   IS_REPREP_ID  =
*   I_SCREEN_START_COLUMN    = 0
*   I_SCREEN_START_LINE      = 0
*   I_SCREEN_END_COLUMN      = 0
*   I_SCREEN_END_LINE        = 0
*   I_HTML_HEIGHT_TOP        = 0
*   I_HTML_HEIGHT_END        = 0
*   IT_ALV_GRAPHICS          =
*   IT_HYPERLINK  =
*   IT_ADD_FIELDCAT          =
*   IT_EXCEPT_QINFO          =
*   IR_SALV_FULLSCREEN_ADAPTER        =
* IMPORTING
*   E_EXIT_CAUSED_BY_CALLER  =
*   ES_EXIT_CAUSED_BY_USER   =
  TABLES
    T_OUTTAB      = LT_ALVSHOW
  EXCEPTIONS
    PROGRAM_ERROR = 1
    OTHERS        = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.

解釋

1:生成的程式碼都是註釋的

2:選擇使用的解除註釋並賦值

8:按鈕操作標題列等設定

程式碼

*按鈕 gui
FORM FORM_PF_STATUS_SET   USING RT_EXTAB TYPE SLIS_T_EXTAB   .
  SET PF-STATUS 'YALVDEMO1_GUI'.
ENDFORM.
*標題
FORM  FORM_TOP_OF_PAGE.
*定義資料 內表和工作區
  DATA LT_COMMENTARY TYPE SLIS_T_LISTHEADER.
  DATA WA_COMMENTARY TYPE SLIS_LISTHEADER.
  WA_COMMENTARY-TYP = 'H' .
  WA_COMMENTARY-INFO = '飛機飛行清單' .
  APPEND WA_COMMENTARY TO LT_COMMENTARY .
  WA_COMMENTARY-TYP = 'S' .
  WA_COMMENTARY-INFO = '中號標題' .
  APPEND WA_COMMENTARY TO LT_COMMENTARY .
  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      IT_LIST_COMMENTARY = LT_COMMENTARY.
*   I_LOGO                   =
*   I_END_OF_LIST_GRID       =
*   I_ALV_FORM               =
ENDFORM.
*使用者操作按鈕
FORM  FORM_USER_COMMAND  USING R_UCOMM LIKE SY-UCOMM
     RS_SELFIELD TYPE SLIS_SELFIELD  .
data : lt_SFLIGHT  TYPE table of SFLIGHT ,   "內表
    wa_SFLIGHT type  SFLIGHT.  "工作區
     IF R_UCOMM = 'ZYDD1' .
       MESSAGE '你觸發了按鈕' TYPE 'I'.
    ELSEIF R_UCOMM = 'Z_SAVE1' .
select  *  from SFLIGHT   into table  lt_SFLIGHT
        for ALL ENTRIES IN LT_ALVSHOW
  where CARRID = lt_alvshow-CARRID .
          ENDIF .
loop at lt_SFLIGHT into wa_SFLIGHT .   "從工作區取數 迴圈
READ TABLE LT_ALVSHOW into WA_ALVSHOW WITH KEY CARRID =  wa_SFLIGHT-CARRID .
if sy-SUBRC = 0 .
*MESSAGE  WA_ALVSHOW-PLANETYPE  TYPE 'I'.
  wa_SFLIGHT-PLANETYPE = WA_ALVSHOW-PLANETYPE .
  MODIFY  lt_SFLIGHT from  wa_SFLIGHT.  "內表更新
  ENDIF .
  CLEAR wa_SFLIGHT .
  CLEAR WA_ALVSHOW.
ENDLOOP.
update  SFLIGHT from table   lt_SFLIGHT.
  if sy-subrc = 0 .
    commit work .  "資料庫提交
        MESSAGE '儲存成功' TYPE 'I'.
    else .
      ROLLBACK work .
              MESSAGE '儲存失敗' TYPE 'I'.
      ENDIF.
ENDFORM  .

總結

這個demo 是最簡單的DEMO 使用的是 系統內建表(飛機表) , 其中包含了使用者操作,排序,求和等常規使用者操作和介面優化 .

常規語法的通俗使用. 此demo還可以進一步優化,把常規重複性操作寫入到函數或者宏中,後續會發更優化版本.

作為入門demo 可以讓你充分了解ALV ,及ALV 常規用到的屬性.

以上就是ABAP ALV最常規寫法及常用功能詳解的詳細內容,更多關於ABAP ALV 寫法功能的資料請關注it145.com其它相關文章!


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