The topic of the blog may seem queer but as I would illustrate later it is very relevant in the lives of technical consultants. I would illustrate with examples how these approaches would help you succeed or if fail then fail gracefully ( read exception and dumps ) . Lets look into each of one at a time.




  • For e.g. if you want to do something like this then this a recipe for sure shot disaster. If lv_entity is not bound then you would run into a dump/exception.You can use this in possibly many ways and you should use this as much as possible.
lv_bo ?= lv_entity.
lv_bo->set_property( iv_attr_name = ‘CITY’
iv_value = ‘Walldorf’ ).


the better way to the similar coding would be

lv_bo ?= lv_entity.
CHECK lv_bo is bound. 
lv_bo->set_property( iv_attr_name = ‘CITY’
iv_value = ‘Walldorf’ ).


lv_bo ?= lv_entity.
if lv_bo is bound.
lv_bo->set_property( iv_attr_name = ‘CITY’
iv_value = ‘Walldorf’ ).


This is a very common failure scenario and is so common that we often tend to ignore this.


  • The second variety is when you write a new method/form etc. , then check whether the importing parameters are proper. This would mean if you expect a reference variable to be passed then it should be bound or if you have a mandatory parameter passed then it should be having some value. Similarly pass export only those parameters which are requested. ( This is not a disastrous case but can save performance).For e.g. if you are sending a collection as an importing parameter to a method then you can write the following statement. This way you know that the col is bound and contains entities


          CHECK ir_col is bound and ir_col->size(  ) > 0. 





This one is my personal favorite. Often uncleared variable could cause embarrassing problems and of magnitude you cannot even imagine. For e.g. you are in a conditional statement where you fill some variables based on condition being true and condition was false and since the variable were not cleared you still get data in variables. Or for e.g. you failed to clear an entity reference variable it would cause you lots of issues. I am providing some examples


lv_bo ?= lv_person.
lv_*** = lv_bo->get_property( ‘***’ ). “Key code
if lv_person->get_parent( ) is not initial.
lv_bo ?= lv_person->get_parent( ).
lv_*** = lv_bo->get_property( ‘***’ ). “Key code


Now if the if condition is not true , then lv_*** is line no 5 should be blank but it would be filled with value fetched in line no 2. In this case it may not seem disastrous but in some cases it is extremely catastrophic.


The better way to do this would be following. As a general rule for methods which have returning or exporting parameters , clear the variables which are collecting values.

lv_bo ?= lv_person.
clear lv_***.
lv_*** = lv_bo->get_property( ‘***’ ). “Key code
if lv_person->get_parent( ) is not initial.
lv_bo ?= lv_person->get_parent( ).
clear lv_***.
lv_*** = lv_bo->get_property( ‘***’ ). “Key code


In my case , I was trying to create multiple DOCFLOW entities but I not have cleared the variable through which I was passing the data to docflow and I was passing the same docflow instance every time hence the data was getting overwritten in same entity. 




Another of my personal favorite. Exceptions are pretty common while we execute a scenario in WebUI. But they are handled in the framework and hence even though exceptions are raised , gracefully WebUI screen opens. If I call a method and it runs into an exception , then it could result in a dump or exception. Both of them are not appreciated by the users hence it makes a lot of sense to fail gracefully and provide exception handling. As a general rule if you are coding in WebUI , don't raise exceptions and don't fail to catch exceptions. Both of them are absolutely necessary.


while lr_current_entity is not initial and lr_entity is not initial .
 *  Add the entitiy
                Clear lr_entity.
CHECK lr_ent is bound.
 lr_ent ?= lr_entity.
 if lr_ent->alive( ) = abap_true.
 Clear lr_adminh , clear lv_object_type.
 lr_adminh ?= lr_ent->get_related_entity( 'BTOrderHeader' ).
 if  (Your_Condition).
  lr_current_entity ?= lr_iterator->get_next( ).
 lr_entity ?= ir_valuehelp_collection->get_next( ).
 catch cx_root.
 lr_current_entity ?= lr_iterator->get_next( ).
 lr_entity ?= ir_valuehelp_collection->get_next( ).

Now this code serves two purposes

a) It handles the exception hence there would not be any disruption in WebUI.

b) In case of exception occurs , there is a handling in that case.


Some of these guidelines may appear didactic but in reality they help in avoiding embarrassing code mishaps.

Multi-level Categorization is a kind of hierarchical categories which can be used in the business transaction for classification purposes. For example, in the service order, we can categorize the defect, reason, solutions into many hierarchical categories. One or more than one can be selected easily from the hierarchical tree in the service order header or item.


Multilevel categorization is available in varying scopes for the following applications:

  • Service orders
  • Service order templates
  • Confirmations
  • Complaints
  • In-house repair orders
  • Case management
  • Interaction record


In some cases if we need to know which level in the category is filled , then we need to calculate the node level which is filled and based on that we can determine whether the node level which we have to look for is filled or not. For e.g. in defect there are L1->L2->L3->L4->L5 , then if we need to find out if L5 is filled or not and if only level L3 is filled then the output that we would get is level 3 and we sure that L5 is not filled. In some business scenario we need to determine if a particular level is filled ( Level has to be filled mandatorily in the transaction). If the level is not filled we need to raise an error message. So the blog below would help to calcuate the level in a category. Using the APIs in the code below , you can twist and tweak as per your requirement.



data: lr_aspect   type ref to if_crm_erms_catego_aspect,
      lr_category type ref to if_crm_erms_catego_category,
      lv_ref_guid type guid_16 value '0050560600AD1ED2B8E18732B52E5D75',      lv_asp_guid type crm_erms_cat_guid,
      lv_cat_guid type crm_erms_cat_guid,
      lv_sel_level type int4,
      ls_cat      type crmt_erms_cat_ca_buf.
call method cl_crm_ml_category_util=>get_categoryfirst
    iv_ref_guid     = lv_ref_guid
    iv_ref_kind     = 'A'
*   iv_catalog_type = 'C'"ORDER_READ->ET_SUBJECT->CAT_ID'
    er_aspect       = lr_aspect
    er_category     = lr_category.
* get aspect guid
call method lr_aspect->get_asp_guid
    rv_asp_guid = lv_asp_guid.
* get category guid
call method lr_category->get_details
    ev_cat = ls_cat.
lv_cat_guid = ls_cat-cat_guid.
    iv_selected_cat_guid = lv_cat_guid    " Selected Category GUID
    iv_schema_guid       = lv_asp_guid    " Schema GUID
    ev_selected_level    = lv_sel_level    " Selected Category Level
