ALV報表總結)

來源:互聯網
上載者:User

文章轉自

http://www.cnblogs.com/VerySky/articles/2700894.html

 

ALV的建立一般有兩種方式: 1> 採用function module, 2> OOPS abap
兩種建立方式有對應的適用範圍,也有一些交集,可以參考:

可以看到需要建立ALV list/ hierachical list,   Fullscreen  grid時可以採用Function module.並且是向後相容的
而我們建立ALV grid or tree  control時則要採用OO的建立方法,在6.4之前也是適用的,但使用OO ALV wrapper to  control時,則適用於6.4之後的版本.
NW WAS 與R3 4.6之間還是有較大的改變,整個平台擴充了許多東西, 像web service,  OO的大規模使用,而且據說是採用SOA策略的實現,

一 .FM

在使用FM來實現ALV時,對應於fullscreen alv,  Type-pool:   SLIS非常重要,它定義了FM中的許多參數類型.
1 .  ALV是種展現手段,那麼它就會涉及到定義資料選擇條件,資料擷取,資料展現,事件處理等步驟.
1> 在定義選擇條件時,可以採用Selection  screen來定義條件,可以定義一個值(PARAMETERS),也可以定義一個範圍(SELECTION-OPTIONS),方便的很,如果程式中如果有動態條件的話,可以考慮採用RANGES來, 並且有個小技巧是採用 ( ) 來動態執行SQL.簡單例子如下.
select * into itab from sflightwhere  (wheretab)  wheretab 是個行項類型是字元型的內表, 它的每一行就是一個選擇條件字串.
對於這種動態語句盡量避免使用,因為它在運行時才能確定執行語句,並且可以避過編譯時間的語法檢查.
注: SAP標準程式中可以看到這種用法,如FM: SD_PARTNER_READ.
      SELECT * FROM (object ) INTO  TABLE l_vbpa WHERE vbeln = f_vbeln. 它是將選取的資料表動態化了.
2> 資料選取
這裡一般對程式效能影響最大,關注點在於對資料庫表的訪問,內表的操作等方面.
3> 資料展現
field  catalog:它是一個內表,對應於每一列的顯示選項的技術性資訊或額外的資訊,像hotspot的定義,這一列顯示不顯示等.
layout  structure: layout for grid,可以定義一些GRID的配置,像求總選項,
4> 事件處理
對於雙擊事件,hotspot的處理, TOP-OF-PAGE,  END-OF-LIST等.
2.相關的FM.
REUSE_ALV_VARIANT_DEFAULT_GET
REUSE_ALV_VARIANT_F4
REUSE_ALV_VARIANT_EXISTENCE
REUSE_ALV_EVENTS_GET: 包含事件名稱與事件處理form名稱的內表
REUSE_ALV_COMMENTARY_WRITE
REUSE_ALV_FIELDCATALOG_MERGE: 根據ABAP  Dictionary中的Transparent table , Structure, View等產生一個field catalog
REUSE_ALV_LIST_DISPLAY: 以list形式顯示結果
REUSE_ALV_GRID_DISPLAY: 以Grid形式顯示結果

REUSE_ALV_POPUP_TO_SELECT
粗線標識的是最經常使用的.
3. field  catalog
1>它是對輸出表的欄位的描述,定義了欄位的輸出屬性.
比如:
col_pos 欄位在表中第幾列,
fieldname 輸出的欄位名,如果此欄位是CURR(currency  field) ,QUAN(Quantity field) 需要指定相應的CUKY, UNIT欄位.設定,CfieldnameCtabnameQfieldnameQtabname

no_out   
隱藏此列,不輸出,但注意使用者可以change  layout來顯示出此列.
hotspot 設定此列的所有cell為熱點, 單擊即可觸發相應function.
do_sum此列求總
no_zero只輸出有意義的值,空值不輸出.
edit_mask對欄位像WRITE般設定格式化.
just        R L 調整對齊
調整輸出資料行抬頭的文本:文本可以隨著使用者調整列的寬度而變化,其文本即是在對應data  element中定義的,如果需要定製,則可以指定以下欄位
seltext_l (long field  label)
seltext_m (medium field  label)
seltext_s (short field  label)
reptext_ddic (header) Analogous to the Data element  main header
Ddictxt (specify text): You can specify with  values 'L', 'M', and 'S',直接指定文本顯示長文本,中,短文本, 指定這個欄位後則會固定下來,不會隨著使用者的寬度調整變化.
2> 如何構建
A. 手工構建   建立SLIS_T_FIELD_ALV類型的內表, 行項類型為SLIS_FIELD_ALV 對每個欄位的相應屬性進行設定後,加入內表.
CLEAR  X_FIELDCAT.
        X_FIELDCAT-COL_POS    = 12.
         X_FIELDCAT-FIELDNAME = 'DMBTR'.
        X_FIELDCAT-TABNAME    =  'I_TAB'.
        X_FIELDCAT-SELTEXT_M = 'Local curr'.
         X_FIELDCAT-OUTPUTLEN = 12.
        X_FIELDCAT-INTTYPE    = 'P'.
         X_FIELDCAT-JUST       = 'R'.
        X_FIELDCAT-DO_SUM     = 'X'.
         APPEND X_FIELDCAT TO I_FIELDCAT.
   B. 半自動
   調用FM:  REUSE_FIELD_CATALOG_MERGE ,傳入DDIC中的transparent table, view ,structure的名稱,輸出field  catalog內表.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
