SAP TREE(轉)
導讀:
REPORT BCALV_TREE_01.
*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
* Purpose:
* ~~~~~~~~
* This report shows the essential steps to build up a hierarchy
* using an ALV Tree Control (class CL_GUI_ALV_TREE).
* Note that it is _not_ possible to build up this hierarchy
* using a simple ALV Tree Control (class CL_GUI_ALV_TREE_SIMPLE).
*-----------------------------------------------------------------
* To check program behavior
* ~~~~~~~~~~~~~~~~~~~~~~~~~
* Start this report. The hierarchy tree consists of nodes for each
* month on top level (this level can not be build by a simple ALV Tree
* because there is no field for months in our output table SFLIGHT.
* Thus, you can not define this hierarchy by sorting).
* Nor initial calculations neither a special layout has been applied
* (the lines on the right do not show anything).
* Note also that this example does not build up and change the
* fieldcatalog of the output table. For this reason, _all_ fields
* of the output table are shown in the columns although the fields
* CARRID and FLDATE are already placed in the tree on the left.
* (Of course, this is not a good style. See BCALV_TREE_02 on how to
* hide columns).
*-------------------------------------------------------------------
* Essential steps (Search for ')
* ~~~~~~~~~~~~~~~
* 1.Usual steps when using control technology.
* 1a. Define reference variables.
* 1b. Create ALV Tree Control and corresponding container.
*
* 2.Create Hierarchy-header
* 3.Create empty Tree Control
* 4.Create hierarchy (nodes and leaves)
* 4a. Select data
* 4b. Sort output table according to your conceived hierarchy
* 4c. Add data to tree
*
* 5.Send data to frontend.
* 6.Call dispatch to process toolbar functions
*
*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
* 1a. Define reference variables
* 定義關鍵使用的ALV的類.和自定義的容器
DATA: G_ALV_TREE TYPE REF TO CL_GUI_ALV_TREE,
G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
*定義輸出的表結構
DATA: GT_SFLIGHT TYPE SFLIGHT OCCURS 0, "Output-Table
OK_CODE LIKE SY-UCOMM,
SAVE_OK LIKE SY-UCOMM, "OK-Code
G_MAX TYPE I VALUE 255.
END-OF-SELECTION.
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Module PBO OUTPUT
*&---------------------------------------------------------------------*
* process before output
*----------------------------------------------------------------------*
MODULE PBO OUTPUT.
SET PF-STATUS 'MAIN100'.
SET TITLEBAR 'MAINTITLE'.
IF G_ALV_TREE IS INITIAL.
*初期化這個樹
PERFORM INIT_TREE.
CALL METHOD CL_GUI_CFW=>FLUSH
EXCEPTIONS
CNTL_SYSTEM_ERROR = 1
CNTL_ERROR = 2.
IF SY-SUBRCNE0.
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
TITEL = 'Automation Queue failure'(801)
TXT1 = 'Internal error:'(802)
TXT2 = 'A method in the automation queue'(803)
TXT3 = 'caused a failure.'(804).
ENDIF.
ENDIF.
ENDMODULE. "PBO OUTPUT
*&---------------------------------------------------------------------*
*& Module PAI INPUT
*&---------------------------------------------------------------------*
* process after input
*----------------------------------------------------------------------*
MODULE PAI INPUT.
SAVE_OK = OK_CODE.
CLEAR OK_CODE.
CASE SAVE_OK.
WHEN 'EXIT' OR 'BACK' OR 'CANC'.
PERFORM EXIT_PROGRAM.
WHEN OTHERS.
* 6. Call dispatch to process toolbar functions
CALL METHOD CL_GUI_CFW=>DISPATCH.
ENDCASE.
CALL METHOD CL_GUI_CFW=>FLUSH.
ENDMODULE. "PAI INPUT
*&---------------------------------------------------------------------*
*& Form init_tree
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*> FORM INIT_TREE.
* 1b. Create ALV Tree Control and corresponding Container.
* create container for alv-tree
DATA: L_TREE_CONTAINER_NAME(30) TYPE C.
L_TREE_CONTAINER_NAME = 'CCONTAINER1'.”這個已經在SCREEN1000中定義過了
CREATE OBJECT G_CUSTOM_CONTAINER
EXPORTING
CONTAINER_NAME = L_TREE_CONTAINER_NAME
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5.
IF SY-SUBRC <>0.
MESSAGE X208(00) WITH 'ERROR'(100).
ENDIF.
* create tree control
CREATE OBJECT G_ALV_TREE
EXPORTING
PARENT = G_CUSTOM_CONTAINER
NODE_SELECTION_MODE = CL_GUI_COLUMN_TREE=>NODE_SEL_MODE_SINGLE
ITEM_SELECTION = 'X'
NO_HTML_HEADER = 'X'
NO_TOOLBAR = '
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
ILLEGAL_NODE_SELECTION_MODE = 5
FAILED = 6
ILLEGAL_COLUMN_NAME = 7.
IF SY-SUBRC <>0.
MESSAGE X208(00) WITH 'ERROR'. "#EC NOTEXT
ENDIF.
* 2. Create Hierarchy-header
* The simple ALV Tree uses the text of the fields which were used
* for sorting to define this header. When you use
* the 'normal' ALV Tree the hierarchy is build up freely
* by the programmer this is not possible, so he has to define it
* himself.
DATA L_HIERARCHY_HEADER TYPE TREEV_HHDR.
PERFORM BUILD_HIERARCHY_HEADER CHANGING L_HIERARCHY_HEADER.
* 3. Create empty Tree Control
* IMPORTANT: Table 'gt_sflight' must be empty. Do not change this table
* (even after this method call). You can change data of your table
* by calling methods of CL_GUI_ALV_TREE.
* Furthermore, the output table 'gt_outtab' must be global and can
* only be used for one ALV Tree Control.
CALL METHOD G_ALV_TREE->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
I_STRUCTURE_NAME = 'SFLIGHT'
IS_HIERARCHY_HEADER = L_HIERARCHY_HEADER
CHANGING
IT_OUTTAB = GT_SFLIGHT. "table must be empty !
* 4. Create hierarchy (nodes and leaves)
PERFORM CREATE_HIERARCHY.
* 5. Send data to frontend.
CALL METHOD G_ALV_TREE->FRONTEND_UPDATE.
* wait for automatic flush at end of pbo
ENDFORM. "init_tree
*&---------------------------------------------------------------------*
*& Form build_hierarchy_header
*&---------------------------------------------------------------------*
* build hierarchy-header-information
*----------------------------------------------------------------------*
* -->P_L_HIERARCHY_HEADER strucxture for hierarchy-header
*----------------------------------------------------------------------*
FORM BUILD_HIERARCHY_HEADER CHANGING
P_HIERARCHY_HEADER TYPE TREEV_HHDR.
*建立TREE的標頭,下面是一些屬性
P_HIERARCHY_HEADER-HEADING = 'Month/Carrier/Date'(300).
P_HIERARCHY_HEADER-TOOLTIP = 'Flights in a month'(400).
P_HIERARCHY_HEADER-WIDTH = 30.
P_HIERARCHY_HEADER-WIDTH_PIX = ' '.
ENDFORM. "build_hierarchy_header
*&---------------------------------------------------------------------*
*& Form exit_program
*&---------------------------------------------------------------------*
* free object and leave program
*----------------------------------------------------------------------*
FORM EXIT_PROGRAM.
CALL METHOD G_CUSTOM_CONTAINER->FREE.
LEAVE PROGRAM.
ENDFORM. "exit_program
*&---------------------------------------------------------------------*
*& Form create_hierarchy
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*> FORM CREATE_HIERARCHY.
DATA: LS_SFLIGHT TYPE SFLIGHT,
LT_SFLIGHT TYPE SFLIGHT OCCURS 0,
L_YYYYMM(6) TYPE C, "year and month of sflight-fldate
L_YYYYMM_LAST(6) TYPE C,
L_CARRID LIKE SFLIGHT-CARRID,
L_CARRID_LAST LIKE SFLIGHT-CARRID.
DATA: L_MONTH_KEY TYPE LVC_NKEY,
L_CARRID_KEY TYPE LVC_NKEY,
L_LAST_KEY TYPE LVC_NKEY.
* 4a. Select data
SELECT * FROM SFLIGHT INTO TABLE LT_SFLIGHT UP TO G_MAX ROWS.
* 4b. Sort output table according to your conceived hierarchy
* We sort in this order:
* year and month (top level nodes, yyyymm of DATS)
* carrier id (next level)
* day of month (leaves, dd of DATS)
SORT LT_SFLIGHT BY FLDATE+0(6) CARRID FLDATE+6(2).
* Note: The top level nodes do not correspond to a field of the
* output table. Instead we use data of the table to invent another
* hierarchy level above the levels that can be build by sorting.
* 4c. Add data to tree
LOOP AT LT_SFLIGHT INTO LS_SFLIGHT.
* Prerequesite: The table is sorted.
* You add a node everytime the values of a sorted field changes.
* Finally, the complete line is added as a leaf below the last
* node.
L_YYYYMM = LS_SFLIGHT-FLDATE+0(6).
L_CARRID = LS_SFLIGHT-CARRID.
* Top level nodes:
IF L_YYYYMM <>L_YYYYMM_LAST. "on change of l_yyyymm
L_YYYYMM_LAST = L_YYYYMM.
*Providing no key means that the node is added on top level:
PERFORM ADD_MONTH USING L_YYYYMM
'
CHANGING L_MONTH_KEY.
* The month changed, thus, there is no predecessor carrier
CLEAR L_CARRID_LAST.
ENDIF.
* Carrier nodes:
* (always inserted as child of the last month
* which is identified by 'l_month_key')
IF L_CARRID <>L_CARRID_LAST. "on change of l_carrid
L_CARRID_LAST = L_CARRID.
PERFORM ADD_CARRID_LINE USING LS_SFLIGHT
L_MONTH_KEY
CHANGING L_CARRID_KEY.
ENDIF.
* Leaf:
* (always inserted as child of the last carrier
* which is identified by 'l_carrid_key')
PERFORM ADD_COMPLETE_LINE USING LS_SFLIGHT
L_CARRID_KEY
CHANGING L_LAST_KEY.
ENDLOOP.
ENDFORM. "create_hierarchy
*&---------------------------------------------------------------------*
*& Form add_month
* 這裏開始增加月份的的節點
*&---------------------------------------------------------------------*
FORM ADD_MONTH USING P_YYYYMM TYPE C
P_RELAT_KEY TYPE LVC_NKEY
CHANGING P_NODE_KEY TYPE LVC_NKEY.
DATA: L_NODE_TEXT TYPE LVC_VALUE,
LS_SFLIGHT TYPE SFLIGHT,
L_MONTH(15) TYPE C. "output string for month
* get month name for node text
PERFORM GET_MONTH USING P_YYYYMM
CHANGING L_MONTH.
L_NODE_TEXT = L_MONTH.
* add node:
* ALV Tree firstly inserts this node as a leaf if you do not provide
* IS_NODE_LAYOUT with field ISFOLDER set. In form 'add_carrid_line'
* the leaf gets a child and thus ALV converts it to a folder
* automatically.
*
CALL METHOD G_ALV_TREE->ADD_NODE
EXPORTING
I_RELAT_NODE_KEY = P_RELAT_KEY
I_RELATIONSHIP = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
I_NODE_TEXT = L_NODE_TEXT
IS_OUTTAB_LINE = LS_SFLIGHT
IMPORTING
E_NEW_NODE_KEY = P_NODE_KEY.
ENDFORM. "add_month
*--------------------------------------------------------------------
FORM ADD_CARRID_LINE USING PS_SFLIGHT TYPE SFLIGHT
P_RELAT_KEY TYPE LVC_NKEY
CHANGING P_NODE_KEY TYPE LVC_NKEY.
DATA: L_NODE_TEXT TYPE LVC_VALUE,
LS_SFLIGHT TYPE SFLIGHT.
* add node
* ALV Tree firstly inserts this node as a leaf if you do not provide
* IS_NODE_LAYOUT with field ISFOLDER set. In form 'add_carrid_line'
* the leaf gets a child and thus ALV converts it to a folder
* automatically.
*
L_NODE_TEXT = PS_SFLIGHT-CARRID.
CALL METHOD G_ALV_TREE->ADD_NODE
EXPORTING
I_RELAT_NODE_KEY = P_RELAT_KEY
I_RELATIONSHIP = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
I_NODE_TEXT = L_NODE_TEXT
IS_OUTTAB_LINE = LS_SFLIGHT
IMPORTING
E_NEW_NODE_KEY = P_NODE_KEY.
ENDFORM. "add_carrid_line
*&---------------------------------------------------------------------*
*& Form add_complete_line
*&---------------------------------------------------------------------*
FORM ADD_COMPLETE_LINE USING PS_SFLIGHT TYPE SFLIGHT
P_RELAT_KEY TYPE LVC_NKEY
CHANGING P_NODE_KEY TYPE LVC_NKEY.
DATA: L_NODE_TEXT TYPE LVC_VALUE.
WRITE PS_SFLIGHT-FLDATE TO L_NODE_TEXT MM/DD/YYYY.
* add leaf:
* ALV Tree firstly inserts this node as a leaf if you do not provide
* IS_NODE_LAYOUT with field ISFOLDER set.
* Since these nodes will never get children they stay leaves
* (as intended).
*
CALL METHOD G_ALV_TREE->ADD_NODE
EXPORTING
I_RELAT_NODE_KEY = P_RELAT_KEY
I_RELATIONSHIP = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
IS_OUTTAB_LINE = PS_SFLIGHT
I_NODE_TEXT = L_NODE_TEXT
IMPORTING
E_NEW_NODE_KEY = P_NODE_KEY.
ENDFORM. "add_complete_line
*&---------------------------------------------------------------------*
*& Form GET_MONTH
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_P_YYYYMM text
* <--P_L_MONTH text
*----------------------------------------------------------------------*> FORM GET_MONTH USING P_YYYYMM
CHANGING P_MONTH.
* Returns the name of month according to the digits in p_yyyymm
DATA: L_MONTHDIGITS(2) TYPE C.
L_MONTHDIGITS = P_YYYYMM+4(2).
CASE L_MONTHDIGITS.
WHEN '01'.
P_MONTH = 'January'(701).
WHEN '02'.
P_MONTH = 'February'(702).
WHEN '03'.
P_MONTH = 'March'(703).
WHEN '04'.
P_MONTH = 'April'(704).
WHEN '05'.
P_MONTH = 'May'(705).
WHEN '06'.
P_MONTH = 'June'(706).
WHEN '07'.
P_MONTH = 'July'(707).
WHEN '08'.
P_MONTH = 'August'(708).
WHEN '09'.
P_MONTH = 'September'(709).
WHEN '10'.
P_MONTH = 'October'(710).
WHEN '11'.
P_MONTH = 'November'(711).
WHEN '12'.
P_MONTH = 'December'(712).
ENDCASE.
CONCATENATE P_YYYYMM+0(4) '->' P_MONTH INTO P_MONTH.
ENDFORM. "GET_MONTH
*-----------------------------------------------------------------------
Example programTheme
SAPSIMPLE_TREE_CONTROL_DEMO Example of a simple tree
SAPTLIST_TREE_CONTROL_DEMO Example of a list tree
SAPCOLUMN_TREE_CONTROL_DEMO Example of a column tree
SAPSIMPLE_TREE_CONTEXT_MEN_DEM Example of context menus
SAPTLIST_TREE_CONTROL_DEMO_HDR Example of a context menu on headings in a SAP Tree
SAPSIMPLE_TREE_DRAG_DROP_DEMO Example of drag and drop
RSDEMO_DRAG_DROP_TREE_MULTI Example of drag and drop with multiple selection
RSDEMO_DRAG_DROP_EDIT_TREE Example of drag and drop between a SAP Tree and a SAP Textedit
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1729022
[收藏到我的網摘] [發送Trackback] LongSky發表於 2007年08月07日 10:43:00
本文轉自
http://blog.csdn.net/long2006sky/archive/2007/08/07/1729022.aspx
REPORT BCALV_TREE_01.
*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
* Purpose:
* ~~~~~~~~
* This report shows the essential steps to build up a hierarchy
* using an ALV Tree Control (class CL_GUI_ALV_TREE).
* Note that it is _not_ possible to build up this hierarchy
* using a simple ALV Tree Control (class CL_GUI_ALV_TREE_SIMPLE).
*-----------------------------------------------------------------
* To check program behavior
* ~~~~~~~~~~~~~~~~~~~~~~~~~
* Start this report. The hierarchy tree consists of nodes for each
* month on top level (this level can not be build by a simple ALV Tree
* because there is no field for months in our output table SFLIGHT.
* Thus, you can not define this hierarchy by sorting).
* Nor initial calculations neither a special layout has been applied
* (the lines on the right do not show anything).
* Note also that this example does not build up and change the
* fieldcatalog of the output table. For this reason, _all_ fields
* of the output table are shown in the columns although the fields
* CARRID and FLDATE are already placed in the tree on the left.
* (Of course, this is not a good style. See BCALV_TREE_02 on how to
* hide columns).
*-------------------------------------------------------------------
* Essential steps (Search for ')
* ~~~~~~~~~~~~~~~
* 1.Usual steps when using control technology.
* 1a. Define reference variables.
* 1b. Create ALV Tree Control and corresponding container.
*
* 2.Create Hierarchy-header
* 3.Create empty Tree Control
* 4.Create hierarchy (nodes and leaves)
* 4a. Select data
* 4b. Sort output table according to your conceived hierarchy
* 4c. Add data to tree
*
* 5.Send data to frontend.
* 6.Call dispatch to process toolbar functions
*
*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
* 1a. Define reference variables
* 定義關鍵使用的ALV的類.和自定義的容器
DATA: G_ALV_TREE TYPE REF TO CL_GUI_ALV_TREE,
G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
*定義輸出的表結構
DATA: GT_SFLIGHT TYPE SFLIGHT OCCURS 0, "Output-Table
OK_CODE LIKE SY-UCOMM,
SAVE_OK LIKE SY-UCOMM, "OK-Code
G_MAX TYPE I VALUE 255.
END-OF-SELECTION.
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Module PBO OUTPUT
*&---------------------------------------------------------------------*
* process before output
*----------------------------------------------------------------------*
MODULE PBO OUTPUT.
SET PF-STATUS 'MAIN100'.
SET TITLEBAR 'MAINTITLE'.
IF G_ALV_TREE IS INITIAL.
*初期化這個樹
PERFORM INIT_TREE.
CALL METHOD CL_GUI_CFW=>FLUSH
EXCEPTIONS
CNTL_SYSTEM_ERROR = 1
CNTL_ERROR = 2.
IF SY-SUBRCNE0.
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
TITEL = 'Automation Queue failure'(801)
TXT1 = 'Internal error:'(802)
TXT2 = 'A method in the automation queue'(803)
TXT3 = 'caused a failure.'(804).
ENDIF.
ENDIF.
ENDMODULE. "PBO OUTPUT
*&---------------------------------------------------------------------*
*& Module PAI INPUT
*&---------------------------------------------------------------------*
* process after input
*----------------------------------------------------------------------*
MODULE PAI INPUT.
SAVE_OK = OK_CODE.
CLEAR OK_CODE.
CASE SAVE_OK.
WHEN 'EXIT' OR 'BACK' OR 'CANC'.
PERFORM EXIT_PROGRAM.
WHEN OTHERS.
* 6. Call dispatch to process toolbar functions
CALL METHOD CL_GUI_CFW=>DISPATCH.
ENDCASE.
CALL METHOD CL_GUI_CFW=>FLUSH.
ENDMODULE. "PAI INPUT
*&---------------------------------------------------------------------*
*& Form init_tree
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*> FORM INIT_TREE.
* 1b. Create ALV Tree Control and corresponding Container.
* create container for alv-tree
DATA: L_TREE_CONTAINER_NAME(30) TYPE C.
L_TREE_CONTAINER_NAME = 'CCONTAINER1'.”這個已經在SCREEN1000中定義過了
CREATE OBJECT G_CUSTOM_CONTAINER
EXPORTING
CONTAINER_NAME = L_TREE_CONTAINER_NAME
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5.
IF SY-SUBRC <>0.
MESSAGE X208(00) WITH 'ERROR'(100).
ENDIF.
* create tree control
CREATE OBJECT G_ALV_TREE
EXPORTING
PARENT = G_CUSTOM_CONTAINER
NODE_SELECTION_MODE = CL_GUI_COLUMN_TREE=>NODE_SEL_MODE_SINGLE
ITEM_SELECTION = 'X'
NO_HTML_HEADER = 'X'
NO_TOOLBAR = '
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
ILLEGAL_NODE_SELECTION_MODE = 5
FAILED = 6
ILLEGAL_COLUMN_NAME = 7.
IF SY-SUBRC <>0.
MESSAGE X208(00) WITH 'ERROR'. "#EC NOTEXT
ENDIF.
* 2. Create Hierarchy-header
* The simple ALV Tree uses the text of the fields which were used
* for sorting to define this header. When you use
* the 'normal' ALV Tree the hierarchy is build up freely
* by the programmer this is not possible, so he has to define it
* himself.
DATA L_HIERARCHY_HEADER TYPE TREEV_HHDR.
PERFORM BUILD_HIERARCHY_HEADER CHANGING L_HIERARCHY_HEADER.
* 3. Create empty Tree Control
* IMPORTANT: Table 'gt_sflight' must be empty. Do not change this table
* (even after this method call). You can change data of your table
* by calling methods of CL_GUI_ALV_TREE.
* Furthermore, the output table 'gt_outtab' must be global and can
* only be used for one ALV Tree Control.
CALL METHOD G_ALV_TREE->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
I_STRUCTURE_NAME = 'SFLIGHT'
IS_HIERARCHY_HEADER = L_HIERARCHY_HEADER
CHANGING
IT_OUTTAB = GT_SFLIGHT. "table must be empty !
* 4. Create hierarchy (nodes and leaves)
PERFORM CREATE_HIERARCHY.
* 5. Send data to frontend.
CALL METHOD G_ALV_TREE->FRONTEND_UPDATE.
* wait for automatic flush at end of pbo
ENDFORM. "init_tree
*&---------------------------------------------------------------------*
*& Form build_hierarchy_header
*&---------------------------------------------------------------------*
* build hierarchy-header-information
*----------------------------------------------------------------------*
* -->P_L_HIERARCHY_HEADER strucxture for hierarchy-header
*----------------------------------------------------------------------*
FORM BUILD_HIERARCHY_HEADER CHANGING
P_HIERARCHY_HEADER TYPE TREEV_HHDR.
*建立TREE的標頭,下面是一些屬性
P_HIERARCHY_HEADER-HEADING = 'Month/Carrier/Date'(300).
P_HIERARCHY_HEADER-TOOLTIP = 'Flights in a month'(400).
P_HIERARCHY_HEADER-WIDTH = 30.
P_HIERARCHY_HEADER-WIDTH_PIX = ' '.
ENDFORM. "build_hierarchy_header
*&---------------------------------------------------------------------*
*& Form exit_program
*&---------------------------------------------------------------------*
* free object and leave program
*----------------------------------------------------------------------*
FORM EXIT_PROGRAM.
CALL METHOD G_CUSTOM_CONTAINER->FREE.
LEAVE PROGRAM.
ENDFORM. "exit_program
*&---------------------------------------------------------------------*
*& Form create_hierarchy
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*> FORM CREATE_HIERARCHY.
DATA: LS_SFLIGHT TYPE SFLIGHT,
LT_SFLIGHT TYPE SFLIGHT OCCURS 0,
L_YYYYMM(6) TYPE C, "year and month of sflight-fldate
L_YYYYMM_LAST(6) TYPE C,
L_CARRID LIKE SFLIGHT-CARRID,
L_CARRID_LAST LIKE SFLIGHT-CARRID.
DATA: L_MONTH_KEY TYPE LVC_NKEY,
L_CARRID_KEY TYPE LVC_NKEY,
L_LAST_KEY TYPE LVC_NKEY.
* 4a. Select data
SELECT * FROM SFLIGHT INTO TABLE LT_SFLIGHT UP TO G_MAX ROWS.
* 4b. Sort output table according to your conceived hierarchy
* We sort in this order:
* year and month (top level nodes, yyyymm of DATS)
* carrier id (next level)
* day of month (leaves, dd of DATS)
SORT LT_SFLIGHT BY FLDATE+0(6) CARRID FLDATE+6(2).
* Note: The top level nodes do not correspond to a field of the
* output table. Instead we use data of the table to invent another
* hierarchy level above the levels that can be build by sorting.
* 4c. Add data to tree
LOOP AT LT_SFLIGHT INTO LS_SFLIGHT.
* Prerequesite: The table is sorted.
* You add a node everytime the values of a sorted field changes.
* Finally, the complete line is added as a leaf below the last
* node.
L_YYYYMM = LS_SFLIGHT-FLDATE+0(6).
L_CARRID = LS_SFLIGHT-CARRID.
* Top level nodes:
IF L_YYYYMM <>L_YYYYMM_LAST. "on change of l_yyyymm
L_YYYYMM_LAST = L_YYYYMM.
*Providing no key means that the node is added on top level:
PERFORM ADD_MONTH USING L_YYYYMM
'
CHANGING L_MONTH_KEY.
* The month changed, thus, there is no predecessor carrier
CLEAR L_CARRID_LAST.
ENDIF.
* Carrier nodes:
* (always inserted as child of the last month
* which is identified by 'l_month_key')
IF L_CARRID <>L_CARRID_LAST. "on change of l_carrid
L_CARRID_LAST = L_CARRID.
PERFORM ADD_CARRID_LINE USING LS_SFLIGHT
L_MONTH_KEY
CHANGING L_CARRID_KEY.
ENDIF.
* Leaf:
* (always inserted as child of the last carrier
* which is identified by 'l_carrid_key')
PERFORM ADD_COMPLETE_LINE USING LS_SFLIGHT
L_CARRID_KEY
CHANGING L_LAST_KEY.
ENDLOOP.
ENDFORM. "create_hierarchy
*&---------------------------------------------------------------------*
*& Form add_month
* 這裏開始增加月份的的節點
*&---------------------------------------------------------------------*
FORM ADD_MONTH USING P_YYYYMM TYPE C
P_RELAT_KEY TYPE LVC_NKEY
CHANGING P_NODE_KEY TYPE LVC_NKEY.
DATA: L_NODE_TEXT TYPE LVC_VALUE,
LS_SFLIGHT TYPE SFLIGHT,
L_MONTH(15) TYPE C. "output string for month
* get month name for node text
PERFORM GET_MONTH USING P_YYYYMM
CHANGING L_MONTH.
L_NODE_TEXT = L_MONTH.
* add node:
* ALV Tree firstly inserts this node as a leaf if you do not provide
* IS_NODE_LAYOUT with field ISFOLDER set. In form 'add_carrid_line'
* the leaf gets a child and thus ALV converts it to a folder
* automatically.
*
CALL METHOD G_ALV_TREE->ADD_NODE
EXPORTING
I_RELAT_NODE_KEY = P_RELAT_KEY
I_RELATIONSHIP = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
I_NODE_TEXT = L_NODE_TEXT
IS_OUTTAB_LINE = LS_SFLIGHT
IMPORTING
E_NEW_NODE_KEY = P_NODE_KEY.
ENDFORM. "add_month
*--------------------------------------------------------------------
FORM ADD_CARRID_LINE USING PS_SFLIGHT TYPE SFLIGHT
P_RELAT_KEY TYPE LVC_NKEY
CHANGING P_NODE_KEY TYPE LVC_NKEY.
DATA: L_NODE_TEXT TYPE LVC_VALUE,
LS_SFLIGHT TYPE SFLIGHT.
* add node
* ALV Tree firstly inserts this node as a leaf if you do not provide
* IS_NODE_LAYOUT with field ISFOLDER set. In form 'add_carrid_line'
* the leaf gets a child and thus ALV converts it to a folder
* automatically.
*
L_NODE_TEXT = PS_SFLIGHT-CARRID.
CALL METHOD G_ALV_TREE->ADD_NODE
EXPORTING
I_RELAT_NODE_KEY = P_RELAT_KEY
I_RELATIONSHIP = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
I_NODE_TEXT = L_NODE_TEXT
IS_OUTTAB_LINE = LS_SFLIGHT
IMPORTING
E_NEW_NODE_KEY = P_NODE_KEY.
ENDFORM. "add_carrid_line
*&---------------------------------------------------------------------*
*& Form add_complete_line
*&---------------------------------------------------------------------*
FORM ADD_COMPLETE_LINE USING PS_SFLIGHT TYPE SFLIGHT
P_RELAT_KEY TYPE LVC_NKEY
CHANGING P_NODE_KEY TYPE LVC_NKEY.
DATA: L_NODE_TEXT TYPE LVC_VALUE.
WRITE PS_SFLIGHT-FLDATE TO L_NODE_TEXT MM/DD/YYYY.
* add leaf:
* ALV Tree firstly inserts this node as a leaf if you do not provide
* IS_NODE_LAYOUT with field ISFOLDER set.
* Since these nodes will never get children they stay leaves
* (as intended).
*
CALL METHOD G_ALV_TREE->ADD_NODE
EXPORTING
I_RELAT_NODE_KEY = P_RELAT_KEY
I_RELATIONSHIP = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
IS_OUTTAB_LINE = PS_SFLIGHT
I_NODE_TEXT = L_NODE_TEXT
IMPORTING
E_NEW_NODE_KEY = P_NODE_KEY.
ENDFORM. "add_complete_line
*&---------------------------------------------------------------------*
*& Form GET_MONTH
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_P_YYYYMM text
* <--P_L_MONTH text
*----------------------------------------------------------------------*> FORM GET_MONTH USING P_YYYYMM
CHANGING P_MONTH.
* Returns the name of month according to the digits in p_yyyymm
DATA: L_MONTHDIGITS(2) TYPE C.
L_MONTHDIGITS = P_YYYYMM+4(2).
CASE L_MONTHDIGITS.
WHEN '01'.
P_MONTH = 'January'(701).
WHEN '02'.
P_MONTH = 'February'(702).
WHEN '03'.
P_MONTH = 'March'(703).
WHEN '04'.
P_MONTH = 'April'(704).
WHEN '05'.
P_MONTH = 'May'(705).
WHEN '06'.
P_MONTH = 'June'(706).
WHEN '07'.
P_MONTH = 'July'(707).
WHEN '08'.
P_MONTH = 'August'(708).
WHEN '09'.
P_MONTH = 'September'(709).
WHEN '10'.
P_MONTH = 'October'(710).
WHEN '11'.
P_MONTH = 'November'(711).
WHEN '12'.
P_MONTH = 'December'(712).
ENDCASE.
CONCATENATE P_YYYYMM+0(4) '->' P_MONTH INTO P_MONTH.
ENDFORM. "GET_MONTH
*-----------------------------------------------------------------------
Example programTheme
SAPSIMPLE_TREE_CONTROL_DEMO Example of a simple tree
SAPTLIST_TREE_CONTROL_DEMO Example of a list tree
SAPCOLUMN_TREE_CONTROL_DEMO Example of a column tree
SAPSIMPLE_TREE_CONTEXT_MEN_DEM Example of context menus
SAPTLIST_TREE_CONTROL_DEMO_HDR Example of a context menu on headings in a SAP Tree
SAPSIMPLE_TREE_DRAG_DROP_DEMO Example of drag and drop
RSDEMO_DRAG_DROP_TREE_MULTI Example of drag and drop with multiple selection
RSDEMO_DRAG_DROP_EDIT_TREE Example of drag and drop between a SAP Tree and a SAP Textedit
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1729022
[收藏到我的網摘] [發送Trackback] LongSky發表於 2007年08月07日 10:43:00
本文轉自
http://blog.csdn.net/long2006sky/archive/2007/08/07/1729022.aspx
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.