Skip to Content

Dynamic modification of Configuration fields ( Part -1) : Form View

I wonder so many requirements are based on the modification of configuration fields, its properties and positions at run time. So I thought to provide some techniques to change the configuration of fields including the properties at run time for different types of views which we commonly use in most of our components.

The standard way is to create a new configuration for each view which renders different set of fields, its properties and alignment. So at runtime depending upon the configuration key, it chooses the appropriate configuration which is the close match and renders the selected configuration view on screen. Now assume we have only limited configurations and we need to use the same configuration and render it differently based on some other conditions at run time.

                       And also as a technical consultant you might not have authorization to create a new configuration and play around with it. But fortunately we have some tricky way to get control on the configuration which is being shown on UI.

We mostly use four types of views in our components.

  1. Form View
  2. Table view
  3. Search View
  4. Overview

In all the views (except Overview) , we have a .htm page for the view which constructs the UI page layout with fields and its properties. Luckily we have a configuration tag which accepts the xml file of the configuration and uses it to render different UI components on screen.

  <%
  DATA:
  lv_xml    TYPE string.
  lv_xml = controller->configuration_descr->get_config_data( ).
%>


<chtmlb:config xml  = “<%= lv_xml %>”
               mode = “RUNTIME” />

So our technique is based on modifying the XML file according to our requirement and then passing it to the configuration tag to display the modified xml .

In this document we will concentrate on Form View.

Reading the XML file and figuring out the fields is a tedious job. As we have some utility classes which covert them to ABAP, we can start playing out with the fields and their properties.

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

<%@page language=”abap” %>
<%@extension name=”thtmlb” prefix=”thtmlb” %>
<%@extension name=”chtmlb” prefix=”chtmlb” %>
<%@extension name=”bsp” prefix=”bsp” %>
<%
  DATA:lv_xml    type string,
             lv_xml_inp type string,
             lv_config_type type BSP_DLC_CONFIG_TYPE,
             lv_view_desc type ref to IF_BSP_DLC_VIEW_DESCRIPTOR,
             it_adv_conf type BSP_DLCT_ADV_CONF_ITM.

* ************Read the original configuration data and property descriptors of the view as an xml file

  lv_xml_inp    = controller->CONFIGURATION_DESCR->GET_CONFIG_DATA( ).
  lv_view_desc = controller->CONFIGURATION_DESCR->GET_PROPERTY_DESCRIPTOR( ).

*********************** Use the utility class to convert xml to ABAP format
    CL_BSP_DLC_CONFIG_UTIL=>ADV_CONF_META_TO_TABLE( exporting IR_VIEW_DESCR = lv_view_desc
                                                                                                                          IV_ADV_CONF_META_XML = lv_xml_inp
                                                                                                         importing ET_ADV_CONF = it_adv_conf ).

**************************************************************
    ***  As it_adv_conf have the structure BSP_DLCT_ADV_CONF_ITM which describes each field on the UI with its properties like mandatory,display only. Also the field label name and its positions are captured . Now you can modify them according to your requirement.

    ***  Place the validation logic here ********                                          

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

********************* Convert the modified config ABAP table to XML


  CL_BSP_DLC_CONFIG_UTIL=>ADV_CONF_TABLE_TO_META( exporting IT_ADV_CONF = it_adv_conf
                                                                                                                         IR_VIEW_DESCR = lv_view_desc
                                                                                                          importing EV_ADV_CONF_META_XML = lv_xml ).

****  ****Here the modified XML is retrieved , but it is not ready as it has been encoded. We have to remove encoding and put it in standard format for rendering.
                                                 
  DATA: lv_defidx    TYPE sy-fdpos,
  lv_clstagidx TYPE sy-fdpos.
 
  lv_defidx = -1.
  lv_clstagidx = 10000.
  IF lv_xml CS ‘<?xml’.                                  “#EC NOTEXT
  lv_defidx = sy-fdpos.
  IF lv_xml CS ‘>’.
  lv_clstagidx = sy-fdpos + 1.
  IF lv_clstagidx > lv_defidx.
  lv_xml = lv_xml+lv_clstagidx.
  ENDIF.
  ENDIF.
  ENDIF.
  CONCATENATE ‘<?xml version=”1.0″?>’ lv_xml INTO lv_xml.“#EC NOTEXT
%>

********* Finally pass the modified configuration data to the tag

<chtmlb:config xml  = “<%= lv_xml %>”
               mode = “RUNTIME” />

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

In the next document http://scn.sap.com/docs/DOC-29972 we will concentrate on other types of views.

26 Comments
You must be Logged on to comment or reply to a post.
  • Hello, Natish.

    It's very good that you've started this series. But as you said "In the next blog...". And you created the document. Do not know it's possible or not to convert current document to a blog post, but it seems to be better within blogs.

    Thank you and keep posting!

    • Hello Andrie,

      Thanks for your comments.

      My first thought is to create a single document and place all the content here itself . Then changed my mind as it would be clumsy to put all the stuff in single document and decided to go for series as blogs .But only after the content is published I noticed that it has been posted as a document and not as a blog 🙁 . Not sure whether we can convert it into a blog. 

      Cheers.

    • Thanks Ajay and Nikhil.

      Andrie,

      As per the moderators, we cannot convert the document into blog and they advised to use series of documents rather than blogs for this content . And in the end I will use an overview blog which refers to  all these documents.

  • Hi Nithish,

    Very nice document.

    I had few queries:

    Can similar coding be done in the DO_CONFIG_DETERMINATION method of the implementation class?

    Sometimes we have a requrement to make a certain field visible or mandatory depending on the value of another field. How to do that?

    Regards,

    Sayan

    • Hi Sayan,

      You can use the code not only in DO_CONFIG_DETERMINATION , but also in any other appropriate method where you can calculate the fields and place the logic to modify them ( dependent upon other fields). At the end we have the modified xml i.e lv_xml and to set this modified xml as our desired configuration we need to use

      me->CONFIGURATION_DESCR->SET_CONFIG_DATA(IV_CONFIG_DATA = lv_xml ).

      Please note the above statement will overwrite the original configuration and save it in database table BSPC_DL_XMLSTRX2, where as in the document I have chosen .htm page to render the modified xml so that it will be modified just before it renders on screen and original configuration created will be preserved .

      Assume we need to place some fields as mandatory , depending upon other field value . In this case if we set our configuration using SET_CONFIG_METHOD ,, in the next run assume if our condition is not satisfied then it will display the most recently modified configuration rather than the original configuration which is created through Customizing request . So in .htm page you can always retrieve the original configuration.

      • Hi Nithish,

        Can you provide me any help on the following...

        I have one requirement, wherein , I am hiding one mandatory field dynamically (dynamic programming in do_config_determination) based on other field value. But , While saving, it shows an error message saying "Make an entry in the field 'XXXXXX' " . How to make that field as optional using dynamic programming do_config_deterrination.  Or How to avoid this situation.Quick response will be helpful.

        Thanks .

        Srinivas

  • Hi Nithish,

    I need to add the fields dynamically in a form view. But these fields are not any of the AET extended fields. For example, i want to create the fields dynamically and display them on the UI as well. Can you please suggest something on this.

    Regards,

    Anil

    • Hello Anil ,

        Do you want to create entries and display them  ? Please explain your requirement properly as it is not clear.

      Dynamic creating of fields is not feasible as to start showing up on the UI it needs to be moved first to the configuration.

        Or

      May be you are looking in : You want to show some field's and hide some fields during certain transactions : to do this create separate configuration and load them dynamically in DO_CONFIG_DETERMINATION .

      Thanks and Regards,

        Qiong

      • Hi Qiong,

        I have to show the fields on the UI creating them dynamic. I dont have them in the value node nor the context node. I have a name value pair in some database table and i need to display them in the UI(form view)

  • Hi Nithish,

    I tried according to your code . . .

    i am trying to change the FIeld_LABEL . It is getting changed in the ITAB but on the Webui it is remaining same . .  .

    Can you please help me on this

    Regards,

    Dinesh Gurram

  • Hi ,

    I have one requirement, wherein , I am hiding one mandatory field dynamically (dynamic programming in do_config_determination) based on other field value. But , While saving, it shows an error message saying "Make an entry in the field 'XXXXXX' " . How to make that field as optional using dynamic programming do_config_deterrination.  Or How to avoid this situation.Quick response will be helpful.

    Thanks .

    • Hi Srinvas,

      Did you check this messages in not trigered by another layer, for example a standard API or a BADI? Mayber this field is mandatory by config, what object are you working on?

      Cheers!

      Luis

  • Don't usually comment on these SCN blogs/docs but this one was very useful to me, especially the bit with the helper classes for converting into an Abap Webcuif scenario then back to xml once done with any business logic. Thanks Nithish.

  • Hi,

    very good document. But I have a question.

    If I implement this change into my HTML document I see my changed view but below the original config is shown again.

    Do you know this issue?

    Thx

    Frank