*    ev_parent_cat_guid   =     " Parent Category GUID
*    ev_parent_cat_id     =     " Parent Category ID
*    ev_parent_level      =     " Parent Category level

The lv_sel_level would give you the level details. Based on business sceanrio , we can add validations .

in the previous blog we discussed how to maintain attachment in pop up window.
In production code it is ususally necessary to also have authorization control on attachment maintenance.
Most of the time it is done via authorization object.
In this example I just use a checkbox to control it during the whole session, in the screenshot below all buttons are disable since the "Allow Edit" checkbox is not selected.
The idea of control is, in GS_CM component controller there is a value node ATTRIBUTES which could be bound by consuming component. 
in the controller class below, Content management framework will firstly check whether the current BOR type is valid ( line 13 ~ line 18), an invalid type will lead to read only mode.
then the display mode flag will be set according to the field display of value node.
based on these findings, we can start development in our ui component.
create an event handler for checkbox status change and just use a global variable to store the flag:
create a new value node ATTRIBUTE in custom controller
redefine INIT.
here we buffer the collection wrapper reference into a global variable of component controller for later usage.
  super->if_bsp_model~init( id    = id
                            owner = owner ).
  mr_owner ?= owner.
  DATA: lv_struct_ref TYPE REF TO crmt_cm_comp_st,
        lv_value_node TYPE REF TO cl_bsp_wd_value_node,
        lv_bo_coll    TYPE REF TO if_bol_bo_col.
  CREATE DATA lv_struct_ref.
  CREATE OBJECT lv_value_node
      iv_data_ref = lv_struct_ref.
  CREATE OBJECT lv_bo_coll
  lv_bo_coll->add( lv_value_node ).
  set_collection( lv_bo_coll ).
redefine ON_NEW_FOCUS. The bufferred collection wrapper for ATTRIBUTE node is used here:
 method ON_NEW_FOCUS.
     lr_entity          TYPE REF TO cl_crm_bol_entity,
     lr_parent          TYPE REF TO cl_crm_bol_entity,
     lv_entity_name     TYPE string,
     ls_cm_attr         TYPE crmt_cm_comp_st,
     lv_product_type    TYPE comt_product_type,
     lr_bo_attr         TYPE REF TO if_bol_bo_property_access,
     ls_prtyp_cust      TYPE coms_prtyp_cust,
     lv_object_guid     TYPE ib_recno_16,
     lv_current         TYPE flag,
     ls_button          TYPE crmt_thtmlb_button.
  CHECK focus_bo IS BOUND.
  lr_entity ?= focus_bo.
  lv_entity_name = lr_entity->get_name( ).
    ls_cm_attr-display = ''.
    ls_cm_attr-display = 'X'.
  CHECK lr_bo_attr IS BOUND.
  lr_bo_attr->set_properties( ls_cm_attr ).
in WD_USAGE_INITIALIZE method of ZSMCATTR component controller, bind the context node of custom controller to GS_CM's attributes node.
CALL METHOD iv_usage->bind_context_node
          iv_controller_type  = cl_bsp_wd_controller=>co_type_custom
          iv_name             = 'ZSMCATT/CMBO'
          iv_target_node_name = 'ATTRIBUTE'                "#EC NOTEXT
          iv_node_2_bind      = 'ATTRIBUTES'.                "#EC NOTEXT
lr_cuco_attachement ?= get_custom_controller( 'ZSMCATT/CMBO' ).
IF lr_cuco_attachement IS BOUND.
        lr_property = me>typed_context->socialpost->collection_wrapper->get_current( ).
        lr_cuco_attachement->typed_context->cmbo->on_new_focus( lr_property ).
        lr_cuco_attachement->typed_context->attribute->on_new_focus( lr_property ).
Hi friends,
you can see attachment ui everywhere in SAP CRM ui but most of them appear within assignment block.
This article just tells you how to put the attachment maintenance ui within pop up window.
The user can click hyperlink in table column "Post ID" to maintain the attachments for the selected post.
This article also shares the tip how to control the enablement of attachment maintenance dynamically.
As you see there is a checkbox "Allow Edit" in first table UI. If checked and navigate to attachment popup window, the attachment maintenance is enabled. Otherwise you will see all buttons in attachment popup window is disabled.
The invovled UI component in this solution:
1. ZSMCQR - the first UI, contains search view with only one search parameter "Post Internal ID", the checkbox to control attachment
maintenance, abd the search result view.
2. ZSMCATT - our wrapper component to load the reuse attachment component.
3. GS_CM - standard UI component provided by SAP exposing attachment operation like create, save and delete. The benefit of using it is that now
it is not necessary for application developer to care about those CRUD operations on attachment - they are all taken over by content management
4. GSURLPOPUP - standard UI component about popup window implementation
in our first host UI component, declare one component usage to GSURLPOPUP.
we would like to make field INTERNAL_ID ( label in UI: Post ID) as hyperlink and trigger a pop up window, so we need to implement a
P-Getter on it:
  CASE iv_property.
      WHEN if_bsp_wd_model_setter_getter=>fp_fieldtype.
        rv_value = cl_bsp_dlc_view_descriptor=>field_type_event_link.
      WHEN if_bsp_wd_model_setter_getter=>fp_onclick.
        rv_value = 'ATTACHMENT'. 
