ALV詳解:OO ALV


OO ALV.. 79

EnjoySAP Controls and CFW... 79

LVC_S_FCAT. 84

LVC_S_LAYO.. 88

set_table_for_first_dispaly()方法參數... 91

隱藏工具欄中預置按鈕(IT_TOOLBAR_EXCLUDING參數接口)... 93

refresh_table_display( )參數... 93

創建ALV.. 94

實例:帶查詢條件、行顏色、事件... 96

一、創建對話屏幕... 96

二、新增子屏幕區域,嵌入查詢條件... 96

三、創建Gui Status,新增查詢按鈕... 97

四、在ALV工具欄中新增自定義按鈕... 97

五、程序代碼設計... 99

容器Container. 102

CL_GUI_DOCKING_CONTAINER容器... 103

CL_GUI_SPLITTER_CONTAINER容器... 104

CL_GUI_ALV_GRID常用方法... 107

get_current_cell( )方法... 107

get_frontend_layout( )方法... 108

get_selected_cells( )方法... 108

get_selected_columns( )方法... 108

get_selected_rows( )方法... 108

refresh_table_display( )方法... 108

set_frontend_layout( )方法... 109

CL_GUI_ALV_GRID常用事件... 109

雙擊事件DOUBLE_CLICK. 109

熱點單擊事件HOTSPOT_CLICK. 109

Toolbar加載事件TOOLBAR. 110

工具欄中下拉菜單加載事件menu_button. 110

用戶命令事件USER_COMMAND... 110

覆蓋預設功能FunCodeBEFORE_USER_COMMAND.. 110

數據變化事件data_changeddata_changed_finished. 110

拖入事件ONDRAGONDROP. 113

按鈕點擊事件BUTTON_CLICK. 113

首次顯示后更新FieldCatLayout. 113

HTTP超鏈接... 114

下拉框... 116

Key-Value. 118

設置單元格的風格... 120

單元格顯示為PushButton. 121

設置單元格級別的可編輯

OO ALV

EnjoySAP Controls and CFW

EnjoySAP ControlSAP提供的基於OO架構的UI技術。CFWControl Framework

現在在SAP中,在傳統的ABAP中,我們可以“畫”出很多自己的screen element,如input fieldbuttontabletabstripTable Control等等(SE51 Screen Painter)。但是,想想,如果我們需要在screen上面顯示圖片、使用Tree來組織數據結構等,我們該怎么實現呢?

 

現在SAP提供另一種基於OO的處理UI的技術名為EnjoySAP,它是以CFW(Control Framework)為基礎來實現的,CFW框架繼承體系如下:

CL_GUI_OBJECT                                                      Proxy Class for a GUI Object

         |-- CL_FORMPAINTER_BASEWINDOW      SAP Form Painter Window Base Class

         |   |-- CL_FORMPAINTER_BITMAPWINDOW    SAP Form Painter Bitmap Window Class

         |   |-- CL_FORMPAINTER_TEXTWINDOW     SAP Form Painter Text Window Class

         |-- CL_GUI_CONTROL                                     Proxy Class for Control in GUI

         |   |-- CL_DSVAS_GUI_BUSIGRAPH           DSVAS: Proxy for Business Graphic

         |   |-- CL_GFW_GP_PRES_CHART                        GFW: Product--specific section of CL_GUI_GP_PRES (Chart)

         |   |-- CL_GFW_GP_PRES_PIG                     GFW: product specific section for web view

         |   |-- CL_GFW_GP_PRES_SAP                    GFW: product--specific section of CL_GUI_GP_PRES (SAP BUSG)

         |   |-- CL_GUI_ALV_GRID_BASE                 Basis Class for ALV Grid

         |   |   |-- CL_CALENDAR_CONTROL_SCHEDULE      Calendar View (Day, Week, Month)

         |   |   |--CL_GUI_ALV_GRID                           ALV List Viewer

         |   |     |-- CL_ALV_DD_LISTBOX                           D&D List Box

         |   |     |-- CL_BUKF_CAT_GRID                            Key Figures -- Grid of categories

         |   |     |-- CL_BUKF_DSRC_GRID                         Key Figures -- Grid for Data sources

         |   |     |-- CL_BUKF_FILTER_GRID              Key Figures -- Filter for Key Figure

         |   |     |-- CL_BUKF_KF_GRID                               Key Figures -- Grid for Key Figures

         |   |     |-- CL_BUKF_TERMS_GRID                      Key Figures -- Grid for terms

         |   |     |-- CL_FTR_GUI_ENTRY_ALV                  Class: ALV Grid Control for Initial Screen (Without Toolbar)

         |   |     |-- CL_GFW_GP_GRID_ALV                    ALV grid proxy

         |   |-- CL_GUI_AQQGRAPHIC_ADAPT      Network Adapter

         |   |-- CL_GUI_AQQGRAPHIC_CONTROL     BW Basis Class Network Control

         |   |   |-- CL_GUI_AQQGRAPHIC_NETPLAN         Network Control

         |   |-- CL_GUI_BARCHART                             Bar chart wrapper

         |   |-- CL_GUI_BORDERPAINTER                 SAP Border Painter Control Proxy Class

         |   |-- CL_GUI_BTFEDITOR                             SAP BTF Editor Control Proxy Class

         |   |-- CL_GUI_CALENDAR                             Calendar Control Proxy Class

         |   |-- CL_GUI_CHART_ENGINE_WIN       Graphics: Presentation Graphics (SAP GUI for Windows)

         |   |-- CL_GUI_CONTAINER                            Abstract Container for GUI Controls

         |   |   |-- CL_GUI_CONTAINER_INFO         Information on Container Controls

         |   |   |-- CL_GUI_CUSTOM_CONTAINER     Container for Custom Controls in the Screen Area

         |   |   |-- CL_GUI_DIALOGBOX_CONTAINER   Container for Custom Controls in the Screen Area

         |   |   |   |-- CL_ECL_VIEWER_FRAME                  Manage EAI Control in Own Window

         |   |   |   |-- CL_GUI_ECL_VIEWERBOX      ECL Viewer as Dialog Box

         |   |   |-- CL_GUI_DOCKING_CONTAINER    Docking Control Container

         |   |   |-- CL_GUI_EASY_SPLITTER_CONTAINER   Reduced Version of Splitter Container Control

         |   |   |   |-- CL_EU_EASY_SPLITTER_CONTAINER  Internal Test; Do Not Use

         |   |   |-- CL_GUI_GOS_CONTAINER                   Generic Object Services Container

         |   |   |-- CL_GUI_SIMPLE_CONTAINER             Anonymous Container

         |   |   |-- CL_GUI_SPLITTER_CONTAINER    Splitter Control

         |   |-- CL_GUI_ECL_2DCOMPARE               Compare Module for 2D Viewer

         |   |-- CL_GUI_ECL_3DCOMPARE               Compare Module for 3D Viewer

         |   |-- CL_GUI_ECL_3DMEASUREMENT      Measurement Module for 3D Viewer

         |   |-- CL_GUI_ECL_3DSECTIONING           Sectioning Module for 3D Viewer

         |   |-- CL_GUI_ECL_MARKUP                                Markup (Redlining) Component

         |   |-- CL_GUI_ECL_PMI                                           PMI Module for the 3D Viewer

         |   |-- CL_GUI_ECL_PRIMARYVIEWER       Basis Class for ECL Viewers (2D und 3D)

         |   |   |-- CL_GUI_ECL_2DVIEWER               Engineering Client 2D Viewer

         |   |   |-- CL_GUI_ECL_3DVIEWER               Engineering Client 3D Viewer

         |   |-- CL_GUI_ECL_VIEWER                          Proxy Class for Engineering Client Viewer

         |   |-- CL_GUI_FORMPAINTER                     SAP Form Painter Control Proxy Class

         |   |-- CL_GUI_GLT                                            Internal; Do Not Use!

         |   |-- CL_GUI_GP                                             GFW: Superclass of all graphics proxies

         |   |   |-- CL_GUI_GP_GRID                           GFW: Grid proxy

         |   |   |-- CL_GUI_GP_HIER                            GFW: Structure graphics

         |   |   |-- CL_GUI_GP_PRES                           GFW: Business graphic

         |   |-- CL_GUI_GRLT                                         Internal; Do Not Use !! ( restricted license -- see docu)

         |   |-- CL_GUI_HTML_EDITOR                      HTML Editor

         |   |-- CL_GUI_ILIDRAGNDROP_CONTROL           Interactive List: Drag & Drop

         |   |-- CL_GUI_MOVIE                                     SAP Movie Control

         |   |-- CL_GUI_NETCHART                              Network wrapper

         |   |   |-- CL_GFW_GP_HIER_SAP               GFW: Product--specific section of CL_GUI_GP_HIER (NETZ)

         |   |-- CL_GUI_PDFVIEWER                           PDF Viewer

         |   |-- CL_GUI_PICTURE                                  SAP Picture Control

         |   |-- CL_GFW_GP_PRES_WEB                   GFW: product specific section for web view

         |   |-- CL_GUI_RTF_EDITOR                          SAP SAPscript Editor Control

         |   |   |-- CL_GUI_SAPSCRIPT_EDITOR      SAP SAPscript Editor Control

         |   |-- CL_GUI_SELECTOR                               SAPSelector: Control for selecting colors or bitmaps

         |   |-- CL_GUI_SPH_STATUS_CONTROL      SAPphone: Status Event Control

         |   |-- CL_GUI_TABLEPAINTER                     SAP Table Painter Control Proxy Class

         |   |-- CL_GUI_TIMER                                      SAP Timer Control

         |   |-- CL_GUI_TOOLBAR                                         Toolbar Control

         |   |   |-- CL_CCMS_AL_GUI_TOOLBAR              Alerts: GUI Toolbar Used in the Visual Framework

         |   |-- CL_GUI_WCF_WWP                            Internal Tool -- DO NOT USE

         |   |-- CL_KW_AUTOMATION_CONTROL     Helper Class for General Automation Objects

         |   |-- CL_LC_EDITOR_CONTROL                 Lifecycle Editor Control

         |   |   |-- CL_GCM_LCEDITOR_CONTROL           Control for the display of definition life cycles

         |   |-- CL_SOTR_SPELLCHECKER                   Interface with OTR Spellchecker

         |   |-- CL_SRM_BASE_CONTROL                 SRM Control

         |   |   |-- CL_SRM_STACKED_CONTROL             RM Control with Stack

         |   |-- CL_TREE_CONTROL_BASE                 Internal Tree Control Class

         |   |   |--CL_GUI_SIMPLE_TREE(參考《User Dialogs.docx》文檔)  Simple Tree Control

         |   |   |-- CL_ITEM_TREE_CONTROL                     Internal Tree Control Class

         |   |     |-- CL_GUI_COLUMN_TREE                     Column Tree Control

         |   |     |   |-- BDMT_CONTROL                              Administers Tree Control for Monitoring

         |   |     |   |-- CL_BUCC_TREE                                  Consistency Checks -- Library Tree

         |   |     |   |-- CL_GFW_COLUMN_TREE             Do not use!!!!!!!!

         |   |     |   |-- CL_GFW_GP_HIER_SAPTREE      GFW: Product--specific section of CL_GUI_GP_HIER

         |   |     |   |-- CL_HU_COLUMN_TREE                 Tree that Displays Handling Units

         |   |     |-- CL_GUI_LIST_TREE                      List Tree Control

         |   |-- C_OI_CONTAINER_CONTROL_PROXY    For Internal Use

         |   |-- SCE_HTML_CONTROL_EVENT_HANDLER   Event Handler for SCE HTML Control

         |   |-- CL_ALV_TREE_BASE                             Basis Class ALV Tree Control

         |   |   |-- CL_GUI_ALV_TREE                          ALV Tree Control

         |   |   |   |-- CL_GCM_WORKLIST_TREE     CM: Worklist

         |   |   |   |-- CL_PT_GUI_TMW_ALV_TREE        Small Modification to CL_GUI_ALV_TREE

         |   |   |-- CL_GUI_ALV_TREE_SIMPLE        Simple ALV Tree

         |   |   |-- CL_SIMPLE_TREE_VIEW_MM                  Simplest Kind of Tree

         |   |-- CL_GUI_ECATT_RECORDER                        SAP eCATT Recorder Control -- To be used by eCATT only!

         |   |-- CL_GUI_TEXTEDIT(參考《User Dialogs.docx》文檔) SAP TextEdit Control

         |   |   |-- CL_GCM_TEXTEDIT                         CM: Long text control

         |   |   |-- CL_SOTR_TEXTEDIT                         Edit Control for the OTR

         |   |-- CL_GUI_HTML_VIEWER                     HTML Control Proxy Class

         |    |-- CL_BFW_HTML_VIEWER_POC                   Browser Framework: Proxy for HTML Control

         |    |-- CL_CCMS_BSP_VIEWER                                HTML Control Proxy Class

         |    |   |-- CL_CCMS_AL_OBJ_DET_HTML_VIEWER Alerts: Component That Displays Object Properties with HTML

         |    |-- CL_CCMS_FROG_HTML_VIEWER              CL_GUI_FROG_HTML_VIEWER

         |    |-- CL_SSF_HTML_VIEWER                        Smart Forms: Enhanced HTML Viewer

         |-- CL_GUI_ECL_MATRIX                               Represents a Complete Data Type with 13 Floats

         |-- CL_GUI_RESOURCES                                 GUI Resources (Fonts, Colors, ...)

         |   |-- CL_WF_GUI_RESOURCES                  Getting Front Settings

         |   |-- CL_WF_GUI_RESOURCES_4_HTML            Get Front Settings for HTML Generation

         |-- CL_KW_AUTOMATION_OBJECT          For Internal Use

         |-- CL_TABLEPAINTER_BASETABLE            SAP Table Painter Table Base Class

         |   |-- CL_TABLEPAINTER_TABLE                 SAP Table Painter Table Class

         |   |-- CL_TABLEPAINTER_TEMPLATE        SAP Table Painter Template Class

         |-- C_OI_AUTOMATION_OBJECT               For Internal Use

         |-- CL_GUI_FRONTEND_SERVICES            Frontend services

 

