Personalized customer engagement is not an event, it is a process. Once the appropriate infrastructure is in place, the journey can begin….

Companies are looking to provide world class service as a way to meet the challenges from increasingly demanding customers that are knowledgeable about their alternatives.


“…Technology is changing the game, and customers are changing the rules. Yet these are more than just trends; we are witnessing a profound paradigm shift in how companies engage with customers. Today’s customers are digitally connected, socially networked, and always on, and with technologies like smartphones, social networks, and mobile apps, they are more empowered than ever.” says Volker Hildebrand, SAP’s Global Vice President, Customer Engagement Solutions.


Facing these challenges may seem daunting, even overwhelming. Once the commitment is made to deliver personalized customer engagement, start where the biggest impact can be made, your Contact Center. This is the “face” you present to your customers and where you interact with them.

One of the challenges is the unpredictable nature of the communications. Your customers decide when, if and how they are going to communicate with you. Your challenge is how to appropriately respond in the communications mode your customers choose, and as quickly as possible.

Another challenge is that the customer dialogue is not a series of discrete, unique experiences, it is part of an ongoing relationship. Customers expect you to know about them and acknowledged them, and to be treated with dignity, and not kept waiting. Violating this relationship can have profound consequences. When musician Dave Carroll was unhappy with how United Airlines handled his concerns and treated him he created a music video “United Breaks Guitars” video that has been seen by more than 13 million viewers.

Companies like Wacker Neuson made a strategic decision to begin their journey to provide personalized customer engagement. They wanted to make sure that the agent could really help callers with their problems by being as knowledgeable as possible when customer called in. To do so, they wanted to arm their Contact Center agents with everything they knew about their customers and have all of the tools available. With a 360-degree view of the customer, agents will instantaneously obtain customer information from multiple systems that typically exist in separate silos. Financial and transactional information from SAP ERP systems where in one place and the sales histories from SAP CRM systems were in another. Seamlessly integrating these systems with the SAP BCM Contact Center gives the agents’ comprehensive information without the time consuming toggling between multiple screens.

Creating a new paradigm for world class customer service with personalized customer engagement is not an event, it is a process. Once the appropriate infrastructure is in place, the journey can begin and the goals of increased customer loyalty and greater long term profits achieved.

Business Analyst Sandy Reisenauer from Wacker Neuson loves sharing the tale of her organization’s experiences on this journey. Hear what she has to say.


This blog originally appeared on and SAP Business Innovations

Yesterday I faced a very common issue with some CRM business transactions: the document flow was showing ECC objects for which no navigation was possible (despite the identification number rendered as hyperlink):


So, as I couldn't find any source on SCN to solve it, I decided to post a quick note on one possible solution to overcome this problem (which I found by debugging the system as of method PREPARE_COL_FOR_NAVIGATE_BOR from class CL_CRM_UIU_BT_NAVIGATE). First, check table BSPDLCV_OBJ_TYPE: it is most likely that you won't find any entry delivered by SAP with "BOR object Type" = "BCONTACT". So you'll have to create such entry in table BSPDLCVC_OBJ_TYP (which is exactly the same as BSPDLCV_OBJ_TYPE, but for customers only):


It's important to use "BOL Object Name" = "ICBORWrapper", because SAP will use this name to determine a "mapping class" stored in table CRMV_UI_OBJ_MAPS (or CRMV_UI_OBJ_MAP if you want to overwrite this customizing with your own values):


This class will in turn create a BOL entity dedicated to BOR objects that will store the BOR type, ID and logical system (i.e. those three pieces of information you need to navigate to the right system, on the right screen). Also, make sure that you name your UI object type WRAPPED_<BOR TYPE> in table BSPDLCVC_BJP_TYP. Now we just need to create a Launch Transaction (tcode CRMC_UI_ACTIONWZ):


And we also need to enable navigation for this WRAPPED_BCONTACT UI object type created above in the corresponding navigation bar (tcode CRMC_UI_NBLINKS):



Everything is setup. If you click on the link corresponding to BCONTACT object type in the Document Flow assignment block, the system will automatically navigate to the corresponding screen in the backend (provided the launch transaction is customized correctly, and the backend system is defined in tcode CRMS_IC_CROSS_SYS). In case you're facing any issue, the following documents by Hasan Zubairi might help:

Almost Everything About Transaction Launcher - Part I

Almost Everything About Transaction Launcher - Part II

Imaging your Sales Force can fulfil their job using well known native tools
to administer own contacts, share information and collaborate with their teams.
Combine the power of SAP CRM with the familarity of Microsoft Outlook.



SAP’s Desktop Connection is the tool which helps you achieving this goal. Now it moved out of restricted Ramp-Up and is available to all customers.


The current version 2.0 (generally available February 14th, 2014) covers synchronization of accounts, contacts and appointments between MS Outlook and SAP CRM. Collaborating and information sharing is just one click away using native MS Outlook look and feel, ensuring everyone is working with the most up to date information.


Desktop Connection tailored your needs and was designed with flexibility and ease of use in mind. With the CRM server customization package you can not only define what gets synchronized but also extend the synchronized objects with your own fields, or even define your own objects to be synchronized.


