OO ALV
EnjoySAP Controls and CFW
EnjoySAP Control是SAP提供的基於OO架構的UI技術。CFW:Control Framework
現在在SAP中,在傳統的ABAP中,我們可以“畫”出很多自己的screen element,如input field、button、table、tabstrip、Table 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 server(GUI).它的處理邏輯簡單可以使用以下的截圖來表示:
這里說明一下:
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存在。
* default是imode;另外在創建時,要注意,instance只需創建一個,防止每次觸發PBO時又創建instance
3.關於使用EnjoySAP Control時的數據傳輸
使用這些control時,在傳遞數據時,不同於一般的dialog程序是整體性地傳遞(例如一個screen中的所有input field會一次性進行交互),而這些control卻是在“需要”的情況下才傳遞,例如只需要改變picture的長寬高等;所以,為了提高performance,在CFW中使用Automation Queue是flushed.
通常,當我們調用這些control的method或者讀取它們的attribute時,這些操作會被buffer在CFW 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(特別有用的是:當我們的screen是compound(復和的)的,因為在Flush一般發生在PBO事件的結束,如果我們的第二個Instance method需要dependent 第一個instance method,因為沒有flush)
4.關於使用EnjoySAP Control時的Event機制
在處理上, GUI上的control有很多的event,通過automation handler與CFW 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 control與HTML 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 選擇模式(A,B,C,D,SPACE)
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_outtab、is_layout 參數傳遞給REUSE_ALV_GRID_DISPLAY函數。其實通過面向對象的方式生成ALV時,基本上也是一樣,先也要准備這些信息,然后通過CL_GUI_ALV_GRID類的實例方法set_table_for_first_display的相關參數傳遞進去,即可生成ALV
CL_GUI_ALV_GRID的set_table_for_first_dispaly ()方法參數與函數REUSE_ALV_GRID_DISPLAY參數類似,其作用都是一樣:生產ALV:
參數 含義
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 進行查看
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 Control)中
為基礎來創建:所以創建ALV之前先需要創建用戶對話屏幕,再在屏幕上繪制一個用戶自定義控件區域,然后該用戶自定義控件區域為基礎來創建CL_GUI_CUSTOM_CONTAINER容器實例,最后以此容器實例來創建CL_GUI_ALV_GRID實例即可。用戶自定義控件區域、容器、ALV控件三都之間的關系如下:
在創建容器對象實例時,其構造方法有一個必傳參數CONTAINER_NAME,它的值就是屏幕上繪制的“用戶自定義控件區域(Custom Control)”的控件的名稱:
當容器實例創建好以后,CL_GUI_ALV_GRID再以此容器對象為參數實例化,即可得到CL_GUI_ALV_GRID對象,最后再調用CL_GUI_ALV_GRID實例對象的set_table_for_first_display方法來生成ALV報表,CL_GUI_ALV_GRID的重要方法如下:
1、 構造函數Constructor( ):必傳參數“I_parent”,容器對象引用,即需要將ALV顯示在在哪容器中
2、 生成表報set_table_for_first_display( ):產生ALV報表,與REUSE_ALV_GRID_DISPLAY函數的作用一樣,參數也大體相同
3、 刷新報表refresh_table_display( ):刷新並重新顯示ALV,當輸出內表數據變更、或其他ALV設置變化時,可以調用此方法重新顯示ALV
實例:帶查詢條件、行顏色、事件
一、創建對話屏幕
由於ALV沒有專門實現的控件,需要先在對話屏幕100上增加一個用戶自定義控件區域(Custom Control),名為CONTAINER_1:
二、新增子屏幕區域,嵌入查詢條件
將查詢條件放在100對話屏幕中的子屏幕101上,所以需要在100屏幕上增加一個子屏幕區域
,用來存放子屏幕:
注:這里我們並沒有直接創建出101子屏幕,而是通過ABAP程序來創建的子屏幕,具體請看程序。
子屏幕的詳細使用可參考《User Dialogs.docx》文檔中的“對話屏幕(Dynpro Screen)->復合屏幕元素->子屏幕Subscreens”章節
三、創建Gui Status,新增查詢按鈕
還為100對話屏幕增加一個“查詢”按鈕,用於條件查詢:
四、在ALV工具欄中新增自定義按鈕
ALV控件會自帶一組工具按鈕,如果要在工具欄上加上按鈕,則需要使用STB_BUTTON結構,該結構的字段介紹如下:
具體作法請參見程序
五、程序代碼設計
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."定義類對象的引用
DATA: grid_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 Grid、Tree、Picture、TextEdit、Splitter)與屏幕區域的中間控件,在構造這些顯示控件前都需要創建相應的容器實例對象。目前容器控件有以下5種:
CL_GUI_DOCKING_CONTAINER容器
上面程序中使用的是cl_gui_custom_container容器類,在使用該時,需要傳遞一個已經在屏幕上繪制好的用戶自定義控件區域(Custom Control)中
,
Docking容器最大特點是在代碼中可以動態創建容器,不需要像創建自定義容器CL_GUI_CUSTOM_CONTAINER那樣,在創建時需要將其綁定到一個預先繪制好的用戶自定義控件區域中,但是還是要先創建用戶對話屏幕,如:
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 ,
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
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。這個方法會返回兩種索引,一個是網格的行列索引,另一個是輸入內表的行列索引,這是因為當設置隱藏字段時實際界面上顯示的順序與內表的不同,所以都返回了
get_frontend_layout( )方法
獲取現在設置的ALV GriD的布局
get_selected_cells( )方法
獲取所選的多個單元格
get_selected_columns( )方法
獲取所選的多列
get_selected_rows( )方法
獲取所選的多行
refresh_table_display( )方法
當輸出內表的數據更新后,需要使用此方法來刷新網格
set_frontend_layout( )方法
修改布局,調用此方法后還需調用refresh_table_display再生效
CL_GUI_ALV_GRID常用事件
雙擊事件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 來反映當前點擊的行號,從而可以定位鼠標的位置(定位哪行)。
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
工具欄中下拉菜單加載事件menu_button
用戶命令事件USER_COMMAND、
覆蓋預設功能FunCode:BEFORE_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_changed、data_changed_finished
我們可以設置alv 處於可編輯狀態,當然ALV 也提供給我們控制數據的輸入。Alv grid有兩個事件:data_changed和ata_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 的一些方法:
Get_cell_value 獲取單元格的值
Modify_cell 修改單元格
Add_protocol_entry 增加日志記錄
Protocol_is_visible 是否允許錯誤表可見
Refresh_protocol 刷新日志記錄
另外,通過CL_ALV_CHANGED_DATA_PROTOCOL的實例屬性,
通過上述一系列方式和屬性,可以獲取修改的值,從而進行一些輸入的檢查
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.
拖入事件ONDRAG、ONDROP
按鈕點擊事件BUTTON_CLICK
參數與HOTSPOT_CLICK事件后兩個參數是一樣的
首次顯示后更新FieldCat、Layout
在很多時候,當報表第一次顯示出來后,有時后通過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超鏈接
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 ,
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超級鏈接是類似的,也是使用了一個內表存放了Key和Value的鍵值對,這個表類型為LVC_T_DROP。不過傳遞給ALV 的方式有點區別:超級鏈接是通過方法SET_TABLE_FOR_FIRST_DISPLAY的參數來傳遞的,而下拉的內表傳遞需要使用方法SET_DROP_DOWN_TABLE
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 ,
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,即這里的下拉框
"與以往的下拉框不同:值就是Key,key就是值(其實是可以做成有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.
DATA: grid_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_LINK、MC_STYLE4_LINK_NO、MC_STYLE_BUTTON、MC_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 就進入不可編輯狀態。
當然還可以設置搜索幫助啊,等等,這里就不一一贅述了:



