Then create a event handler for event ATTACHMENT to pop up a window. In the event handler implementation, we plan to pop up the
attachment maintenance window. Before we write code, we need to define one more component usage:
Now we are ready to implement the event handler:
          lv_post TYPE REF TO cl_crm_bol_entity,
          lv_bol_col TYPE REF TO CL_CRM_BOL_BO_COL.
    lv_post = zcl_jerry_tool=>get_selected_post_by_event( iv_col_wrapper = me->typed_context->searchresult->collection_wrapper
        iv_event = htmlb_event_ex->event_id ).
    CREATE OBJECT lv_bol_col.
    lv_bol_col->IF_BOL_BO_COL~add( lv_post ).
  lr_popup = comp_controller->window_manager->create_popup(
     iv_interface_view_name = 'ZSMCATT/MainWindow'
     iv_usage_name = 'ZSMCATT'
     iv_title = 'Social Post Attachment Maintenance' ).
  lr_popup->set_on_close_event( iv_view = me iv_event_name =
  lr_popup->open( iv_inbound_plug = 'FROM_SEARCH' iv_collection = lv_bol_col ).
all the content in pop up window is encapsulated in interface view MainWindow of ZSMCATT. Our next step will focus on its implementation.
the method get_selected_post_by_event is a handy method which just returns the selected post BOL entity via event:
    lv_index_str TYPE string,
    lv_idx       TYPE string,
    lv_index     TYPE i,
    lv_result    TYPE REF TO cl_crm_bol_entity.
    lv_index_str = iv_event.
  SHIFT lv_index_str UP TO '[' LEFT CIRCULAR.
  SHIFT lv_index_str BY 1 PLACES.
  WHILE lv_index_str(1) <> ']'.
    CONCATENATE lv_idx lv_index_str(1) INTO lv_idx.
    SHIFT lv_index_str BY 1 PLACES.
  lv_index = lv_idx.
  CHECK lv_index >= 0.
  lv_result ?= iv_col_wrapper->find( iv_index = lv_index ).
  rv_result = lv_result->get_related_entity( 'SocialPostRel' ). "#EC NOTEXT
component ZSMCATT just contains one overview page and one post header page.
The overview page has two assignment blocks: one( headerWindow ) for post header which indicates the current post being maintained, the other one( attachmentWindow ) just displays the UI of reuse component GS_CM.
see picture below:
the view contained in the attachmentWindow is not developed by us, but reuse from GS_CM.
so we define one component usage AttachmentUploadDet and include its interfacre view MainWindow into our attachmentWindow, as shown below:
Again the new pop up window shown in right part of screenshot above is also another standard UI of GS_CM, so we just define another component usage to include it into our component:
in figure5 you observed that there is a hyperlink "Properties", once clicked it will navigate to attachment property UI, which is also one standard part of GS_CM.
I call this window as "DetailWindow". So finally I have the following windows:
It means we need to define the third component usage on GS_CM to include that part into our own UI:
you may find that in three component usage, the same interface view MainWindow of GS_CM is included. So the real page that would be displayed in GS_CM.MainWindow depends on which outbound plug from our own UI component is called and which inbound plug of target UI will catch that.
So in this step we will define navigate link to specify the navigation behavior of each.
in component controller of ZSMCQR, do component context node binding for component usage ZSMCATTR:
          lv_usage  TYPE REF TO if_bsp_wd_component_usage,
          lo_entity TYPE ref to cl_crm_bol_entity.
    CHECK me->typed_context->socialpost->collection_wrapper IS NOT INITIAL.
    lv_usage = me->comp_controller->get_component_usage( iv_usage->usage_name ).
    IF lv_usage->usage_name = 'ZSMCATT'.
      CALL METHOD lv_usage->bind_context_node
           iv_controller_type  = cl_bsp_wd_controller=>co_type_component
           iv_target_node_name = 'SOCIALPOST'                   "#EC NOTEXT
           iv_node_2_bind      = 'SOCIALPOST'.                  "#EC NOTEXT
in component ZSMCATTR, create a custom controller and create a context node CMBO. Implement its on_new_focus method:
METHOD on_new_focus.
 DATA: lr_qs              TYPE REF TO cl_crm_bol_query_service,
       lr_data            TYPE REF TO data,
       ls_cmbo_prop       TYPE crmt_cmic_rfolder_attr,
       lr_entity_col      TYPE REF TO if_bol_entity_col.
  FIELD-SYMBOLS: <fs_guid> TYPE crmt_genil_object_guid.
  CHECK focus_bo IS BOUND.
      lr_qs = cl_crm_bol_query_service=>get_instance( cl_crm_cm_genil_comp=>gc_query_bo_link ).
    CATCH cx_root.                                      "#EC NO_HANDLER
  lr_data = focus_bo->get_property( 'UUID' ).
  ASSIGN lr_data->* TO <fs_guid>.
  ls_cmbo_prop-instid = <fs_guid>.
  ls_cmbo_prop-typeid = 'BUS1006'. ------------- use your own BOR type here!
  ls_cmbo_prop-catid = 'BO'.
  lr_qs->set_properties( ls_cmbo_prop ).
  lr_entity_col = lr_qs->get_query_result( ).
  me->collection_wrapper->clear_collection( ).
  me->collection_wrapper->set_collection( lr_entity_col ).
in component controller of ZSMCATTR, do the context node binding logic:
METHOD wd_usage_initialize.
DATA: lr_cn       TYPE REF TO cl_bsp_wd_context_node,
           lr_property         TYPE REF TO if_bol_bo_property_access,
           lr_cn_attr  TYPE REF TO if_bol_bo_property_access,
           lr_cuco_attachement TYPE REF TO CL_ZSMCATT_CMBO_IMPL,
           ls_cm_attr  TYPE crmt_cm_comp_st.
   IF NOT me->context IS BOUND.
     me->wd_create_context( ).
   CASE iv_usage->usage_name.
     WHEN 'AttachmentUploadDet' or 'AttachmentUpload' or 'AttachmentProperty'.
      CALL METHOD iv_usage->bind_context_node
          iv_controller_type  = cl_bsp_wd_controller=>co_type_custom
          iv_name             = 'ZSMCATT/CMBO'
          iv_target_node_name = 'CMBO'                "#EC NOTEXT
          iv_node_2_bind      = 'CMBUSOBJ'.                "#EC NOTEXT
       CALL METHOD iv_usage->bind_context_node
          iv_controller_type  = cl_bsp_wd_controller=>co_type_component
*         node at the calling component
          iv_target_node_name = 'SOCIALPOST'                       "#EC NOTEXT
*         name of the called component
          iv_name             = iv_usage->usage_name
*         node at the called component
          iv_node_2_bind      = 'PARENTNODE'.
never forget to call on_new_focus of custom controller context node manually:
lr_cuco_attachement ?= get_custom_controller( 'ZSMCATT/CMBO' ).
 IF lr_cuco_attachement IS BOUND.
        lr_property = me->typed_context->socialpost->collection_wrapper->get_current( ).
        lr_cuco_attachement->typed_context->cmbo->on_new_focus( lr_property ).
        lr_cuco_attachement->typed_context->attribute->on_new_focus( lr_property ).
implement the inbound of outbound plug of window attachmentWindow,
and DetailWindow:
for source code of these two class please refer to attached document.
that's all.
Summary: in this solution we use three component usage on GS_CM, one for attachment list page in attachment assignblock, the second for Attachment upload page and the third for attachment property page. If you would like to know how to control the enablement of attachment maintenance dynamically, please continue to read the next blog.
in part1 we discuss about:
1. How to enhance your genil component ( create a new Dependent object and corresponding DDIC structure ) to support AET
2. how to create a new UI object type
3. Create necessary EEW include structure and respective DB table to store FE transaction data.
In this part2 I will show you how to enhance the Genil component implementation class.
step1: support read access. If there is transaction data stored in DB table ZCRM_SOC_FE, it must be fetched and displayed in UI accordingly.
The read access is done in genil implementation class method IF_GENIL_APPL_INTLAY~GET_OBJECTS.
The original code before enhancement is using handler style. Every node has its corresponding handler class to do the job.
The handler class for SocialPost is ZCL_CRM_SOC_POST, which means in order to support read access of extension fields, we need to enhance ZCL_CRM_SOC_POST->READ_OBJECT.
 lr_object = go_handler_factory->get_handler( iv_object_name = lv_name ).
      lr_post ?= lr_object.
CALL METHOD lr_post->read_object
        it_request_objects = it_request_objects
        iv_ref             = iv_root_list
        ct_bapireturn      = lt_bapireturn. 
This blog will not go deep into the Genil component implementation itself, but just focus what needs to be enhanced in Genil component implementation.
as you see, I just add the code surrounded with red to read the extension field data. I pass the reference of container object into method get_fe_data.
After that method is executed, the extension field data will be fetched and filled into the container object lo_post.



method GET_FE_DATA.
    data: lv_guid         TYPE crmt_genil_object_guid,
          lv_attr         TYPE ZCRM_EXT_SMC_DYNP_SV,
          lv_convert_guid TYPE socialdata-socialdatauuid,
          lv_post_id      TYPE socialdata-internal_id.
    data(lv_children) = iv_container->GET_CHILDREN( IV_AS_COPY = ABAP_TRUE ).
    data(lv_child) = LV_CHILDREN->GET_FIRST( ).
    ASSERT lv_child IS BOUND.
    iv_container->get_key( IMPORTING es_key = lv_guid ).
    lv_convert_guid = lv_guid.
    lv_attr = zcl_crm_soc_fe_buffer_access=>get( lv_convert_guid ).
    lv_child->set_attributes( lv_attr ).
    DATA(lv_attr_props) = lv_child->get_attr_props_obj( ).
    lv_attr_props->set_all_properties( if_genil_obj_attr_properties=>changeable ).
    SELECT SINGLE internal_id INTO lv_post_id FROM socialdata WHERE socialdatauuid = lv_convert_guid
    ASSERT sy-subrc = 0.
    data(ls_key) = VALUE ZCRM_EXT_SMC_KEY( client = sy-mandt post_id = lv_post_id ).
    lv_child->set_key( ls_key ).
in get_fe_data, there is nothing special logic inside. The real data is returned via zcl_crm_soc_fe_buffer_access, which encapsulate the buffer handling of extension field data in current session.
so let's have a look at the buffer class zcl_crm_soc_fe_buffer_access's get method:
method GET.
    DATA: ls_data TYPE ZCRM_SOC_FE,
          ls_attr TYPE ZCRM_EXT_SMC_DYNP_SV.
    READ TABLE st_buffer ASSIGNING FIELD-SYMBOL(<buffer>) WITH KEY uuid = iv_guid.
    IF sy-subrc = 0.
        rs_data = <buffer>-data.
        ON B~internal_id = A~post_id ) WHERE B~SOCIALDATAUUID = iv_guid.
    MOVE-CORRESPONDING ls_data TO ls_attr.
    DATA(ls_entry) = VALUE ty_buffer( uuid = iv_guid data = ls_attr ).
    APPEND ls_entry TO st_buffer.
    rs_data = ls_attr.