Get started now, extend in the future. Together with invisibleCRM® we are already working on the next releases. Our professional edition, available in Q2 2014, will additionally synchronize e-mails and personal tasks. The enterprise edition, available later this year, will offer even more synchronized objects such as leads and opportunities, as well as a number of other improvements.


Further information can be found here.

In previous blog we have finished the creation for web service PROD_WS, and ABAP consumer proxy class ZZCO_PROD_WS. Before it can be used in ABAP program to consume the web service we created, a logical port is needed.


Create a new Logical Port in SOAMANAGER

1. Go back to SOAMANAGER and search PROD_WS again, this time the ABAP consumer proxy ZZCO_PROD_WS is also visible in search result list.


2. Click consumer proxy class and click button Create->WSDL Based Configuration:


3. Specify Logical Port name:


Specify the WSDL link of new binding for service definition created in previous step. Specify a valid user and password for WSDL access.




Click finish button to finish logical port creation. Click Ping button and ensure it works successfully.


Consume the web service in ABAP program


Use the following source code to consume the query and read service operation. Pass the logical port name LP__TEST1 in constructor of consumer class. The data type and method signature could be easily found in class builder for consumer proxy class ZZCO_PROD_WS.




DATA: lo     TYPE REF TO zzco_prod_ws,

           input  TYPE zzcrmost__pro001prodadvsea01,

           output TYPE zzcrmost__pro001prodadvsea00.



    logical_port_name = 'LP_TEST1'.


input-input-searchforproducts-created_by-sign = 'I'.

input-input-searchforproducts-created_by-option = 'EQ'.

input-input-searchforproducts-created_by-low = 'WANGJER'.




        input                   = input


        output                  =  output ).

  CATCH cx_root INTO DATA(lv_text).

    DATA(ls) = lv_text->get_text( ).

    WRITE:/ ls.



DATA: ls_read_input  TYPE zzcrmost__prod_ws_read,

           ls_read_result TYPE zzcrmost__prod_ws_read_respo.


    ls_read_input-input-prod_ws-product_id = 'ARNO_TEST004'.



          input  = ls_read_input


          output = ls_read_result ).

  CATCH cx_root INTO lv_text.

    ls = lv_text->get_text( ).

    WRITE:/ ls.


program execution result: 100 results found with CREATED_BY = WANGJER:


The result is exactly the same as when we manually run the advanced search in GENIL_BOL_BROWSER:


And the result for read operation consumption:


In this blog I will create a web service which is exposed via Genil model PROD in CRM web client UI and consume it via a simple ABAP program.


Create web service in CRM Webclient UI


1. log on CRM Web ui with business role SERVICEPRO, work center Service Operation, Create a new Web service:


Choose Material as Business Object, choose Product/Individual Product as Component, Product as Root object.

Mark check box Read, Create and Change.


Click the new button to also create a webservice operation which is implemented via the query object of Genil model


Click new button:


2. in step2 of the creation wizard, simply click select all to ensure all attributes in Genil model PROD are involved in the web service.


click Confirm Selection to continue.


3. in step3, it is allowed to specify certain fields as read only.


4. In final step of wizard, we can specify the security profile of created web service. The differences of the two can be found in the chapter when we talk about how to consume the web service. In this blog I choose BASIC as security profile.


Click Activate button and then click Productive button in toolbar. Now we have finished the creation and the webservice PROD_WS is ready to be consumed.


Create new binding for Service Definition PROD_WS


use tcode SOAMANAGER, click Web Service Configuration.


Search by object name = PROD_WS:


Select search result and click Create Service button:


Specify Service name and Binding name:


Select SSL as Transport Level Security


If you select SECURE as security profile in web service creation step, the Authentication Level will be Strong instead of Basic, and the checkbox "User ID/Password" will be disabled, which means in that case, only X.509 SSL Client Certificate or Single Sign On are allowed.


In this blog, since both the creation of web service and service consumption are done in AG3, I mark "Make Local Call" as Local System Call.


Click Finish button, click the icon "Open Binding WSDL Generation",


write down the WSDL link:


Create the service consumer proxy in ABAP backend



1. tcode SE80, choose tab "Enterprise Services Browser", right click on Objects, choose "Create new Object",


Choose Service Consumer and click continue:




Specify a prefix:


Lots of proxy objects for runtime usage will be created:


Finally the ABAP consumer proxy class ZZCO_PROD_WS has been generated, which would be used in the ABAP program to consume the web service.


Now the consumer proxy class is ready for use. We can find all its available methods and signature in class builder.


In part 2 of this blog, we will discuss how to use this proxy class to consume web service in ABAP program.

Less face a fact, the world of customer relationship management is no more just a traditional automatic Happy new year campaign email or a after service survey. Since the beginning of 2012 we have seen a revolution in CRM systems around the world. The focus today is not just about the customers but also on the ease of usability and features to the employees.


Phew ! Our systems are very friendly but wait ... did we hear "features" ? Yes features in terms of an applications is a collection of addons which makes the experience more interactive or fun to work with.