對於CFW主要有三點需要理清:

(1)OO處理

(2)Automation Queue

(3)Events

在現實的GUI程序中,這時一共會有四個對象實例:2 in ABAP program 2  the presentation serverGUI.它的處理邏輯簡單可以使用以下的截圖來表示:

image059

這里說明一下:

1.在創建將要使用的enjoy SAP control時的步驟:

* screen painter中畫一個area(custom area)

* 然后在我們的程序中,以上一步創建SubArea(Custom area)為基礎,來創建Container control class CL_GUI_<>_CONTAINER”的實例

* 最后,再以上一步創建出來的container control為基礎,來創建Enjoy SAP Control的實例

2.同時,在創建這些control時,需要注意它們的lifetime(生命周期):

* <classname>=>lifetime_imode:指定其當該Internal session存在時就一直”存活”着(也就是沒有離開當前的session,如沒使用Leave program)

* <classname>=>lifetime_dynpro:指定其一直“存活着”,只要該screen instance存在。

* defaultimode;另外在創建時,要注意,instance只需創建一個,防止每次觸發PBO時又創建instance

3.關於使用EnjoySAP Control時的數據傳輸

使用這些control時,在傳遞數據時,不同於一般的dialog程序是整體性地傳遞(例如一個screen中的所有input field會一次性進行交互),而這些control卻是在“需要”的情況下才傳遞,例如只需要改變picture的長寬高等;所以,為了提高performance,在CFW中使用Automation Queueflushed.

通常,當我們調用這些controlmethod或者讀取它們的attribute時,這些操作會被bufferCFW service里面(Automation Queue),這些actions只有當CFW調用了“Flush”方法后,才會將其傳遞給presentation server。同時因為在CFW中只有一個automation queue,它被所有的control所使用着,所以當 flush發生時,all of the actions stored for all presentaion server controls are transferred,同時,“Result values”將從presentation server controls 傳回給 CFW 。我們也可以自己調用cl_gui_cfw=>flush來觸發這些actions(特別有用的是:當我們的screencompound(復和的)的,因為在Flush一般發生在PBO事件的結束,如果我們的第二個Instance method需要dependent 第一個instance method,因為沒有flush)

4.關於使用EnjoySAP Control時的Event機制

在處理上, GUI上的control有很多的event,通過automation handlerCFW service,將user action傳遞並處理給ABAP program里的Proxy class Instance

* 首先要知道control有哪些event。這要以通過SE24中查看相關的class中有定義。

* 定義好了event,需要再定義event handler。此時,一般我們采用的是local event handler,即在程序中定義handler,然后通過set handler來進行注冊這些event

* 使用CL_GUI_CFW=>dispatch

 

EnjoySAP Control中的Picture controlHTML control比較特別,它們需要指定data source(來源於external或者Internal)

 

 

 

