Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

ALV Report to have two different Reports

Former Member
0 Kudos

Hi All,

I have a need to display two different reports for the same set of data selections, (Successful data and Error Data) in a Single ALV Layout using a Application tool bar Button. Does anyone have a sample code for this kind of requirement. Preferably using Objects.

Also, how can we check if an object is already created? In other words, how to check for a null reference?

Thanks in advance.

Jr.

1 ACCEPTED SOLUTION

Former Member
0 Kudos

Hi,

go for OOalv.create one screen and draw sub screen area in that.create two sub screens also.create containers on each sub screen and display the alv on those screens.maintain one variable to switch between the two alv s. when the application tool bar button is pressed change the variable status.

check the program BCALV_EDIT_O5 for help on OO alv.

<b>award if helpful.</b>

rgds,

bharat.

2 REPLIES 2

Former Member
0 Kudos

Hi,

go for OOalv.create one screen and draw sub screen area in that.create two sub screens also.create containers on each sub screen and display the alv on those screens.maintain one variable to switch between the two alv s. when the application tool bar button is pressed change the variable status.

check the program BCALV_EDIT_O5 for help on OO alv.

<b>award if helpful.</b>

rgds,

bharat.

Former Member
0 Kudos

Sample code for split alv using OOABAP.

this would help you in ur requirement.

go through this program where the screen is divided in two for two alv in different containers.

.

DATA: save_ok LIKE sy-ucomm,

g_container TYPE scrfname VALUE 'CC1',

g_grid TYPE REF TO cl_gui_alv_grid,

g_custom_container TYPE REF TO cl_gui_custom_container,

gt_fieldcat TYPE lvc_t_fcat,

g_max TYPE i VALUE 100.

  • declarations for top of page event

Data: gv_c_split type ref to cl_gui_splitter_container,

gv_c_ptv type ref to cl_gui_container,

gv_alv_ptv type ref to cl_gui_alv_grid,

o_dd_doc TYPE REF TO cl_dd_document,

text TYPE sdydo_text_element,

o_split type ref to cl_gui_easy_splitter_container,

o_top type ref to cl_gui_container,

o_bot type ref to cl_gui_container,

gv_c_vp type ref to cl_gui_container.

  • end of declaration for top of page.

CLASS lcl_event_receiver DEFINITION DEFERRED.

*class lcl_application_dc definition deferred.

DATA: o_event_receiver TYPE REF TO lcl_event_receiver.

  • g_dc type ref to lcl_application_dc.

DATA: gt_outtab TYPE TABLE OF sbook.

*----


*

  • CLASS lcl_event_receiver DEFINITION

*----


*

*

*----


*

CLASS lcl_event_receiver DEFINITION.

PUBLIC SECTION.

METHODS: handle_f4 FOR EVENT onf4 OF cl_gui_alv_grid

IMPORTING e_fieldname

es_row_no

er_event_data

et_bad_cells

e_display,

handle_top_of_page FOR EVENT top_of_page OF cl_gui_alv_grid

IMPORTING e_dyndoc_id.

METHODS: reset.

METHODS: show_f4.

PRIVATE SECTION.

**

  • attributes for creating an own F4-Help

  • (using a second ALV Grid Control

**

DATA: f4_grid TYPE REF TO cl_gui_alv_grid,

f4_custom_container TYPE REF TO cl_gui_custom_container.

TYPES: BEGIN OF ty_f4.

TYPES: value TYPE s_class.

TYPES: descr(20) TYPE c.

TYPES: END OF ty_f4.

DATA: f4_itab TYPE TABLE OF ty_f4.

DATA: f4_fieldcatalog TYPE lvc_t_fcat.

**

  • attributes to store event parameters

  • (after the CALL SCREEN command, the event parameters

  • are not accessible)

**

TYPES: BEGIN OF onf4_event_parameters_type.

TYPES: c_fieldname TYPE lvc_fname.

TYPES: cs_row_no TYPE lvc_s_roid.

TYPES: cr_event_data TYPE REF TO cl_alv_event_data.

TYPES: ct_bad_cells TYPE lvc_t_modi.

TYPES: c_display TYPE char01.

TYPES: END OF onf4_event_parameters_type.

DATA: f4_params TYPE onf4_event_parameters_type.

**

  • Methods to create own F4-Help

  • (This is done using a second ALV Grid Control)

**

METHODS: init_f4.

METHODS: build_fieldcatalog.

METHODS: fill_f4_itab .

METHODS: on_double_click FOR EVENT double_click OF cl_gui_alv_grid

IMPORTING es_row_no.

ENDCLASS. "lcl_application_f4 DEFINITION

*----


*

  • CLASS lcl_event_receiver IMPLEMENTATION

*----


*

*

*----


*

CLASS lcl_event_receiver IMPLEMENTATION.

*§2. Implement an event handler method for event ONF4.

METHOD handle_f4.

  • Save event parameter as global attributes of this class

  • (maybe solved differently if you use a function module!)

f4_params-c_fieldname = e_fieldname.

f4_params-cs_row_no = es_row_no.

f4_params-cr_event_data = er_event_data.

f4_params-ct_bad_cells = et_bad_cells.

f4_params-c_display = e_display.

*§3. Call your own f4 help. To customize your popup check

  • first if the cell is ready for input (event parameter E_DISPLAY).

  • (parameter E_DISPLAY is checked later in method on_double_click)

  • (Probably, you would call a function module at this point,

  • pass the needed event parameter and call the popup screen

  • within that function module. This is not done in this example

  • to avoid scattering its code).

CALL SCREEN 101 STARTING AT 10 10.

*§7. Inform the ALV Grid Control that an own f4 help has been processed

  • to suppress the standard f4 help.

er_event_data->m_event_handled = 'X'.

ENDMETHOD. "on_f4

*----

-


METHOD show_f4.

  • DATA: ls_outtab TYPE sbook.

  • initialize own f4 help if needed

IF f4_custom_container IS INITIAL.

CALL METHOD init_f4.

ENDIF.

CALL METHOD fill_f4_itab.

  • refresh list of values in f4 help and show it

CALL METHOD f4_grid->refresh_table_display.

  • CAUTION: Do not use method REFRESH_TABLE_DISPLAY for

  • your editable ALV Grid instances while handling events

  • DATA_CHANGED or ONf4. You would overwrite intermediate

  • values of your output table on frontend.

  • 'f4_grid' is a non-editable ALV Grid Control for the

  • application specific F4-Help. Therefore, calling

  • REFRESH_TABLE_DISPLAY for this instance has no

  • negative effect.

CALL METHOD cl_gui_cfw=>flush.

ENDMETHOD. "show_f4

*----

-


METHOD init_f4.

DATA: ls_f4_layout TYPE lvc_s_layo.

  • build fieldcatalog entries for f4

CALL METHOD build_fieldcatalog.

  • create controls

CREATE OBJECT f4_custom_container

EXPORTING container_name = 'CC_ONF4'.

CREATE OBJECT f4_grid

EXPORTING i_parent = f4_custom_container.

  • hide toolbar

ls_f4_layout-no_toolbar = 'X'.

CALL METHOD f4_grid->set_table_for_first_display

EXPORTING

is_layout = ls_f4_layout

CHANGING

it_fieldcatalog = f4_fieldcatalog

it_outtab = f4_itab.

  • register event double click on backend

SET HANDLER me->on_double_click FOR f4_grid.

  • flush since 'ls_layout' is local!

CALL METHOD cl_gui_cfw=>flush.

ENDMETHOD. "init_f4

*----

-


METHOD fill_f4_itab.

DATA ls_f4_itab TYPE ty_f4.

  • Delete all entries in f4_itab to determine

  • offered values dynamically

CLEAR f4_itab[].

ls_f4_itab-value = 'C'.

ls_f4_itab-descr = text-t03. "Business Class

APPEND ls_f4_itab TO f4_itab.

ls_f4_itab-value = 'Y'.

ls_f4_itab-descr = text-t04. "Economie Class

APPEND ls_f4_itab TO f4_itab.

ls_f4_itab-value = 'F'.

ls_f4_itab-descr = text-t05. "First Class

APPEND ls_f4_itab TO f4_itab.

ENDMETHOD. "fill_f4_itab

*----

-


METHOD build_fieldcatalog.

DATA: ls_fcat TYPE lvc_s_fcat.

CLEAR ls_fcat.

ls_fcat-fieldname = 'VALUE'.

ls_fcat-coltext = text-t02.

  • ls_fcat-inttype = 'S_CLASS'.

ls_fcat-outputlen = 5.

APPEND ls_fcat TO f4_fieldcatalog.

CLEAR ls_fcat.

ls_fcat-fieldname = 'DESCR'.

ls_fcat-coltext = text-t01.

ls_fcat-inttype = 'C'.

ls_fcat-outputlen = 20.

APPEND ls_fcat TO f4_fieldcatalog.

ENDMETHOD. "build_fieldcatalog

*----

-


METHOD on_double_click.

*§5. If not already caught by your own f4 help, check whether

  • the triggered cell was ready for input by using E_DISPLAY

  • and if not, exit.

IF f4_params-c_display EQ 'X'.

LEAVE SCREEN.

ENDIF.

*§6. After the user selected a value, pass it to the ALV Grid Control:

*§ 6a. Define a field symbol of type: LVC_T_MODI and a structure of

  • type LVC_S_MODI to pass the value later on.

FIELD-SYMBOLS TYPE lvc_t_modi.

DATA: ls_modi TYPE lvc_s_modi,

ls_f4_itab TYPE ty_f4.

*§ 6b. Dereference attribute M_DATA into your field symbol and add

  • the selected value to the table to which this symbol points to.

ASSIGN f4_params-cr_event_data->m_data->* TO .

LEAVE TO SCREEN 0.

ENDMETHOD. "on_double_click

*----

-


METHOD reset.

FIELD-SYMBOLS display_document

EXPORTING parent = o_top.

ENDMETHOD. "handle_top_of_page

ENDCLASS. "lcl_application_f4 IMPLEMENTATION

END-OF-SELECTION.

CALL SCREEN 100.

*----


*

  • MODULE PBO OUTPUT *

*----


*

MODULE pbo OUTPUT.

SET PF-STATUS 'MAIN100'.

SET TITLEBAR 'MAIN100'.

IF g_custom_container IS INITIAL.

PERFORM create_and_init_alv CHANGING gt_outtab[]

gt_fieldcat.

ENDIF.

ENDMODULE. "pbo OUTPUT

*----


*

  • MODULE PAI INPUT *

*----


*

MODULE pai INPUT.

save_ok = sy-ucomm.

CLEAR sy-ucomm.

CASE save_ok.

WHEN 'EXIT' OR 'BACK' OR 'CANCEL'.

PERFORM exit_program.

WHEN 'SWITCH'.

PERFORM switch_edit_mode.

WHEN OTHERS.

  • do nothing

ENDCASE.

ENDMODULE. "pai INPUT

*----


*

  • FORM EXIT_PROGRAM *

*----


*

FORM exit_program.

LEAVE PROGRAM.

ENDFORM. "exit_program

*&----


*

*& Form build_fieldcat

*&----


*

  • text

*----


*

  • -->PT_FIELDCAT text

*----


*

FORM build_fieldcat CHANGING pt_fieldcat TYPE lvc_t_fcat.

DATA ls_fcat TYPE lvc_s_fcat.

CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'

EXPORTING

i_structure_name = 'SBOOK'

CHANGING

ct_fieldcat = pt_fieldcat.

LOOP AT pt_fieldcat INTO ls_fcat.

  • Exchange smoker field with invoice field - just to

  • make the dependance between SMOKER and CLASS more transparent

  • (Smoking is only allowed in the first class).

IF ls_fcat-fieldname EQ 'SMOKER'.

ls_fcat-col_pos = 11.

ls_fcat-outputlen = 10.

ls_fcat-edit = 'X'.

  • Field 'checktable' is set to avoid shortdumps that are caused

  • by inconsistend data in check tables. You may comment this out

  • when the test data of the flight model is consistent in your system.

ls_fcat-checktable = '!'. "do not check foreign keys

MODIFY pt_fieldcat FROM ls_fcat.

ELSEIF ls_fcat-fieldname EQ 'INVOICE'.

ls_fcat-col_pos = 7.

MODIFY pt_fieldcat FROM ls_fcat.

ELSEIF ls_fcat-fieldname EQ 'CLASS'.

ls_fcat-edit = 'X'.

ls_fcat-outputlen = 5.

ls_fcat-checktable = '!'. "do not check foreign keys

MODIFY pt_fieldcat FROM ls_fcat.

ENDIF.

ENDLOOP.

ENDFORM. "build_fieldcat

*&----


*

*& Form create_and_init_alv

*&----


*

  • text

*----


*

  • -->PT_OUTTAB text

  • -->PT_FIELDCAT text

*----


*

FORM create_and_init_alv CHANGING pt_outtab TYPE STANDARD TABLE

pt_fieldcat TYPE lvc_t_fcat.

DATA: lt_exclude TYPE ui_functions,

ls_layout TYPE lvc_s_layo.

CREATE OBJECT g_custom_container

EXPORTING container_name = g_container.

  • CREATE OBJECT g_grid

  • EXPORTING i_parent = g_custom_container.

CREATE OBJECT gv_c_split

EXPORTING

  • link_dynnr = lv_dynnr

  • link_repid = lv_repid

parent = g_custom_container

rows = 2

columns = 1

EXCEPTIONS

cntl_error = 1

cntl_system_error = 2

others = 3 .

CALL METHOD gv_c_split->set_border

EXPORTING

border = space.

CALL METHOD gv_c_split->get_container

EXPORTING

row = 1

column = 1

RECEIVING

container = gv_c_ptv.

CALL METHOD gv_c_split->set_row_height

EXPORTING

id = 1

height = 20

EXCEPTIONS

cntl_error = 1

cntl_system_error = 2

OTHERS = 6 .

CALL METHOD gv_c_split->get_container

EXPORTING

row = 2

column = 1

RECEIVING

container = gv_c_vp .

CALL METHOD gv_c_split->set_row_height

EXPORTING

id = 2

height = 10

EXCEPTIONS

cntl_error = 1

cntl_system_error = 2

OTHERS = 3 .

CREATE OBJECT o_split

EXPORTING

parent = gv_c_ptv

with_border = 1

EXCEPTIONS

cntl_error = 1

cntl_system_error = 2

others = 3.

IF sy-subrc <> 0.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

o_top = o_split->top_left_container.

o_bot = o_split->bottom_right_container.

CREATE OBJECT gv_alv_ptv

EXPORTING

i_parent = o_bot

EXCEPTIONS

error_cntl_create = 1

error_cntl_init = 2

error_cntl_link = 3

error_dp_create = 4

others = 5 .

CREATE OBJECT g_grid

EXPORTING

i_parent = gv_c_vp

EXCEPTIONS

error_cntl_create = 1

error_cntl_init = 2

error_cntl_link = 3

error_dp_create = 4

others = 5 .

PERFORM build_fieldcat CHANGING pt_fieldcat.

  • Optionally restrict generic functions to 'change only'.

  • (The user shall not be able to add new lines).

PERFORM exclude_tb_functions CHANGING lt_exclude.

PERFORM build_data CHANGING pt_outtab.

ls_layout-grid_title = 'F4 help implemented for field CLASS'.

CREATE OBJECT o_event_receiver.

SET HANDLER o_event_receiver->handle_top_of_page FOR gv_alv_ptv.

SET HANDLER o_event_receiver->handle_top_of_page FOR g_grid.

CREATE OBJECT o_dd_doc EXPORTING style = 'ALV_GRID'

no_margins = 'X'.

CALL METHOD gv_alv_ptv->set_table_for_first_display

EXPORTING

is_layout = ls_layout

CHANGING

it_outtab = pt_outtab[]

it_fieldcatalog = pt_fieldcat

EXCEPTIONS

invalid_parameter_combination = 1

program_error = 2

too_many_lines = 3

OTHERS = 4.

CALL METHOD g_grid->set_table_for_first_display

EXPORTING

it_toolbar_excluding = lt_exclude

is_layout = ls_layout

CHANGING

it_fieldcatalog = pt_fieldcat

it_outtab = pt_outtab[].

CALL METHOD gv_alv_ptv->list_processing_events

EXPORTING

i_event_name = 'TOP_OF_PAGE'

i_dyndoc_id = o_dd_doc.

  • register f4 for field CLASS

PERFORM register_events.

  • Set editable cells to ready for input initially

CALL METHOD g_grid->set_ready_for_input

EXPORTING

i_ready_for_input = 1.

ENDFORM. "CREATE_AND_INIT_ALV

*&----


*

*& Form exclude_tb_functions

*&----


*

  • text

*----


*

  • -->PT_EXCLUDE text

*----


*

FORM exclude_tb_functions CHANGING pt_exclude TYPE ui_functions.

  • Only allow to change data not to create new entries (exclude

  • generic functions).

DATA ls_exclude TYPE ui_func.

ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row.

APPEND ls_exclude TO pt_exclude.

ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row.

APPEND ls_exclude TO pt_exclude.

ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row.

APPEND ls_exclude TO pt_exclude.

ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row.

APPEND ls_exclude TO pt_exclude.

ls_exclude = cl_gui_alv_grid=>mc_fc_loc_move_row.

APPEND ls_exclude TO pt_exclude.

ENDFORM. " EXCLUDE_TB_FUNCTIONS

*&----


*

*& Form build_data

*&----


*

  • text

*----


*

  • --> p1 text

  • <-- p2 text

*----


*

FORM build_data CHANGING pt_outtab TYPE STANDARD TABLE.

DATA: ls_sbook TYPE sbook,

l_index TYPE i.

SELECT * FROM sbook INTO TABLE gt_outtab UP TO g_max ROWS.

IF sy-subrc NE 0.

PERFORM generate_entries CHANGING pt_outtab.

ENDIF.

LOOP AT pt_outtab INTO ls_sbook.

l_index = sy-tabix.

CLEAR ls_sbook-class.

  • Alternate between smoker and non smoker to make

  • it more obvious what this example is about

l_index = l_index MOD 2.

IF l_index EQ 1.

ls_sbook-smoker = 'X'.

ELSE.

ls_sbook-smoker = ' '.

ENDIF.

MODIFY pt_outtab FROM ls_sbook.

ENDLOOP.

ENDFORM. " build_data

*&----


*

*& Form generate_entries

*&----


*

  • text

*----


*

  • -->PT_SBOOK text

*----


*

FORM generate_entries CHANGING pt_sbook TYPE STANDARD TABLE.

DATA: ls_sbook TYPE sbook,

l_month(2) TYPE c,

l_day(2) TYPE c,

l_date(8) TYPE c,

l_prebookid TYPE i.

ls_sbook-carrid = 'LH'.

ls_sbook-connid = '0400'.

ls_sbook-forcurkey = 'DEM'.

ls_sbook-loccurkey = 'USD'.

ls_sbook-custtype = 'B'.

DO 110 TIMES.

l_prebookid = sy-index.

ls_sbook-forcuram = sy-index * 10.

ls_sbook-loccuram = ls_sbook-loccuram * 2.

ls_sbook-customid = sy-index.

ls_sbook-counter = 18.

ls_sbook-agencynum = 11.

l_month = sy-index / 10 + 1.

DO 2 TIMES.

l_day = 3 + l_month + sy-index * 2.

l_date+0(4) = '2000'.

l_date+4(2) = l_month.

l_date+6(2) = l_day.

ls_sbook-fldate = l_date.

SUBTRACT 3 FROM l_day.

ls_sbook-order_date+0(6) = l_date+0(6).

ls_sbook-order_date+6(2) = l_day.

ls_sbook-bookid = l_prebookid * 2 + sy-index.

IF sy-index EQ 1.

ls_sbook-smoker = 'X'.

ELSE.

ls_sbook-smoker = space.

ENDIF.

ls_sbook-luggweight = l_prebookid * 10.

IF ls_sbook-luggweight GE 1000.

ls_sbook-wunit = 'G'.

ls_sbook-class = 'C'.

ELSE.

ls_sbook-wunit = 'KG'.

ls_sbook-class = 'Y'.

ENDIF.

IF ls_sbook-bookid > 40 AND ls_sbook-wunit EQ 'KG'.

ls_sbook-invoice = 'X'.

ENDIF.

IF ls_sbook-bookid EQ 2.

ls_sbook-cancelled = 'X'.

ls_sbook-class = 'F'.

ENDIF.

APPEND ls_sbook TO pt_sbook.

ENDDO.

ENDDO.

ENDFORM. " generate_entries

*&----


*

*& Form register_events

*&----


*

  • text

*----


*

FORM register_events.

*§1. Register event ONF4 at frontend using method

  • register_f4_for_fields. For this purpose, you pass a table

  • with all fields, for which you want to implement your own

  • f4 help.

  • remark: If you want to use an own f4 help for fields where

  • no standard f4 help exists set field F4AVAILABL for

  • this field in the fieldcatalog.

DATA: lt_f4 TYPE lvc_t_f4 WITH HEADER LINE.

CLEAR lt_f4.

lt_f4-fieldname = 'CLASS'.

  • If you would like to deregister the field again,

  • pass value SPACE with field 'register'.

lt_f4-register = 'X'.

*§ 1b. If the value range in your f4 help depends on other

  • values of cells that are input enabled, set the

  • GETBEFORE parameter.

  • The consequence is that the ALV Grid Control raises

  • event DATA_CHANGED before the f4 help is called to

  • check values that the f4 help depends on.

lt_f4-getbefore = 'X'.

  • The next parameter is used to change values after onf4 has

  • been processed. The ALV Grid Control will raise

  • event DATA_CHANGED afterwards, if you set it.

lt_f4-chngeafter = space.

INSERT TABLE lt_f4.

CALL METHOD g_grid->register_f4_for_fields

EXPORTING

it_f4 = lt_f4[].

  • register events for abap objects (backend)

SET HANDLER o_event_receiver->handle_f4 FOR g_grid.

ENDFORM. " register_events

*----


*

  • MODULE status_0101 OUTPUT

*----


*

*

*----


*

MODULE status_0101 OUTPUT.

SET PF-STATUS 'POPUP'.

SET TITLEBAR 'POPUP'.

CALL METHOD o_event_receiver->show_f4.

ENDMODULE. " STATUS_0101 OUTPUT

*&----


*

*& Module USER_COMMAND_0101 INPUT

*&----


*

  • text

*----


*

MODULE user_command_0101 INPUT.

PERFORM user_command.

ENDMODULE. " USER_COMMAND_0101 INPUT

*&----


*

*& Form user_command

*&----


*

  • text

*----


*

FORM user_command.

DATA: save_ok TYPE sy-ucomm.

save_ok = sy-ucomm.

CLEAR sy-ucomm.

CASE save_ok.

WHEN 'CANCEL'.

CALL METHOD o_event_receiver->reset.

LEAVE TO SCREEN 0.

ENDCASE.

ENDFORM. "user_command

*&----


*

*& Form switch_edit_mode

*&----


*

  • text

*----


*

FORM switch_edit_mode.

IF g_grid->is_ready_for_input( ) EQ 0.

  • set edit enabled cells ready for input

CALL METHOD g_grid->set_ready_for_input

EXPORTING

i_ready_for_input = 1.

ELSE.

  • lock edit enabled cells against input

CALL METHOD g_grid->set_ready_for_input

EXPORTING

i_ready_for_input = 0.

ENDIF.

ENDFORM. "switch_edit_mode