How great would it feel if my SAP CRM system plans my day automatically after reading my calendar, making a note of my important meetings, missed alerts, closing opportunities, creates a day-wise agenda and mails me the same every morning at 8 AM. Wooohoo !!! " My employees would love this and I can pay anything for such a great feature " , would be the words of a customer. Friends, there are many apps which are providing such features ! Traditional features are considered just a baseline these days.


The second thing which a lot of us ( CRM experts ) must have seen now a days are a set of silly kind of requirements ( sounds to us ) like I want to see a list of users in my organizational position who are using the CRM system or online ! ( Trust me, I had this encounter ). " Why do you need this feature ? you have office lync or GTalk for this feature " , were my words to him. "I need to know who I can transfer my service cases for the fastest response and if it's not possible in CRM please let us know as this is very important for us and Sales-force already has a plugin for this" , was his response.


Seems legit , isn't it ? Yes it is , at first it sounded useless but the explanation along with the comparison of another product was good enough for me to help him solve this.


Every time we tend to refuse for a requirement, just because we have no idea of how it can be done kills the trust ! Still there are situations which cant be implemented at all. One of my customers asked for providing him an auto-complete features in text boxes on CRM Web-UI, which simply was not possible due to the data throughput it will put on the system but we let him know about a work around which was accepted by him. Bottom line : "We just should not close an impossible requirement with a NO, provide an alternate solution". Trust me when you talk in business terms with the customer, the relation builds stronger and the trust grows.


In my blog "Six kinds of debugging tips" Fabian Geyer raised a very good point about the trouble during ERP Application trouble shooting.

Let me just quote his good statement:


"Several ERP applications (esp. Financials) often use a "message collector" technique especially when handling "multiple objects", where after the application ist "detecting" an error it will be "stored" to an "error collection" and after all checks have been done the list of maybe many erros is shown in a popup or list.

In these cases, when the message is "shown" is far to late to analyze, because the application data/situation which is causing the error is analyzed somewhere else (far earlier in the runtime). In these cases I often use breakpoints in FM "MESSAGE_STORE".


Similar handling is needed in case the BC Application Log-technique is used (SLG0, SLG1 etc.) a breakpoint in FM BAL_LOG_MSG_ADD can help. "


Actually in CRM application the error message handling logic is the same. Let me just use the example of Service Contract processing as example:


How to find the code where the nessage CRM_ORDERADM_I with number 505 is raised?


Approach1: Use the source code scan

For more details about how to use source code scan, please refer to my previous blog.

When I am using this approach to write the blog, it just took me several minutes to find the exact code position.


First we use the source code scan tool ( search keyword = 505) to find the constant ITEM_TYPE_NOT_FOUND for message number 505. Since I know the program CRM_STATUS_CON has defined constants for all status, then I execute the search report with the parameter below:



And here is the result:




Then use the source code scan once again. The question is how to specify the input parameter?


1. We know that service contract is implemented via one order framework. Just display function module CRM_ORDER_* for example CRM_ORDER_READ, and get its package name CRM_ORDER:


2. execute the search report with the following input:


Nothing found. Then I change CRM_ORDER to CRM_ORDER*. This time we get seven candidates, then just set a breakpoint at each and repeat your scenario.


The third one in result above is proven to be the location we are just looking into:


Approach2: Use function module BAL_LOG_MSG_ADD



This tip is suggested by Fabian Geyer and is also very good. Just set a breakpoint on functon module BAL_LOG_MSG_ADD and repeat the scenario in service contract. The breakpoint is triggered( you can observe the FM is now displayed in the top-most of callstack ) and the code position we found this way is just exactly the same as Approach1.


In this case the Approach2 is even more efficient than Approach1 to quickly locate the code we look for. Thank Fabian for sharing us such useful tip.


Setting breakpoint in function module BALW_BAPIRETURN_GET2 would be another good attempt.


Why neither approach works for me? Why the breakpoint is not triggered in my application?


Still use service contract for example, the business transaction like Sales Order, Service Order and Service Contract are implemented via so-called One Order Framework. And as clearly described by Fabian which I quote in the beginning of this part, the error detection logic of One Order Framework, in this example is the logic in form DETERMINE_ITEM_TYPE, is ONLY done for the first time the item is inserted. Once an error is found, the respective function module in the function group CRM_MESSAGES will be called to persist the error message. Later on when the erroneous service contract is opened once again, there are no item type check any more, instead the error message is fetched via read function module in the function group and displayed in the UI.



When I delete one item product in the service contract, the obsolete error message for that item would also be deleted by the corresponding FM CRM_MESSAGES_DELETE.


So when I am trouble shooting the error message raised in Business Transaction application, I will either delete the old erroneous item then recreate it, or create a new one from scratch. Of course if we need to do debugging in production system, both could be inappropriate.

In this case if you can ensure that the error message raised in customer production system could also be reproduced in your dev system, then you can still use the tips in this blog to find the position in an efficient way.

Maggie Su

Condition with zero rate

Posted by Maggie Su Jan 24, 2014