LVC_S_FCAT

ROW_POS                          ALV control: Output line (INTERNAL USE)

COL_POS         ALV                    control: Output column

FIELDNAME                       ALV control: Field name of internal table field

TABNAME                          LVC tab name

CURRENCY                         ALV control: Currency unit

CFIELDNAME                    ALV control: Field name for currency unit referenced

QUANTITY                          ALV control: Unit of measure

QFIELDNAME                    ALV control: Field name for unit of measure referenced

IFIELDNAME                      ALV control: Field name of internal table field

ROUND                               ALV control: ROUND value

EXPONENT                         ALV control: Exponent for float representation

KEY                                       ALV control: Key field

KEY_SEL                              ALV control: Key column that may be hidden

ICON                                    ALV control: Output as icon

SYMBOL                              ALV control: Output as symbol

CHECKBOX                         ALV control: Output as checkbox

JUST         ALV                            control: Alignment

LZERO                                  ALV control: Output leading zeros

NO_SIGN        ALV                    Control: Suppress Signs for Output

NO_ZERO                           ALV control: Suppress zeros for output

NO_CONVEXT        ALV         control: Do not consider conversion exit for output

EDIT_MASK                       ALV control: EditMask for output

EMPHASIZE                       ALV control: Highlight column with color

FIX_COLUMN         ALV           Control: Fix Column

DO_SUM         ALV                   control: Aggregate values of column

NO_SUM         ALV                   control: No aggregation over values of column

NO_OUT          ALV                   control: Column is not output

TECH                                    ALV control: Technical field

OUTPUTLEN                      ALV control: Column width in characters

CONVEXIT                          Conversion Routine

SELTEXT                              ALV control: Column identifier for dialog functions

TOOLTIP                             ALV control: Tool tip for column header

ROLLNAME                        ALV control: Data element for F1 help

DATATYPE                          Data Type in ABAP Dictionary

INTTYPE                              ABAP data type (C,D,N,...)

INTLEN                                Internal Length in Bytes

LOWERCASE                      Lowercase letters allowed/not allowed

REPTEXT                             Heading

HIER_LEVEL                       ALV control: Internal use

REPREP                               ALV control: Value is selection criterion for rep./rep.intf.

DOMNAME                       Domain name

SP_GROUP                        Group key

HOTSPOT                            ALV control: SingleClick-sensitive

DFIELDNAME                    ALV control: Field name for column group in database

COL_ID                                ALV control: Column ID

F4AVAILABL                      Does the field have an input help

AUTO_VALUE                           ALV control: Automatic value copy

CHECKTABLE                     Table Name

VALEXI                                Existence of fixed values

WEB_FIELD                        ALV control: Field name of internal table field

HREF_HNDL                       Natural Number

STYLE                                   ALV control: Style

STYLE2                                 ALV control: Style

STYLE3                                 ALV control: Style

STYLE4                                 ALV control: Style

DRDN_HNDL                     Natural Number

DRDN_FIELD                     ALV control: Field name of internal table field

NO_MERGING                Character Field Length 1防止在排序時,將相同的列合並成一個單元格

H_FTYPE ALV                   tree control: Functional type (sum, avg, max, min, ...)

COL_OPT                                     Entry for Optional Column Optimization

NO_INIT_CH                     Character Field Length 1

DRDN_ALIAS                     Character Field Length 1

DECFLOAT_STYLE           DD: Output Style (Output Style) for Decfloat Types

PARAMETER0          30             Characters

PARAMETER1          30             Characters

PARAMETER2          30             Characters

PARAMETER3          30             Characters

PARAMETER4          30             Characters

PARAMETER5                             Natural Number

PARAMETER6                             Natural Number

PARAMETER7                             Natural Number

PARAMETER8                             Natural Number

PARAMETER9                             Natural Number

REF_FIELD                          ALV control: Reference field name for internal table field

REF_TABLE                         ALV control: Reference table name for internal table field

TXT_FIELD                          ALV control: Field name of internal table field

ROUNDFIELD                    ALV control: Field name with ROUND specification

DECIMALS_O                    ALV control: Number of decimal places for output

DECMLFIELD                      ALV control: Field name with DECIMALS specification

DD_OUTLEN                      ALV control: Output length in characters

DECIMALS                          Number of Decimal Places

COLTEXT ALV                   control: Column heading

SCRTEXT_L                         Long Field Label

SCRTEXT_M                       Medium Field Label

SCRTEXT_S                         Short Field Label

COLDDICTXT                      ALV control: Determine DDIC text reference

SELDDICTXT                       ALV control: Determine DDIC text reference

TIPDDICTXT                       ALV control: Determine DDIC text reference

EDIT          ALV                            control: Ready for input

TECH_COL                          ALV control: Internal use

TECH_FORM                     ALV control: Internal use

TECH_COMP                     ALV control: Internal use

HIER_CPOS                        ALV control: Hierarchical column position

H_COL_KEY                       Tree Control: Column Name / Item Name

H_SELECT                           Indicates if a column in the tree control can be selected

DD_ROLL                                     Data element (semantic domain)

DRAGDROPID                            ALV control: Drag&Drop handle for DragDrop object

MAC                                     Character Field Length 1

INDX_FIELD                       Natural Number

INDX_CFIEL                       Natural Number

INDX_QFIEL                       Natural Number

INDX_IFIEL                         Natural Number

INDX_ROUND                            Natural Number

INDX_DECML                    Natural Number

GET_STYLE                         Character Field Length 1

MARK                                  Character Field Length 1

LVC_S_LAYO

ZEBRA                                  ALV control: Alternating line color (striped)

EDIT          ALV                            control: Ready for input

EDIT_MODE                      ALV control: Edit mode

NO_KEYFIX                        ALV control: Do not fix key columns

FRONTEND                        ALV control: Excel, Crystal or ALV

OBJECT_KEY                      Business Document Service: Object key

DOC_ID                               Business Document Service: Document ID

TEMPLATE                          Business Document Service: File names

LANGUAGE                       Language ID

GRAPHICS                          GUID in 'CHAR' Format in Uppercase

SMALLTITLE                       ALV control: Title size    標題大小

NO_HGRIDLN         ALV         control: Hide horizontal grid lines

NO_VGRIDLN         ALV         control: Hide vertical grid lines

NO_HEADERS         ALV         control: Hide column headings

NO_MERGING                ALV control: Disable cell merging                  排序時不會合並相鄰相同的單元格

CWIDTH_OPT          ALV         control: Optimize column width

TOTALS_BEF                      ALV control: Totals output before individual records

NO_TOTARR                     Character Field Length 1

NO_TOTEXP                     Character Field Length 1

NO_ROWMOVE              Character Field Length 1

NO_ROWINS                    Character Field Length 1

NO_COLEXPD                            Character Field Length 1

NO_F4                                 Character Field Length 1

COUNTFNAME                ALV control: Field name of internal table field

COL_OPT                                     Character Field Length 1

VAL_DATA                         Character Field Length 1

BLOB_SCOPE                    Identifier if BLOB is from SAP or Customer

BLOB_FLAVOUR             Key Field for BLOB Store in SALV_BS_BLOB_...

BLOB_NAME                     Name for BLOB Store in SALV_BS_BLOB_...

BLOB_KEY                          Key Field for BLOB Storage

BLOB_TYPE                        ID from ALV Layout for BLOB Display Mode

.INCLUDE         ALV control: General display options

STYLEFNAME                    ALV control: Field name of internal table field

.INCLUDE         ALV control: Grid customizing

NO_ROWMARK              ALV control: Disable row selections    刪除GRID的行選擇按鈕,SEL_MODE = D時刪除行選擇按鈕,為A時列/行選擇按鈕?

NO_TOOLBAR                            ALV control: Hide toolbar不會顯示工具條

GRID_TITLE                        ALV Control: Title bar text