*      I_PROGRAM_NAME                =
*       I_INTERNAL_TABNAME            =
       i_structure_name              =  c_alv_structure_name
*      I_CLIENT_NEVER_DISPLAY        = 'X'
*       I_INCLNAME                    =
*      I_BYPASSING_BUFFER            =
*      I_BUFFER_ACTIVE               =
    CHANGING
        ct_fieldcat                   = gt_fieldcat[]
    EXCEPTIONS
        inconsistent_interface        = 1
       program_error                 = 2
      OTHERS                         = 3

如果要對抬頭,hotspot等屬性進行調整, 可以迴圈field catalog內表,修改其對應屬性.如:
LOOP AT  gt_fieldcat ASSIGNING <l_fcat>.
        CASE < l_fcat>-fieldname.
    WHEN 'flname'.
               "修改屬性.
ENDCASE.
ENDLOOP.

4. field layout
注意屬性 GET_SELINFOS  ,它對於REUSE_ALV_GRID_DISPLAY 的輸入IS_SEL_HIDE有用,但在WAS 7.0中已不再支援.
5. 事件
ALV觸發的事件可用FM: REUSE_ALV_EVENTS_GET 來獲得, 輸出一個內表,類型是slis_t_event , 行項為slis_alv_event,包含兩個欄位,一個事件名,另一個是事件處理的FORM名.
CALL FUNCTION  'REUSE_ALV_EVENTS_GET'
       EXPORTING
           I_LIST_TYPE =  0
       IMPORTING
            ET_EVENTS   =  I_EVENTS.
常用事件有:
列表抬頭處理: Slis_ev_top_of_page TYPE slis_formname  VALUE 'TOP_OF_PAGE'.
雙擊,單擊   : Slis_ev_user_command TYPE slis_formname  VALUE'USER_COMMAND'
subtotal文本:Slis_ev_subtotal_text TYPE  slis_formnameVALUE'SUBTOTAL_TEXT'.


參考  https://www.sdn.sap.com/irj/scn/wiki?path=/display/Snippets/Display%252bsubtotal%252btext%252bin%252bALV%252bgrid
https://www.sdn.sap.com/irj/scn/thread?threadID=1033110&tstart=0
注意: 如果必須修改subtotal對應的欄位的field_catalog屬性no_out為X才可以觸發這個事件.
6.開發時一般的需求:
一般都會涉及到REUSE_ALV_GRID_DISPLAY 的輸入屬性
1> ALV variant 儲存
is_default
    is_save  
     is_variant
2> 小計, 排序
it_sort屬性,可以定義按哪個欄位排序並且可以指定按這個欄位小計其它可以匯總的欄位.
-          spos : Sort  sequence
-          fieldname : Internal output table field name
-          tabname : Only relevant for hierarchical-sequential lists. Name of the  internal output table.
-          up : 'X' = sort in ascending  order
-          down : 'X' = sort in descending order
-          subtot : 'X' = subtotal at group value change
-          group : '* ' =  new page at group value change ,'UL' = underline at group value  change  

3> ALV 抬頭 頁尾
A. 可以採用TOP_OF_PAGE事件觸發可以採用方式:
a. CALL  FUNCTION 'REUSE_ALV_COMMENTARY_WRITE' 輸出一個內表: slis_t_listheader 這種方法輸出格式固定,不利於對齊設定輸入屬性i_logo可輸出圖片.
b.  Grid方式:設定 , 布局容易控制一些.
DATA : lr_content   TYPE REF TO  cl_salv_form_element.
   DATA : lr_grid      TYPE REF TO  cl_salv_form_layout_grid,  " top grid definition

          lr_flow      TYPE  REF TO cl_salv_form_layout_flow,  " flow for top grid

          l_text(500  )  TYPE c .                             " showed in top of list

      *  create a grid
      CREATE OBJECT lr_grid.
      *建立一個儲存格