After appying below support packages, or SAP Note 1884286 into the CRM system, you will see the condition with rate "0" being activated in a CRM transaction. Before that, the condition is marked as inactive if its rate is zero.




Due to this change, depends on the used pricing procedure's settings, below symptoms may occur:

- A non-static condition (class B) with proper rate is set to inactive

- The item's net value becomes zero.

- Item's net value is changed to a unwanted value if a new pricing is executed.


Now, there is a new SAP Note 1968594 created to make the system behavior customizable based on the client’s business scenario. After applying this note, the client can control whether the condition with zero rate should be set to active with parameter “KEEP_ZERO_PRICE”. More detailed information can be found in the note.

About UI5 for Beginners


     SAP UI5 run time client side HTML5 rendering library with a rich set of standard and extensive controls. Used in developing lightweight business application which runs multiple background across devices such as desktops, mobiles, smartphones, tablets. Based on extensive JavaScript, it supports RIA (Rich Internet Applications). Initially named in as a'Phoenix Project' then evolved into SAP UI5.



  1. Any screen on any device,
  2. Cutting-edge controls,
  3. Powerful theming and branding,
  4. Efficiency and Performance.


1. Any screen on any device - Flexibility in adapting new technology across multiple devices. List/Table views flexibility in designing screens. Supporting RIA like client-side features based on JavaScript.

2.Cutting-edge controls - Focused on user-experience. Supports extensibility concept for business relevant controls such as Calendar, Charts and Index to extend the current functionality.

3.Powerful theming and branding - Easily customizable themes which supports CSS5, which adapts themes to brand in an effective manner. SAP UI5 tools integrated into Eclipse supports in creating and modifying themes with an enhanced CSS editor and application preview capabilities.

4. Efficiency and Performance - Fully supports SAP product standards including security globalization, accessibility and performance. Allows usage of own JavaScript and HTML.


Browser Support


     Internet Explorer,

     Mozilla Firefox,


     Chrome browsers support the web tool.

Data Binding

     Model View Controller architecture is used in binding the data between request and response of the system. Binding modes can be of one-way or two-way.

Example: Updating relationship and synchronization of calendar utilities.

Model Implementation

     SAP UI5 can be implemented through JSON, XML, ODATA models.

JSON Model


     Implementation of JSON has a slight edge over other models since it uses a REST interface. REST is a web application interface model through which the client communicates with the server by modifying the state of resources through representations. This interface manipulates the state of resource oriented decomposition of business processes.


CRUD Application and ICF service based on REST and JSON configurations are provided in the development toolkit references. Implementing the REST service using model and DDIC objects and CRUD methods will summarizes the response of the web service.


*CRUD - Create, Read, Update and Delete methods

*REST - REpresentational State Transfer

*ICF - Internet Communication Framework

*JSON - JavaScript Object Notation


     1 - Web Service request

     2 - Response from the server.

Can you imagine a new way to get support from SAP, without the need to search for notes in SMP or opening an incident because you can’t find a code correction for a specific error?


With this opened question we started our presentation on “Automated Note Search Tool” (ANST) during the ASUG Ontario Chapter last November. The reaction from the audience was “It sounds great!!”, and it really IS great.


As you may know, ANST is new approach to help out customer searching for notes and also for troubleshooting and root-cause analysis for of any SAP related issue within ABAP environments.


The fact you don’t have to identify keywords to do the search in SMP or double-check if you can or can’t implement a note, makes ANST a very powerful tool for our customers, saving them time and eliminating re-work.


If it won’t be enough, customer does not have to wait for an SAP Engineer to review and provide feedback about a known bug. Check out the following diagram for the complete work flow revolutionized by ANST:

Blog #2.png


The tool was not only for note searches but also about customer code and customizing tables and how following this simple process makes the difference, saving time and efforts they would have otherwise have to spend in an incident/message.


It was an amazing experience to get in touch with our customers and show them life demos where they can validate how this tool works and how their work (and life) can be easier. If you want to learn more about ANST please take a look at the following videos ANST @CRM and ANST @ECC.

Background of this blog

The reason to write the blog is recently we found that in several CRM projects in China, the ABAP Webdynpro is wrongly chosen by local partners as custom devopment UI technology, which has caused several issues after project is on line and led to huge maintenance effort. Many partners choose ABAP Webdynpro because they are more familiar with it and they consider Webclient UI has performance issue compared with ABAP webdynpro.

in my previous blog Webclient UI vs ABAP webdynpro - performance loss in BOL / Genil Layer discussion I made some performance discussion regarding CRM Webclient UI and ABAP webdynpro and finally my conclusion is when talking about CRM custom development, we should always stick to Webclient UI technology and avoid the ABAP webdynpro if possible.

In this blog, I will try to collect issues if ABAP Webdynpro is unfortunately used in CRM application. Feel free to raise your parts, if they are not mentioned here

Issue list

Some of the issues described here do not immediately make the application stop working, but can lead to potential issues in the future, make the application unstable, or cause inconsistent user experience for end users. All of these inconsistency makes your application really inprofessional.

Back Button

in CRM UI, there is a Back button in top right part of window, and UI developers could implement page navigation and back ( so called breadcrumb )  by implementing respective methods defined in Component Workbench.


Of course this is not available for ABAP webdynpro components. After ABAP webdynpro component is integrated CRM UI, end user would see two Back buttons - the red one is CRM standard one, and the green one is developed by developers on their own.


The issues would be:

These two buttons will make end user confused.

Additional effort must be paid to implement the back button function by developers.

It is technically impossible to register an ABAP webdynpro UI component to CRM Breadcrumb framework, so when the red button above is clicked, end user will not return to the expected search view, but to home page instead. This makes sense, since CRM Breadcrumb framework does not recognize the ABAP webdynpro component at all.

Data loss handling

in CRM webclient UI, you can follow the wiki to implement data loss. The steps are quite simple, as most of tasks are done by UI framework.

When you make some changes on UI without save and plan to navigate to other UIs for example by clicking other work center in the left navigation bar, the data loss dialog will be popped up automatically.


It is difficult to implement data loss scenario in ABAP webdynpro(See SCN discussion here). Developer have to take care the logic how to detect the ABAP webdynpro UI element is changed, which has already been done by CRM UI framework. Developers have to write lengthy and dirty code to achieve it.

The toggle between display and edit mode

In Webclient UI framework, the edit button plus switching all editable UI elements to edit mode is quite simple:


  method EH_ONEDIT.

    DATA:   lr_entity             TYPE REF TO cl_crm_bol_entity.

    lr_entity ?= me->typed_context->socialpost->collection_wrapper->get_current( ).

    CHECK lr_entity IS NOT INITIAL.

    IF lr_entity->lock( ) EQ abap_true.

      me->view_group_context->set_all_editable( ).



The task to switch the element into edit mode is done by method set_all_editable.

However, in ABAP webdynpro you need to do all of these tasks by yourself: The read only properties of all editable UI elements must be bound to a new context attribute POST_LOCKED, and you also need to set the content of that attribute every time the object is locked or unlocked.



Session issue

For example, when we log on to CRM system via a business role:


use tcode SM04, we observed there is only one user session for the current UI:


When we go to the integrated ABAP webdynpro page:


Go to SM04 again, we can observe there is a new user session generated for ABAP webdynpro, which means the ABAP webdynpro UI resides in a different user session, whereas the left CRM UI page in the original user session.


The technical session isolation makes it difficult to exchange data between ABAP webdynpro UI and CRM webclient UI, as they are residing in two different user sessions.


if you need to pass data from CRM UI page to embedded ABAP webdynpro UI, One approach is to define the parameters in ABAP webdynpro applications, fill those parameter in CRM and populate the URL containing the passed parameter via cl_wd_utilities=>construct_wd_url:



However, this approach is not appropriate to pass large amount of data like internal tables. It is also difficult to pass data from ABAP webdynpro back to CRM UI. What's more, careful coding is necessary to ensure a consistent transaction state.

Inconsistent configurability


By clicking the configuration icon, we can directly enter configuration mode to make adaptations on UI layout:




When an ABAP webdynpro is displayed, the configuration icon is still enabled.


However, since it makes completely no sense to configure an ABAP webdynpro component via Webclient UI framework, once the icon is clicked,

We only get one notification saying currently no UI part is configurable.


ABAP webdynpro UI component configuration has a different development mechanism than Webclient UI. The coexistence of both leads to an inconsistent configuration experience for the end user.


Location of message area

The message raised in ABAP webdynpro via message manager will appear by default on top of the application UI page,


Whereas in CRM Webclient UI, the message appears in the right top of the UI framework, and the message text could also be collapsed or expanded by the small triangle.


Put the mouse onto the message text, then the technical information of the message could be displayed as tooltip, which is not available for the message raised by ABAP Webdynpro.


Incorrect use of underlying layer API

Let's review the benefit of using Webclient UI framework:


  • The object oriented BOL API is simple, generic, uniform and easy to use.
  • Your UI components are decoupled from any interface changes in the underlying application specific APIs, it is even not necessary for you to know the detail of underlying API at all; Your application is easier to maintain and sustainable for future development
  • Development of WEBCUIF applications is made easy, since the BOL has been designed to work hand in hand with the UI parts of the framework
  • The built-in buffer accelerates your applications: Once data it is read, the Object is buffered and could be retrieved in nearly no time. Way faster than calling various function modules again and afterwards preparing the data for business use.


so if you choose ABAP webdynpro, you will lose all of these benefits: Your UI component would bypass the BOL & Genil Layer and directly struggle with the underlying API.


When I am supporting customer on site customer has complained to me about the "poor quality" of FM CRM_ORDER_MAINTAIN. They directly call this FM in their ABAP webdynpro view controller and complain it does not work as expected. After investigation in their system with quite a time, finally I find it is caused by the inproper importing parameters passed in. Such issue could have been avoided if using BOL API in UI layer - you just need to fire the very simple and generic BOL API and all left things like interaction with the complex underlying API will be handled by Genil implementation. Such UI component will them be easier to maintain and more robust.


When you plan to fulfill the customer requirement by developing ABAP webdynpro and integrating them into CRM UI( via transaction launcher), please always think twice whether it is really necessary. If you decide to do this, you have to confront with all troubles described in this blog. Please kindly raise your findings, if it is not included in this blog

Background of this Blog

For several CRM projects in China which I am involved, I found the partner have chosen ABAP webdynpro when custom development is necessary. When asked why they do not consider webclient UI as the first choice, they argued that "Webclient ui is slower than ABAP webdynpro." or "the performance of Webclient UI is bad compared with ABAP webdynpro, since it has additional layers as BOL and Genil". From my point of view, such conclusion without concreate performance benchmark does not make too much senses.


Let's do not consider what we can benefit from webclient ui framework( for example better achitecture, cleaner code, better Maintainability, consistent session magement, consistent navigation management etc ) for the moment. I would like to figure out what is the percent of performance loss caused by additional layers introduced in webclient UI framework - the BOL and Genil. So I made the following performance testings.


Test Preparation

I have created one webclient UI component and one ABAP webdynpro component. Both have the exactly the same functionality:


  • Click search button to get several BO instance ( Social post) in result table. I choose the new Genil model named CRMSM delivered in CRM7.0 EHP3, as the structure of it is quite simple.
  • Click post ID hyperlink of one search request row, then we can navigate to detail page.
  • Click Edit button in detail page to switch to change mode, make some changes on post content, click save button to persist the change.


In the webclient UI component, I ensure that the view controller only calls methods defined in BOL interface, like cl_crm_bol_core~query and modify, cl_crm_bol_entity~set_property and get_property, and if_bol_transaction_context~save. In ABAP webdynpro UI component, I directly call the lower layer function modules SOC_POST_SEARCH, SOC_POST_MODIFY and SOC_POST_SAVE in view controller method.


The ABAP webdynpro search page looks like below:


CRM webclient UI Search page:


ABAP webdynpro detail page:



Webclient UI detail page:


Test using STAD

Note: The aim to use STAD for comparison here is not to get the overhead caused by Additional Layer Overhead, but just give the end user a concrete impression that, the performance of the two different UI technology, ABAP Webdynpro and Webclient UI, resides in the same order of magnitude.

Then I compare the response time of both application via STAD. Below is the performance data of Search button click. We observed the memory consumption of webclient UI component is almost twice than ABAP webdynpro. This makes sense since webclient UI framework needs additional memory to store the model metadata in the runtime and also for objects necessary for BOL / Genil framework processing.

1search time.png

And this is the performance data of post ID hyperlink click. Here webclient UI is slower than ABAP webdynpro, however the absolute time is less than 1 seconds, which does not make too much difference from end user point of view.


This performance data is for Edit button click. Again webclient ui is slower, total time less than 1 seconds.


This is for save button click:


Test using SAT

From this rough test, we are still not clear about what is the exact performance loss caused by the additional layers in webclient UI compared to ABAP webdynpro. So I plan to SAT to do more accurate performance testing using the following categories. I choose three Genil Models in CRM, the technical name of the model is CRMSM, PROD and BT accordingly. I want to know the percent of execution time spent in BOL & Genil layer compared with the total execution time of Search, Modify and Save. ( Category Modify means the property of a Genil model node is only changed in buffer. The change will not persisted into database until save call is performed ).


o(x): Additional Layer overhead of a given BOL model x

f(x): absolute execution time spent in BOL and GenIL layer

a(x): absolute execution time of application API

Post Search

I have written the following report to perform Social post search via cl_crm_bol_core~query. Then I can get the exact time spent on a(x)|x=CRMSM and calculate the o(x)|x=CRMSM.




PARAMETERS: po_id type socialdata-internal_id,

            maxhit type i.

DATA: lo_core               TYPE REF TO cl_crm_bol_core,

      lo_collection         TYPE REF TO if_bol_entity_col,

      lo_root_entity        TYPE REF TO cl_crm_bol_entity,

      lv_view_name          TYPE crmt_view_name,

      lv_query_name         TYPE crmt_ext_obj_name VALUE 'PostSearch',

      lt_query_parameter    TYPE crmt_name_value_pair_tab.



  IF po_id NE space.

    DATA(ls_query_parameter) = VALUE crmt_name_value_pair( name = 'INTERNAL_ID' value = po_id ).

    APPEND ls_query_parameter TO lt_query_parameter.


  IF maxhit EQ space.

    maxhit = 100.


  ls_query_parameter = VALUE #( name = 'MAX_ROWS' value = maxhit ).

  APPEND ls_query_parameter TO lt_query_parameter.

  lo_core = cl_crm_bol_core=>get_instance( ).

  lo_core->load_component_set( 'CRMSMT' ).

  lo_collection = lo_core->query(

      iv_query_name               = lv_query_name

      it_query_params             = lt_query_parameter

      iv_view_name                = lv_view_name ).

  DATA(lv_size) = lo_collection->IF_BOL_BO_COL~SIZE( ).

  WRITE:/ 'Number of ' , lv_size, ' Posts has been found!'.



