Documentos de Académico
Documentos de Profesional
Documentos de Cultura
zalvtree.
*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
* 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 bseg.
* 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
* belnr and AUGDT 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
data: g_alv_tree type ref to cl_gui_alv_tree,
g_custom_container type ref to cl_gui_custom_container.
data: gt_bseg type bseg 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-subrc ne 0.
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'.
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_bseg' 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 = 'BSEG'
is_hierarchy_header = l_hierarchy_header
changing
it_outtab = gt_BSEG. "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.
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_BSEG type BSEG,
lt_BSEG type BSEG occurs 0,
l_yyyymm(6) type c, "year and month of BSEG-AUGDT
l_yyyymm_last(6) type c,
l_belnr like BSEG-BELNR,
l_BELNR_last like BSEG-BELNR.
data: l_month_key type lvc_nkey,
l_BELNR_key type lvc_nkey,
l_last_key type lvc_nkey.
* §4a. Select data
select * from BSEG into table lt_BSEG 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_BSEG by AUGDT+0(6) BELNR AUGDT+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_BSEG into ls_BSEG.
* 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_BSEG-AUGDT+0(6).
l_BELNR = ls_BSEG-BELNR.
* 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_BELNR_last.
endif.
* Carrier nodes:
* (always inserted as child of the last month
* which is identified by 'l_month_key')
if l_BELNR <> l_BELNR_last. "on change of l_BELNR
l_BELNR_last = l_BELNR.
perform add_BELNR_line using ls_BSEG
l_month_key
changing l_BELNR_key.
endif.
* Leaf:
* (always inserted as child of the last carrier
* which is identified by 'l_BELNR_key')
perform add_complete_line using ls_BSEG
l_BELNR_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_BSEG type BSEG,
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_BELNR_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_BSEG
importing
e_new_node_key = p_node_key.
endform. " add_month
*--------------------------------------------------------------------
form add_BELNR_line using ps_BSEG type BSEG
p_relat_key type lvc_nkey
changing p_node_key type lvc_nkey.
data: l_node_text type lvc_value,
ls_BSEG type BSEG.
* 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_BELNR_line'
* the leaf gets a child and thus ALV converts it to a folder
* automatically.
*
l_node_text = ps_BSEG-BELNR.
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_BSEG
importing
e_new_node_key = p_node_key.
endform. " add_BELNR_line
*&---------------------------------------------------------------------*
*& Form add_complete_line
*&---------------------------------------------------------------------*
form add_complete_line using ps_BSEG type BSEG
p_relat_key type lvc_nkey
changing p_node_key type lvc_nkey.
data: l_node_text type lvc_value.
write ps_BSEG-AUGDT 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_BSEG
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
*-----------------------------------------------------------------------