SAP ABAP开发从入门到精通——第15章 面向对象ALV
目錄
15.1概要
15.1.1 什么是ALV
ALV的主要功能
15.1.2 ALV的類型
?15.1.3 ALV GRID容器接口
15.1.4 ALV GRID 容器結構
15.2 SAP容器
15.2.1 創建SAP容器及容器對象
15.3 創建ALV
15.3.1 創建ALV GRID 容器
1. 創建參照變量
2.創建SAP容器
3.創建ALV GRID 控件
4.查詢數據
5.調用ALV顯示方法
6.執行程序
15.3.2 利用Docking容器創建程序
15.4 ALV方法
15.4.1 set_table_for_first_display方法
1. I_STRUCTURE_NAME 參數
2. IS_VARIANT 參數
3. I_SAVE 參數
4.I_DEFAULT 參數
5.IS_LAYOUT 參數
6.IT_OUTTAB 參數
7.IT_FIELDCATALOG 參數
8.IT_TOOLBAR_EXCLUDING 參數
9.IT_SORT 參數
15.4.2 ALV 其他方法
1. get_current_cell 方法
目錄
15.1概要
15.1.1 什么是ALV
ALV的主要功能
15.1.2 ALV的類型
?15.1.3 ALV GRID容器接口
15.1概要
15.1.1 什么是ALV
ALV是ABAP List Viewer的縮寫,是實際業務中查詢數據或修改數據是經常使用的程序。“第 12 章 報表程序”中是使用WRITE語句制作了報表程序。面向對象程序中為了追加下載數據的功能,首先要創建GUI STATUS,從而在畫面中增加按鈕,
然后實現用戶單擊按鈕時觸發事件。但是ALV已經提供了包含這些基本業務的程序包。即在Excel程序中,排序數據,計算合計,篩選信息等基本功能不用通過代碼也能自由地實現。
ALV的主要功能
- 排序功能
- 過濾設置
- 變更列管
- 變更布局
- ABC分析
- 下載Excel及Word文檔的保存。
ALV在SAP Release3.1版本以后開始出現在ABAP程序中,最近除報告書,成績表等有固定樣式的文檔程序基本使用ALV進行開發
15.1.2 ALV的類型
ALV分為利用函數的方法和利用GRID控件的方法兩種,兩種方法內部含有相似的結構和功能,當然也存在SALV(New ALV)。這些技術出現的順序依次為Function ALV > GRID ALV > SALV。REUSE_ALV_GRID_DISPLAY函數也以類為基礎
但是SAP公司為了提供方便集合了多樣的功能使用功能函數實現。若利用函數輸出ALV程序,則不易控制畫面。就因為存在這些限制項,從SAP Release3.1版本開始導入了利用ABAP對象的ALV GRID技術。另外,Net Web 2004平臺中發布了集合
ALV功能的SALV包(SALV也稱為 New ALV)。SALV可以像使用函數生成ALV一樣不適用畫面以全屏模式輸出,也可以利用容器在畫面上顯示ALV。利用GRID的ALV不能以Batch Job登錄后再后臺運行,但SALV可正常運行。SALV與現有方法相比
為開發提供了便利,集合了詳細功能以接口方式提供。但是SALV的唯一缺點就是不支持編輯模式。
利用ALV,只要運用數據結構和內標就可以在短時間內開發報表。Function ALV在第16章進行介紹。ALV GRID是以類開發的技術,因此需要掌握“第 14 章 ABAP 對象”的知識。
下圖是用ALV查詢列表的畫面。ALV GRID 使用 SAP 公司開發的控件技術。與其他很多容器相同,ALV GRID 容器提供可以通過全局類影響屬性的方法,通過這些方法可以為程序包ALV基本功能基礎上適用追加項。另外 ALV GRID 容器定義 SAP
Context 菜單就可以使用標準程序的綜合功能。
? ? ? ? ? ? ? ? ? ? ? ? ??
?15.1.3 ALV GRID容器接口
ALV 程序中使用的接口由參照CL_GUI_ALV_GRID類的變量定義。用下列語句定義對象引用變量。
DATA : name TYPE RET TO cl_gui_alv_grid.上面語句的name變量是參照CL_GUI_ALV_GRIDE的對象引用變量(Object Reference Variable)。
另外,用CREATE OBJECT 語句調用類的構造函數并生成ALV GRID接口
CREATE OBJECT name.?ALV GRID 容器中擁有畫面顯示的所有信息,調用類方法可以重新定義或修改ALV畫面屬性。
下圖說明了ALV的繼承樹。在類生成器T-CODE:SE24中查詢CL_GUI_ALV_GRID可以發現Supper class字段上面存在超級類。還可以看出CL_GUI_ALV_GRID的超級類是CL_GUI_ALV_OBJECT。
15.1.4 ALV GRID 容器結構
下圖說明了ALV GRID 顯示在畫面的順序。
要利用ALV顯示數據,至少要經過下列兩個步驟。
只要啟動ALV GRID,則傳遞給ALV GRID容器中的輸出表一直有效。輸出表可以利用ABAP數據字典對象,但也可以只用字段目錄創建ALV結構。字段目錄(Field CataLog)是存儲要顯示在ALV畫面上的字段信息的表。例如,定義ALV字段的類型,屬性,長度等。
字段目錄是LVC_T_FCAT類型的表。下圖顯示生成ALV畫面之前的內部結構順序。
為了顯示ALV實例到畫面,首先要定義ALV領域,可以利用屏幕編輯器的自定義控件設置。另外,顯示ALV必須要有連接屏幕領域與ALV的SAP容器控件。ALV是與畫面的SAP控件相連后顯示在畫面上的。控件從“Containe”單詞可以看出是代表給畫面“裝什么”的意思。即容器時在畫面上顯示類似于 Textedit,Picture等控件對象時使用的上級控件。在第二節中會詳細介紹SAP容器。
15.2 SAP容器
15.2.1 創建SAP容器及容器對象
若要顯示ALV畫面,必須要有連接屏幕與ALV GRID控件的SAP容器控件。即SAP容器為了充當連接器,將SAP控件包含在容器中。SAP容器類型有SAP Tree,SAP Picture,SAP Textedit,SAP Splitter控件等。SAP容器時包含其他控件的控件,也稱為父控件(Parent Control)。
下圖中的容器控件為基礎創建ALV程序。能顯示這些SAP控件的SAP容器種類
| SAP 自定控件 | 在使用屏幕編輯器的一般畫面上定義領域 類:CL_GUI_CUSTOM_CONTAINER |
| SAP 對話框控件 | 對話框或者在全畫面上以對話框形式顯示 類:CL_GUI_DILGONBOX_CONTAINER |
| SAP Docking 控件 | 在畫面領域的各邊角可以調節其大小。是在ALV程序中經常與自定義控件一起使用的形態 類:CL_GUI_DOCKING_CONTAINER |
| SAP 拆分控件 | 拆分容器時使用 類:CL_GUI_SPLITTER_CONTAINER |
| SAP 細拆分控件 | 和Splitter控件功能相同,可以再拆分已被拆分的容器 類:CL_GUI_EASY_SPLITTER_CONTAINER |
本章重點學習這5種類型中的SAP自定義控件。另外,在實際也去中也經常使用SAP Docking容器,因此先簡單了解基本結構后做實際練習。此外,容器的基本原理都相似,因此只要掌握其使用方法就不難理解。
15.3 創建ALV
15.3.1 創建ALV GRID 容器
1. 創建參照變量
創建屏幕,利用屏幕編輯器追加自定義控件CON1。然后追加創建參照ALV GRID 容器的引用變量,與此同時創建要顯示在屏幕上的內表。
REPORT z15_02.DATA : con1_ref TYPE REF TO CL_GUI_CUSTOM_CONTAINER.DATA : G_GRID TYPE REF TO CL_GUI_ALV_GRID.DATA : GT_SFLIGHT TYPE TABLE OF SFLIGHT.2.創建SAP容器
在屏幕上創建適當大小的自定義控件。另外,在PBO模塊init_con中追加下列代碼后創建SAP容器。CREATE OBJECT語句會調用類CL_GUI_CUSTOM_CONTAINER的構造函數,創建SAP容器的實例。此時,參數指定屏幕上創建的自定義控件。
IF~is initial.語句的內容意味著已經創建容器對象不重復創建。例如,ALV GRID已經顯示在畫面上,當用戶點擊REFRESH按鈕要重新刷新畫面時沒有必要重新創建實例。
MODULE init_con OUTPUT.IF con1_ref is initial.CREATE OBJECT con1_refEXPORTINGcontainer_name = 'CON1'.3.創建ALV GRID 控件
利用CREATE OBJECT 語句創建參照CL_GUI_ALV_GRID控件實例。參數i_parent為了顯示ALV指定連接屏幕時使用的SAP容器。
CREATE OBJECT G_GRIDEXPORTINGi_parent = con1_ref.ENDIF.ENDMODULE.4.查詢數據
在主程序中追加執行事件START-OF-SELECTION來查詢數據。然后調用存在自定義控件的屏幕。
SELECT * FROM sflightINTO TABLE gt_sflight UP TO 25 ROWS.CALL SCREEN 100.5.調用ALV顯示方法
只要調用顯示ALV的G_GRID方法就可以很簡單地結束ALV畫面。此時,參數利用SFLIGHT結構體要顯示在畫面上的數據使用內表gt_sflight。在MODULE init_con最后追加下面代碼
CALL METHOD g_grid->set_table_for_first_displayEXPORTINGI_STRUCTURE_NAME='SFLIGHT'CHANGINGit_OUTTAB=gt_sflight.6.執行程序
15.3.2 利用Docking容器創建程序
自定義容器是在畫面指定領域,于此相反Docking容器是創建實例時直接直接指定屏幕和大小。即就如Docking單詞的本意一樣,不用通過自定義容器直接指定ALV要使用的領域和屏幕編號。下圖為Docking容器的結構
除了決定SAP容器的類不同和不指定屏幕領域這兩點之外,其他使用方法和自定義控件相似。首先,定義參照Docking容器的類型參照對象和ALV實例。
DATA:G_DOCKING TYPE REF TO CL_GUI_DOCKING_CONTAINER,G_GRID TUPE REF TO CL_GUI_ALV_GRID.利用CREATE OBJECT語句調用類cl_gui_docking_container的構造函數創建g_docking實例。但是創建Docking容器組件時參數還需要指定程序編號sy-repid和屏幕編號sy-dynnr。
CREATE OBJECT G_GOCKINGEXPROTINGREPID=SY-REPIDDYNNER=SY-DYNNREXTENSION=800."顯示寬度利用CREATE OBJECT語句創建參照CL_GUI_ALV_GRID的ALV GRID控件實例。然后創建ALV GRID控件實例的同時連接Docking容器。
CREATE OBJECT G_GRIDEXPORTINGI_PARENT = G_DOCKING.15.4 ALV方法
本章介紹ALV中經常用到的方法。前面已經介紹方法決定對象的行為即ALV方法管理ALV行為。
15.4.1 set_table_for_first_display方法
set_table_for_first_display是 ALV GRID 控件實例顯示在輸出列表時最基本,最重要的方法。調用方法時需要參照ABAP數據字典的結構或者需要定義字段目錄。前者指的是如前面實例中的EXPORTING I_STRUCTURE_NAME='SFLIGHT'所示,參照SFLIGHT表一樣的結構,后者指的是在代碼中直接構成ALV字段。另外,調用set_table_for_first_display方法時在運行程序之前可以排序或者過濾字段,如下圖語句所示
CALL METHOD<ref.var.to CL_GUI_ALV_GRID>->set_table_for_first_displayEXPORTINGI_STRUCTURE_NAME =<string of type DD02L-TABNAME>IS_VARIANT =<structure of type DISVARIANT>I_SAVE =<var.of TYPE cHAR01>I_DEFAULT =<var.of TYPE cHAR01>IS_LAYOUT =<structure of type LVC_S_LAYO>IS_PRINT =<structure of type LVC_S_PRNT>IT_SPECIAL_GROUPS =<internal table of type LVC_T_SGRP>IT_TOOLBAR_EXCLUDING =<internal table of type UI_FUNCTIONS>CHANGINGIT_OUTTAB =<internal table>IT_FIELDCATALOG =<internal table of type LVC_T_FCAT>IT_SORT =<internal table of type LVC_T_SORT>IT_FILTER =<internal table of type LVC_T_FILT>下面仔細觀察一下set_table_for_first_display 方法中要使用的參數和屬性。
1. I_STRUCTURE_NAME 參數
為了制作輸出表的形式輸入類似于SFLIGHT的一樣的ABAP數據字典結構體名字。只要設置這個參數會自動生成符合此結構體的字段目錄。即在程序內部沒有必要重新構成字段目錄。
DATA : g_g_grid TYPE REF TO cl_gui_alv_grid.gt_sflight TYPE TABLE OF sflight.CALL METHOD g_grid->set_table_for_first_displayEXPORTINGI_STRUCTURE_NAME = 'SFLIGHT'CHANGINGIT_OUTTAB = GT_SFLIGHT.2. IS_VARIANT 參數
可以設置ALV列表變式(Variant)。列表變式把修改的畫面字段順序、排列字段等操作保存成一個變式,以便以后查詢時以同樣式顯示。首先需要在報表程序中追加用于選擇布局的參數及功能。
3. I_SAVE 參數
函數set_table_for_first_display的參數I_SAVE已經在前面講述,因此下面簡單整理一下相關值
| 值 | 功? ? ? ? 能 |
| X | 只能保存全局布局 |
| U | 只能保存自定義布局 |
| A | 同時包含X和U |
| SPACE | 不保存布局 |
4.I_DEFAULT 參數
決定用戶是否能保存默認變式。
| 值 | 功? ? ? ? 能 |
| X | 可以設置默認變式 |
| SPACE | 不能設置默認變式 |
5.IS_LAYOUT 參數
利用IS_LAYOUT 參數可以定義ALV GRID控件的畫面屬性,如設置合計金額或者以條紋形式顯示等。布局是LVC_S_LAYO類型的結構體。此結構體可以在T-CODE:SE11中查詢
| 字? ?段 | 描? ? 述 | 目? ? 的 |
| CTAB_FNAME | 指定字段列顏色 | 顏色 |
| CWIDTH_OPT | 自動調整列寬 | GRID屬性 |
| DFTAILINIT | 決定是否在詳細畫面顯示初始值 | Interaction |
| DFTAILTITL | 顯示詳細畫面的標題欄 | Interaction |
| EXCP_CONDS | 顯示例外處理字段Sub Total | Exeptions |
| EXCP_FNAME | 顯示例外處理字段 | Exeptions |
| EXCP_LED | 例外處理字段不用信號燈顯示,而是用LED | Exeptions |
| EXCP_ROLLN | 顯示關于例外處理字段的幫助 | Exeptions |
| GRID_TITLE | 指定標題欄的描述 | GRID 屬性 |
| INFO_FNAME | 指定行顏色 | 顏色 |
| KEYHOT | 指定以HOTSOPOT顯示的主鍵 | Interaction |
| NO_HEADERS | 不顯示字段標題 | GRID 屬性 |
| NO_HGRIDLN | 不顯示GRID的水平線 | GRID 屬性 |
| NO_MERGING | 排序字段時防止合并相同值的列 | GRID 屬性 |
| NO_ROWMARK | 刪除GRID的行選擇按鈕 SEL_MODE='D'時刪除行選擇按鈕 SEL_MODE=‘A’時刪除字段/行按鈕 | GRID 屬性 |
| NO_TOOLBAR | 不顯示工具欄 | GRID 屬性 |
| NO_TOTLINE | 不顯示所有行 | Total選項 |
| NO_VGRIDLN | 不顯示Grid的垂直線 | GRID 屬性 |
| NUM_TOTAL | 顯示NUMC字段的合計金額 | Total選項 |
| S_DRAGDROP | 設置Drag & Drop控件 (復制,移動行的功能) | Interaction |
| SEL_MODE | 設置選擇模式 (A,B,C,D,SPACE) | GRID 屬性 |
| SGL_CLK_HD | 單擊字段標題時進行排序 | Interaction |
| SMALLTITLE | 決定標題大小 | GRID 屬性 |
| TOTALS_BEF | 合計金額顯示在最上行 | Total選項 |
| ZEBRA | 變換行顏色 | 顏色 |
設置幾個布局屬性后進行測試,其他的參數可以通過練習掌握功能,生成LVC_S_LAYO類型的變量。
6.IT_OUTTAB 參數
IT_OUTTAB 參數是定義要顯示數據的輸出表的參數。換句話說是指定包含要顯示數據的內表參數。
7.IT_FIELDCATALOG 參數
決定要顯示的數據類型及輸出表結構。
8.IT_TOOLBAR_EXCLUDING 參數
在ALV GRID控件中有需要隱藏按鈕時使用。先定義ui_funcionts 類型的內表,然后把此Function代碼插入到此表中,則相應按鈕就會隱藏
9.IT_SORT 參數
設置ALV數據排列順序的參數。定義參照LVC_T_SORT類型的內表后,加入要用于排序的字段到此表中杰克。LVC_T_SORT中T指的是表,LVC_S_SORT指的是結構體。排序表的選項中Subtot設置以排序字段為基準顯示合計金額和全體合計金額。
| 屬? ?性 | 值 | 說? ? 明 |
| SPOS | 數字 | 指定排列順序 |
| FIELDNAME | 字段名 | 指定需要排序的字段名 |
| UP | “,‘X’ | 升序排序 |
| DOWN | “,‘X’ | 降序排序 |
15.4.2 ALV 其他方法
1. get_current_cell 方法
總結
以上是生活随笔為你收集整理的SAP ABAP开发从入门到精通——第15章 面向对象ALV的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 魔术方法
- 下一篇: 大数据集群搭建之hadoop、tomca