SEL_MODE                         ALV control: SelectionMode                  選擇模式(ABCDSPACE

image060

1.如果你設置了ALV 是可編輯的,可能會覆蓋你在布局中選擇方式的設置的.

2.設置了選擇方式以后,我們可以使用很多方法來獲取用戶的選擇.比如"GET_SELECTED_CELLS","GET_SELECTED_CELLS_ID","GET_SELECTED_ROWS","GET_SELECTED_COLUMNS"

3.在執行PAI 以后,用戶所選擇的單元格,行或者列可能丟失.你可以在PBO,使用對應的SET 方法來恢復這些選擇.

BOX_FNAME ALV         control: Field name of internal table field

SGL_CLK_HD  ALV         control: SingleClick on column header

.INCLUDE         ALV control: Totals options

NO_TOTLINE                     ALV control: Do not output totals line

NUMC_TOTAL                 ALV control: Disallow NUMC field summation

NO_UTSPLIT                     ALV control: Split totals lines by unit

EXCP_FNAME                            ALV control: Field name with exception coding

EXCP_ROLLN                     ALV control: Data element for exception documentation

EXCP_CONDS                             ALV control: Aggregate exceptions

EXCP_LED                           ALV control: Exception as LED

EXCP_GROUP                            ALV Control: Exception Group

.INCLUDE         ALV control: Interactive control

DETAILINIT                         ALV control: Display initial values on detail screen

DETAILTITL                         ALV control: Title bar of detail screen

KEYHOT                               ALV control: Key columns as hotspot

NO_AUTHOR                    ALV control: Do not perform ALV standard authority check

XIFUNCKEY                        SAP Query (S): Name of additional function

XIDIRECT                                      General Flag

S_DRAGDROP                            ALV control: Drag&Drop control settings   允許行拖放功能

.INCLUDE         ALV control: Colors

INFO_FNAME         ALV         control: Field name with simple row color coding

CTAB_FNAME         ALV         control: Field name with complex cell color coding

.INCLUDE         ALV control: Web options

WEBLOOK                          ALV control: Web look

WEBSTYLE                          ALV control: Style

WEBROWS                         ALV control: Number of lines to be displayed in the Web

WEBXWIDTH                     Natural Number

WEBXHEIGHT                    Natural Number

set_table_for_first_dispaly()方法參數

函數REUSE_ALV_GRID_DISPLAY創建ALV報,需要構造fieldcat、數據輸出內表、以及設置Layout,然后將它們通過it_fieldcat t_outtabis_layout 參數傳遞給REUSE_ALV_GRID_DISPLAY函數。其實通過面向對象的方式生成ALV時,基本上也是一樣,先也要准備這些信息,然后通過CL_GUI_ALV_GRID類的實例方法set_table_for_first_display的相關參數傳遞進去,即可生成ALV

CL_GUI_ALV_GRIDset_table_for_first_dispaly ()方法參數與函數REUSE_ALV_GRID_DISPLAY參數類似,其作用都是一樣:生產ALV

image061

參數                                含義

I_BUFFER_ACTIVE                       如果方法調用是靜態的,可以設置這個標記,這表示,如果每次顯示ALV 都是相同的字段目錄。既然這樣,那么字段目錄會被放到一個特殊的緩存里,這樣加速了ALV 的顯示

I_STRUCTURE_NAME       輸出數據參考的數據字典的結構名,例如'SFLIGHT'。如果指定了這個參數,字段目錄會自動生成,下面的參數T_FIELDCATALOG 不需要傳值。

IS_VARIANT                          展示時所使用的布局變式

I_SAVE                                              決定用戶是否可以保存變式:'X' 只能保存全局變式;'U' 只能保存特定變式;'A' 都可以保存;SPACE 不可以將布局保存為變式

I_DEFAULT                                      決定用戶是否可以設置默認的布局:'X' 可以定義默認布局,這個參數是默認的;SPACE 不可以設置默認布局

IS_LAYOUT                                      ALV布局設置(外觀設置)

IS_PRINT                                后台打印屬性的參數

IT_SPECIAL_GROUPS                 如果在字段目錄中,一些字段通過SP_GROUP 被分組在一起。我們就必須為這些組傳遞一個組的文本內表進去

IT_TOOLBAR_EXCLUDING        需要隱藏的標准按鈕的內表

IT_HYPERLINK                      設置HTTP超鏈接

IT_ALV_GRAPHICS             比較復雜,沒有用過,意思好象是可以在圖表中顯示ALV

IT_OUTTAB                                     輸出數據存放的內表,數據都是存放在這個內表里

IT_FIELDCATALOG              字段目錄

IT_SORT                                  排序

IT_FILTER                                數據過濾

隱藏工具欄中預置按鈕(IT_TOOLBAR_EXCLUDING參數接口)

標准按鈕的Funcode可以打開 CL_GUI_ALV_GRID 進行查看

image062

image063

refresh_table_display( )參數

參數                   含義

IS_STABLE                              刷新的穩定性,有2 個參數,一個是行,一個是列。如果設置了相應的值,那么對應的行或者列,在刷新的時候將會保持穩定(就是滾動條保持不動

I_SOFT_REFRESH       軟刷新。這個參數只是在異常情況下被使用,如果設置了這個參數,任何創建的合計,任何排序次序,任何為了顯示數據而設置的過濾都將保持不變。這個是非常有意義的,例如:當然你沒有修改數據內表里的數據,但因布局修改了想刷新ALV可使用(僅僅只是改變一下布局和字段目錄,輸出內表中的數據根本沒有發生變化,所以不需要硬刷新了)

創建ALV

ALV表格控件對應的全局類是“CL_GUI_ALV_GRID”,因為所有的Controls控件必須被嵌入在一個SAP容器(SAP Container Control,以下簡稱容器),其全局類為“CL_GUI_CUSTOM_CONTAINER”,而該容器的實例對象又必須以屏幕上的用戶自定義控件區域Custom Controlimage064為基礎來創建:所以創建ALV之前先需要創建用戶對話屏幕,再在屏幕上繪制一個用戶自定義控件區域,然后該用戶自定義控件區域為基礎來創建CL_GUI_CUSTOM_CONTAINER容器實例,最后以此容器實例來創建CL_GUI_ALV_GRID實例即可。用戶自定義控件區域、容器、ALV控件三都之間的關系如下:

image065

 

在創建容器對象實例時,其構造方法有一個必傳參數CONTAINER_NAME,它的值就是屏幕上繪制的“用戶自定義控件區域Custom Control)”的控件的名稱:

image066

當容器實例創建好以后,CL_GUI_ALV_GRID再以此容器對象為參數實例化,即可得到CL_GUI_ALV_GRID對象,最后再調用CL_GUI_ALV_GRID實例對象的set_table_for_first_display方法來生成ALV報表,CL_GUI_ALV_GRID的重要方法如下:

image067

1、 構造函數Constructor( ):必傳參數“I_parent”,容器對象引用,即需要將ALV顯示在在哪容器中

2、 生成表報set_table_for_first_display( ):產生ALV報表,與REUSE_ALV_GRID_DISPLAY函數的作用一樣,參數也大體相同

3、 刷新報表refresh_table_display( ):刷新並重新顯示ALV,當輸出內表數據變更、或其他ALV設置變化時,可以調用此方法重新顯示ALV

實例:帶查詢條件、行顏色、事件

一、創建對話屏幕

image068

由於ALV沒有專門實現的控件,需要先在對話屏幕100上增加一個用戶自定義控件區域Custom Control,名為CONTAINER_1

image069 image070

二、新增子屏幕區域,嵌入查詢條件

將查詢條件放在100對話屏幕中的子屏幕101上,所以需要在100屏幕上增加一個子屏幕區域image071,用來存放子屏幕:

image072

注:這里我們並沒有直接創建出101子屏幕,而是通過ABAP程序來創建的子屏幕,具體請看程序。

子屏幕的詳細使用可參考《User Dialogs.docx》文檔中的“對話屏幕(Dynpro Screen)->復合屏幕元素->子屏幕Subscreens”章節

三、創建Gui Status,新增查詢按鈕

還為100對話屏幕增加一個“查詢”按鈕,用於條件查詢:

image073

四、在ALV工具欄中新增自定義按鈕

ALV控件會自帶一組工具按鈕,如果要在工具欄上加上按鈕,則需要使用STB_BUTTON結構,該結構的字段介紹如下:

image074image075

具體作法請參見程序

五、程序代碼設計

image076

image077

CLASS cl_event_handle DEFINITION. "定義事件處理類
 
PUBLIC SECTION.
   
"初始化ALV工具欄對象事件,如增加按鈕並設定屬性
   
METHODS handle_toolbar
FOR EVENT toolbar OF cl_gui_alv_grid
           
IMPORTING e_object e_interactive.

   
"該事件用於在下ALV工具欄的下拉菜單按鈕中增加選項
   
METHODS handle_menu_button
FOR EVENT menu_button OF cl_gui_alv_grid
           
IMPORTING e_object e_ucomm.

   
"ALV工具欄按鈕的點擊事件
   
METHODS handle_user_command
FOR EVENT user_command OF cl_gui_alv_grid
           
IMPORTING e_ucomm.

   
"ALV表格雙擊事件
   
METHODS handle_double_click
FOR EVENT double_click OF cl_gui_alv_grid
           
IMPORTING e_row e_column es_row_no.

ENDCLASS.

DATA: gs_toolbar TYPE stb_button.
DATA:BEGIN OF gt_sflight OCCURS 0.
       
INCLUDE STRUCTURE sflight.
       DATA: color TYPE char10,"在原表的基礎上附加此列,用來存儲每行顏色
END OF gt_sflight.
CLASS cl_event_handle IMPLEMENTATION."事件處理類實現部分
 
METHOD handle_toolbar.
    gs_toolbar
-function = 'B_SUM'."按鈕的FunctionCode
    gs_toolbar
-icon = icon_display."按鈕圖標
    gs_toolbar
-text = '總行數'."按鈕標簽
    gs_toolbar
-butn_type = '0'."定義按鈕類型,0為標准按鈕,具體取值可參考這里
   
APPEND gs_toolbar TO e_object->mt_toolbar."添加按鈕到工具欄中

    gs_toolbar
-function = 'B_LIST'."按鈕的FunctionCode
    gs_toolbar
-quickinfo = '自定義下拉菜單按鈕'."按鈕的冒泡提示
    gs_toolbar
-icon = icon_biw_report_view."按鈕圖標
    gs_toolbar
-text = '下拉菜單按鈕'."按鈕標簽
    gs_toolbar
-butn_type = '1'."定義按鈕類型,1為下拉菜單按鈕
   
APPEND gs_toolbar TO e_object->mt_toolbar."添加下拉菜單按鈕到工具欄中
 
ENDMETHOD.

 
METHOD handle_menu_button.
   
IF e_ucomm = 'B_LIST'."給下拉菜單按鈕增加選項,可以多次調用該方法以增加多行
     
CALL METHOD e_object->add_function
       
EXPORTING

         
icon  = icon_display
          fcode
= 'B_SUM'"
字菜單按鈕的FunCode
         
text  = '顯示ALV總行數'.
   
ENDIF.
 
ENDMETHOD.
 
METHOD handle_user_command.
   
DATA: sum TYPE i .
   
IF e_ucomm = 'B_SUM'.
     
DESCRIBE TABLE gt_sflight[] LINES sum.
     
MESSAGE i001(00) WITH '當前ALV表格中的數據總行數為:' sum.
   
ENDIF.
 
ENDMETHOD.
 
METHOD  handle_double_click.
   
READ TABLE gt_sflight INTO gt_sflight INDEX es_row_no-row_id.
   
MESSAGE i001(00) WITH '當前行:' es_row_no-row_id ',航線代碼:' gt_sflight-carrid.
 
ENDMETHOD.
ENDCLASS.

DATA: event_handle TYPE REF TO cl_event_handle."定義類對象的引用
DATAgrid_r  TYPE  REF  TO  cl_gui_alv_grid ,
      container_r 
TYPE  REF  TO  cl_gui_custom_container.
DATA:fieldcat TYPE lvc_t_fcat.
DATA: gs_layout TYPE lvc_s_layo.

TABLES: spfli.
"查詢條件子屏幕
SELECTION-SCREEN BEGIN OF SCREEN 101 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK 10 WITH FRAME TITLE title.
SELECT-OPTIONS:s_carrid FOR spfli-carrid,
               s_connid
FOR spfli-connid.
SELECTION-SCREEN END OF BLOCK 10.
SELECTION-SCREEN END OF SCREEN 101.

INITIALIZATION.
 
title = '查詢條件'.

START-OF-SELECTION.
 
CALL SCREEN 100.

MODULE status_0100 OUTPUT.
 
SET PF-STATUS 'T001'.
ENDMODULE.

MODULE user_command_0100 INPUT.
 
CASE sy-ucomm.
   
WHEN 'EXEC'.
     
SELECT * FROM sflight INTO CORRESPONDING FIELDS OF TABLE gt_sflight
       
WHERE carrid IN s_carrid AND connid IN s_connid.

     
"以字母C加上一個3位數據作為顏色代碼:C510表示綠色,C610表示紅色,C310表示黃色
      gt_sflight
-color = 'C610'.
     
MODIFY gt_sflight TRANSPORTING color WHERE seatsocc < 100.

     
IF   container_r  IS  INITIAL.
       
CREATE  OBJECT    container_r"創建ALV容器對象
                 
EXPORTING container_name 'CONTAINER_1'.
       
CREATE  OBJECT  grid_r"創建ALV控件
                
EXPORTING i_parent  container_r.

        gs_layout
-info_fname = 'COLOR'."指定存放顏色字段
       
CALL METHOD grid_r->set_table_for_first_display
         
EXPORTING

            i_structure_name
= 'sflight'
            is_layout       
= gs_layout
            i_save          
= 'X'"
可以保存變式
         
CHANGING
            it_outtab       
= gt_sflight[]
            it_fieldcatalog 
= fieldcat[]."
如果fieldcat內表為空,則相當於沒有配置,采用默認方式顯示

       
CREATE OBJECT :event_handle.
       
"ALV按鈕注冊監聽事件
       
SET HANDLER :event_handle->handle_toolbar FOR grid_r,
                     event_handle
->handle_menu_button FOR grid_r,
                     event_handle
->handle_user_command FOR grid_r,
                     event_handle
->handle_double_click FOR grid_r.
       
"調用此方法才能激活工具欄上增加的自定義按鈕
       
CALL METHOD grid_r->set_toolbar_interactive.
     
ELSE.
       
CALL METHOD grid_r->refresh_table_display.
     
ENDIF.
 
ENDCASE.
ENDMODULE.

容器Container

SAP容器是連接着最終顯示控件(如ALV GridTreePictureTextEditSplitter)與屏幕區域的中間控件,在構造這些顯示控件前都需要創建相應的容器實例對象。目前容器控件有以下5種:

image078

CL_GUI_DOCKING_CONTAINER容器

上面程序中使用的是cl_gui_custom_container容器類,在使用該時,需要傳遞一個已經在屏幕上繪制好的用戶自定義控件區域Custom Control)中image064[1]

Docking容器最大特點是在代碼中可以動態創建容器,不需要像創建自定義容器CL_GUI_CUSTOM_CONTAINER那樣,在創建時需要將其綁定到一個預先繪制好的用戶自定義控件區域中,但是還是要先創建用戶對話屏幕,如:

image079

DATA: gt_fieldcat TYPE lvc_t_fcat WITH HEADER LINE.
DATA: gs_layout TYPE lvc_s_layo.
DATAgrid_r  TYPE  REF  TO  cl_gui_alv_grid ,
      container_r 
TYPE  REF  TO 
cl_gui_docking_container.

DATA:BEGIN OF gt_data OCCURS 0,
  val1
(40),
  val2
(40),
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-scrtext_l = &2.
   
append gt_fieldcat.
 
END-OF-DEFINITION.
  fill_fdcat
'VAL1' '1'.
  fill_fdcat
'VAL2' '2'.

 
CALL SCREEN 100.

FORM inital .
  gt_data
-val1 = 'cell1'.
  gt_data
-val2 = 'cell2'.
 
APPEND gt_data.
ENDFORM.
MODULE init_0100 OUTPUT.
 
CREATE  OBJECT    container_r"創建ALV容器對象,這里不需要與用戶自定義控件綁定
     
EXPORTING
        
    repid = sy-repid
             dynnr = sy-dynnr

             extension
= 300."ALV初始寬度
 
CREATE  OBJECT  grid_r"創建ALV控件
     
EXPORTING
        i_parent 
container_r.

 
CALL METHOD grid_r->set_table_for_first_display
   
EXPORTING

      is_layout      
= gs_layout
   
CHANGING

      it_outtab      
= gt_data[]
      it_fieldcatalog
= gt_fieldcat[].

ENDMODULE.

CL_GUI_SPLITTER_CONTAINER容器

SAP Splitter Container可以將屏幕區域划分成多個子區域,具有如下特性:

(1)它可以顯示在其他的container control

(2)它最大可以達到16 * 16 單元格

(3)可以在每個單元格中顯示其他的control

(4)Split bars可以移動或者固定

(5)可以通過程序來控制其高度和寬度

(6)可以顯示Frame

image080

DATA: gt_fieldcat TYPE lvc_t_fcat WITH HEADER LINE.
DATA: gs_layout TYPE lvc_s_layo.
DATA: grid_r  TYPE  REF  TO  cl_gui_alv_grid ,
      grid_r2 
TYPE  REF  TO  cl_gui_alv_grid ,
      container_r 
TYPE  REF  TO  cl_gui_docking_container,
      ref_splitter
TYPE REF TO  cl_gui_splitter_container,
      ref_cell 
TYPE REF TO  cl_gui_container.

DATA:BEGIN OF gt_data OCCURS 0,
  val1
(40),
  val2
(40),
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-scrtext_l = &2.
   
append gt_fieldcat.
 
END-OF-DEFINITION.
  fill_fdcat
'VAL1' '1'.
  fill_fdcat
'VAL2' '2'.

 
CALL SCREEN 100.

FORM inital .
  gt_data
-val1 = 'cell1'.
  gt_data
-val2 = 'cell2'.
 
APPEND gt_data.
ENDFORM.
MODULE init_0100 OUTPUT.
 
CREATE OBJECT container_r
   
EXPORTING

      repid    
= sy-repid
      dynnr    
= sy-
dynnr
      extension
= 300.


 
CREATE OBJECT ref_splitter
   
EXPORTING

      parent 
= container_r
     
rows    = 1"
將父容器分成兩個子容器
      columns
= 2.

 
"得到第一行第一列子容器
 
CALL METHOD ref_splitter->get_container
   
EXPORTING

      row      
= 1
      column   
= 1
    RECEIVING
      container
= ref_cell.

 
CREATE OBJECT grid_r"創建第一個ALV,並放在左邊子容器中
   
EXPORTING
      i_parent
= ref_cell.

 
CALL METHOD grid_r->set_table_for_first_display
   
EXPORTING

      is_layout      
= gs_layout
   
CHANGING

      it_outtab      
= gt_data[]
      it_fieldcatalog
= gt_fieldcat[].


  
"得到第一行第二列容器
 
CALL METHOD ref_splitter->get_container
   
EXPORTING

      row      
= 1
      column   
= 2
    RECEIVING
      container
= ref_cell.

 
CREATE OBJECT grid_r2 "創建第一個ALV,並放在右邊子容器中
   
EXPORTING
      i_parent
= ref_cell.

 
CALL METHOD grid_r2->set_table_for_first_display
   
EXPORTING

      is_layout      
= gs_layout
   
CHANGING

      it_outtab      
= gt_data[]
      it_fieldcatalog
= gt_fieldcat[].


ENDMODULE.

 

 

 

CL_GUI_ALV_GRID常用方法

get_current_cell( )方法

獲取鼠標所在網格中的位置,如果未選中任何單元格,則row值返回為0。這個方法會返回兩種索引,一個是網格的行列索引,另一個是輸入內表的行列索引,這是因為當設置隱藏字段時實際界面上顯示的順序與內表的不同,所以都返回了

image081

image082

get_frontend_layout( )方法

獲取現在設置的ALV GriD的布局

get_selected_cells( )方法

獲取所選的多個單元格

get_selected_columns( )方法

獲取所選的多列

get_selected_rows( )方法

獲取所選的多行

refresh_table_display( )方法

當輸出內表的數據更新后,需要使用此方法來刷新網格

image083

image084

set_frontend_layout( )方法

修改布局,調用此方法后還需調用refresh_table_display再生效

image085

CL_GUI_ALV_GRID常用事件

image086

image087

雙擊事件DOUBLE_CLICK

行的雙擊事件與下面的HOTSPOT_CLICK事件觸發時,回調的參數是一樣的

熱點單擊事件HOTSPOT_CLICK

某個字段的字段目錄HOTSPOT設置為"X",那么這個字段就可以接受單擊事件HOTSPOT_CLICK。這個HOTSPOT_CLICK 事件有三個參數,其中第一個參數"E_ROW_ID"已經作廢,另外2 個參數是:參考類型LVC_S_COL 定義的"E_COLUMN_ID",可以通過E_COLUMN_ID-FIELDNAME 來反映當前點擊的字段名定位哪列;參考類型LVC_S_ROID 定義的"ES_ROW_NO",可以通過ES_ROW_NO-ROW_ID 來反映當前點擊的行號,從而可以定位鼠標的位置(定位哪行)。

image088

FORM handle_hotspot_click USING i_row_id TYPE lvc_s_row
                                i_column_id
TYPE
lvc_s_col
                                is_row_no
TYPE lvc_s_roid.

 
READ TABLE gt_data INDEX is_row_no-rowid.
 
IF sy-subrc = 0 AND i_column_id-fieldname = 'XXX'.
   
...
 
ENDIF.
ENDFORM.

Toolbar加載事件TOOLBAR

可參考這里TOOLBAR事件

工具欄中下拉菜單加載事件menu_button

可參考這里的menu_button事件

用戶命令事件USER_COMMAND

可以參考這里的USER_COMMAND事件

覆蓋預設功能FunCodeBEFORE_USER_COMMAND

ALV 也給我們提供了修改標預置按鈕功能的機會,為了實現這個目的,我們需要在"before_user_command"事件中截取標准的功能,然后使用方法"set_user_command"來修改功能碼,這樣便可以指向自己定義的功能碼

FORM handle_before_user_command USING i_ucomm TYPE syucomm .
 
CASE e_ucomm .
   
WHEN '&INFO' .
     
CALL FUNCTION 'ZSFLIGHT_PROG_INFO' .
     
CALL METHOD gr_alvgrid->set_user_command
       
EXPORTING

          i_ucomm
= space.
 
ENDCASE .
ENDFORM .

數據變化事件data_changeddata_changed_finished

我們可以設置alv 處於可編輯狀態,當然ALV 也提供給我們控制數據的輸入。Alv grid有兩個事件:data_changedata_changed_finished.第一個事件在可編輯字段的數據發生變化時觸發,可用來檢查數據的輸入正確性,第二個事件是當數據修改完成后觸發

注:如果數據沒有被修改,當失去焦點或回車時(具體在失去焦點或回車是是否觸發,則要看是否通過REGISTER_EDIT_EVENT此方法注冊過這兩種觸發方式,見后面)那么它不會走data change,而是直接觸發data change finish事件

 

我們可以通過方式CL_GUI_ALV_GRID類的REGISTER_EDIT_EVENT方法來設置,如何觸發數據改變事件,2 種方式:

1.按回車觸發: i_event_id = cl_gui_alv_grid=>mc_event_enter

2.單元格失去焦點: i_event_id = cl_gui_alv_grid=>mc_event_modifies

必須設置一種方式,要不然數據變化事件不會被觸發事件

 

為了獲取ALV 中被修改字段的一些信息,DATA_CHANGED 事件會把參考CL_ALV_CHANGED_DATA_PROTOCOL實例通過參數ER_DATA_CHANGED傳遞給ALV,通過這個參數我們可以知道哪些單元格被修改了,修改了什么值,下面是類CL_ALV_CHANGED_DATA_PROTOCOL 的一些方法:

image089

Get_cell_value                        獲取單元格的值

Modify_cell                               修改單元格

Add_protocol_entry             增加日志記錄

Protocol_is_visible                 是否允許錯誤表可見

Refresh_protocol                            刷新日志記錄

另外,通過CL_ALV_CHANGED_DATA_PROTOCOL的實例屬性,

image090

通過上述一系列方式和屬性,可以獲取修改的值,從而進行一些輸入的檢查

FORM handle_data_changed USING ir_data_changed
                               
TYPE REF TO cl_alv_changed_data_protocol.

 
DATA: ls_mod_cell TYPE lvc_s_modi,
        lv_value
TYPE lvc_value.
 
SORT ir_data_changed->mt_mod_cells BY row_id."對發生改變所有單元格進行排序
 
"只對有過修改的 SEATSMAX 字段所對應單元格進行處理
 
LOOP AT ir_data_changed->mt_mod_cells INTO ls_mod_cell
                                       
WHERE fieldname = 'SEATSMAX'.

   
CALL METHOD ir_data_changed->get_cell_value"獲取單元格中的值
     
EXPORTING
        i_row_id   
= ls_mod_cell-row_id"行號
        i_fieldname
= 'CARRID'"要獲取的列的列名
     
IMPORTING
        e_value    
= lv_value."獲取到的單元格中的值
   
"進行關聯性驗證,即 SEATSMAX CARRID 兩個單元格中的值一起進行驗證
   
IF lv_value = 'THY' AND ls_mod_cell-value > '500'.
     
"如果驗證不通過,記錄錯誤消息日志
     
CALL METHOD ir_data_changed->add_protocol_entry
       
EXPORTING

          i_msgid    
= 'SU'
          i_msgno    
= '000'
          i_msgty    
= 'E'
          i_msgv1    
= 'This number can not exceed 500 for '
          i_msgv2    
= lv_value
          i_msgv3    
= 'The value is et to ''500'''

          i_fieldname
= ls_mod_cell-fieldname
          i_row_id   
= ls_mod_cell-rowid.

     
"然后將值修改回到500
     
CALL METHOD ir_data_changed->modify_cell
       
EXPORTING

          i_row_id   
= ls_mod_cell-row_id
          i_fieldname
= ls_mod_cell-
fieldname
          i_value    
= '500'.

   
ENDIF.
 
ENDLOOP.
ENDFORM.

拖入事件ONDRAGONDROP

 

按鈕點擊事件BUTTON_CLICK

image091

參數與HOTSPOT_CLICK事件后兩個參數是一樣的

首次顯示后更新FieldCatLayout

在很多時候,當報表第一次顯示出來后,有時后通過ALV工具欄中的布局按鈕,可能切換布局或已修改了布局,此時的字段目錄或Layout發生了變化,但可能需要在此基礎上做一些人為的手動修改,此時可以調用以下這些方法:

字段目錄 :   get_frontend_fieldcatalog

set_frontend_fieldcatalog

布局:               get_frontend_layout

set_frontend_layout

使用這些方法,在首次展示后,可以獲取這些內容,然后修改他們:

DATA ls_fcat TYPE lvc_s_fcat .
DATA lt_fcat TYPE lvc_t_fcat .
DATA ls_layout TYPE lvc_s_layo .
CALL METHOD gr_alvgrid->get_frontend_fieldcatalog
 
IMPORTING

    et_fieldcatalog
= lt_fcat[].
LOOP AT lt_fcat INTO ls_fcat .
 
IF ls_fcat-fieldname = 'PAYMENTSUM' .
    ls_fcat
-no_out = space .
   
MODIFY lt_fcat FROM ls_fcat .
 
ENDIF .
ENDLOOP .
CALL METHOD gr_alvgrid->set_frontend_fieldcatalog
 
EXPORTING

    it_fieldcatalog
= lt_fcat[].

CALL METHOD gr_alvgrid->get_frontend_layout
 
IMPORTING

    es_layout
= ls_layout.
ls_layout
-grid_title = 'Flights (with Payment Sums)' .
CALL METHOD gr_alvgrid->set_frontend_layout
 
EXPORTING

    is_layout
= ls_layout.

HTTP超鏈接

image092

DATA: gt_fieldcat TYPE lvc_t_fcat WITH HEADER LINE.
DATA: gs_layout TYPE lvc_s_layo.
DATAgrid_r  TYPE  REF  TO  cl_gui_alv_grid ,
      container_r 
TYPE  REF  TO  cl_gui_docking_container.

DATA:BEGIN OF gt_data OCCURS 0,
  val1
(40),"需要給此字段設置HTTP超鏈接
  val2
(40),
  "存儲VAL1字段的超鏈接所對應的鏈接值,由該字段的值來決定VAL1
  "
具體鏈接到哪個網址(即網址所對應的Key,這種映射關系是在后面lvc_t_hype內表中指定的),該字段一般不做顯示
  val1_link_val
TYPE int4,
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-scrtext_l = &2.
   
"VAL1列設置成HTTP超鏈接
   
if &1 = 'VAL1'.
     
"指定VAL1超鏈接所對應的鏈接值字段,這樣VAL1列就會自動成為超鏈接了
      gt_fieldcat
-web_field = 'VAL1_LINK_VAL'.
   
endif.
   
append gt_fieldcat.
 
END-OF-DEFINITION.
  fill_fdcat
'VAL1' '超鏈接列'.
  fill_fdcat
'VAL2' '2'.

 
CALL SCREEN 100.

FORM inital .
  gt_data
-val1 = '打開百度'.
  gt_data
-val2 = '百度'.
  gt_data
-val1_link_val = 1.
 
APPEND gt_data.
  gt_data
-val1 = '打開谷歌'.
  gt_data
-val2 = '谷歌'.
  gt_data
-val1_link_val = 2.
 
APPEND gt_data.

ENDFORM.
MODULE 100_pbo OUTPUT.
 
CREATE  OBJECT    container_r
     
EXPORTING

             repid
= sy-repid
             dynnr
= sy-
dynnr
             extension
= 300.

 
CREATE  OBJECT  grid_r
     
EXPORTING

        i_parent 
container_r.

 
"==========HTTP超鏈接
 
DATA ls_hype TYPE lvc_s_hype .
 
DATA lt_hype TYPE lvc_t_hype ."網址映射關系表,在具體鏈接到哪個網址就是根據 handle 中設定的值來獲取的
  ls_hype
-handle = 1 ."相當於HashMap中的Key
  ls_hype
-href = 'http://www.baidu.com' ."相當於HashMap中的Value
 
APPEND ls_hype TO lt_hype .
  ls_hype
-handle = 2 .
  ls_hype
-href = 'http://www.google.com' .
 
APPEND ls_hype TO lt_hype .


 
CALL METHOD grid_r->set_table_for_first_display
   
EXPORTING

      is_layout      
= gs_layout
      it_hyperlink   
=
lt_hype
   
CHANGING

      it_outtab      
= gt_data[]
      it_fieldcatalog
= gt_fieldcat[].

ENDMODULE.

下拉框

設置為下拉,和上面設置HTTP超級鏈接是類似的,也是使用了一個內表存放了KeyValue的鍵值對,這個表類型為LVC_T_DROP。不過傳遞給ALV 的方式有點區別:超級鏈接是通過方法SET_TABLE_FOR_FIRST_DISPLAY參數來傳遞的,而下拉的內表傳遞需要使用方法SET_DROP_DOWN_TABLE

image093image094


DATA: gt_fieldcat TYPE lvc_t_fcat WITH HEADER LINE.
DATA: gs_layout TYPE lvc_s_layo.
DATAgrid_r  TYPE  REF  TO  cl_gui_alv_grid ,
      container_r 
TYPE  REF  TO  cl_gui_docking_container.

DATA:BEGIN OF gt_data OCCURS 0,
  val1
(40),"需要將此字段設置為下拉框
  val2
(40),
 
"val1列的每個單元格中的下拉框中的值集所對應的句柄Key
 
"注:如果整列所有單元格的下拉框的值是一樣,則不需要附加下以字段
 
",而是直接通過 gt_fieldcat-drdn_hndl 設置下拉框所對應的句柄Key即可
  drop_down_handle
TYPE int4,
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-scrtext_l = &2.
   
"VAL1列設置成下拉框形式
   
if &1 = 'VAL1'.
     
"注:該設置是在整列所有單元下拉框值都是一樣的情況下,可以這樣設置
     
",如果每個單元格下拉框中的值不一樣,則需要使用后面 drdn_field來設置
     
"gt_fieldcat-drdn_hndl = '1' .
     
"設置下拉框值所對應的句柄Key列名。這里是假設每個單元格的下拉框值不
     
"一樣才有必要這樣設置,如果都有一樣,通過上面 drdn_hndl 簡單設置即
     
"可,也根本就不在輸出內表中再定義一個 drop_down_handle 列來存儲每個
     
"單元格值所對應的句柄Key
      gt_fieldcat
-drdn_field = 'DROP_DOWN_HANDLE' .
   
endif.
   
append gt_fieldcat.
 
END-OF-DEFINITION.
  fill_fdcat
'VAL1' '下拉框列'.
  fill_fdcat
'VAL2' '2'.

 
CALL SCREEN 100.

FORM inital .
  gt_data
-val1 = '1'.
  gt_data
-drop_down_handle = 1.
 
APPEND gt_data.
  gt_data
-val1 = '2'.
  gt_data
-drop_down_handle = 2.
 
APPEND gt_data.

ENDFORM.
MODULE 100_pbo OUTPUT.
 
CREATE OBJECT container_r
   
EXPORTING

      repid    
= sy-repid
      dynnr    
= sy-
dynnr
      extension
= 300.

 
CREATE OBJECT grid_r
   
EXPORTING

      i_parent
= container_r.

 
"==========下拉框中的值
 
DATA lt_ddval TYPE lvc_t_drop.
 
DATA ls_ddval TYPE lvc_s_drop.
 
"句柄Key,相同句柄Key的值為一個值集,即同屬於一個下拉框
  ls_ddval
-handle = '1' .
 
"出現在下拉框中的值。注:這里只有值,沒有Key,即這里的下拉框
 
"與以往的下拉框不同:值就是Keykey就是值(其實是可以做成有Key也有Value的下拉框的,請參考后面
  ls_ddval
-value = '1' .
 
APPEND ls_ddval TO lt_ddval .
  ls_ddval
-handle = '1' .
  ls_ddval
-value = '2' .
 
APPEND ls_ddval TO lt_ddval .

 
"上面設置了一個下拉框的值,下面再設置另外一個下拉框的值
  ls_ddval
-handle = '2' .
  ls_ddval
-value = '2' .
 
APPEND ls_ddval TO lt_ddval .
  ls_ddval
-handle = '2' .
  ls_ddval
-value = '3' .
 
APPEND ls_ddval TO lt_ddval .

 
CALL METHOD grid_r->set_drop_down_table
   
EXPORTING

      it_drop_down
= lt_ddval.

 
CALL METHOD grid_r->set_table_for_first_display
   
EXPORTING

      is_layout      
= gs_layout
   
CHANGING

      it_outtab      
= gt_data[]
      it_fieldcatalog
= gt_fieldcat[].

ENDMODULE.

Key-Value

上面設計的下拉框中沒有Key的概念,只有Value,其實是可以做成像以前HTML中下拉框那樣有Key也有Value

DATA: gt_fieldcat TYPE lvc_t_fcat WITH HEADER LINE.
DATA: gs_layout TYPE lvc_s_layo.
DATAgrid_r  TYPE  REF  TO  cl_gui_alv_grid ,
      container_r 
TYPE  REF  TO  cl_gui_docking_container.

DATA:BEGIN OF gt_data OCCURS 0,
  val1
(40),
  val2
(40),
  drop_down_handle
TYPE int4,
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-scrtext_l = &2.

   
if &1 = 'VAL1'.
      gt_fieldcat
-drdn_field = 'DROP_DOWN_HANDLE' .
     
"下拉框有Key,有也Value,如果不設置,則下拉框只有值,沒有Key(即
     
"與以往HTML
中的下拉框不一樣)
     gt_fieldcat-drdn_alias = 'X'.
   
endif.
   
append gt_fieldcat.
 
END-OF-DEFINITION.
  fill_fdcat
'VAL1' '下拉框列'.
  fill_fdcat
'VAL2' '2'.

 
CALL SCREEN 100.

FORM inital .
  gt_data
-val1 = '1'.
  gt_data
-drop_down_handle = 1.
 
APPEND gt_data.
  gt_data
-val1 = '2'.
  gt_data
-drop_down_handle = 2.
 
APPEND gt_data.

ENDFORM.
MODULE 100_pbo OUTPUT.
 
CREATE OBJECT container_r
   
EXPORTING

      repid    
= sy-repid
      dynnr    
= sy-
dynnr
      extension
= 300.

 
CREATE OBJECT grid_r
   
EXPORTING

      i_parent
= container_r.


 
DATA lt_ddval
TYPE lvc_t_dral.
 
DATA ls_ddval TYPE lvc_s_dral.

  ls_ddval
-handle = '1' .
  ls_ddval
-int_value = 'Key1' ."key
  ls_ddval
-value = '1' ."value
 
APPEND ls_ddval TO lt_ddval .
  ls_ddval
-handle = '1' .
  ls_ddval
-int_value = 'Key2' .
  ls_ddval
-value = '2' .
 
APPEND ls_ddval TO lt_ddval .

  ls_ddval
-handle = '2' ..
   ls_ddval
-int_value = 'Key2' .
  ls_ddval
-value = '2' .
 
APPEND ls_ddval TO lt_ddval .
  ls_ddval
-handle = '2' .
   ls_ddval
-int_value = 'Key3' .
  ls_ddval
-value = '3' .
 
APPEND ls_ddval TO lt_ddval .

 
CALL METHOD grid_r->set_drop_down_table
   
EXPORTING

     
it_drop_down_alias = lt_ddval.

 
CALL METHOD grid_r->set_table_for_first_display
   
EXPORTING

      is_layout      
= gs_layout
   
CHANGING

      it_outtab      
= gt_data[]
      it_fieldcatalog
= gt_fieldcat[].

ENDMODULE.

設置單元格的風格

單元格最終展現形式的style 可以在CL_GUI_ALV_GRID 的屬性中可以查到,分MC_STYLE4_LINKMC_STYLE4_LINK_NOMC_STYLE_BUTTONMC_STYLE_DISABLED....,包含單元格級別的可編輯/不可編輯,是否有F4,是否有鏈接,把單元格設置為按鈕,單元格級別的熱點......

單元格顯示為PushButton

要想實現這個功能,我們需要在數據輸出內表中要多增加一個字段,並參考表類型"LVC_T_STYL"

DATA: BEGIN OF gt_data OCCURS 0.
       
INCLUDE STRUCTURE sflight.

       
DATA cellstyles TYPE lvc_t_styl.
DATA END OF gt_data.

把需要設置為按鈕的字段填進內表字段中,如這里把第7 行的字段SEATSMAX 設置為按鈕:

DATA ls_style TYPE lvc_s_styl.
READ TABLE gt_data INDEX 7.
"需要對第7行的SEATSMAX列單元格樣式進行設置
ls_style
-fieldname = 'SEATSMAX'.
ls_style
-style = cl_gui_alv_grid=>mc_style_button."顯示成按鈕形式
APPEND ls_style TO gt_data
-cellstyles.
MODIFY gt_data INDEX 7.

最后在布局中指定對應的STYLE 輸出內表字段:

gs_layout-stylefname = 'CELLSTYLES'.

單元格中展示的按鈕點擊事件和按鈕事件BUTTON_CLICK類似,也是需要2 個參數來確定位置.

設置單元格級別的可編輯

單元格級別的可編輯和不可編輯是個非常有用的功能,在SAP 標准的一些事務中,經常可以看到這些方面的應用。通常用到的比較多的地方,是需要數據驗證的,比如輸入類型A,后面的某個字段才可以編輯,如果輸入了類型B,后面的這個字段就不可編輯

想讓一列(整列)可以編輯,我們可以在字段目錄中設置EDIT "X"。在可編輯的情況下,ALV 工具欄中會自動多出來幾個編輯按鈕:刪除、新增、插入、復制,如果你不需要它們,可以使用前面介紹的方法去掉它們

單元格級別的可編輯和不可編輯,實現起來和上面PushButton類似的,也是內表字段,參考表類型"LVC_T_STYL",不過填入的style 應該為CL_GUI_ALV_GRID=>MC_STYLE_ENABLED(可編輯)CL_GUI_ALV_GRID=>MC_STYLE_DISABLED(不可編輯)樣式:

FORM adjust_edittables USING pt_data LIKE gt_data[].
 
DATA ls_datarow LIKE LINE OF pt_data.
 
DATA ls_stylerow TYPE lvc_s_styl.
 
DATA lt_styletab TYPE lvc_t_styl.
 
LOOP AT pt_data INTO ls_datarow."pt_data為傳進來的數據輸出內表
   
IF ls_datarow-carrid = 'XY'.
      ls_stylerow
-fieldname = 'SEATSMAX'."需對哪列進行樣式設置
      ls_stylerow
-style = cl_alv_grid=>mc_style_disabled."樣式設置
     
APPEND ls_stylerow TO lt_styletab.
   
ENDIF.
   
IF ls_datarow-connid = '02'.
      ls_stylerow
-fieldname = 'PLANETYPE'.
      ls_stylerow
-style = cl_alv_grid=>mc_style_enabled.
     
APPEND ls_stylerow TO lt_styletab.
   
ENDIF.
   
INSERT LINES OF lt_styletab INTO ls_datarow-cellstyles.
   
MODIFY pt_data FROM ls_datarow.
 
ENDLOOP.
ENDFORM.

當然也是一樣,需要告訴ALV 哪個字段是控制STYLE 的內表字段:

gs_layout-stylefname = 'CELLSTYLES'.

 

一般情況下,單元格的設置會覆蓋整列的設置。如果想在程序里動態切換各種樣式,只需要修改內表里關於STYLE 字段的值然后刷新即可

另外,使用CL_GUI_ALV_GRID的方法set_ready_for_input傳入參數i_ready_for_input = 1 可以是ALV 進入編輯狀態,使用這個方法可以使ALV 在編輯和不可編輯模式之間切換。顯然如果把參數i_ready_for_input 設置為0 就進入不可編輯狀態。

當然還可以設置搜索幫助啊,等等,這里就不一一贅述了:

image095


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM