Technology Blogs by Members
Explore a vibrant mix of technical expertise, industry insights, and tech buzz in member blogs covering SAP products, technology, and events. Get in the mix!
cancel
Showing results for 
Search instead for 
Did you mean: 
ramakrishnappa
Active Contributor

Hello welcome again :smile:

Hope, you have gone through the below link for custom getter method GET_CTX_STAT_ATTR( )

Custom getter & setter methods in Webdynpro ABAP - Part 1

Now, let us look into to the method SET_CTX_STAT_ATTR( ).

Method: SET_CTX_STAT_ATTR( )

Signature:

Logic:

Header 1

METHOD set_ctx_stat_attr.
  DATA lo_nd                TYPE REF TO if_wd_context_node.
  DATA lo_nd_info          TYPE REF TO if_wd_context_node_info.
  DATA lv_type_name        TYPE string.
  DATA lv_node_name        TYPE string.
  DATA lo_nd_struct_descr  TYPE REF TO cl_abap_structdescr.


  "----------------------------------------------------
  "Purpose: set data to context node of given controller context
  "----------------------------------------------------
  CLEAR: ed_error_message.

  "===================================
  "check if context is supplied
  IF io_context IS  BOUND.
    lv_node_name = id_node_name.
    TRANSLATE lv_node_name TO UPPER CASE.
    TRY.
        "read node
        lo_nd = io_context->get_child_node( name = lv_node_name ).
        IF lo_nd IS BOUND.
          " check if dirty flag needs to be set
          IF id_set_dirty EQ abap_true.
            lo_nd->set_changed_by_client( abap_true ).
          ENDIF.
          "get node info
          lo_nd_info = lo_nd->get_node_info( ).
          IF lo_nd_info IS BOUND.
            lo_nd_struct_descr =
            lo_nd_info->get_static_attributes_type( ).
            IF lo_nd_struct_descr IS BOUND AND
              lo_nd_struct_descr->is_ddic_type( ) EQ abap_true.
              lv_type_name = lo_nd_struct_descr->get_relative_name( ).

              "based on node cardinality, bind data
              IF lo_nd_info->is_multiple( ) EQ abap_true.
              ctx_bind_table(
                  EXPORTING io_node = lo_nd
                            id_node_name = lv_node_name
                            id_stat_attr = id_stat_attr
                            id_nd_type_name = lv_type_name
                  IMPORTING ed_error_message = ed_error_message ).

              ELSE.
                ctx_bind_structure(
                  EXPORTING io_node = lo_nd
                            id_node_name = lv_node_name
                            id_stat_attr = id_stat_attr
                            id_nd_type_name = lv_type_name
                  IMPORTING ed_error_message = ed_error_message ).

              ENDIF.
              FREE lo_nd_info.
            ENDIF.
            FREE lo_nd.
          ELSE.
            ed_error_message = text-001.
          ENDIF.
        ENDIF.
      CATCH cx_root.                                    "#EC CATCH_ALL
        ##no_handler
        ed_error_message = text-004.
    ENDTRY.
  ELSE.
    ed_error_message = text-003."context is not supplied,
    RETURN.
  ENDIF.
ENDMETHOD.

Now let us create 2 private methods  as below

  • CTX_BIND_TABLE( ) - Bind table to context node - For Internal use only
  • CTX_BIND_STRUCTURE( ) - Bind structure to context node - For Internal use only

Method: CTX_BIND_TABLE( )

Signature:

Logic:

CTX_BIND_TABLE

METHOD CTX_BIND_TABLE.
  DATA lo_str_descr      TYPE REF TO cl_abap_structdescr.
  DATA lo_tbl_descr      TYPE REF TO cl_abap_tabledescr.
*  DATA lo_stat_data      TYPE REF TO data.
  DATA lv_nd_type_name    TYPE string.
  DATA lv_id_type_name    TYPE string.
  DATA lv_temp_type_name  TYPE string.

  FIELD-SYMBOLS: <lt_stat_attr>    TYPE STANDARD TABLE.

  CLEAR: ed_error_message,
        lv_nd_type_name,
        lv_id_type_name,
        lv_temp_type_name.

  IF io_node IS BOUND.
    lv_nd_type_name = id_nd_type_name.
    TRANSLATE lv_nd_type_name TO UPPER CASE.
    "get the type name of data provided
    lo_tbl_descr ?=
      cl_abap_tabledescr=>describe_by_data( id_stat_attr ).
    IF lo_tbl_descr IS BOUND.
      "check if the data type provided and
      "node type are same
      lo_str_descr ?= lo_tbl_descr->get_table_line_type( ).
      IF lo_str_descr IS BOUND.
        lv_id_type_name = lo_str_descr->get_relative_name( ).
      ENDIF.


      "check if the type name is used from context node
      IF lv_id_type_name NE lv_nd_type_name.
        CONCATENATE 'ELEMENT' id_node_name
        INTO lv_temp_type_name SEPARATED BY '_'.
        TRANSLATE lv_temp_type_name TO UPPER CASE.

        IF lv_id_type_name EQ lv_temp_type_name.
          lv_id_type_name = lv_nd_type_name.
        ENDIF.
      ENDIF.


      IF lv_id_type_name EQ lv_nd_type_name.
        ASSIGN id_stat_attr TO <lt_stat_attr>.
        IF <lt_stat_attr> IS ASSIGNED.
          io_node->bind_table(
          EXPORTING new_items = <lt_stat_attr> ).
        ENDIF.
      ELSE.
        ed_error_message = 'Data mismatch against context node'.
      ENDIF.
      FREE lo_tbl_descr.
    ENDIF.
  ENDIF.
ENDMETHOD.

Method: CTX_BIND_STRUCTURE( )

Signature:

Logic:

CTX_BIND_STRUCTURE

METHOD CTX_BIND_STRUCTURE.

  DATA lo_str_descr      TYPE REF TO cl_abap_structdescr.
*  DATA lo_stat_data      TYPE REF TO data.
  DATA lv_id_stat_attr_type_name    TYPE string.
  DATA lv_temp_type_name  TYPE string.
  DATA lv_nd_type_name    TYPE string.
  FIELD-SYMBOLS: <ls_stat_attr>    TYPE any.

  CLEAR: ed_error_message,
        lv_nd_type_name,
        lv_id_stat_attr_type_name,
        lv_temp_type_name.

  IF io_node IS BOUND.
    lv_nd_type_name = id_nd_type_name.
    TRANSLATE lv_nd_type_name TO UPPER CASE.
    "get the type name of data provided
    lo_str_descr ?=
    cl_abap_structdescr=>describe_by_data( id_stat_attr ).
    "check if the data type provided and node type are same
    IF lo_str_descr IS BOUND.
      lv_id_stat_attr_type_name = lo_str_descr->get_relative_name( ).
      "check if the type name is used from context node
      IF lv_id_stat_attr_type_name NE lv_nd_type_name.
        CONCATENATE 'ELEMENT' id_node_name
        INTO lv_temp_type_name SEPARATED BY '_'.
        TRANSLATE lv_temp_type_name TO UPPER CASE.
        IF lv_id_stat_attr_type_name EQ lv_temp_type_name.
          lv_id_stat_attr_type_name = lv_nd_type_name.
        ENDIF.
      ENDIF.
      IF lv_id_stat_attr_type_name EQ lv_nd_type_name.
        ASSIGN id_stat_attr TO <ls_stat_attr>.
        IF <ls_stat_attr> IS ASSIGNED.
          io_node->set_static_attributes(
          EXPORTING index = 1
                    static_attributes = <ls_stat_attr> ).
        ENDIF.
      ELSE.
        ed_error_message = 'Data mismatch against context node'.
      ENDIF.
      FREE lo_str_descr.
    ENDIF.
  ENDIF.
ENDMETHOD.


Now, let us see how to bind data to context node by using method SET_CTX_STAT_ATTR( ).

Example:

Set data : Let us say we have a context node MY_NODE_T in component controller context with cardinality 0....n /1..n


DATA lt_my_node_t     TYPE wd_this->elements_my_node_t.
  DATA lv_error_message TYPE string.
 
  CALL METHOD zcl_wd_helper_class=>set_ctx_stat_attr
    EXPORTING
      io_context       = wd_context    " WD Context ref
      id_node_name     = 'MY_NODE_T'    " Ctx Node Name
      id_stat_attr     = lt_my_node_t
*     id_set_dirty     = ABAP_FALSE
    IMPORTING
      ed_error_message = lv_error_message.

Set data : Let us say we have a context node MY_NODE_S in component controller context with cardinality 0...1 /1..1


  DATA ls_my_node_s     TYPE wd_this->elements_my_node_s.
  DATA lv_error_message TYPE string.
 
  CALL METHOD zcl_wd_helper_class=>set_ctx_stat_attr
    EXPORTING
      io_context       = wd_context    " WD Context ref
      id_node_name     = 'MY_NODE_s'    " Ctx Node Name
      id_stat_attr     = ls_my_node_s
*     id_set_dirty     = ABAP_FALSE
    IMPORTING
      ed_error_message = lv_error_message.

Hope this helps for those who are looking for a common logic in place to get and set data from/to context node in WDA applications :smile: :smile: :smile:

I appreciate your comments/feedback :smile:

2 Comments
Labels in this area