Skip to Content
0
Mar 13, 2013 at 01:57 PM

Custom button in WD-ALV for inserting a new editable row

248 Views

Hi,

I am in doubt about how to proceed with an ALV component in my view. I have arranged it in my WDDONINT that after a search for data only 2 of the 3 fields are allowed to be edited.

However, I have declared a custom button for Insert Line, which is to be used for inserting a new row where all 3 fields are to be editable.

Will I have to create an event handler for INSLIN function with an insert of a new line ?

The ALV will then have to contain both existing records with display only for the first field and new records that are to be inserted using the Insert Line button. Is that possible ?

The code for WDDOINIT is below:

METHOD wddoinit.



********************************************************

* Add toolbar for functionality (INSERT, DELETE etc.)

* and

* Set table fields Editable for start and end date

********************************************************





DATA : lt_columns TYPE salv_wd_t_column_ref,

ls_columns TYPE salv_wd_s_column_ref.

DATA lo_cmp_usage TYPE REF TO if_wd_component_usage.



* Declarations for additional button for insert new line



DATA: lr_cmp_usage TYPE REF TO if_wd_component_usage.

DATA: lr_intf_alv TYPE REF TO iwci_salv_wd_table.



**



lo_cmp_usage = wd_this->wd_cpuse_alv_test( ).

IF lo_cmp_usage->has_active_component( ) IS INITIAL.

lo_cmp_usage->create_component( ).

ENDIF.



DATA lo_interfacecontroller TYPE REF TO iwci_salv_wd_table .

lo_interfacecontroller = wd_this->wd_cpifc_alv_test( ).



DATA lv_value TYPE REF TO cl_salv_wd_config_table.

lv_value = lo_interfacecontroller->get_model(

).



* set header text for the table view



DATA: lr_table_settings TYPE REF TO if_salv_wd_table_settings.

DATA: lr_header TYPE REF TO cl_salv_wd_header. lr_table_settings ?= lv_value.



lr_header = lr_table_settings->get_header( ). lr_header->set_text( 'Assignment of WBS to consultants' ).



CALL METHOD lv_value->if_salv_wd_column_settings~get_columns

RECEIVING

value = lt_columns.



DATA: lo_sdatum TYPE REF TO cl_salv_wd_uie_input_field.

DATA: lo_edatum TYPE REF TO cl_salv_wd_uie_input_field.



* Open required fields in existing records for editing



LOOP AT lt_columns INTO ls_columns.

CASE ls_columns-id.

WHEN 'SDATUM'.

CREATE OBJECT lo_sdatum

EXPORTING

value_fieldname = ls_columns-id.

ls_columns-r_column->set_cell_editor( lo_sdatum ).



WHEN 'EDATUM'.

CREATE OBJECT lo_edatum

EXPORTING

value_fieldname = ls_columns-id.

ls_columns-r_column->set_cell_editor( lo_edatum ).

ENDCASE.



ENDLOOP.



CALL METHOD lv_value->if_salv_wd_table_settings~set_read_only

EXPORTING

value = abap_false.



***************

** Add button for insert line

***************



DATA: l_ref_cmp_usage TYPE REF TO if_wd_component_usage.



l_ref_cmp_usage = wd_this->wd_cpuse_alv_test( ).

IF l_ref_cmp_usage->has_active_component( ) IS INITIAL.

l_ref_cmp_usage->create_component( ).

ENDIF.



*Call Get_model() of Interface Controller to set changes to the output

*table



DATA: l_ref_interfacecontroller TYPE REF TO iwci_salv_wd_table .

l_ref_interfacecontroller = wd_this->wd_cpifc_alv_test( ).

DATA:

l_value TYPE REF TO cl_salv_wd_config_table.



l_value = l_ref_interfacecontroller->get_model(

).



* Hide not needed buttons on standard toolbar



lv_value->if_salv_wd_std_functions~set_export_allowed( abap_false ).

lv_value->if_salv_wd_std_functions~set_edit_append_row_allowed( abap_false ).

lv_value->if_salv_wd_std_functions~set_edit_insert_row_allowed( abap_false ).

lv_value->if_salv_wd_std_functions~set_edit_delete_row_allowed( abap_true ).

lv_value->if_salv_wd_std_functions~set_edit_check_available( abap_false ).



*Add custom button for Insert Line in table



DATA:lr_function TYPE REF TO cl_salv_wd_function,

lr_toggle_button TYPE REF TO cl_salv_wd_fe_button,

lref_toggle_button TYPE REF TO cl_salv_wd_fe_a_button.



lr_function = l_value->if_salv_wd_function_settings~create_function( id = 'INSLIN' ).



CREATE OBJECT lr_toggle_button.

lref_toggle_button ?= lr_toggle_button.



lr_toggle_button->set_text( 'Insert Line' ).

lr_function->set_editor( value = lr_toggle_button ).







ENDMETHOD.