Skip to Content

In Web Dynpro dynamic programming one of the basic requirements is to create context nodes dynamically. Here are a few code samples how it can be done.

CASE 1

If the attributes are only from one database structure then we can simply pass the structure to create the context node as shown below.

  DATA: lr_rootnode_info TYPE REF TO if_wd_context_node_info,
        lr_node_info
TYPE REF TO if_wd_context_node_info,
        lr_node
TYPE REF TO if_wd_context_node.

  lr_rootnode_info = wd_context->get_node_info( ).
  CALL METHOD lr_rootnode_info->add_new_child_node
   
EXPORTING
      static_element_type          =
‘SFLIGHT’
      name                         =
‘FLIGHT’
    RECEIVING
      child_node_info              = lr_node_info.
  lr_node = wd_context->get_child_node( name =
‘FLIGHT’ ).

The variable lr_node is used to set the context node with values.

In method ADD_NEW_CHILD_NODE, there are a few other parameters as well. They are used for the following purpose:

Parameter

Use

Associated Type

Default Value

SUPPLY_METHOD

Mention the name of the Supply method to populate the context node attributes

String

SUPPLY_OBJECT

Instance of Supply Method

Object

DISPOSE_METHOD

Name of dispose method

String

DISPOSE_OBJECT

Instance of Dispose Method

Object

NAME

Name of the context node. This is a mandatory parameter.

String

IS_MANDATORY

If it is true there must be at least one entry.

ABAP_BOOL

ABAP_FALSE

IS_MANDATORY_SELECTION

If it is true at least one entry must be selected.

ABAP_BOOL

ABAP_FALSE

IS_MULTIPLE

If it is true the context node can contain more than one entry.

ABAP_BOOL

ABAP_TRUE

IS_MULTIPLE_SELECTION

If it is true multiple entries can be selected.

ABAP_BOOL

ABAP_TRUE

IS_SINGLETON

If it is true then the Node Only Exist for Lead Selection of Parent

ABAP_BOOL

ABAP_FALSE

IS_INITIALIZE_LEAD_SELECTION

If it is true then Lead Selection Always Defined

ABAP_BOOL

ABAP_TRUE

IS_STATIC

If it is true context node can’t be changed dynamically

ABAP_BOOL

ABAP_TRUE

IS_RANGE_NODE

ABAP_BOOL

Depending on the requirement this parameters are set accordingly.

CASE 2

Context node can be defined using random attribute structure also. For that we use the importing parameter ATTRIBUTES. Here is a sample code.

  data:

    lt_attributes       type wdr_context_attr_info_map,
    attribute          
like line of lt_attributes,

    lr_node_info        type ref to if_wd_context_node_info.

    attribute-name      = ‘TEXT’.
    attribute-type_name =
‘STRING’.
   
insert attribute into table lt_attributes.

    attribute-name      = ‘EXPANDED’.
    attribute-type_name =
‘WDY_BOOLEAN’.
   
insert attribute into table lt_attributes.

    lr_node_info = wd_context->get_node_info( ).

    lr_node_info->add_new_child_node(
      supply_method                =
‘S_STATIC_NODE’
      supply_object                = me
      name                         =
‘STATIC_NODE’
      is_mandatory                 = abap_false
      is_mandatory_selection       = abap_false
      is_multiple                  = abap_true
      is_multiple_selection        = abap_true
      is_singleton                 = abap_false
      is_initialize_lead_selection = abap_false
      is_static                    = abap_false
      attributes                   = lt_attributes ).

Here, the supply method parameter is passed. We need to create method S_STATIC_NODE in the methods tab of the view of type Supply Function.

Another Example:  Here unlike previous case the Type Name of the attributes are not maintained.

  data: l_node_info type ref to if_wd_context_node_info,
        l_attribute
type wdr_context_attribute_info,
        l_attributes
type wdr_context_attr_info_map,
        l_node
type ref to if_wd_context_node.

  l_attribute-name = ‘INPUT’.
  l_attribute-rtti ?= cl_abap_typedescr=>describe_by_name(
‘STRING’ ).
 
insert l_attribute into table l_attributes.
  l_attribute-name =
‘INPUT2’.
  l_attribute-rtti ?= cl_abap_typedescr=>describe_by_name(
‘SFLIGHT-CARRID’ ).
 
insert l_attribute into table l_attributes.
  l_node_info = wd_context->get_node_info( ).
  l_node_info = l_node_info->add_new_child_node(
     name =
‘NEW’
     is_multiple = abap_false
     is_mandatory = abap_true
     attributes = l_attributes ).

CASE 3

Apart from these two import parameters to specify the context node structure there is another import parameter to create context node called static_element_rtti. This parameter is used when context node attributes are determined at runtime. Here is a simple example:

data: node_info type ref to if_wd_context_node_info,

      comp_tab    type cl_abap_structdescr=>component_table,

      struct_type type ref to cl_abap_structdescr.

      comp        like line of comp_tab.

* build a structure description from the list of single fields

  comp-name = ‘CARRID’.

  comp-type ?= cl_abap_datadescr=>describe_by_name( ‘S_CARR_ID’ ).

  append comp to comp_tab.

  comp-name = ‘CONNID’.

  comp-type ?= cl_abap_datadescr=>describe_by_name( ‘S_CONN_ID’ ).

  append comp to comp_tab.

* not this structure contains the fields “CONNID” and “CARRID”

  struct_type = cl_abap_structdescr=>create( comp_tab ).

* now the nodeinfo is created

  node_info = wd_context->get_node_info( ).

  node_info = node_info->add_new_child_node(

    name                         = ‘MY_NODE’

    is_mandatory                 = abap_true

    is_multiple                  = abap_true

    static_element_rtti          = struct_type

    is_static                    = abap_false

       ).

Few more examples to show how the parameter is populated:

Example 1

      data:
        lt_scarr
type standard table of scar,

        struct_type type ref to cl_abap_structdescr.

      cl_salv_wd_test_data=>select_data_from_ddic(
       
exporting
          ddic_table =
‘SCARR’
       
changing
          t_table    = lt_scarr ).

      struct_type ?= cl_abap_typedescr=>describe_by_data( ls_scarr ).

Example 2 

data:

    lr_locator                 type ref to cl_dpr_ui_log_locator,

    lt_components_attr         type abap_component_tab,

    struct_type                type ref to cl_abap_structdescr.

* Initialize

  lr_locator = cl_dpr_ui_log_locator=>get_instance( ).

* Get ALV data structure

  lt_components_attr = lr_locator->get_alv_structure( ).

  struct_type        = lr_locator->get_alv_structure_ref( lt_components_attr ).

There are many such examples. Keep exploring and keep learning. 🙂

Case4

Here we will create a context node where attributes are added dynamically

  data:
    lr_node_info       
type ref to if_wd_context_node_info,
    attribute          
type wdr_context_attribute_info,
    lr_parent_node_info
type ref to if_wd_context_node_info,
    lr_item_node_info  
type ref to if_wd_context_node_info. 

lr_parent_node_info = wd_context->get_node_info( ).  

lr_item_node_info = lr_parent_node_info->add_new_child_node( name = ‘ITEM’ is_static = abap_false ).
  attribute-name      =
‘ITEM’.
  attribute-type_name =
‘STRING’.
  lr_item_node_info->add_attribute( attribute ).

Here is a brief document on how context nodes can be created dynamically.

To report this post you need to login first.

Be the first to leave a comment

You must be Logged on to comment or reply to a post.

Leave a Reply