Here is the result for Social post search:



Total execution time of post search: 934 milliseconds


Overhead in Additional Layer: 218( spent on component set loading) + ( 634 – 234 – 289 ) = 329 ( 35% in total time ).

Considering that the component set load will only be performed once in the application lifetime, and it would be further improved by using share memory to store model metadata, so I do not regard the time spent on component set loading as overhead. As a result, the final overhead is 329 - 218 = 111 milliseconds, that is 12% of total time.



Post Modify



Total time in Post Modify: 55


Overhead in Additional Layer : 55 – 53 = 2 ( 3.6% )


Post Save



Total time in Save & Commit: 13 + 6 = 19

Overhead in Additional Layer : (13 – 12) + ( 6 – 3 ) = 4 ( 21.1% )





Total execution time: 2348 milliseconds


Overhead in Additional Layer : 896 – 348  = 548 ( 23.3% )


Product Modify



Total execution time: 58


Overhead in Additional Layer: 58 – 52 = 6 ( 10.3% )


Product Save



Total time in Save & Commit: 282 + 263 = 545


Overhead in Additional Layer : (282 – 280) + ( 263 – 41 – 97 ) = 127 ( 23.3% )


Note: 97 milliseconds spent on program SAPMSSY4 should be deducted since it contains the execution of routines registered on COMMIT, such as middleware logic, the workflow event, update function module etc. Those are nothing to do with BOL & Genil framework processing.





Total execution time: 1160 milliseconds

Overhead in Additional Layer : 658 – 608  = 50 ( 4.3% in total time )


Sales Order modify




Total execution time: 105


Overhead in Additional Layer : 105 – 93 = 6 ( 11.4% )


Sales Order save




Total time in Save & Commit: 6202 + 354 = 6556

Overhead in Additional Layer: (6202 – 6199) + ( 354 – 24 – 175 ) = 158 ( 2.4% )




The testing result about overhead percent for the three Genil Model could be found in below graph:





According to the formula, the more complex the application API is, the less performance loss caused by additional layer overhead in Web client UI. Also in reality, the performance bottleneck resides in application API, not in the call stack of BOL & GenIL delegation. So in my opinion, performance reason should NEVER be used as the excuse when you do not use Webclient UI as the first choice for custom development in CRM.

What we can benefit from BOL& GenIL

  • The benefit to use Webclient UI framework in CRM custom development is apparent:
  • The object oriented BOL API is simple, generic, uniform and easy to use.
  • Your UI components are decoupled from any interface changes in the underlying application specific APIs, it is even not necessary for you to know the detail of underlying API at all; Your application is easier to maintain and sustainable for future development
  • Development of WEBCUIF applications is made easy, since the BOL has been designed to work hand in hand with the UI parts of the framework
  • The built-in buffer accelerates your applications: Once data it is read, the Object is buffered and could be retrieved in nearly no time. Way faster than calling various function modules again and afterwards preparing the data for business use.


Taken these benefits into consideration, in my opinion, the gain outweighs the minor performance overhead in additional BOL & Genil layer, if we always stick to Webclient UI in CRM custom development.


Please kindly let me know your opinion on this topic. Thank you very much!

SAP Fiori is everywhere these days. If you don't know what it is, I'd recommend to go through a few blog posts available here on SCN (non exhaustive list):

What is SAP Fiori

Fiori arrives - first impressions and thoughts

What is SAP Fiori? Maybe it's more than you think

SAP Fiori Wave 2 is here - so what's new ?


To sum it up very quickly Fiori allows end users to access some "transactions" from their mobile phone, tablet or desktop with the same user experience. All you need is a browser recent enough to display HTML5. As a SAP CRM consultant I wanted to give it a try and see what we can get with those ~10 apps dedicated to sales representatives... And the good news is: a few weeks ago I noticed this big orange button on to try Fiori for free!


In fact this button never worked for me: I was just directed to a page asking me to actually buy the whole package... So I contacted someone from SAP support, who asked me to contact someone else who knew the guy that heard someone tried Fiori etc. (you got my point :-) But in the end I could finally get the links I was looking for (thank you Mr. Enrique Espinosa): (americas) (emea) (asia pacific)


If you click on one of those links (depending on your location) and enter promotion code TRYFIORI during checkout, you'll be able to download everything you need to install SAP Fiori applications on your CRM system to test it during 45 days for free.


Edit 15th May 2015: links are not working anymore. You may wait for the cloud trial version to be released instead: SAP Fiori, Demo Cloud Edition


That's what I did, except that I didn't have any CRM7.0 EhP3 (minimum required) available. So I created a virtual machine on my laptop running Win7 64bits, with 8Go RAM and 120Go free hard drive. I must admit that the installation process went quite smoothly until I had to download support packages: can you believe that you need someone to "approve" your download basket via Solution Manager? I'll probably write another blog post about it because obviously I didn't need to install SolMan to complete my installation, however I did had to contact a friend with a valid user on SolMan to be able to download the needed files from SAP Service Marketplace (which makes me think that this is a cra**y piece of software otherwise SAP wouldn't have to force people to use it).


Anyway, now it's working fine so I began to create a series of video showing what it looks like. I'll update this blog post as soon as new videos are ready to go so don't forget to click the "follow" button or "receive email notifications" on the right hand side of the page if you want to get notified when new stuff is out :-)

Video 1 >> SAP FIORI for CRM: Getting started

Video 2 >> SAP FIORI for CRM: My appointments

Video 3 >> SAP FIORI for CRM: My appointments app vs WebUI calendar

Video 4 >> SAP FIORI for CRM: My accounts

Video 5 >> SAP FIORI for CRM: My tasks

Video 6 >> SAP FIORI for CRM: My opportunities



PS: for the record after everything was up and running, I downloaded the following OSS notes to fix a few bugs:

1878995    LPD: Display of further attributes in LPD_CUST

1907696    New synchronization functions in the launchpad

1927493    Mapping Formats are saved inconsistently

1928317    News Tile Drill Down image correction

1929563    ACE Checks for Contacts and Accounts

1930670    BP_SRV: Runtime error GETWA_NOT_ASSIGNED in FSBP_CNS_TYPE_HA

1930684    KPIs for Account FactSheet not available

1930800    Performance improvement 'resolvelink'in INTEROP Service

1930931    My Leads: Filtering the Search Results

1931051    SAPUI5 upgrade to version 1.16.4

1931635    Hotfix for UI AddOn 1.16.4 SC: UI2_SRVC

1931654    UI2_FND (SP06): Improving performance of Fiori Startup Page

1933579    UI2_FND, UI2_700 (SP06): Improving performance of UI2 Intero

1939288    Hotfix for UI AddOn 1.16.5

1939404    HTML 5 compability for IE 9 - meta tag "http-equiv" in "head" of popup; popup looks empty when loading pdf

Actually the code of this example comes from a Thoughworker in China and this is his blog.

I just move his code to a BSP component. Feel free to have a look at his blog directly, in case you understand Chinese


Once the bsp application is launched, all the tags will move in an ellipse trace:






To achieve it you just need a BSP component with a simple view:


paste the html source below to main.htm:


<%@page language="abap"%>
<%@extension name="htmlb" prefix="htmlb"%>
<script type="text/javascript" src="test.js"></script>
<div id="tagCloud">
<style type = "text/css">
  #tagCloud {
    height: 300px;
    width: 600px;
    position: relative;
    margin: 0;
    overflow: hidden;
#tagCloud a {
    position: absolute;
    text-decoration: none;
    color: #0B61A4;
    text-shadow: #66A3D2 1px -1px 1px;
        <li><a href="#">ABAP</a></li>
        <li><a href="#">BSP</a></li>
        <li><a href="#">Webdynpro</a></li>
        <li><a href="#">RFC</a></li>
        <li><a href="#">Interaction Center</a></li>
    <script type="text/javascript">
          var tagCloud = new JsTagCloud({ CloudId: 'tagCloud' });



a. define an CSS ID selector "tagCloud". It is used as the container for all tag clouds. Specify a default width and height. Set position property to relative.

b. define an CSS class selector for tag cloud. The position is set as absolute, as we will change X and U coordinate of tag cloud elements by Javascript.


Create an text file locally and paste the javascript code below into it:


function JsTagCloud(config) {
    var cloud = document.getElementById(config.CloudId);
    this._cloud = cloud;
    var w = parseInt(this._getStyle(cloud, 'width'));
    var h = parseInt(this._getStyle(cloud, 'height'));
    this.width = (w - 100) / 2;
    this.height = (h - 50) / 2;
    this._items = cloud.getElementsByTagName('a');
    this._count = this._items.length;
    this._angle = 360 / (this._count);
    this._radian = this._angle * (2 * Math.PI / 360);
    this.step = 0;
JsTagCloud.prototype._getStyle = function(elem, name) {
    return window.getComputedStyle ? window.getComputedStyle(elem, null)[name] :
JsTagCloud.prototype._render = function() {
    for (var i = 0; i < this._count; i++) {
        var item = this._items[i];
        var thisRadian = (this._radian * i) + this.step;
        var sinV = Math.sin(thisRadian);
        var cosV = Math.cos(thisRadian); = (sinV * this.width) + this.width + 'px'; = this.height + (cosV * 50) + 'px'; = cosV * 10 + 20 + 'pt'; = cosV * 1000 + 2000; = (cosV / 2.5) + 0.6; = " alpha(opacity=" + ((cosV / 2.5) + 0.6) * 100 + ")";
    this.step += 0.007;
JsTagCloud.prototype.start = function() {
    setInterval (function(who) {
        return function() {
    } (this), 20);


Then import it via context menu->Create->Mime Object->Import:


In the javascript we first get the radian of each tag cloud element, and change its X and Y coordinate, that is left and top property based on calculation on it from time to time( in 20 millisecond's interval ). The same logic is done on font size, the opacity and Z-Order index so that we got a Pseudo 3D effect: the more the element is near to us, the bigger and more vivid it is, and vice visa.


Filter Blog

By author:
By date:
By tag: