The ALV concept can also be applied several times on a single screen, for which a DYNPRO needs to be created. This example shows how that can be done for a simple screen with 2 custom containers.
ALV reports don't have a lot of disadvantages in comparison to classic reports. But I found one. The classic report can handle different line types in a single report. The solution can be quite simple: use 2 ALV overviews in a single screen. Stacked on top or side by side, the first report shows high level information and the second (right or bottom) reports details linked to a selected line from the main report.
The report source coding:
report ZDEMO_ALV_7_CUSTOM_CONTAINERS.
include ZABAPCADABRA_EASY_ALV.
class lcl_event_manager definition deferred.
data: gt_data type table of mara,
gw_data type mara,
gt_data2 type table of marc,
gv_okcode type syucomm,
* A custom container needs to be set up in a custom screen. This
* example has 2: top and bottom.
go_container_top type ref to cl_gui_custom_container,
go_container_bottom type ref to cl_gui_custom_container,
* 2 ALV references (again for the top and bottom)
go_alv_top type ref to lcl_easy_alv, "Define
go_salv_top type ref to cl_salv_table,
go_alv_bottom type ref to lcl_easy_alv, "Define
go_salv_bottom type ref to cl_salv_table,
go_event_man type ref to lcl_event_manager.
*-----------------------------------------------------------------------
* CLASS lcl_event_manager DEFINITION
*----------------------------------------------------------
* An example subclass for processing events
*----------------------------------------------------------
class lcl_event_manager definition.
public section.
methods: constructor importing r_object type ref to cl_salv_table,
on_link_click for event link_click of cl_salv_events_table
importing row column.
private section.
data: go_salv type ref to cl_salv_table.
endclass. "lcl_example_alv DEFINITION
*----------------------------------------------------------
* CLASS lcl_event_manager IMPLEMENTATION
*----------------------------------------------------------
* Allow response for double clicks and user commands (menu actions)
*----------------------------------------------------------
class lcl_event_manager implementation.
method constructor.
data: lo_events type ref to cl_salv_events_table.
go_salv = r_object.
lo_events = go_salv->get_event( ).
set handler on_link_click for lo_events.
endmethod. "preperation_control
method on_link_click.
read table gt_data index row into gw_data.
* Fetch fresh data
select * from marc up to 15 rows
into table gt_data2
where matnr = gw_data-matnr.
go_alv_bottom->display( refresh = abap_true ).
endmethod. "on_link_click
endclass. "lcl_example_alv IMPLEMENTATION
*----------------------------------------------------------
* Module STATUS_0900 OUTPUT
*----------------------------------------------------------
module status_0900 output.
set pf-status 'MAIN'. "<=your own menu, no ALV functionality here
if go_container_top is initial.
create object go_container_top
exporting
container_name = 'TOP_HALF'.
go_alv_top->set_alv_from_template(
exporting container = go_container_top
changing content = gt_data
salv_table = go_salv_top ).
create object go_event_man
exporting
r_object = go_salv_top.
go_alv_top->set_field( fieldname = 'MATNR'
is_hotspot = abap_true ).
go_alv_top->display( ).
endif.
if go_container_bottom is initial.
create object go_container_bottom
exporting
container_name = 'BOTTOM_HALF'.
go_alv_bottom->set_alv_from_template(
exporting container = go_container_bottom
title = 'Plants for the material'(001)
SKIP_VARIANT_SUPPORT = abap_true
changing content = gt_data2
salv_table = go_salv_bottom ).
go_alv_bottom->set_no_buttons( ).
go_alv_bottom->set_field( fieldname = 'MATNR'
is_key = abap_false is_hidden = abap_true ).
go_alv_bottom->display( ).
endif.
endmodule. " STATUS_0900 OUTPUT
*----------------------------------------------------------
* Module USER_COMMAND_0900 INPUT
*----------------------------------------------------------
module user_command_0900 input.
case gv_okcode.
when 'BACK'.
leave to screen 0.
endcase.
endmodule. " USER_COMMAND_0900 INPUT
*----------------------------------------------------------
start-of-selection.
* Compose simple set of test data:
select * from mara
up to 20 rows into table gt_data
where mtart = 'DIEN'.
read table gt_data index 1 into gw_data.
select * from marc up to 15 rows
into table gt_data2
where matnr = gw_data-matnr.
create object go_alv_top. "Create
create object go_alv_bottom. "Create
* Call the main screen, from which the ALV lists are controlled:
call screen 900.
The main screen for this example
Most of the demo's in the EASY ALV suite run by simply implementing a bit of coding, for this example however, an actual DYNPRO is required. Double click on the CALL SCREEN 900. line (on the "900") to create it.
Screen 900 is a simple screen with a very basic flow logic. The STATUS_0900 will prepare all the work and the USER_COMMAND_0900 module will provide a way out of the report.
process before output. module status_0900. process after input. module user_command_0900.
and also a very basic layout, custom control TOP_HALF and custom control BOTTOM_HALF. Custom controls can be created via the "Layout of screen" (screen painter), select Edit / Create element / Custom control. Select a star point and end point and make sure you use the names as described above.
The menu (pf-status)
Last but not least, there is a menu to be incorporated in the setup. Find the line SET PF-STATUS 'MAIN". and double click on it to create. Make sure you add a "way out" for your end user. In this demo, the BACK function is the only available function.
