Mostly SAP related…
ABAP Code
Triggering a Broadcast
May 29th
The SAP CRM system allows a manager to send broadcasts to agents via the broadcast manager. This is useful to notify agents immediately of any important information.
The BSP Application CRM_BM can be used to send broadcast messages. Below is a screenshot.
When you click send, the user will immediately receive a scrolling message at the bottom of their screen.
However, in some case you may want to send an automated message. Maybe you want to notify a processor that a service ticket is outside SLA or a customer must be phoned?
It is possible to send broadcasts automatically from background jobs or actions using the following code.
data: lt_users type crmt_bm_key_value_tab,
ls_user type crmt_bm_key_value_line,
lv_message type string.
data: supervisor type ref to cl_crm_bm_broadcast_sup.
lv_message = 'This is a demo message'.
ls_user-key = 'AUSERNAME'.
ls_user-value = 'AUSERNAME'.
append ls_user to lt_users.
create object supervisor.
try.
supervisor->send_message(
exporting text_value = lv_message
priority_value = '0'
duration_h_value = '0'
duration_m_value = '1'
dl_members = lt_users ).
* importing
* et_success = et_success
* et_fail = et_fail
catch cx_crm_bm_exception .
endtry.Hands Off…
May 15th
I wonder how many times someone stuck their finger into SAPMSSYD before the developer included this warning…
*/////////////////////////////////////////////////////////////////////// * C A U T I O N: */////////////////////////////////////////////////////////////////////// * If you want to add a specific handler within a main step handler, * make sure to follow the following * G O L D E N R U L E * If you do not know, what a dynpro is: HANDS OFF * If you do not know, what a main step is: HANDS OFF ... * N E V E R prototype here. You may damage the system seriously. * The worst case will lead to a system, where nobody can login. * It will be your job, to spend the following night in your office * to repair the system. *///////////////////////////////////////////////////////////////////////
The thing is that I discovered this comment late one night many years ago after implementing a login screen for RF scanners using SAP Console. The process is described in Note 365664. I ignored the part of the note that said “Please, change only the layout!!!!” and tried to include a subscreen or module(can’t remember why).
The result was that nobody could log into the system. The reason is that the code in the login program SAPMSYST is hidden(try to view it in SE80:-) ). As soon as this program is modified, the hidden code is lost(…it took me a while to figure out what the heck happened).
The only way to fix this error is to transport program SAPMSYST from a working system into the broken system.
IC WebClient Business Transaction Search
May 13th
Overview
This post describes the enhancement of the IC WebClient using the Business Transaction Search in CRM 5.0. The Business Transaction Search (BT Search) allows you to define an index table that can be used as an alternative to the standard reporting framework.
As this is really too much to information to put into a post, I just placed an extract here, and created a PDF(containing code, screen shots, etc) that can be download here:
Benefits
The BT Search allows you to overcome a number of common problems encountered in the Inbox, namely:
- Poor performance
- Custom Search Fields
- Inconsistent Search Results
The typical IC WebClient Project deals with all 3 of the above problems. Poor performance is almost inherent to the standard Inbox as the database structure of the One Order Framework is extremely flexible, but complex.
If you add custom search fields to the Inbox, you must either implement filters in the AFTER_SEARCH method of BADI CRM_IC_INBOX_BADI or you must implement BT Search. Using filters is always a bad idea, as performance suffers and they lead to unexpected results.
Finally, the Inbox is used to select Interactions, Service Tickets, Follow Ups, Sales Orders, etc. All of these transactions have different customizing settings and it is sometimes impossible to align all of them in the standard Search Results. BT Search allows you to do this.
Steps
The BT Search allows you to define an Index Table in the IMG. The IMG transaction will generate the following components for you:
- A Database Table that will be your “Index”
- An initial load report for populating the Database Table
- A Badi Implementation (ORDER_SAVE) used to populate the delta entries to the Index when a document is saved.
However, you will have to modify the generated Report and Badi in order to achieve the desired results.
You must also create an Implementation of Badi CRM_IC_SOS_INDEX in order to determine the Index to be used.
An implementation of Badi CRM_IC_INBOX_BADI will also be required for doing some fancy footwork.
The rest of the document will describe the required steps in more detail.
Enhancement Scenario
The enhancement described in this document caters for the following requirements:
- An Index only for Service Tickets and Follow ups
- Multiple Customer Specific Search Fields
- Customer Specific Result Fields
Caveats
BT Search completely replaces the standard search. It’s a lot of work as you really end up rebuilding the entire search logic of the Inbox. The BT Search is not a simple enhancement. It needs a lot of tweaking. This document assumes that the reader has an understanding of One Order documents, their customizing and ABAP knowledge.
This document is only applicable to CRM 5.0. The BT Search functionality has changed significantly in CRM 2007 and many of the problems and solutions described here will hopefully not be encountered. I have not verified this beyond the point of looking at the customizing tables in CRM 2007.
This document does not deal with adding additional search parameters to the UI or the BOL. That is a separate topic on its own. Here we assume it has already been done.
I have not tested this Index with an Inbox containing Workflow Items or E-mails as well. Some code in this document may be incompatible with Workflow/E-mail Items, but I just don’t know.
My Table Mover(Part 2)
May 13th
Ok, so I finally found some time to write Part 2(took me a couple of months). Part 1 of this blog only dealt with what the Table Mover program does and the broad mechanics used. In this blog I want to discuss the table download mechanism in order to explain some of the dynamic ABAP techniques used.
The first step is to get the list of database tables that need to be downloaded. I did this using a direct select of the Data Dictionary table dd02l. It may have been better to find the appropriate function module.
data: lt_tables type table of dd02l,
ls_tables type dd02l.
select * into table lt_tables from dd02l
where tabname in so_tab
and as4local = 'A'
and tabclass = 'TRANSP'.The following variables are of importance for what is to follow:
data: lr_table type ref to data. field-symbols: <lt_table> type standard table. field-symbols: <ls_table> type any.
We will then loop at each table name in lt_tables and create a dynamic variable that will contain the data to be selected from the database. The statements below create this variable and can be accessed from field-symbol <lt_table>.
lv_tab = ls_tables-tabname.
create data lr_table type standard table of (lv_tab)
with non-unique default key.
assign lr_table->* to <lt_table>.The Create Data statement above creates a new variable with the same type as the Data Dictionary definition of the Database Table we want to select from. Then we do a dynamic SQL select into our table <lt_table>.
select * into table <lt_table>
from (lv_tab).The next step is to build an internal table that will enable us to download the table into a text format. In order to do this you must ensure that each field is converted first into character format. Also, we want to add our separator here.
loop at <lt_table> assigning <ls_table>.
ls_dnl-tabname = lv_tab.
clear: ls_dnl-content, sy-subrc, sep.
while sy-subrc = 0. "Map each component of the structure to a single field
assign component sy-index of structure <ls_table> to <lv_field>.
if sy-subrc = 0.
lv_1024 = <lv_field>. "This is for character conversion.
concatenate ls_dnl-content sep lv_1024 into ls_dnl-content.
sep = c_sep. "Add the separator
endif.
endwhile.
append ls_dnl to lt_dnl.
endloop.My clever format conversion routine( lv_1024 = <lv_field> ) is not failsafe, and I have not tested it thoroughly, but at least it converts GUIDs, Dates and Numbers to text that will not destroy my download file.
But, the internal table lt_dnl now contains all the entries we want to download. All that remains is to download the table to the front end.
cl_gui_frontend_services=>gui_download(
exporting
filename = lv_name
filetype = 'ASC'
write_field_separator = ' '
changing
data_tab = lt_dnlHere is the link to the source code of the full report:
Determine the current WebClient Profile
Apr 8th
Sometimes you need to determine the WebClient Profile of the logged in user. The code below you allows you to accomplish this.
In CRM 4.0:
data: lv_profile type crmc_ic_profile .
lv_profile = cl_crm_ic_services=>get_customizing_profiles( ).
In CRM 5.0 and beyond:
data: lr_prof type ref to if_ic_profile,
lv_prof type string.
lr_prof = cl_ic_profile_service=>get_instance( ).
lv_prof = lr_prof->get_profile( ).