first check in the buffer table whether there is already an entry there for the current social post. If buffer hits, the bufferred data is directly returned.
If not, just load it from DB table. Why I use inner join is the type of buffer table has uuid as key, not internal id. And the uuid is the key field of hosting table of Social post, that is SOCIALDATA.
After the data is loaded from DB, never forget to insert it into buffer table.
    BEGIN OF ty_buffer,
           uuid TYPE socialdata-socialdatauuid,
           data TYPE ZCRM_EXT_SMC_DYNP_SV,
         END OF ty_buffer .
    tt_buffer TYPE STANDARD TABLE OF ty_buffer WITH KEY uuid .
now the read access of extension fields are done.
step2: write access.
After we type some value in UI fields and click enter key, IF_GENIL_APPL_INTLAY~MODIFY_OBJECTS will be called. Just the same logic as step1, the call will be delegated to handler class ZCL_CRM_SOC_POST. In method MODIFY_OBJECT, I only add one more line to handle with extension fields by creating a new method process_children.
for simplicity reasons I only react on the change mode. Again I pass the call to zcl_crm_soc_fe_api.
in set_fe_data I just put the list of changed attribute ( lt_changed_attr ) and the latest data typed by user ( ls_attributes ) to buffer class.
in set method of buffer class, again the similiar logic as done in read case. First check in the buffer table whether there exists an entry for current social post.
If buffer hits, I just to update the buffer with latest extension fields data. I loop the internal table it_changed_attr to make sure all changed attributes are handled.
if there is no entry in the buffer, the situation should be that such post has not any extension fields stored in DB table at the begining of this transaction.
The iv_new_data would come from the manual input typed by user in UI. In this case all I need is just to append the latest extension field data into the buffer table.
step3: save case.
No doubt the method SAVE_OBJECT of ZCL_CRM_SOC_POST must now take care the saving of both SocialPost itself and extension fields data as well.
I just add two more lines to original code.
I first save the extension field( done by zcl_crm_soc_fe_api=>save_fe_data), then the SocialPost itself ( via function module SOC_POST_SAVE ).
The condition "no value changed" is enhanced that only the situation neither Socialpost nor its extension fields are changed could be regarded as no value changed. If the line 18 is missing, you will receive message in UI "No value changed", even you have already modified some extension field but not touch standard field in social post itself.
The method save_fe_data is also very simple: just fetch the extension field buffer from buffer table and then modify database table.
  method SAVE_FE_DATA.
    DATA: ls_change TYPE ZCRM_SOC_FE.
    DATA(ls_buffer) = zcl_crm_soc_fe_buffer_access=>get( iv_guid ).
    CHECK ls_buffer IS NOT INITIAL.
    MOVE-CORRESPONDING ls_buffer TO ls_change.
    MODIFY zcrm_soc_fe FROM ls_change.
    rv_fe_changed = abap_true.
The genil component implementation is enhanced regarding following three parts:
1. enhance IF_GENIL_APPL_ALTERNATIVE_DSIL~SAVE_OBJECTS to support extension field save.
2. enhance IF_GENIL_APPL_ALTERNATIVE_DSIL~MODIFY_OBJECTS to support extension field change.
3. enhance IF_GENIL_APPL_ALTERNATIVE_DSIL~GET_OBJECTS to support extension field change.
Now it's time to enjoy our labour! Just create three extension fields to test. The three extension fields has type Quantity and sub type PRESS ( built-in type provided by SAP), so AET framework automatically creates two seperate fields for you, one for quantity value and the other for unit.
Those features like F4 help and validation logic for respective data type are automaitcally handled by AET framework. You do not need to code by yourself
Now have a look at the EEW structure created in part4. All extension fields are attached here.
And extension fields data are stored in DB.
Note: normally the AET enablement is done by SAP or Partner but not for customer, since if customers are able to build their own component by themselves, they can enhance it freely whenever they want without the help of AET.
Recently we got a requirement from customer that they want a non-extensible UI to be supported by Application extension tool ( AET ).
Since I found currently there is no detailed step by step about how to achieve this, I jsut create one.
AET is a powerful tool which could allow a user without any technical background to create new extension fields on UI in just a few seconds.
Equipped with AET, your application becomes more flexible since it allows your customer to create new fields by themselves which are missing in your standard application.
For demonstration usage I just use a component ZCRMSM which is copied from SAP standard genil component CRMSM for example.
( by the way, CRMSM is developed by us in CRM7.0 EHP3 which exposes the functionality to integrate social channel like twitter and facebook into CRM.  )
The genil mode is very simple: It just have one Root object, one query object and one query result object.
Create a new structure as below. EEW standards for easy enhancement workbench and SMC for Social media cockpit.
This structure acts as a place holder to attach extension fields created by AET. the component EXT_SMC is just a dummy field to circumvent the
restrict that netweaver does not allow you to activate an empty structure.
create a new dependent object SocialPostSetCRM_SMC to represent the extension fields belonging to a social post.
Of course a Aggregation must also be created to allow the navigation from SocialPost to this DO.
Now we have to create the key structure and attribute structure for DO.
create key structure for DO. Post ID is the unique identifier to identify a social post. UUID could also be used. Here I use post id since it is more human readable compared with UUID, which makes my trouble shooting easier.
for attribute structure, just include the key attribute above and the EEW structure created in step1, and that's all.
The EEW structure is included so that every time the extension fields are created, they will be attached to EEW structure and then would
also automatically appear in this attribute structure as well.
Now the enhancement for Genil component is finished, of course we need to implement the access logic on the DO as well. We will do this later and let's continue with our modelling task.
create a database table ZCRM_SOC_FE to store the transaction data of extension fields. Just the same logic in step3 of attribute structure: include key structure  and EEW structure.
tcode AXTREG, register your genil component as extensible.
Create a new entry in "Extensible BOs". In this example I use ZSOCIALPOST. It is just an indicator, no need to equal with your Genil component name or model node name.
Navigate to BO Parts. Create a new entry. Specify "Part of a BO". Here I just use "HEADER", which tells AET framework I want to put my extension fields on "Header" level of the Social Post.
Maintain the Field Enhancement Place - the extension fields will be attached to the EEW structure maintained here.
So technically speaking, if customer choose HEADER in AET ui, the extension fields will be created on EEW structure ZINCL_EEW_SMC.
The remain settings could just be maintained as below:
create a new application group, or you can also reuse existing one if there is any which make senses for your business requirement.
Here I just create a new one "SOCIALMEDIA".
click "Places" and register your EEW structure ZINCL_EEW_SMC here. Special the max number of fields you allow to put into this structure.
And also the max bytes which are allowed for the total extension fields.
The sum of Percentage customer, partner and SAP should be 100, the rule of thumb value would be 60:20:20 ( customer : partner: SAP )
double click on the sub folder "BOL objects" and maintain the DO for extension fields and its BOL Path from Root object such as below:
You may observe there are some other folders like Search place and Table place. Those are places where the registration for table and search enhancement are done.
This is out of scope of this blog. Now all the necessary parts in AXTREG are done.
Tcode SM30, choose view BSPDLCV_OBJ_TYPE and click maintain button. Then create a new entry with object type CCRM_SMC
and maintain Genil component name, the root object name, the BOR object type and extension BO name, which is created in step 5.
step7: go to the view where you would like to display the extension fields, redefine method DO_CONFIG_DETERMINATION.
Just specify the ui object type created in step6:
    CHECK iv_first_time = abap_true.
    me->set_config_keys( iv_object_type          = 'CCRM_SMC'
                         iv_propagate_2_children = abap_false ).
Now launch your UI, click configure icon to reach AET page, you should see "Create Field" button is enabled, which means all registration parts done currently are correct. Now the left task is doing enhancement on Genil implementation, which will be discussed in detail in part2.
ComponentSupport Package


I bet some of you guys still hearing those sentence again and again, "We want a report in the Web UI which should list...."  or "Yes, no problem, we will build a ALV in the web client" This last one still give me the chills <Offtopic> I HATE TLX!</offtopic>


Well as you already know, Web Client is not meant to do reports as you will traditionally do in SAP GUI, there's a reporting layer called SAP CRM Analytics which uses can use BI reports or CRM reports, remember BW is part of netweaver, so yes, CRM has his own BW , what's the main advantage of using SAP CRM analytics, although is based on BW  you can display very very very updated data. You can click the following link to see a nice video blog with some features: SAP CRM Analytics without BI ( using the CRM as the data source) in the perfect world


You can check/follow the SAP Best practices documents how to configure SAP CRM Analytics (no BI integration):


C41_CRM702_BB_CRM Interactive Reporting

CR2_CRM702_BPD_Interactive Reporting


Don't forget to activate the Business functions that applies to your needs, for example, if you want to use Sales Orders reporting area.


As you see there's a lot of stuff to learn, understand and do and I bet most of the people who read this will have no experience with SAP BW (like me) well, if is this you case, stop reading this, and run to find a BW consultant in your team, don't continue until you come back with him/her.....I'm serious.....soooooooo  you are not going to find him/her, right? do you think you are "very macho" to do it in your own right? nah...I'm kidding probably you won't find him/her because the project estimation didn't included a BW guy, why? this is a CRM implantation, who was expecting a BW consultant will be needed? reports are done with ALV!


Now I'm serious, you will need it, at least if you don't have enough time (and a sandbox) to learn how to add new fields and how BW objects should be transported.


Still a lot to do just to enable a few reports right? well now comes the best part: Let's assume you have everything running and healthy, you created  a report which lists sales orders, the customer wants to analyze the sales orders of this quarter, the list is about 5.000 sales orders, I hope you have a nice hardware or...wait? someone said SAP HANA? because if not, this will take ..hmmmm...let's say some time


Okok, you are lucky and you have SAP HANA and you realized you can export the data via a flat excel file or even a pivot table, I tried the pivot table export and it's pretty impressive, I mean, from a customer point of view, you all know customers love exporting data to excel and play with i.


And now one of the reasons which led me to write this blog:


Yeah, the Web UI export to excel is "limited" to tens or hundreds what now? you did a lot of work the customer payed the HANA licences but you can not export the info to excel because is "limited to tens or hundreds" when I read this It was like noooooooooooooooo waaaaaaaaaaaaaay. So if I was you I would really consider all this points before starting the "SAP CRM Analytics safari" .


In resume:


SAP CRM analytics requires:

- SAP CRM Knowledge

- SAP Web UI Knowledge

- SAP BW Knowledge

- SAP BASIS Knowledge

- Reports of no more than tens or hundreds records as long the customer doesn't want to export to excel and you have a nice hardware or SAP HANA.


In the end I just want to clarify, this is my modest opinion and my brief experience, take it as what it is of course I encourage all of you to participate in this blog, SAP CRM Analytics world is very obscure and  any small contribution/discussion will be a benefit to everyone.





The Business Blueprint


The business blueprint in all its essence is the genuine, realistic and conclusive detailing of our understanding of the scope, the specifications and the completeness of the solution design to be fulfilled to the business objectives, desired project outcomes and envisioned benefits.


When a strategic IT initiative progresses to the solution blueprinting phase, we, in all aspects, need to plan adequately for a well-balanced and disciplined approach. Given the strategic importance of the initiative, all-inclusive commitment from the clients, the consulting team along with the participating program management organization holds a paramount importance in realization of the solution.  It’s never been more important to understand how one needs to recognize the significance of the collective best-in-class teamwork supported by consensus based practical planning and organization -- be it the methodologies, tools & templates and the knowledge repository -- in making these initiatives accomplish the likely results.

The business blueprinting primarily focuses on understanding, authenticating and documenting project scope, specifications and the future to-be solution in its objective conceptuality and practicality. The following illustration depicts simple yet effectual steps with clear understanding of the business blueprint viewed as a value chain process (See Figure 1) -- Plan-to-Workshops-to-Blueprint-to-Acceptance. The acceptance of the business blueprint results in subsequent realization phase encompassing the steps -- Blueprint-to-Configurations-to-Test-to-Go-Live.


The Business Blueprint - FINAL.jpeg


In the initial planning process, we should clearly communicate and highlight the project’s business goals, approach, timelines and the teams to all the key participants before the actual scoping steps. The illustration above portrays logical phases of an actual business printing along with the attentive set of activities. Each of these phases understandably encompasses pre-defined set of activities to be performed with clearly identified deliverables.

The workshops are the most crucial part of the business blueprinting; this phase needs the utmost attention and thoughtful communication, planning and organization. What we do here -- solution scoping -- becomes the foundation for the subsequent step. All the participants of the workshops need to be identified well in advance with designated leads and their active participation holds foremost importance in successful scoping.

Blueprint preparation, it is in this phase, we write the actual business blueprint and takes the shape of a realistic and conclusive detailing into a presentation with all the things we have collected through the workshops -- scope, specifications and the solution. This detailing in all its objectivity, strategic distinction and as a result rationalizes how the-sum-is-greater-than-the-parts in aligning the IT initiative to the business vision and its supporting capabilities.

On successful preparation of the business blueprint; it can then be presented to the client for their assessment and validation in its completeness and acceptance.

Here, a key characteristic is the collective efforts, experience and determination of the team -- especially the right people -- who bring passion and commitment to the project success. Equally important are determining and developing client specific templates across all the steps. In consensus with the clients the templates can be discussed and institutionalized with the necessary authorizations ensuring predictability in deliverables with assured quality.

The internal collective knowledge repository can be of great help; such pre-defined templates reduce overall time and accelerate the process. However, not all the clients have well established internal IT team; so this necessitates hand-holding in structuring and managing the overall initiative, this can be of valuable learning experience. Vigilant and participative program management can be a great facilitator in bridging all the cross-functional teams and in creating an atmosphere of positivity and project success in all aspects through actively managing progress and mentoring to see how well the project is moving towards its goals.

For the businesses to operate in all its efficiency and competence the IT capabilities are the foundational components. The business blueprint summarizes the very essence of such dynamic IT capabilities aligned to the desired project outcomes and this is where the strategic IT initiatives meet the operational level. This means, a well written blueprint ensures value realization through its practical implementation in its functional, process and technical feasibility. So is the purpose of the business blueprint and it holds a strategic importance in fulfilling a shared vision.

Sometimes we need to supply a single value synchronization of specific parameter between different separated components of CRM. Of course, there is a way to implement such task via binding, but if we are talking about synchronization of only one single value, this way may be too complicated. Here is an approach to do that much more easily.


Implementation in WD_USAGE_INITIALIZE( ):


  1. " define implementation class of component, which we want to link
  2. sync_win TYPE REF TO %comp_class_impl%.
  3. usage_ref TYPE REF TO cl_bsp_wd_component_usage.
  4. CASE iv_usage->usage_name.
  5.         " define synchronization only for specific usage
  6.         WHEN '%name%'.
  7.                 usage_ref ?= iv_usage.
  8.                 " define MainWindow of component, which we want to link
  9.                 sync_win ?= usage_ref=>get_interface_view_contr( '%COMP_NAME/Window_Name%' ).
  10. " link specific attribute of current class to specific attribute of desired component class
  11. GET REFERENCE OF me->flag INTO sync_win->flag.


I suggest to use this approach very carefully, because active use of such technique may lead to some side effects, such as kind of «spaghetti code», where it's very difficult to understand what, where and when is connected with external components.



