Skip to Content
Author's profile photo Former Member

Custom F4 functionality in WebDynpro for ABAP


I was looking for a custom solution for the F4-functionality in WebDynpro for ABAP, when I encountered the lack of information provided for the moment. Maybe the forum viewers would like to know what I’ve been doing with the information I requested. That’s why I decided to post an overview of the result.

I have to thank Rich Heilmann for the Using Select Options in a Web Dynpro(ABAP) Application he did on select option, it helped me almost at the point of delivery.

Get what you need

I started out by copying the selection template WDR_SELECT_OPTIONS that was allready there and just removed the button row out of the layout of the view SELECTION_SCREEN.


That way I had my own component for it ZKLAB_DEMO_HELP.

So far, so good. All I needed was the value help itself, so i created a component ZF4_PROFILE (because I’ll be looking for project profiles 😉 ). Double click on the component and add the component use of the freshly created help functionality.


and implement the needed interface for the value help.


Now go to the component controller and add an attribute M_LISTENER, this one will handle the events in the called popup.



In the properties you should define component use for the value_help you just selected, this will create the events automatically. In the methods I added the following:


method CANCEL .

wd_this->m_listener->CLOSE_WINDOW( ).


METHOD selection_made .
DATA: ls_profile TYPE zklab_demo_profile.
wd_this->m_listener->f4_context_element->get_static_attributes( importing static_attributes = ls_profile ).
ls_profile-project_profile = id.

wd_this->m_listener->f4_context_element->set_static_attributes( ls_profile ).

wd_this->m_listener->close_window( ).


wd_this->m_listener = listener.


Selection screen

For this I should redirect you to Rich’s blog . You just have to add a few things on top of that. I added a search and cancel button (instead of the continue button). And the actions linked to them as wel as the selection of a tableview row.

In the tableview I just added an onSelect action:


TYPE table.

  • Retrieve the data from the select option

  rt_profile = wd_this->m_handler->get_range_table_of_sel_field(

                           i_id = ‘S_PROJECT_PROFILE’ ).

  • Assign it to a field symbol

  ASSIGN rt_profile->* TO .

  • Retrieve that data from the database.  Normally it is suggested to

  • encapsulate the data retrieval in a separate class.

  • For simplicity, the SELECT statement has been implemented here.

  • CLEAR iscc. REFRESH iscc.




      profiles = lt_profiles

      id = .

  • Bind the data to the context

    node_profile = wd_context->get_child_node( name = `PROFILES` ).

    node_profile->bind_elements( lt_profiles ).

  • ENDIF.


METHOD onactionselected .

  DATA: node TYPE REF TO if_wd_context_node,

        elements TYPE wdr_context_element_set,

        element TYPE REF TO if_wd_context_element,

        selected_elements TYPE wdr_context_element_set,

        row TYPE REF TO if_wd_context_element,

        lv_line TYPE zklab_demo_propro,

        lo_component type ref to IF_WD_COMPONENT.                     “#EC NEEDED

  node = wd_context->get_child_node( ‘PROFILES’ ).

  selected_elements = node->get_selected_elements( ).

  READ TABLE selected_elements INTO row INDEX ‘1’.

  IF sy-subrc EQ 0.

    row->get_static_attributes( IMPORTING static_attributes = lv_line ).


  node->set_attribute( name = ‘PROFIDPROJ’ value = lv_line-profidproj ).

  wd_comp_controller->selection_made( lv_line-profidproj ).


METHOD wddoexit .

  DATA: lr_usage TYPE REF TO if_wd_component_usage.

  lr_usage =   wd_this->wd_cpuse_select_options( ).

  IF lr_usage->has_active_component( ) IS NOT INITIAL.

    lr_usage->delete_component( ).



METHOD wddoinit .


  lt_range_table       TYPE REF TO data,

  rt_range_table       TYPE REF TO data,

  read_only            TYPE abap_bool,

  typename             TYPE string.


    lr_componentcontroller TYPE REF TO ig_componentcontroller,

    l_ref_cmp_usage TYPE REF TO if_wd_component_usage.

  • create the used component

  l_ref_cmp_usage = wd_this->wd_cpuse_select_options( ).

  IF l_ref_cmp_usage->has_active_component( ) IS INITIAL.

    l_ref_cmp_usage->create_component( ).


*instantiate m_view

  • wd_this->m_view ?= wd_this->wd_get_api( ).

  • get a pointer to the interface controller of the select options


  wd_this->m_wd_select_options =

       wd_this->wd_cpifc_select_options( ).

  • init the select screen

  wd_this->m_handler =

       wd_this->m_wd_select_options->init_selection_screen( ).

  • create a range table that consists of this new data element

  lt_range_table =


         i_typename = ‘PROFIDPROJ’ ).

  • add a new field to the selection


                 i_id = ‘S_PROJECT_PROFILE’

                 it_result = lt_range_table

                 i_read_only = read_only ).


The called bapi is just a getlist function that works with range input ant table output. Now everything is set up on the side of the plugin, just creating a main screen left.

Main view

I went for only one view, with a series of inputfields, of which one is prepared with a custom F4 functionality. Therefor I needed to add the used components:



Include the components and interface in your main component.

Add the used components to you main view:


Select the attribute you want the Value help for in your context, and update the properties like this:


Now you should be able to see the following when you execute your main application:


use the F4


Select one and the (key)value is passed to the main screen.

Assigned Tags

      You must be Logged on to comment or reply to a post.
      Author's profile photo Former Member
      Former Member
      Blog Post Author
      Thank you very much, I'm under the impression that your blog has disappeared, I can no longer find it in the search eather.



      Author's profile photo Mark Finnern
      Mark Finnern
      Yes Rich is right and we fixed it, Mark.
      Author's profile photo Cristian Berri
      Cristian Berri
      Hi Koen,
      Are you still updating this blog?
      It seems that there are some missing steps.
      It would be great if you can add a "map" of the different objects involved in this development, because it is a bit confussing.
      Author's profile photo Former Member
      Former Member
      I have gone through the blog but some how the information provided doesn't seems to be clear.
      It would be better if you can add some more steps to make it clear.