lr_flow =  lr_grid->create_flow(
row     = 1   "行
column = 1 ). "列

* write a blank column
   WRITE (20 ) '' .   "可直接輸出

plr_flow =  plr_grid->create_flow(
   row     = 1
   column = 2 ).

    *  create text in cell
    lr_flow->create_text( text = pl_text ).  "定製cell裡的文本
cl_salv_form_content=>set( lr_content ).
   B. 設定I_CALLBACK_HTML_TOP_OF_PAGE 屬性觸發
FORM f_html_top_of_page USING  pr_document TYPE REF TO cl_dd_document.
可以加入HTML文本,連結,圖片
CALL METHOD pr_document->add_text( text =  'Picture' ).

           CALL METHOD  pr_document->add_gap( width = 10 ).

           CALL METHOD  pr_document->add_picture( picture_id = 'ENJOYSAP_LOGO' ).

4> 點擊某列,轉到另外一個tranaction中,需要設定欄欄位為hotspot,再在user_command中處理function code:  "&IC1 "

     it_events屬性,傳入一個slis_t_event類型的內表.設定相應處理form,如 handle_user_command.
    FORM  handle_user_command USING p_ucomm     LIKE sy-ucomm
                        ps_selfield TYPE slis_selfield.

二. OOPS
1. 面向對像的方式建立ALV Grid control,它是Control  Framework中的一個組件,另外也可以採用CL_SALV_TABLE,CL_SALV_HIERSEQ_TABLE,CL_SALV_TREE.等.後者建立是list形式,也可以是Grid形式,是目前SAP推薦的建立方式,是在NW  2004以後支援的版本。

全螢幕的Grid control有個對應的function module:  REUSE_ALV_GRID_DISPLAY_LVC.
OOPS的方式功能更強大一些,這種方式支援求最大值,最小值等標準功能。目前SAP中的組件已以OO方式重寫,採用OO方式來編寫是以後的發展方向。

相關類:
CL_GUI_ALV_GRID: alv grid control class, ALV List Viewer
CL_GUI_CUSTOM_CONTAINER: Container for Custom Controls in the Screen Area
相關DDIC中的structure/table type
LVC_T_FCAT: Field Catalog for List Viewer  Control, table type
LVC_S_FCAT: field catalog fro ALV control , structure
LVC_T_LOUT:ALV control: Layout structure

2 .步驟:
1>. 在screen上定義一個custom control area
2>. 產生一個 CL_GUI_CUSTOM_CONTAINER class 執行個體,在構造器參數中傳入custom area的名稱。
3>. 產生一個 CL_GUI_ALV_GRID 執行個體,在構造器的參數中設定上面產生container引用
4>. 調用grid執行個體的 SET_TABLE_FOR_FIRST_DISPLAY 方法,給它設定要顯示的內表。另外可以傳入全域的structure名稱,即要顯示的ALV 內表對應的line type,也可以傳遞一個field  catalog內表。

注意 在產生CL_GUI_ALV_GRID執行個體時,構造器參數I_PARENT是必需的,但如果要對ALV 的功能進行擴充,例如工具列加入按鈕,並在事件處理器中對ALV的cell的屬性如顏色,style等變更,則必須對I_APPL_EVENTS賦值為X.

SET_TABLE_FOR_FIRST_DISPLAY 的一些參數:
定義variant相關的參數: is_variant,   is_save, i_default
隱藏不需要的功能:IT_TOOLBAR_EXCLUDING , 相關的功能碼是以MC_FC打頭的常量.
定義排序表it_sort
列抬頭相關: COLDDICTXT  COLTEXT  REPTEXT  SCRTEXT_L  SCRTEXT_M   SCRTEXT_S  SELDDICTXT

refresh_table_display   用來在PBO重新整理ALV,而不用重建一個ALV.

3. field catalog 可以手動產生,也可以調用 FM  LVC_FIELDCATALOG_MERGE 先產生一個field  catalog table,然後再按需求迴圈修改屬性.

I_STRUCTURE_NAME’   ‘IT_FIELDCATALOG’ 兩個參數如果都傳入的話,I_STRUCTURE_NAME有優先權.

在使用set_table_for_first_display方法的參數it_sort時, 排序時會把相同的列值垂直合并,如果要對所有列取消合并可更改layout中的no_merging,更改單列的合并可更改對應field  catalog的no_merging.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.