Discover, learn from and listen to SAP’s LoB Customer ‘espresso’ webinar series.  EMEA are currently hosting a webinar series consisting of 6 CRM topics. These 30 minute webinars cover topics in an efficient and informative manner; engaging the audience throughout. 

Don’t worry if you have missed the webinars, all recordings can be found below! All webinars are open for customers/prospect and partners to join!


Learn about how your digitally-empowered customers have new expectation for what your organisation can do for them in.  “Revolutionise the way you can engage with your customers” ‘webinar.


Click here to Watch Recording Now


Get an inside look on how using SAP Sales OnDemand can increase sales rep intelligence. Join Roland van Breukelen, Business Development Director SAP CRM Centre of Excellence for ‘How SAP Closes Deals Faster with Real-time Sales Intelligence’ webinar.


Click here to Watch Recording Now



Listen to ‘SAP and hybris deliver customer engagement innovation’ 30 minute Webinar featuring guest speaker Jack Shaw – Technology Futurist and E-Commerce Specialist. Find out how these two powerhouses are working together to change the face of commerce and customer engagement.


Click here to Watch Recording Now



Discover how your sales and marketing teams can achieve key insights quickly to reach the right customer with a personalised approach in ‘SAP Customer Engagement Intelligence: Sell more and Spend less!’ webinar. 10th October 10am CET.


Register Now


Join our ‘Monetise Services with a next-generation billing platform’ webinar. Learn about how your customers are becoming more empowered and expect higher quality products and services.  24th October 10am CET


Register Now


Register for ‘How Lexmark successfully manages global rebates program’ webinar and hear about how Lexmark International benefit from SAP Payback and Chargebacks by Vistex. 7th November 4pm CET


Register Now

Hello All    


I am pleased to announce first ever CRM Community Event in Delhi , India on 23, November,2013(Saturday).

Idea is to meet with all SCN CRM Delhi region community members in person and to discuss about various topics on CRM like

CRM on HANA, CRM EHP3,Social media integration and many more.



Hasan Rafiq already published a blog . We would like to know the interest of community members who would be interested to attend this event. Based on the response we will be deciding the location of the event.



my request to all community members who would like to attend this event or want to present any session please register at the link below



We are planning to organize similar event at other locations also. Please keep following this space for more details.


You can reach to following volunteers if you need any further info or if  you have any suggestion.


hasan rafiq( or Kumar Akshat( or Naresh Kumar Malik(



Agenda :

CRM Webclient UI improvements via Customer Connection - Gregor Wolf Gregor Wolf

CRM  with HANA -  an Overview   - Naresh Kumar Malik Naresh Kumar Malik

SAP CRM - Social Inegration - Hasan Rafiq Hasan Rafiq


Sap Connect link: You can join sessions remotely via* *

Participant Passcode:



Venue :  SAP Labs India Pvt. Ltd. - Gurgaon , Vatika Towers , Sector 54, Golf Course Road , Gurgaon, Haryana - 122002, India

Since SAP CRM 6.0, a billing transaction type is alwasy displayed in the follow up transacton type slection list for an sales document.


It is a functionality change, that is intended for the convenience of creating billing document, the billing document appears as an default entry in the follow up transaction type selection list.


If there is the business requirement to get rid of this option, you need to enhance the view and deactive the relevant codings in the enhanced class CL_BT115H_S_SOHOVERVIEW_IMPL method EH_ONFOLLOWUP
... ...

*** Add billing on popup

    lr_context_node = gr_proctype_bo_popup->get_context_node(

iv_cnode_name = 'PROCTYPE' ).

    IF lr_context_node IS BOUND AND me->is_template( ) = abap_false.

      CREATE DATA ls_struct_ref.

... ...

As a developer in my daily life I always need to quickly locate the source code where raises a given message in webclient ui.

(If you would like to know how to quickly find the source code which raises message in SAP GUI environment, please refer to this blog of mine instead. )

Here below are four approaches using which almost all messages I meet with so far could be located:


1. If some invalid data is input which blocks the account save, the generic message saying "data contains error" without dedicated errorous field is not helpful. Suppose I would like to find the exact code which raises error message. You can observe that if I put the mouse onto the error message, there would be a tooltip poped up with message technical information like message id and message number. By default this behavior is not activated for your user. You can manually activate it via:




go to transaction code SU3 and maintain user parameter BSPWD_USER_LEVEL = 6




6 means "Experienced user". You can find the description of all possible value in domain BSPWD_MSGLEVEL.




Now we know the message id is CRM_BUPA_BOL and number is 036. Go to transaction code SE91 and search code via where use list:




we get 2 hits: double click on one of them. Why there is if 1 = 2 whose condition will never be met?



actually the red code below is just what we look for. The above code in line 86 is just simply written in order to enable itself to be found by where use list,

since where used list in abap workbench would only find the static message usage like keyword MESSAGE + <message type like e,i,w><message number>

(<message id>). The red code does not really raise message via keyword MESSAGE but just put the given message into an internal table via global message service and thus would not be found by where use list.







2. In IC agent inbox, if an unsupported search attribute is specified, the search could not be performed and the corresponding message is raised in ui.



unfortunately now if I follow approach1, no hit in where use list.




so I try to use report RS_ABAP_SOURCE_SCAN, use 559 as search key, and maintain CRM_IC_APPL_INBOX as package. The report will scan 559 within all abap source codes which are stored in that package.




So how can I get the package name CRM_IC_APPL_INBOX? Just click F2 on UI, I can know the view name ICCMP_INBOX/InboxSearch.


in its event handler for event SEARCH, I can know that the search implementation is actually provided by class CL_CRM_AUI_QUERY_SERVICE.




so now I can ensure that the code which raises the information message is definitly inside that package.



after a while the report runs over and I can simply double click the result to jump into the source code.



3. When it comes to product area, it is pretty easy to find the source code of given message. Almost all underlying messages in product application is raised by utility function module COM_PRODUCT_ADD_MESSAGE. In example below I input an invalid item category group WWW and would like to find which code does validation check and raise error message. All I have to do is just to set a breakpoint in that function module, and re-save in ui:




breakpoint is hit as I expect after I click save button again:



the sy-subrc indicates that there is some exception raised, and just above the FM COM_PRODUCT_ADD_MESSAGE, we can find the FM

COM_PRODUCT_CHECK_FIELD_ENTRY complains that the input WWW is not valid.



4. This is the most powerful debugging method. Suppose I need to find which line of code raises this message below:


Use F2 button I know that the current search page is built on BP_HEAD_SEARCH/MainSearch:


So I set a break point on search event handler:



The breakpoint is hit when I click search again. However I will not debug it line by line. Click tab "Break./Watchpoints", and create a dynamic breakpoint for abap command MESSAGE. As a result the breakpoint will be triggered wherever the keyword MESSAGE is written in abap code.




I just click F8, and debugger automatically stops in the line below, which is just what we are looking for.






all the four methods above makes my trouble shooting life easier. If you have any other approaches to achieve the same, welcome to share with us

Disciplined Approach To Solution Scoping


Organization’s business imperatives have more often a mutually-inclusive impact on how it leads its strategic IT initiatives. In other words, aligning IT strategy closely with business strategy and mobilizing the right resources to effort instigates collaboration and collective teamwork those once would have been in parallel existence.

Effective alignment can happen only when IT and business strategy are anchored in clearly articulated scope of capabilities in juxtaposition. Such collaborative capabilities are dynamic and give the organization an ability to adapt to changing market environment especially while implementing enterprise systems that hold strategic importance and hence needs to be anchored to clearly defined scope of   business and IT capabilities.

Here is an illustration of a traditional methodology in its simplistic view on various characteristic activities across the life-cycle of an implementation project (See Figure 1). It essentially links and binds together a set of collective activities into a well-defined and distinctive transition plan.

Traditional Methodology - A Simplistic View - FINAL.jpeg

A disciplined scoping holds a paramount importance at the beginning and lays the groundwork for more effectual designing and to subsequent steps of the project. Incoherent and messy scoping leads to unnecessary complexities, since high-profile IT projects are particularly prone to drifting. We need to be vigilant against scope tiptoe, which can cause projects to deviate from their original objectives.

In the planning process, we should clearly articulate and reinforce the project’s business objectives long before the actual transformation. Here are critical guidelines and few success factors that go-a-long-way in scoping the solution to realization.


  • In the initial stage of the project, we really need to understand the business imperatives, objectives and the challenges – this clear understanding will lead us to scope, approach and timelines and in essence provides a foundation to plan subsequent steps.
  • Scoping in most of the scenarios, are conducted through business blueprint workshops with the specific process or functional emphasis along with the targeted audience to maximize the effectiveness. At this point, the audience should be expanded to include all of the employees who will use the system with the designated leads.
  • Client specific scoping templates – functional and business process flows, scoping of requirements, requirements fit-gap, and workshop take aways etc. – drafted well in advance are exceedingly effective. They help us in systematic and organized scoping of requirements and also reduce time overall to accelerate the process.
  • Solution walk-through process flows can be of great help in mapping client-specific functional and business process requirements to the functionality and we should maximize the usage of the off-the-self solutions for they would accomplish most of the project’s objectives at lower cost. With this approach we can identify gaps and customizing, recommend potential workarounds for gaps, and suggest enhancements and improvement opportunities.
  • Consolidate the scoping requirements, prioritize requirements, solution gaps/enhancements and present the findings of the workshops to reassure clear alignment between proposed IT capability, business measures addressing key pain-points and desired outcomes.
  • All the customization's should be reflected on the costs to build and support them over the project’s lifetime. In all, we should limit customization's to no more than 20% of the standard, and those modifications should focus on central capabilities that are essential to business imperatives and its success. Customization beyond these levels can make future upgrades too costly and time consuming, undermining a fundamental benefit of packaged solution.
  • The scoping schedule should always include the freezing time. However, some addition in scope may be justifiable to stay up-to-date with market and competitive demands. But in general, clarity of scoping that defines what the project will and won’t accomplish reduces the likelihood of inconveniences and its impact on the overall project scope and timeline.
  • In practicality, often users request new features during testing phase of the project and we should be prepared to evaluate those requests in the context of the project’s original objectives and accordingly accommodate with the necessary approvals. The scoping issues should always be discussed in its objectivity separating the issues from the people.
  • The needs of the organization will change over time and its capabilities must keep pace with them. This requires constant coordination between IT and the business units, on-going assessment and reviews of the IT priorities, timely scoping and allocation of resources. However, the essential capabilities remain relatively stable. Once the new system has been rolled out, it’s important to continue to measure the operational and behavioral changes that will lead to the sought-after benefits.


As IT capabilities become aligned with business imperatives and strategies, its relationship to the business matures and deepens over time. The IT organization’s ultimate objective is to function seamlessly as part of the business and then evolve into a trusted partner.

Disciplined scoping of solution makes way for a complete and all-inclusive methodology, ensuring that the requirements are identified, summarized, prioritized and documented with the necessary approvals during the scoping phase of the project. Whilst, governance is the bridge between promise and delivery – there always is a better way, however – it’s the people who make the difference.

When we collectively work together, as a team with the shared values and the simplicity of virtues, we can bring about business-transformations through successful implementations of projects that truly deliver on value and desired outcome with the lasting impact.

In Territory Management , we can create rules for determination using the rule policy builder. The rules can be created based on standard attributes which would appear as drop or as F4 Help. But there are situations when we would need to add new Z -fields based on which new determination rules can be created. The process for creating Z fields for territory determination is as follows


  • Go to spro ->Customer Relationship Management ->Master Data ->Territory Attributes->Maintain Territory Attributes. The new attributes could be added in BP ( Account) , PR ( Product) , SA ( Sales Area)


  • To create a new attribute for determination in say in BP , select BP and press attributes and go to edit mode



  • Create new entry by pressing the new entry button and the following screen is presented


Fill in the details , Condition Attribute Id , Description , Help Type , Data type and F4 Help . Remember to choose the Applicable operators. If Dropdown is selected as Help type , then choose the operator '='.


  • And save the attribute


  • Now Implement the BADI CRM_TERRMAN_ATTRIB for additional attributes in Territory Management


  • Some of the methods, that needs to be implemented are

          IF_EX_CRM_TERRMAN_ATTRIB~FIELD_CHECK( ) -> This method is used for checking the value entered in the rule policy builder is valid or not.


          IF_EX_CRM_TERRMAN_ATTRIB~GET_F4_HELP_CUSATTR( ) -> The value of help is retrieved using this method.


          IF_EX_CRM_TERRMAN_ATTRIB~GET_CUSTOMER_ATTRVAL( ) -> This method provides all possible value of an attribute field.



  • An easy way to test this setup is to create additional attributes and then put a breakpoint in BADI methods. Then try to create a new rule from WebUI. The breakpoints would be hit.


Filter Blog

By author:
By date:
By tag: