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