SlideShare a Scribd company logo
1 of 190
Download to read offline
Tips & Tricks for
Oracle CRM On Demand
Volume 1 including exclusive tips
First book providing for free tips and tricks to improve your Oracle CRM On Demand application
Mathieu Emanuelli
Joann Alejandro Bravo
Times have changed. Companies are not anymore worried about its products, the production processes or
even the quality, today, what really determines a company’s strategy is nothing more than people,
customers or prospects are modeling their market context following their needs and privileging what really
makes life easier. It seems that it is worthy then listening to people, what are their expectations, what
motivates them to come and ask try and buy new products…
All these changes are not just coincidences, the world has really changed, human interactions are evolving
faster than never before and the Internet as well as all the communication technologies being conceives
every hour all around the world have finally put people and nothing else, in the top of the priorities… and
you know what? We, humans, just love it, this is actually all that we have ever wanted, to be listened and
followed by our equals.
If you consider this new landscape, we are sure that we will not have to make big efforts in order to
convince you that you as an individual but particularly, as a company, you need to listen people around in
order to adapt and improve your offer for all your prospects and clients. The CRM (Customer Relationship
Management) is just a grandiose combination between new technologies and a new world giving more
and more importance to each individual opinion and broadcasting those opinions everywhere in just one
second.
This book is intended to be a tool for all those companies using Oracle CRM On Demand and looking for
better means to make the customer dreams become reality. If you have ever wanted to optimize your
CRM configuration or integrate your CRM to the open internet world, this book is for you.
In the book, you’ll find three indicators for each “How To”:
 Time to result : how much time the user need to apply successfully
 Complexity: scale from 1 to 5
 Gap with out of the box cap: What is the gap with Oracle CRM On Demand out of the box
capabilities: 0% is a standard functionality, 100% is a complete custom development
WHY THIS PROJECT?
This project was born from our customer requirements. Yes, as many of you, listening to our customers
gave us the key to this project. We start at the beginning, gathering up every single requirement
demanding a high level of complexity in our project’s implementation. In the earliest phases we intended
those files to be exploited as a part of our internal knowledge data base.
A couple of implementations later and some years of experience shown us that some “expected” features
requests came over and over again in our projects and most of the time, those request came from the
Oracle CRM On Demand administrators looking for the way to make easier the use of the application or
wanting to integrate the application to other tools available in the internet.
When the trend was confirmed, we decided to share our experiences with all the Oracle CRM On Demand
community by writing this book that contains the functional and the technical points of view for every
application improvement, we hope that you will find this information useful and that you will enjoy as
much as we did, its implementation.
WHO ARE WE?
Author: Mr. Mathieu Emanuelli
Mr. Mathieu Emanuelli is currently CRM Practice Manager for a Swiss Consulting and Systems Integration
(CSI) company. He has been working with Oracle CRM On Demand from the earliest phase of the product
(has implemented release 12), in the first instance as user and administrator for his former company and
lately as CRM consultant and product expert, managing implementation teams in international projects all
around the world.
You can find more details about Mathieu’s work checking his profile in LinkedIn (type Mathieu Emanuelli)
Co-Autor: Mr. Joann Alejandro Bravo
Currently Mr. Joann Alejandro Bravo is a senior CRM consultant, specialized on SaaS (Software as a service)
applications and Social CRM. In the past he has ensured the implementation as team member and team
leader for multiple projects using Oracle CRM On Demand
You can find more details about Joann Alejandro’s work checking his profile in LinkedIn (type Joann
Alejandro Bravo)
THANKS TO…
Many thanks to our customers for all the new challenges during implementations, seeing Oracle CRM On
Demand evolves in several business environments allow us to identify which information is worthy for
most of the people using the application.
Of course, thanks to our company, Business & Decision, for being the central quarter for the “Oracle CRM
On Demand team”. That was always a great opportunity to be involved in many challenging projects in
different industries. Thanks to our colleagues and/or external people we had the chance to meet and/or to
work with: Jonathan Fouque, Elios Gibanel, Sandrine Wens, Amine Hammi, Steffen Soldner, Josselain
Prost, Laurent Petitguyot for their support, their imagination and their creativity.
Thanks to Oracles’ staff for being there and interact with us when particular questions concerning the
application came up.
And last but not least, of course our beloved families, my wife and my children to have seen sawing daddy
working hard after an official day work! Thanks as well to the fabulous Fab for being understanding during
the work at home and all the support and encouragement.
TABLE OF CONTENT
GENERAL CONFIGURATION .................................................................................................................... 1
How to define parent and child relationship for any object? ...................................................................... 2
How to join activity & service request with context transfert? ................................................................... 8
How can I create a link to a document in the action bar or homepage?................................................... 12
How to copy or set up a new record? ........................................................................................................ 14
How to concatenate with a workflow? ...................................................................................................... 17
How to calculate duration on a field using a default value or a workflow?............................................... 18
How to transform lower in upper case?..................................................................................................... 19
How can i create a simple custom look-up?............................................................................................... 21
How can i create a custom button that runs a custom look up from Edit and Detail page?..................... 26
How can I create a custom look up that fill in many fields in Oracle CRM On Demand? .......................... 28
How to prevent the sales stage modification after the opportunity closed?............................................ 39
How to monitor some variables evolution?............................................................................................... 41
How can to create a custom button?......................................................................................................... 43
How to avoid weekend selection for date type fields?.............................................................................. 47
How to make caps mandatory for field content? ...................................................................................... 56
How can I create an I-Frame in homepage?............................................................................................... 58
How can i create an i-frame with action bar content?............................................................................... 62
How can I rename the button “Log A Call” in activity related information? ............................................. 64
How can I create an “information bubble” on 1 or many fields? .............................................................. 67
How can I create a document including CRM merged fields and print it?................................................. 74
How to see the primary account for a campaign recipient?...................................................................... 81
SOCIAL NETWORKS AND CRM SOCIAL CRM ................................................................................... 83
How can i analyze my products in social network?.................................................................................... 84
How can i measure my contact profile influence in the social networks?................................................. 86
How can i monitor social network content from OCOD?........................................................................... 91
How to add Twitter feeds overview? ......................................................................................................... 97
How can i tweet automatically from OCOD? ........................................................................................... 100
How can i create a button with LinkedIn link in Oracle CRM On Demand?............................................. 104
How to embed Yammer console into Oracle CRM On Demand?............................................................. 106
How to make a mashup with Xing?.......................................................................................................... 112
How can I create a shoutbox for my user’s community?......................................................................... 113
WEB INTEGRATION ................................................................................................................................ 119
How can I create a link between Oracle CRM On Demand and Skype?................................................... 120
How can I use Skype applet for support?................................................................................................. 122
How can I create satisfaction survey, send it to customer and measure feedback?............................... 125
How can i create a link between Oracle CRM On Demand and Gmail?................................................... 134
How can i send email with Gmail or Microsoft Outlook? ........................................................................ 136
How can i embed Google capabilities? .................................................................................................... 143
How can i embed Google talk into Oracle CRM On Demand?................................................................. 146
How to create Web Applet with Google Maps?....................................................................................... 148
How can I send SMS from the application (using email)?........................................................................ 150
How can I send voice SMS from the application (using email)? .............................................................. 156
How can I send SMS from the application (using http request)?............................................................. 161
EXCLUSIVE ! ............................................................................................................................................. 164
Chapter:GENERALCONFIGURATION
1
GENERAL CONFIGURATION
People want their life to be easier, and let’s face it, we all want the same. When it comes to the adoption
of a new application people are often asking: what is the added value that I am getting from it?
As every IT Consultant knows using “out of the box” applications is not always easy and, for sure, never
totally adapted to the business needs. This is not because applications are not well developed but due to
the fact that each company has its own way to complete processes and so its own customization needs.
Consider all the information before and you can be sure about one thing, users want the applications to be
as customized as possible in order to make little effort when using it, after all the only way for users to
adapt a new tool is by getting more from it than they should give.
This chapter is dedicated to some of the more recurrent tricks used during the implementation for our
clients, some of them concern first level data quality, some others take care about the form and the
presentation and some others just integrate new features being added, in all cases as you will see, our
efforts strives to ensure the adoption of the tool at every level of the company since, as you probably
know, users are the success of technological evolution.
Chapter:GENERALCONFIGURATION
2
How to define parent and child relationship for any object?
INTRODUCTION
Native relationships between different records of the same type are not available in OCOD, in fact only
accounts (and from V19, opportunities as long as we know) propose the possibility to link “internally” their
records. In companies’ everyday operations yet, users are looking for a way that easily allows defining
connections and hierarchical relationships
BUSINESS CASES, WHEN “ARTIFICIAL” HIERARCHICAL RELATIONSHIP IS USEFUL
Marketing programs, commercial action plans
Think about a company trying to define a marketing program containing multiple campaigns aiming
different markets (for example one market by country)
Figure 1: Parent campaign and child campaigns associated
… And what about a company wanting to execute an action plan composed of a sequence actions… what
to do?
WHAT DO WE WANT TO DO?
We would like to create a record related section providing a way to easily create a child record (related to
the current record). Our example is based on activity objects but, of course, you can adapt this example.
Something like this:
Time to result
•40 Mins
Complexity (1 to 5)
•Level 3
Gap with out of the box cap
•45%
Chapter:GENERALCONFIGURATION
3
Figure 2: Create a related record from custom related information
HOW CAN WE DO?
We need to follow these steps in order to obtain our functionality:
 Create a custom field called “Related Activity ID” which would store the parent Appointment Id
 Create a web applet that embed the code for the related item
 Create a Report which will show the related Tasks for this particular Contact Call
 Embedded the report on the Call detail page
CREATE A CUSTOM FIELD TO STOCK THE RELATED ACTIVITY ID
We have created a new field for the object Activity, called “Related Activity ID” and we have added it to
the page layouts:
Figure 3: Create the Related custom field
Chapter:GENERALCONFIGURATION
4
Figure 4: Related custom field in page layout
Figure 5: Custom field displayed on the layout
CREATE THE WEB APPLET
Next step, create a new web applet “Related Tasks” for both Appointments and Tasks and add it to the
page layouts:
Chapter:GENERALCONFIGURATION
5
Figure 6: New web applet "Related Task"
The code is the following:
<script type="text/javascript" id="customJavaScript">
var Div_id = document.getElementById("customJavaScript").parentNode.id;
var endIndex = Div_id.indexOf("Div");
if(endIndex>0) {
var Title_id = Div_id.substring(0, endIndex) + "_Title";
var Title_obj = document.getElementById(Title_id);
var newTD = document.createElement('td');
newTD.innerHTML = "<div
onclick="doNavigate('TaskNew?OMTGT=TaskEditForm&OMTHD=ActivityNewNav&TaskEditForm.Indexed
Short Text
0=%%%Id%%%&TaskEditForm.Type=To+Do&OMRET0=TaskDetail%3fOMTGT%3dTaskDetailForm%26OMT
HD%3dActivityDetailNav%26OCTYPE%3d%%%Type%%%%26TaskDetailForm.Id%3d%%%Id%%%&OCTYPE=
To+Do',false, this, null);" onmouseover="toggleNavButton(this);"
onmouseout="toggleNavButton(this);" onkeypress="onButtonPress(this);"
class="buttonChildTitleBarTD" id="OpenActivitiesTB31607487*1">&#160;New Related
Task&#160;</div>";
Title_obj.parentNode.insertBefore(newTD, Title_obj.nextSibling );
}
</script>
To understand:
Yellow code: custom field ID (in this example we used an Indexed text field)
Fields with the format %%%field%%% are tags coming from the application
This script should work for:
Tasks:
 Task Standard
 Visit Report
Chapter:GENERALCONFIGURATION
6
Appointments:
 Appointment Standard
 Visit
Once you add the web applet to the layout it appears like this:
Figure 7: Button created in the custom related information
Using this button you can create
 Tasks related to an Appointment (when you are on ‘Appointment Standard’ or ‘Visit’ page layout)
 Tasks related to a Task (when you are on ‘Task Standard’ or ‘Visit Report’ page layout)
When you click on this button the New Task creation page would be opened with the ‘Related Activity ID’
field filled in automatically:
CREATE EMBEDDED REPORT
Upon Save or Cancel, you will return to the Appointment or Task page layout and the “Related Tasks” web
applet is automatically refreshed in a few seconds to reflect the change:
Figure 8: Report embedded showing the related record
But how is this contextual section alimented and updated? Start going to the reporting tool and building a
report which looks like this:
Chapter:GENERALCONFIGURATION
7
Figure 9: column selected to create the report embedded
Notice that we have chosen the indexed short text field to store the related Activity ID so we need to ask
for this information by adding the filter “is prompted” on this field
Now, you can integrate the contextual report in the application using the following code
<iframe src='/OnDemand/user/analytics/saw.dll?Go&Path=%2fshared%2fCompany_HE3678-
1JAZ2_Shared_Folder%2fRelated+to&Options=rfd&&Action=Navigate&p0=1&p1=eq&p2=Activity.INDEXE
D_SHORTEXT_0&p3=%%%Id%%%'frameborder="no" width="100%" height=200></iframe>
To understand:
Yellow: column technical name for the custom field
Now you just need to add the web applet code to the script described previously, as follows:
Figure 10: Web applet with the whole code
Then, whole code is:
<script type="text/javascript" id="customJavaScript">
var Div_id = document.getElementById("customJavaScript").parentNode.id;
var endIndex = Div_id.indexOf("Div");
if(endIndex>0) {
var Title_id = Div_id.substring(0, endIndex) + "_Title";
var Title_obj = document.getElementById(Title_id);
var newTD = document.createElement('td');
Chapter:GENERALCONFIGURATION
8
newTD.innerHTML = "<div
onclick="doNavigate('TaskNew?OMTGT=TaskEditForm&OMTHD=ActivityNewNav&TaskEditForm.Indexed
Short Text
0=%%%Id%%%&TaskEditForm.Type=To+Do&OMRET0=TaskDetail%3fOMTGT%3dTaskDetailForm%26OMT
HD%3dActivityDetailNav%26OCTYPE%3d%%%Type%%%%26TaskDetailForm.Id%3d%%%Id%%%&OCTYPE=
To+Do',false, this, null);" onmouseover="toggleNavButton(this);"
onmouseout="toggleNavButton(this);" onkeypress="onButtonPress(this);"
class="buttonChildTitleBarTD" id="OpenActivitiesTB31607487*1">&#160;New Related
Task&#160;</div>";
Title_obj.parentNode.insertBefore(newTD, Title_obj.nextSibling );
}
</script>
<iframe
src='/OnDemand/user/analytics/saw.dll?Go&Path=%2fshared%2fCompany_HE3678-
1JAZ2_Shared_Folder%2fRelated+to&Options=r&&Action=Navigate&p0=1&p1=eq&p2=Activity.INDEXED_
SHORTEXT_0&p3=%%%Id%%%'
frameborder="no" width="100%" height=200></iframe>
To understand:
yellow: part of code to create the button associating the activities
Blue: part of the code to enclosed the contextual report
How to join activity & service request with context transfert?
INTRODUCTION
Using standard OCOD functionalities, it is impossible to create a Service Request from the detail page of an
activity since service request is not a related section for the object activity. It gets even harder when in
addition you need to copy some information (one or more values in different fields) coming from that
activity in the new service request detail… what can you do?
BUSINESS CASE
Service Requests from tasks
Imagine you or your client wants to create a service request from a task with the capability to keep the
contact filled in into the task layout… that is what he ask us, we quickly understood that there were no
relation join task and service request since service request was not a task’s related information.
WHAT DO WE WANT TO DO?
Simple to say: insert a button on the related information section of the object task to create a new service
request (“traitement”) and pass the contact information from the task to the service request.
Time to result
•40 Mins
Complexity (1 to 5)
•Level 3
Gap with out of the box cap
•30%
Chapter:GENERALCONFIGURATION
9
Figure 11: Expected result, a new related information including a button
HOW CAN WE DO?
Follow the following steps to achieve the expected result:
FIND A SIMILAR PAGE AND COPY URL
The first thing to do is to find a similar page to the one we want to generate when clicking the button that
we will insert. We have decide to start from the contact page as, in the related information sections you
can add a new service request (treatment) by clicking the button ‘new’
Figure 12: Button “New” for a service request
The following screenshot illustrates the page launched after the click:
Chapter:GENERALCONFIGURATION
10
Figure 13: Layout launched after the click
Now we need to copy the URL of this page. Be careful!!! do it from the edition page (instead of the
consultation page) you should get something like:
https://secure-ausomxXXX.crmondemand.com/OnDemand/user/ServiceRequestNew?OMCR0=AIIA-
O2B12&OMTGT=ServiceRequestEditForm&OMTHD=ServiceRequestNewNav&OMCBO=Contact&OMRET0=
ContactDetail%3focTitle%3d%2b%26OMTGT%3dContactDetailForm%26OMTHD%3dContactDetailNav%26
ocEdit%3dY%26OCTYPE%3dClient%26ocTitleField%3dFull%2bName%26ContactDetailForm.Id%3dAIIA-
O2B12&OCNOEDITTYPE=Y&OCTYPE=
Modify the URL to meet the following format:
https://secure-
ausomxXXX.crmondemand.com/OnDemand/user/ServiceRequestNew?OMCR0=%%%Contact_Id%%%&O
MTGT=ServiceRequestEditForm&OMTHD=ServiceRequestNewNav&OMCBO=Contact&OMRET0=ContactD
etail%3focTitle%3d%2b%26OMTGT%3dContactDetailForm%26OMTHD%3dContactDetailNav%26ocEdit%3
dY%26OCTYPE%3dClient%26ocTitleField%3dFull%2bName%26ContactDetailForm.Id%3d%%%Contact_Id%
%%&OCNOEDITTYPE=Y&OCTYPE=
To understand:
 Blue: your POD
 Yellow: The ID of the contact
 Green : the variable for the Contact ID that will replace the ID contact (yellow)
CREATION OF A WEB APPLET
The web applet which contains the button is created. As the button should be propose as a related section
on the object task, the web applet has to be configured from the task configuration:
Chapter:GENERALCONFIGURATION
11
Figure 14: Web applet hosting the code to create custom related information with custom behavior button
The script for the button is composed of the URL on edition mode plus the button code.
Only two modifications to the script:
1. Copy the URL created previously as indicated (see URL highlighted in blue) and
2. Give a name to the button (name of the button highlighted in yellow – here “Nouvel Traitement”:
<script type="text/javascript" id="customJavaScript">
var Div_id = document.getElementById("customJavaScript").parentNode.id;
var endIndex = Div_id.indexOf("Div");
if(endIndex>0) {
var Title_id = Div_id.substring(0, endIndex) + "_Title";
var Title_obj = document.getElementById(Title_id);
var newTD = document.createElement('td');
newTD.innerHTML = "<div onclick="doNavigate('https://secure-
ausomxXXX.crmondemand.com/OnDemand/user/ServiceRequestNew?OMCR0=%%%Contact_Id%%%&O
MTGT=ServiceRequestEditForm&OMTHD=ServiceRequestNewNav&OMCBO=Contact&OMRET0=ContactD
etail%3focTitle%3d%2b%26OMTGT%3dContactDetailForm%26OMTHD%3dContactDetailNav%26ocEdit%3
dY%26OCTYPE%3dClient%26ocTitleField%3dFull%2bName%26ContactDetailForm.Id%3d%%%Contact_Id%
%%&OCNOEDITTYPE=Y&OCTYPE=',false, this, null);" onmouseover="toggleNavButton(this);"
onmouseout="toggleNavButton(this);" onkeypress="onButtonPress(this);"
class="buttonChildTitleBarTD" id="OpenActivitiesTB31607487*1">&#160;Nouveau
traitement&#160;</div>";
Title_obj.parentNode.insertBefore(newTD, Title_obj.nextSibling );
}
</script>
To understand:
 Blue: URL that we have created before
 Yellow: display name of the custom button
Add this web applet to the layout and that’s it, now, you can create service request whenever you want
from the activities layout.
Chapter:GENERALCONFIGURATION
12
How can I create a link to a document in the action bar or
homepage?
INTRODUCTION
User’s adoption depends, frequently, on how ergonomic the application is; people do not want to change
over and over again from a screen to another. Centralizing work tools is one of the greatest challenges on
a project.
BUSINESS CASES, ALL THE BUSINESS TOOLS IN THE SAME PLACE
Knowledge data base or Dynamic catalogues
Some companies use many tools to manage the Customer Relationship, although, they do not want to
logout from the CRM to use it. When clients ask questions regarding products, the answers can be
available in a knowledge data base and/or in a dynamic catalogue… should users leave the CRM
application to have access? Not anymore!
Imagine that you want to propose the access to different applications, documents or any other web tool
from any screen in the application… what can you do?
WHAT DO WE WANT TO DO?
We would like to have one or many links show in the action bar
Figure 15: Link created in the action bar
Or
Figure 16: Many links in the action bar
Time to result
•10 Mins
Complexity (1 to 5)
•Level 2
Gap with out of the box cap
•90%
Chapter:GENERALCONFIGURATION
13
HOW CAN WE DO?
Follow the following steps:
CREATE THE GLOBAL WEB APPLET
To create a link in html, we use tags <a> and </a> and put the content between. Content can be image.
The tag <a> can have 3 attributes:
 href : indicates link address
 target : defines the link’s target
Figure 17: Global web applet created to embed a web applet in the action bar
The code in this example is the following:
<a href="http://www.helponmyproject.com" target="_blank">Help me !</a>
We could imagine a more complex code, defining a table including several links:
Figure 18: Global web applet created to embed a web applet (more complex) in the action bar
Chapter:GENERALCONFIGURATION
14
The code in this case would see like:
<div align="left">
<table width="131" border="0">
<tr>
<td width="11">&nbsp;</td>
<td width="179"><a href="www.helponmyproject.com" target="_blank">Help me ! </a></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><a href="www.google.com" target="_blank">Google</a></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><a href="www.linkedin.com" target="_blank">LinkedIn </a></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><a href="www.facebook.com" target="_blank">Facebook</a></td>
</tr>
</table>
</div>
To understand:
 Yellow: URL address
 Blue: target
 Red: Name of the link that will be displayed
ADD THE CUSTOM GLOBAL WEB APPLET TO AN ACTION BAR LAYOUT
You can define a new action bar layout or you can add quickly this global web applet by clicking on “My Set
up” link.
Note: you could modify URL addresses using tags coming from Oracle CRM On Demand
How to copy or set up a new record?
INTRODUCTION
Taking advantage from a pre existent record is a common practice that very often users which to apply.
After all, why should I create from scratch my record if there is another containing almost the exact values
that I need?
Time to result
•40 Mins
Complexity (1 to 5)
•Level 3
Gap with out of the box cap
•70%
Chapter:GENERALCONFIGURATION
15
BUSINESS CASES
Identical opportunities and several activities responding to the same problem
This trick starts as a requirement from one of our clients who wished to be able to copy opportunities on
his environment. Filling in the whole information in opportunities takes time because of the number of
fields in this object so he wanted to take advantage from all this typing.
Once we found a technical solution, we realized that this code could of course be useful when copying
records, but more than that, with some little variations, the code could work when initializing new records
from a particular one. Let’s see how?
WHAT DO WE WANT TO DO?
We would like to copy or initialize a record keeping many pre-populated fields from the original one
Since the release 17 users can “copy” a record but this functionality does not exist on every object. In
addition, copy a record is a standard function not allowing any customization…
HOW CAN WE DO?
Create a web link that will contain all the information concerning the new record. You can either copy field
by field the content or decide to copy only some fields and assign fixed values to others:
Figure 19: Web link created to copy a record
To define the content of the opportunity that will be created, you need to go to the opportunity edition
page and copy its url, then edit this url in order to initialize as you want each field (this expression was
built using the weblink editor):
Chapter:GENERALCONFIGURATION
16
Figure 20: Code to copy a record pasted in the web link definition
The code used is the following:
/OnDemand/user/OpptyCreateNewPageDefault?OMTGT=OpptyCreateEditForm&OMTHD=OpportunityNe
wNav&OMRET0=OpportunityHomePage&OpptyCreateEditForm.Primary Revenue Close
Date=%%%Primary Revenue Close
Date%%%&OpptyCreateEditForm.Description=%%%Description%%%&OpptyCreateEditForm.Account=%%
%Account%%%&OpptyCreateEditForm.Account
Id=%%%Account_Id%%%&OpptyCreateEditForm.ZDate_26=%%%dAward_Date%%%&OpptyCreateEditFor
m.ZPick_11=%%%plIntegration_Center_IC%%%&OpptyCreateEditForm.ZPick_10=%%%plSBL_Geographical
_Zone%%%&OpptyCreateEditForm.ZPick_17=%%%plSegment%%%&OpptyCreateEditForm.ZPick_25=%%%
plTHINT_Status%%%&OpptyCreateEditForm.ZPick_18=%%%plTHINT_Category%%%&OpptyCreateEditFor
m.ZPick_4=%%%plSBL_1%%%&OpptyCreateEditForm.ZDate_29=%%%dRFP_Date%%%&OpptyCreateEditF
orm.ZPick_13=%%%nP1_C%%%&OpptyCreateEditForm.ZPick_14=%%%plP2_%%%&OpptyCreateEditForm.
ZPick_24=%%%plCountry_of_Origin%%%&OpptyCreateEditForm.ZPick_6=%%%plActivities%%%&OpptyCre
ateEditForm.Currency
Code=%%%Currency_Code%%%&OpptyCreateEditForm.ZNum_21=%%%pcExpected_Gross_Margin%%%&
OpptyCreateEditForm.ZPick_21=%%%plSubActivities%%%&OpptyCreateEditForm.ZPick_15=%%%plScenari
o%%%&OpptyCreateEditForm.ZPick_14=%%%nP1_C%%%&OpptyCreateEditForm.ZDate_30=%%%dPropos
al_Due_Date%%%&OpptyCreateEditForm.ZPick_9=%%%plCompetitiveNegociation%%%&OpptyCreateEdit
Form.OwnerAlias=%%%Owner_Alias%%%&OpptyCreateEditForm.ZPick_20=%%%plUnit%%%&OpptyCreat
eEditForm.ZPick_22=%%%plSubSegment%%%&OpptyCreateEditForm.ZCur_1=%%%cGlobal_Amount%%%
&OpptyCreateEditForm.ZPick_12=%%%plLegal_Entity%%%&OpptyCreateEditForm.ZCur_3=%%%cThales_A
mount%%%&OpptyCreateEditForm.ZPick_8=%%%plBusiness_Unit_BU%%%&OpptyCreateEditForm.ZPick_
19=%%%plTHINT_Type%%%&OpptyCreateEditForm.ZMSPick_1=%%%msplBid_Currency%%%&OpptyCreat
eEditForm.ZPick_7=%%%plBid_Type%%%&OpptyCreateEditForm.ZPick_32=%%%plDepartment%%%&Opp
tyCreateEditForm.ZPick_30=%%%plTHINT_Client_Type%%%&OpptyCreateEditForm.ZPick_31=%%%plCivil_
_Military%%%&OpptyCreateEditForm.ZText_32=%%%stOpportunity_Group%%%&OpptyCreateEditForm.Z
Pick_35=%%%plInternalExternal%%%&OpptyCreateEditForm.ZCur_19=%%%cBid_Currency%%%&OpptyCr
eateEditForm.ZNum_20=%%%pcP3_%%%&OpptyCreateEditForm.Indexed Pick
Chapter:GENERALCONFIGURATION
17
1=%%%Indexed_Pick_1%%%&OpptyCreateEditForm.ZText_31=%%%stBid_Manager%%%&OpptyCreateEdi
tForm.Sales Type=%%%
Now you can modify the values after the equal sign (=) in order to initialize your record with fix values if
needed.
How to concatenate with a workflow?
INTRODUCTION
Concatenated fields are very often useful when a particular naming rule is defined for an object,
configuring your system this way avoid the need for you asking users to keep in mind the rule so they can
focus on the business needs.
BUSINESS CASES
Naming opportunities
Imaging a company willing to name all its opportunities coming from leads following this rule:
“Account name” + “Oppty ID”
WHAT DO WE WANT TO DO?
We want to populate the field opportunity name (or any other field) with the predefined content
HOW CAN WE DO?
The general syntax to use when concatenating fields and including blanks between is:
[<Field_name>]+ ' ' + [<Field_name>]+ ' ' + [<Field_name>]+ ' ' + [<Field_name>]
So you can now define a default value and a workflow to update the field, hereafter the concatenation for
the field opportunity name
Time to result
•10 Mins
Complexity (1 to 5)
•Level 1
Gap with out of the box cap
•100%
Chapter:GENERALCONFIGURATION
18
Figure 21: Example of a concatenate formula at a field definition level
Notice that, the workflow concatenation is only available for data in characters (exclude dates, timestamp
or integer). If you want to concatenate with one of these type, use the function “ToChar”.
How to calculate duration on a field using a default value or a
workflow?
INTRODUCTION
Automatic calculation with dates used to be one of the better known limitations on OCOD. Values
depending on time variables were just impossible to modify so very often system administrators had to
use contextual reports like web applets to show the information. Fortunately, this is not a problem
anymore.
BUSINESS CASES
Warranties expiring on …
Imagine you need to fill in a date field when a particular action like a change on the opportunity sales stage
is executed, or just think about the case of this example, a client trying to calculate the end date for a
warranty… how can you do?
WHAT DO WE WANT TO DO?
My customer wanted the application to fill in automatically the ending date of warranty based on the
purchasing date.
HOW CAN WE DO?
Time to result
•15 Mins
Complexity (1 to 5)
•Level 2
Gap with out of the box cap
•100%
Chapter:GENERALCONFIGURATION
19
Using a post default value for the field we that we want to update (and adding a workflow if it changes on
modification) with the following syntax:
[<PurchaseDate>] + Duration('P2Y')
Figure 22: Example of syntax pasted in the field to calculate the end date of warranty
How to transform lower in upper case?
INTRODUCTION
Data quality is a recurrent question when working with data bases. Sometimes is very important to keep a
unique format for specific fields in order to ensure data identification or integration. This how to will show
you how to automate and be sure that your data will follow the format that you define.
BUSINESS CASES, KEEPING YOUR DATA ON STANDARD FORMAT
Often companies wish to use their customer’s data on marketing campaigns that are including information
coming directly from the data base. Imagine for instance that you are generating a personalized e-mailing
campaign, would you like to include names combining random upper and lowercase?
WHAT DO WE WANT TO DO?
We would like to ensure that a particular field will be filled in with uppercase only. We do not want any
workflow to run when saving the record, instead of that, we need the function to be active while typing
the field value
Time to result
•20 Mins
Complexity (1 to 5)
•Level 1
Gap with out of the box cap
•20%
Chapter:GENERALCONFIGURATION
20
Figure 23: Field in automatically in upper case
HOW CAN WE DO?
We will create a global web applet embedded into the action bar:
Figure 24: Web Global applet to host the JavaScript
The code in this applet is:
<script>
function uppercaseInput()
{
var INPUT_ID = 'LeadCreateEditForm.Company Name';
var elem = document.getElementById(INPUT_ID);
if( elem != null )
{
elem.style.textTransform = 'uppercase';
try {
Chapter:GENERALCONFIGURATION
21
elem.addEventListener('keyup',function (e) { this.value=this.value.toUpperCase();
}, true);
} catch(e){
elem.attachEvent('onkeyup', function (e) { this.value=this.value.toUpperCase(); });
}
}
}
setTimeout ( "uppercaseInput()", 2000 );
</script>
To understand:
Yellow: Field ID where we would like functionality activated
SOME APPLICATION EXAMPLES
Using a field as a part of the primary key of a record in interfaces
Imagine that you are interfacing 2 different systems, updating some particular information for the same
set of records based on a key. Imagine as well that one (or several) field making part of the primary key is
systematically filled in with caps for one of the systems … how can you ensure the primary key
correspondence? We are guessing that after this reading you have a particular idea in mind… don’t you?
How can i create a simple custom look-up?
INTRODUCTION
Oracle CRM On Demand allows users to define relationships between tables (known as “objects”). These
relationships are defined in many ways including related information (for 1 to many relationship) or the
lookup for 1 to 1 relationship.
Some standard functions provide users with the capability to “join” two object non-related in a
conventional way by using JoinfieldValue. Sometimes this function is not enough since it works only
between a well defined group of objects. Do not worry if you want to go further, we have found an
alternative solution for these particular requirements: just use reports’ capabilities and build a custom
lookup… are you wondering how? Keep reading …
BUSINESS CASES, WHEN SIMPLE CUSTOM LOOK UP IS USEFUL
Many Oracle CRM On Demand users would like to fill in fields with a value coming from a non-linked
object simulating thus, a standard lookup (that appears with the following icon: )
Time to result
•15 Mins
Complexity (1 to 5)
•Level 2
Gap with out of the box cap
•100%
Chapter:GENERALCONFIGURATION
22
The most frequent example concerning this functionality is the creation of a hierarchical relationship
inside a particular object. Let’s consider for instance a marketing program, launched in Europe and
composed of many campaigns linked to the marketing program. In this case the simplest way to create this
non-standard relationship is the custom look up.
WHAT DO WE WANT TO DO?
It is possible to simulate a look up behavior by creating a custom look up based on reports. This “how to”
will show you how you can create a “simple” custom look up catching one field content coming from the
report. (Notice that you will find the equivalent functionality for more than one field later on this book)
So let’s create a report containing the required information. Please notice that this report will include a
link sending the information to the right field:
Figure 25: Simple custom look catching one field content
HOW CAN WE DO?
FIND OUT THE FIELD ID OF THE TARGET FIELD (FIELD TO FILL IN)
We need to know the Oracle CRM application field id that we will fill in by clicking on the report.
1. On Firefox, select the field you would like to fill in
2. Right Click
3. Select view selection code
Chapter:GENERALCONFIGURATION
23
Figure 26: View selection code
4. Find and keep in your notepad the field ID
Note: To find out the field ID with IE you need to right click, select view source and search thanks to the
field display name.
CONFIGURE THE REPORT COLUMNS
Our example is based on a report related to the product’s table. The value that we would like to fill in is
the product name.
To create a report with a custom look up behavior:
1. Create the report including the column that you would like to display
2. Add the column containing the value that you would like to send into the target field
3. Set up this column as follows:
a. Select Column properties
Figure 27: Click on Column Properties
b. Select Data format tab and insert the following code:
"http://"@[html]"<a target=_top href=""javascript:void(null)""
onclick="Callback('"@"');">Select</a>"
To understand:
Yellow: name of the link that will appear in the place of the value
Chapter:GENERALCONFIGURATION
24
Figure 28: Insert the code in Data Format Tab
4. After the execution of the previous steps your report will contain two columns as shown:
Figure 29: Report built overview
CREATE THE REPORT NARRATIVE VIEW
We have to create a narrative view using with the following code:
<html>
<script type="text/javascript">
function Callback(Line)
{
var Line = Line
var theform = window.top.opener.document.getElementById("ServiceRequestEditForm");
for (n=0;n<theform.elements.length;n++) {
if (theform.elements[n].name == "ServiceRequestEditForm.Product")
{
theform.elements[n].innerText=Line;
theform.elements[n].value=Line;
}
}
window.close();
}
</script>
</html>
Chapter:GENERALCONFIGURATION
25
To understand:
Yellow: page name
Blue: Field id (catch in previous step)
Note: usually the field ID is based on the following pattern: page_name.Field_name
CREATE A WEB LINK
We need now to create the custom function into a report to catch the expected value that will feed our
CRM target field. To do this we just need to create a web link with the report path to run it from the target
record detail page in the CRM application:
Figure 30: Create a web link with the report path
Note: To run a custom report we are going to need to click the “Edit” button in the target record detail
page. If you want to run the custom lookup without editing the page, please read the “HowTo” “How to run
a custom lookup without clicking on page Edit Button on a single object”
Chapter:GENERALCONFIGURATION
26
How can i create a custom button that runs a custom look up
from Edit and Detail page?
INTRODUCTION
Custom look ups are quite useful and I think we all agree about it, although, when using it, many of us
have asked why we cannot use it from the simple view page with not need to previously click the edit
button… surprisingly, is possible … keep reading if you want to find out
WHAT DO WE WANT TO DO?
We would like to create a custom button that runs a custom look up in edit and detail page:
Figure 31: Button created to run the custom look up
CODE TO INSERT
This code has been created to launch a custom report service request in order to call a report related on
product. That aims to catch a product into a Service Request through a custom lookup.
The code is the following:
<script>
// First step: Open report and switch page in edit Mode
function openLink(target) {
// Open the reportrelated on custom lookup
var str = "https://secure-
ausomxXXX.crmondemand.com/OnDemand/user/analytics/saw.dll?Go&Path=%2fshared%2fCompany_30
701_Shared_Folder%2fProduct+Workaround&Options=rfd&Action=Prompt";
var editButton = "&nbsp;Edit&nbsp;";
var tdtd = document.getElementsByTagName("td");
for (var i = 0; i < tdtd.length; i++) {
Time to result
•50 Mins
Complexity (1 to 5)
•Level 3.5
Gap with out of the box cap
•20%
Chapter:GENERALCONFIGURATION
27
// Simul clic sur Bouton Edit
if (tdtd[i].innerHTML == editButton){
if(target =="Service" )
doNamedInvoke('ServiceRequestEditNav', tdtd[i]);
break ;
}
}
window.open(str);
} // End Function
</script>
<script>
// Second step: Parse page et define location for the button
function addCustomPickListButton()
{
var currentPage = document.getElementById('ocTitleFieldLabel');
var sr ="Consumer";
var target ="";
if(currentPage != null && currentPage.innerHTML != null && (currentPage.innerHTML.match("^"+sr)==sr )
) {
target ="Service";
var tdtd = document.getElementsByTagName("td");
for (var i = 0; i < tdtd.length; i++) {
// this button will be displyed close to text "Select product"
if (tdtd[i].innerHTML == "Select product" || tdtd[i].innerHTML == 'Select product' ){
tdtd[i+1].innerHTML="<input type=button value=Open onclick="openLink('"+target+"')" > ";
}
}
}
}
setTimeout ( "addCustomPickListButton()", 1000 ); // To be sure the Action Bar is loaded
</script>
To understand:
Yellow: repot path. Be aware to change the POD
Blue: target page name in edit mode
Green: text closed to the button will be displayed
Objectives of this code are to:
1. Create a button and put in the layout in Edit and Detail pages for lead and deal Objects
2. Switch the page in Edit mode if the page is not to allow the custom lookup to run
3. Open the report that embed the code for sending values into the layout
Chapter:GENERALCONFIGURATION
28
** Some comments have been added to let you understand code lines.
EMBED THIS CODE IN OCOD
The code has to be defined into a Global web applet, displayed in the action bar:
Figure 32: Global Web applet displayed in the action bar
Note: Do not forget to add this global web applet in the action bar and to create the custom look up.
How can I create a custom look up that fill in many fields in
Oracle CRM On Demand?
INTRODUCTION
Let’s say that this “How to” is the second of my favorites (I let you find the first one in the book…)
I am sure that you know “the standard” custom lookup, I mean the one that send one value from a report
into the application. Then, here is the evolved version of it ! This custom look up will be able to fill in
several values in one shot, from a report to the application.
BUSINESS CASES, KEEPING KEY IDENTIFICATION
Imagine that you want to recover data concerning an order in the application; you want the ID in order to
keep a primary key relationship but also, the order number coming from an external application. Obviously
you want to do it with the minimum number of clicks…
Time to result
•30 Mins
Complexity (1 to 5)
•Level 3,5
Gap with out of the box cap
•40%
Chapter:GENERALCONFIGURATION
29
WHAT DO WE WANT TO DO?
We would like to create a custom report that could fill in 2 fields in the application:
OCOD with the link to the custom look up:
Figure 33: Link to the custom lookup
HOW CAN WE DO?
Let us follow the following steps:
IN ORACLE CRM
CREATE CUSTOM FIELDS
Fields that will receive information should be text fields and should not be defined as “Read only”:
Figure 34: Fields that have been filled in
FIND THE SYSTEM NAME OF THE CUSTOM FIELDS
We need then to find the system name of the custom fields we have created previously:
Chapter:GENERALCONFIGURATION
30
Figure 35: Right click and select view Source
When the source page is displayed, do a search (Ctrl + F) based on the field display name. The system
name follows the format: Page_name.field_name
Figure 36: Edit page source and search the system name thanks to fields display name
Keep these system names by copying in your favorite text editor:
Chapter:GENERALCONFIGURATION
31
Figure 37: Copy system name
Now that we have the containers waiting for the data, we need to create our report:
IN ORACLE ANSWER (REPORT)
We need now to create a report that will feed our custom fields:
CREATE YOUR REPORT (STEP 1)
Select expected columns to build your report:
Figure 38: Columns selected to create our report
As we want to prompt orders (opportunities) owned by the contact we are based on, we will add a filter
based on the contact ID:
Chapter:GENERALCONFIGURATION
32
Figure 39: filter to display only opportunities owned by the displayed contact
CREATE THE LINK TO FEED THE APPLICATION FROM THE REPORT
We will create a column that will display a link with the name “Sélectionner une commande” (“select an
order”.
Use a custom format for the column
We will use a custom format for all data displayed on this column based on JavaScript function (“Callback):
Chapter:GENERALCONFIGURATION
33
Figure 40: Custom format used
The code is the following:
"http://"@[html]"<a target=_top href=""javascript:void(null)"" onclick="Callback('"@"');">Sélectionner
une commande</a>"
To understand:
Yellow: is the link name
Define “fx” in the column
In the fx defined in our column we must find all the parameters that will be used in the future:
In our example, we need to find two fields:
Chapter:GENERALCONFIGURATION
34
Figure 41: Fx definition
The formula used is:
CONCAT(Opportunity."Opportunity ID", CONCAT('?', Opportunity.Name))
To understand:
Yellow: two fields we are interested in to fill in our application
Blue (‘?’): the sign “?” allow us to separate both fields. Before selecting this key, be sure that it will not be
used in any other column
Note: we can also use the sign “||” to define a concatenation function as follows:
"- Product Category"."Parent Product" || '?' || "- Product Category"."Category Description"
Add a narrative view
Now we have to host the JavaScript that will parse our report and run the callback function to fill in our
two application field:
Chapter:GENERALCONFIGURATION
35
Figure 42: Add a narrative view
Figure 43: Code to paste in the narrative view
Paste the code:
<html>
<script type="text/javascript">
function Callback(Line)
{
var Line = Line;
// Le parameter Line permet de récupérer les valeurs contenu dans la colonne “Sélectionner” définies plus
haut ( soit (CONCAT(Opportunity."Opportunity ID", CONCAT('?', Opportunity.Name)))
Chapter:GENERALCONFIGURATION
36
var position = Line.indexOf('?');
// Index Of est une fonction Javascript permettant de renvoyer la position du parameter (?) dans la chaine
Line. La variable position permet de définir la poistion du « ‘?»
var MyCommandeID = Line.substring(0, position);
// Commande ID est compris entre 0 et la variable position (?)
var MyCommandeName = Line.substring(position+1);
// Commande name est situé à la position ? +1
// Get SR form from parent page
var theform = window.top.opener.document.getElementById("ServiceRequestEditForm");
for (n=0;n<theform.elements.length;n++) {
if (theform.elements[n].name == "ServiceRequestEditForm.Indexed Short Text 0")
{
theform.elements[n].innerText=MyCommandeName;
theform.elements[n].value=MyCommandeName;
}
if (theform.elements[n].name == "ServiceRequestEditForm.ZText_30")
{
theform.elements[n].innerText=MyCommandeID;
theform.elements[n].value=MyCommandeID;
}
}
window.close();
}
</script>
</html>
To understand:
Yellow: fields’ system name
Blue: page name that we want to feed
Note: To create a custom report with many parameters to feed, objects and method can be lightly
different. You have to use the following syntax:
<html>
<script type="text/javascript">
function Callback(ProgramID)
{
var position = ProgramID.indexOf('?');
var MyProgramID = ProgramID.substring(0,position);
var MyProgramName = ProgramID.substring(position+1);
var theform = window.top.opener.document.getElementById("DealRegistration.EditForm");
for (n=0;n<theform.elements.length;n++) {
if (theform.elements[n].id == "DealRegistration.EditForm.Product Interest")
{
theform.elements[n].innerText=MyProgramID;
theform.elements[n].value=MyProgramID;
Chapter:GENERALCONFIGURATION
37
}
if (theform.elements[n].id == "DealRegistration.EditForm.ZText_2")
{
theform.elements[n].innerText= MyProgramName ;
theform.elements[n].value = MyProgramName ;
}
}
window.close();
}
</script>
</html>
CREATE THE LINK BETWEEN ORACLE CRM ON DEMAND AND ORACLE ANSWER
Now we have to create a web link that will run the prompted report:
RETRIEVE THE REPORT PATH
To find the report path, run it in internet Explorer, right click on it and select properties:
Figure 44: Copy the report path
CREATE A WEB LINK FIELD
Get back to oracle CRM On Demand and create a web link that will run the prompted report
Chapter:GENERALCONFIGURATION
38
Figure 45: Create the custom web link
Figure 46: Detail on the formula used
Note: You have to specify “Open in a new window”
In our example, the URL is the following:
Chapter:GENERALCONFIGURATION
39
https://secure-
ausomxXXX.crmondemand.com/OnDemand/user/OpportunityDetail?ocTitle=%%%Indexed_Short_Text_0
%%%&OMTGT=OpptyDetailForm&OMTHD=OpportunityDetailNav&ocEdit=Y&OpptyDetailForm.Id=%%%stI
D_Commande%%%&OCTYPE=Nouvelle+activit%C3%A9&ocTitleField=Name
How to prevent the sales stage modification after the
opportunity closed?
INTRODUCTION
Consolidating figures could be a tricky question with CRM. Sometimes users just are not that sure about
the information that they are entering in CRM. You might want to ask accurate updates on the database so
you can take information as real facts, thus, it would be worthy for you to prevent users from changing the
Opportunity Sales Stage picklist value from ‘Closed/Lost’ or ‘Closed/Won’ back to any of the earlier stages
(say, ‘Short List’, ‘Negotiation’, etc.)
BUSINESS CASES, WHEN CLOSED OPPORTUNITY MODIFICATION RESTRICTION IS USEFUL
Matching financial and commercial information
Imagine that you need to validate your financial figures with commercial information coming from your
sales force. We are guessing you do not want to find any inconsistency that push you make many calls and
ask to a half of your sales why information does not match… what to do? What about “Forcing” your users
to announce the final decision at the real end of the opportunity and not being able to get back if they do
not?
WHAT DO WE WANT TO DO?
We want to block opportunities with status Closed. Does not matter if they are Won or Lost.
HOW CAN WE DO?
This can be achieved by writing a field validation rule for the ‘Sales Stage Id’ field in the Opportunity
record-type. Usually field validation rules are written directly for the field that one wants to control, but in
this case, you cannot write these rule for the Sales Stage field, since the field validation option is disabled.
Instead of this, you can use the Sales Stage Id field to achieve the same result
1. Locate Sales Stage Id on the Opportunity Field Setup page and click the Edit link.
2. Enter the following rule in the Field Validation field:
PRE('')'Closed/Won' AND PRE('')'Closed/Lost'
Time to result
•40 Mins
Complexity (1 to 5)
•Level 1,5
Gap with out of the box cap
•100%
Chapter:GENERALCONFIGURATION
40
If you want only users with a certain role, such as the Administrator, to have the ability to change a
closed opportunity to one of the earlier stages, then you can exclude that user role in the field
validation rule:
(PRE('')'Closed/Won' AND PRE('')'Closed/Lost') OR (UserValue('')='Administrator')
3. Enter the error message that should be displayed when a user tries to change the sales stage value on
a closed Opportunity record.
4. Click Save.
5. Test the field validation rule to make sure it works as you expect.
Figure 47: Validation message after applying workflow to restrict opportunity status changes
If you want to see more details, including more pictures, check out this document on My Oracle Support:
Restricting Opportunity Sales Stage Value Using Field Validation (Doc ID 841398.1: You'll need to sign in
with your My Oracle Support account to access the document.)
Chapter:GENERALCONFIGURATION
41
How to monitor some variables evolution?
INTRODUCTION
Sometimes, is worthy for users to follow up the evolution of certain variables that will, in consequence,
facilitate and encourage the team work by allowing managers to help at the right moment their team
members.
BUSINESS CASES, WHEN MONITORING VARIABLES IS USEFUL
Following up opportunities evolution
Imagine for instance, a sales rep. who has created an opportunity for the current year but it is been a while
since he modified it for the last time. As a manager, you would like to see how could you help him to
concretize his opportunity and win it but… how could you know who needs support at the right moment?
Well in this document we will build a report concerning opportunities (you can do the same with any
object) that will let you know when a particular field was modified for the last time and what was its
previous value.
Contact form
As you can imagine from now, many uses are possible with this functionality, let’s go deeper and see some
other examples.
WHAT DO WE WANT TO DO?
We want to follow up the changes realized on a group of fields and the dates of these changes. Then, we
would like to follow up those fields in a report showing evolution and identifying need for action.
HOW CAN WE DO?
We are going to need some pivots fields to stock evolution information, then a report concerning those
fields will alert us about actions required.
STEP 1: PIVOT FIELDS
Time to result
•30 Mins
Complexity (1 to 5)
•Level 2,5
Gap with out of the box cap
•100%
Chapter:GENERALCONFIGURATION
42
Create “pivot fields” for the object that contains the date and the previous value for the fields that you
want to follow up. In our example this object is the opportunity and we will follow up the field “Sales
Stage”.
We need to create two pivot fields for each monitored field. The first one keeping the field previous value
and the second one will indicate the last modification date not for the record but for the field being
monitored.
Figure 48: Example of pivot field used to monitor some variables evolution
STEP 2: WORKFLOWS
Once the fields are available we will need to populate it automatically with the right information. To do
this, let’s create a workflow for the field taking the information as shown on the figure below:
Figure 49: Workflow defined to monitor some variables evolution
The condition triggering the workflow is the field (and no the record) modification. The function PRE
allows you to compare the previous value to the new one.
Concerning the workflow activities, set the field values as follows:
Figure 50: Workflow definition to monitor some variables evolution
Chapter:GENERALCONFIGURATION
43
Figure 51: Date to monitor some variables evolution
STEP 3: CREATE AND BUILD YOUR REPORT
Now that your records are correctly populated, create your report and make it available for all managers
wanting to monitor opportunities’ sales stage evolution.
Figure: Example of report created to monitor some variables evolution
Note:
- Please notice that this reports needs at least two days to be finalized since new customized fields
are available on analytics just the day after its creation.
- If you need to go farther on modification history, you can use the same philosophy to explore
previous modifications, but you will have to create two additional fields each time.
How can to create a custom button?
INTRODUCTION
Integrating custom buttons following specific behavior is very often worthy to respond to particular
requirements which are not standard functionalities in OCOD. Using code you can get to create many
interesting possibilities. Let’s see how can we integrate buttons.
BUSINESS CASES, WHEN CUSTOM BUTTONS ARE USEFUL
Creating a custom look up filling up multiple fields
Time to result
•30 Mins
Complexity (1 to 5)
•Level 3
Gap with out of the box cap
•30%
Chapter:GENERALCONFIGURATION
44
Standard look up functionality can only fill in one field at a time… what about saving time and effort for
your users when creating and/or editing records?
WHAT DO WE WANT TO DO?
We would like to create a custom button with a custom behavior.
This “how to” is based on an example realize on "lead" object:
Figure 52: Example of custom buttons created
HOW CAN WE DO?
CREATE THE JAVASCRIPT
We need to create a code, as follows:
type="text/javascript" id="customJavaScript">
// comportement du bouton
function linkedIn(addr){
window.open (addr); //pour un popup. Pour ouvrir dans la page courante: window.location
}
function addCustomPickListButton2()
{
var tdtd = document.getElementsByTagName("td");
// initialisation des variables
var fname ="";
var lname ="";
// premiere partie: affecte valeur dans les pages de detail
//pour acceder a une valeur de champ en edit mode la fonction est .innerHTML
Chapter:GENERALCONFIGURATION
45
for (var i = 0; i < tdtd.length; i++) { //parcours la page
if (tdtd[i].innerHTML == "First Name"){
fname = tdtd[i+1].innerHTML;
}
if (tdtd[i].innerHTML == "Last Name"){
lname = tdtd[i+1].innerHTML;
}
}
// deuxieme partie: affecte valeur dans les pages edit
// va chercher l'element egal a td+1 (valeur du champs)
//pour acceder a une valeur de champ en edit mode la fonction est .value
if(fname == "" && document.getElementById('LeadCreateEditForm.First Name') != null )
fname = document.getElementById('LeadCreateEditForm.First Name').value;
if(lname == "" && document.getElementById('LeadCreateEditForm.Last Name') != null )
lname = document.getElementById('LeadCreateEditForm.Last Name').value;
//Troisieme partie: creer le bouton et reference a son comportement
for (var i = 0; i < tdtd.length; i++) { // parcours la page
// On place le bouton a cote du texte "Linked In"
if (tdtd[i].innerHTML == "Linked In" || tdtd[i].innerHTML == '="fl">Linked In' ){ // page de detail ou page
edit
// reference au comportement du bouton
tdtd[i+1].innerHTML="";
}
}
}
setTimeout ( "addCustomPickListButton2()", 1000 ); // To be sure the Action Bar is loaded
</script>
CODE EXPLANATION
We put some comments into the code, but let us explain how you can adapt this code:
CREATE THE LINK FOR THE BUTTON TO FOLLOW
We have to write the link in a variable because Javascript cannot follow a simple URL:
function linkedIn(addr){
window.open (addr); //pour un popup. Pour ouvrir dans la page courante: window.location
}
function addCustomPickListButton2()
{
Chapter:GENERALCONFIGURATION
46
LOOKING FOR "TD" ELEMENTS
Specify that you are looking for td elements
var tdtd = document.getElementsByTagName("td");
VARIABLE DECLARATION
Specify the variable(s) that will compose our URL (the example is based on tags that will compose the
URL):
var fname ="";
var lname ="";
PARSE THE CURRENT PAGE
This will parse every page where the application is
for (var i = 0; i < tdtd.length; i++) {
SEARCH ELEMENTS IN EDIT PAGES
To find elements that we are looking for in an edit page, the function is ".innerHTML"
To find the element (the value in the fields called "Last Name" and "first Name"), we are looking for the
elements after elements called "Last Name" and "first Name", some element after td = Last name and First
name, so td+1:
if (tdtd[i].innerHTML == "First Name"){
fname = tdtd[i+1].innerHTML;
}
if (tdtd[i].innerHTML == "Last Name"){
lname = tdtd[i+1].innerHTML;
}
}
SEARCH ELEMENTS IN DETAILS PAGES
To find elements that we are looking for in an edit page, the function is ".value"
To find the element (the value in the fields called "Last Name" and "first Name"), we are looking for the
elements after elements called "Last Name" and "first Name", some element after td = Last name and First
name, so td+1
Chapter:GENERALCONFIGURATION
47
if(fname == "" && document.getElementById('LeadCreateEditForm.First Name') != null )
fname = document.getElementById('LeadCreateEditForm.First Name').value;
if(lname == "" && document.getElementById('LeadCreateEditForm.Last Name') != null )
lname = document.getElementById('LeadCreateEditForm.Last Name').value;
Of course, you have to adapt the page name depending object where you want to put the custom button
SELECT THE PLACE WHERE WE WOULD LIKE TO PUT THE CUSTOM BUTTOM
We will parse de page and find the display name "Linked In" in the current page to place the button right
after.
Once again in the edit page specify ".innerHTML" and in detail page ".value"
if (tdtd[i].innerHTML == "Linked In" || tdtd[i].innerHTML == 'Linked In' ){
SPECIFY BEHAVIOR ON THE BUTTON
if (tdtd[i].innerHTML == "Linked In" || tdtd[i].innerHTML == 'Linked In' ){
PUT THE CODE IN A CUSTOM WEB APPLET
The code, once adapted to your environment, has to be copied in a custom web applet
Figure: Global Web applet created to create a custom button
And don't forget to add this web applet to the action bar for users...
How to avoid weekend selection for date type fields?
Time to result
•50 Mins
Complexity (1 to 5)
•Level 4
Gap with out of the box cap
•20%
Chapter:GENERALCONFIGURATION
48
INTRODUCTION
Business rules and daily work restrictions can add complexity to the configuration of a CRM. Imaging that
you are using your application to monitor your deliveries and, as many of us, some of the members of your
supply chain do not work on weekends. You do not want to plan shipping and deliveries in those dates
since performance indicators will not correspond to reality… what to do without checking carefully the
calendar each time that you create and/or edit a record?
BUSINESS CASES, WHEN AVOIDING WEEKENDS IS USEFUL
Avoiding weekend choice
Imagine that your customer wants an automatic calculation to be launched on a date field type in order to
avoid week end and this, for the “Service Request” object which includes a dynamic layout (rule should be
triggered just for a particular service request type)
The dates in question represent the final shipment date and the pickup start date (commitment from the
shipping provider) which are, as well, calculated depending on a department selection and a original
pickup and shipment date selection.
WHAT DO WE WANT TO DO?
We want to avoid work on weekends… well even if it is funny this is pretty much right, let’s check the
business rule
We should not be able to select “pickup date” and “shipment date” when:
We are on a layout type “Assistance Service FR” (dynamic layout value)
And
Field “Issue du diagnostique”= “Décision Pickup”
And
Select the pickup date or shipment date that represents the original date
and
Filled in field “Pickup code postal” (pick up zip code) or “Livraison code postal” (shipment zip code)
And
You select the department number
Chapter:GENERALCONFIGURATION
49
A workflow rule is applied to calculate the final shipment or pickup date where the provider is committed
with following definition:
DestinationZip code Days in Transit
DestinationZip
code
Days in Transit
01xxx 1 45xxx 1
02xxx 1 46xxx 2
03xxx 1 47xxx 1
04xxx 3 48xxx 1
05xxx 3 49xxx 1
06xxx 2 50xxx 1
07xxx 2 51xxx 1
08xxx 1 52xxx 1
09xxx 1 53xxx 1
10xxx 1 54xxx 1
11xxx 2 55xxx 1
12xxx 1 56xxx 1
13xxx 2 57xxx 1
14xxx 1 58xxx 1
15xxx 2 59xxx 1
16xxx 1 60xxx 1
17xxx 2 61xxx 1
18xxx 1 62xxx 1
19xxx 1 63xxx 1
20xxx 5 64xxx 2
21xxx 1 65xxx 1
22xxx 1 66xxx 2
23xxx 1 67xxx 1
24xxx 2 68xxx 1
25xxx 1 69xxx 1
26xxx 2 70xxx 1
27xxx 1 71xxx 1
Chapter:GENERALCONFIGURATION
50
28xxx 1 72xxx 1
29xxx 2 73xxx 2
30xxx 2 74xxx 1
31xxx 1 75xxx 1
32xxx 1 76xxx 1
33xxx 1 77xxx 1
34xxx 2 78xxx 1
35xxx 1 79xxx 1
36xxx 1 80xxx 1
37xxx 1 81xxx 1
38xxx 1 82xxx 1
39xxx 1 83xxx 2
40xxx 1 84xxx 2
41xxx 1 85xxx 2
42xxx 1 86xxx 1
43xxx 1 87xxx 1
44xxx 1 88xxx 1
HOW CAN WE DO?
Simple: a workflow calculating our final date AND a Javascript that we will embed into a Global Web applet
in the action bar.
DEFINE WORKFLOW
We need to create a workflow involving the shipment and the pickup start date to calculate the final date
depending on the department rule and the original date:
Figure 53: Workflow formula to calculate final date depending on the department rule based on the original date
Chapter:GENERALCONFIGURATION
51
The workflow formula is the following:
IIf(Left([<stPickup_CP_ITAG>],2)='06' OR '07' OR '11' OR '13' OR '15' OR '17 'OR '24' OR '26' OR '29' OR '30'
OR '34' OR '46' OR '64' OR '66' OR '73' OR '83' OR '84' OR '85' OR '98', [<A_ITAG>]-2,
IIf(Left([<stPickup_CP_ITAG>],2)='04'OR '05', [<A_ITAG>]-3, IIf(Left([<stPickup_CP_ITAG>],2)='20',
[<A_ITAG>]-5, [<A_ITAG>]-1)))
To understand:
[<stPickup_CP_ITAG>]: zip code
[<A_ITAG>]: Original date
DEFINE THE SCRIPT
The script will do following action:
 Parse correct layout and get elements
 Trigger the workflow rule (calculation)
 If result is a week end, then alert the user
 And finally add the next working day (correct date)
The code that we’ll need to use is the following (explanation are embedded with the code (marked as
comment):
<script type="text/javascript">
function startW (s, str)
{
return (s.match("^"+str)==str);
}
// keep date, parse and define variable new Date()
function getDateFromOcodStringDate(sDate)
{
var v = sDate;
var start = v.indexOf("/", 0 );
var j = v.substr(0,start);
var m = v.substr(start+1,2);
var a = v.substr(start+4,4);
var d = new Date();
d.setFullYear(a,m-1,j);
return d;
}
///////////////////////////////////////////////////////////////////////////////
Chapter:GENERALCONFIGURATION
52
// Define day depending date
function getDay( d )
{
var weekday = new Array(7);
weekday[0]="Sunday";
weekday[1]="Monday";
weekday[2]="Tuesday";
weekday[3]="Wednesday";
weekday[4]="Thursday";
weekday[5]="Friday";
weekday[6]="Saturday";
//alert("Today is " + weekday[d.getDay()] );
return weekday[d.getDay()];
}
// alerte definition if result is a week end
function isWeekendDay( d)
{
var weekday = new Array(7);
weekday[0]="Sunday";
weekday[1]="Monday";
weekday[2]="Tuesday";
weekday[3]="Wednesday";
weekday[4]="Thursday";
weekday[5]="Friday";
weekday[6]="Saturday";
//alert("Today is " + weekday[d.getDay()] );
if( weekday[d.getDay()] == "Saturday" || weekday[d.getDay()] == "Sunday" )
return true;
return false;
}
////////////////////////////////////////////////////////////////////////////
// Parse page
function GetElement( id )
{
if( document.getElementById(id) )
{
return document.getElementById(id);
}
else
{
//alert("Not found Element by id : "+ id);
return false;
}
}
Chapter:GENERALCONFIGURATION
53
function checkDates()
{
// Get needed input values
var type = GetElement('ServiceRequestEditForm.SR Type').value;
var pick = GetElement('ServiceRequestEditForm.Indexed Pick 4').value;
// Keep field shipment zip code and pickup zip code
var codePLivraison = GetElement('ServiceRequestEditForm.ZText_39').value;
var codePPickup = GetElement('ServiceRequestEditForm.ZText_36').value;
var result;
// Check expected condition
if ( type == "Assistance Service FR" && pick =="Décision pickup" && codePPickup != "" )
{
var dd = GetElement('ServiceRequestEditForm.ZDate_25').value;
// format String date to Date
var date = getDateFromOcodStringDate ( dd );
var oldDate = getDateFromOcodStringDate ( dd );
// Get the number of days to back from zip code
date.setDate ( date.getDate() - getBackDayNumber (codePPickup) );
// We will Add 1 day if date is a Sunday and 2 days if date is a saturday
if( isWeekendDay (date) )
{
if(getDay(date) == "Sunday"){
// Add one day
oldDate.setDate ( oldDate.getDate() + 1 )
} else {
// Add two day
oldDate.setDate ( oldDate.getDate() + 2 )
}
// format new Date
var nDate = oldDate.getDate() + "/" + (oldDate.getMonth() + 1) + "/" +
oldDate.getFullYear();
// Message defined if date is a week end
alert("Date Départ pickup est un Weekend.nNouvelle date pickup : " + nDate);
// Change the date input value
GetElement('ServiceRequestEditForm.ZDate_25').value = nDate;
//return true;
}
}
////////////////////////////////////////////////////////////////////////////////////////////
// We do the substraction with date.getdate() and getBackDayNumber (codePLivraison) and apply
behavior. The substraction is done on the shipment and pickup date to let the workflow being applied.
if ( type == "Assistance Service FR" && pick =="Décision pickup" && codePLivraison != "" )
{
var dd = GetElement('ServiceRequestEditForm.ZDate_26').value;
var date = getDateFromOcodStringDate ( dd );
Chapter:GENERALCONFIGURATION
54
var oldDate = getDateFromOcodStringDate ( dd );
date.setDate ( date.getDate() - getBackDayNumber (codePLivraison) );
if( isWeekendDay (date) )
{
if(getDay(date) == "Sunday"){
oldDate.setDate ( oldDate.getDate() + 1 )
} else {
oldDate.setDate ( oldDate.getDate() + 2 )
}
var nDate = oldDate.getDate() + "/" + (oldDate.getMonth() + 1) + "/" +
oldDate.getFullYear();
// Message defined if date is a week end
alert("Date Départ Livraison est un Weekend.nNouvelle date Livraison: " +
nDate);
GetElement('ServiceRequestEditForm.ZDate_26').value = nDate;
//return true;
}
}
return true;
}
//////////////////////////////////////////////////////////////////////////////////
// getBackDayNumber calculation: Define number depending postal code
function getBackDayNumber( codeP )
{
var code = codeP.substr(0, 2);
if( code == "06" || code =="07" || code =="11" || code =="13" || code =="15" || code =="17" ||
code =="24" || code =="26" || code =="29" || code =="30" || code =="34" || code =="46" || code =="64"
|| code =="66" || code =="73" || code =="83" || code =="84" || code =="85" || code =="98")
return 2;
if ( code =="04" || code =="05")
return 3;
if ( code =="20" )
return 5;
return 1;
}
//////////////////////////////////////////////////////////////////////////////////////////
// Detect the form where the script has to run
function detectAddForm()
{
// Wait two seconds after changing the value type in the picklist because we are using a dynamic layout
Chapter:GENERALCONFIGURATION
55
// Check SR Type attribute if exist
if ( GetElement('ServiceRequestEditForm.SR Type') )
{
var elem = GetElement('ServiceRequestEditForm.SR Type');
try{
// Re-add the same method on this attribute every time the user choose different
type, because when change SR Type the page is reloading and we lost Javascript Event
// addEventListener: all browsers except IE before version 9
elem.addEventListener('change',function (e) { setTimeout ( "detectAddForm()",
2000 ); }, true);
} catch(e){
// attachEvent: IE before version 9
elem.attachEvent('onchange', function (e) { setTimeout ( "detectAddForm()", 2000
); });
}
}
var e = document;
e = e.getElementsByTagName('td');
// Parse HTML page to find ‘Save’ button and change his behavior by Check Date function
var i=0;
while( i < e.length)
{
// Check SR form
if( startW (e[i].id, "ServiceRequestNewForm") || startW (e[i].id,
"ServiceRequestEditForm") )
{
// Check Save button
if(e[i].innerHTML == "&nbsp;Enregistrer&nbsp;" || e[i].innerHTML ==
"&nbsp;Enregistrer &amp; Nouvelle Traitement&nbsp;" )
{
document.getElementById( e[i].id ).onclick = function(e){
// Add check date functionality before saving
if( checkDates() == true )
{
// doNamedInvoke : default function used when clicking
on Save button
doNamedInvoke('Save', this);
}
}
}
}
i++ ;
}
}
// Run the script 2 seconds after action bar loaded
//detectAddForm();
setTimeout ( "detectAddForm()", 2000 );
Chapter:GENERALCONFIGURATION
56
</script>
To understand:
 ServiceRequestEditForm.ZText_39: Pick up zip code
 ServiceRequestEditForm.ZText_36: shipment zip code
 Assistance Service FR: picklist value that defines dynamic layout
 Dccision pickup: value of the "type" field
Adapt and paste the code in a global web applet associated to the Action Bar and you will be done!!!
How to make caps mandatory for field content?
INTRODUCTION
Data bases are being more and more integrate to business processes in the last years. Today interfaces,
web marketing and many other functionalities are finding support on brut data base content. From the
practical point of view what this introduces is the need for every system administrator to manage data
quality.
BUSINESS CASES, WHEN MANDATORY CAPS ARE USEFUL
Emailing on your data base contacts
Imagine that you are sending marketing e-mails campaigns to all or a segment of your data base contacts.
Imagine as well that you are merging some of the fields on the contact record profile… you do not want to
include orthographic errors which can bother your potential client, do you? If you say no, this how to is for
you.
Time to result
•10 Mins
Complexity (1 to 5)
•Level 1,5
Gap with out of the box cap
•100%
Chapter:GENERALCONFIGURATION
57
WHAT DO WE WANT TO DO?
Just to push users to use ONLY a predefined set of characters when filling in a particular field.
HOW CAN WE DO?
STEP1: CREATE THE WORKFLOW EXPRESSION
We need to use the Field validation capabilities. You need to add a field validation formula, which will
define the allowed characters for the field. In this case, capital letters, numbers and some other symbols.
Use the following expression:
Figure 54: Syntaxe définie dans la validation du champ
(FindNoneOf((FieldValue('<AccountName>')),"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-() _/")) = 0
To understand:
<AccountName> can be replaced by any other field name!
FINDNONEOF FUNCTION EXPLANATION:
The FindNoneOf function in Expression Builder returns the position of the first instance in the first
argument (string1) that does not match any character in the second argument (string2).
THE SYNTAX TO FOLLOW
The syntax to follow is: FindNoneOf(string1, string2)
RESULT TYPE
The result type is an Integer
STEP 2: SPECIFY THE FIELD VALIDATION ERROR MESSAGE
Chapter:GENERALCONFIGURATION
58
Once you have the validation expression, you can now create a message that will show up whenever users
try to save a record not matching the established conditions. Here and example:
“Only capital letters, numbers, spaces and the characters period, parenthesis, dash, slash and underscore,
can be used for the field Account Name, please modify your entry accordingly”
How can I create an I-Frame in homepage?
INTRODUCTION
This tip has often been used to personalize Oracle CRM On Demand application. This customization allows
users to create shortcuts based on user business processes
BUSINESS CASES, WHEN A HOMEPAGE I-FRAME IS USEFUL
I had a customer who wanted to personalize his application with the look of a Partner Portal. The aim of
this customization was to create an I Frame in the homepage, embedding some quick links to main
functionalities and most consulted information.
WHAT DO WE WANT TO DO?
Your CRM could have this more attractive than the standard look:
Figure 55: I Frame in Homepage. Illustration from a customer
Or
Time to result
•10 Mins
Complexity (1 to 5)
•Level 2
Gap with out of the box cap
•40%
Chapter:GENERALCONFIGURATION
59
maybe this one:
Figure 56: I Frame in Homepage. Illustration from a customer
CREATE A GLOBAL WEB APPLET
Insert this code:
<body>
<style type="text/css">
a:link {COLOR: #0033BB; TEXT-DECORATION: none}
a:visited{COLOR: #0033BB; TEXT-DECORATION: none}
a:active{COLOR: #0033BB; TEXT-DECORATION: none}
a:hover {COLOR: #0033BB;TEXT-DECORATION: underline}
</style>
<table cellspacing="10" width="100%" bgcolor="#F9F9F9">
<tr>
<br>
<br>
<td width="100"><img
src="http://t3.gstatic.com/images?q=tbn:pkSvMmwgOsBelM:http://www.oekumenischekampagne.ch/cm
s/uploads/media/Signet_BFA_RGB.jpg"></td>
<td width="100%"><font size=3 color="black"><b>Welcome to your <Customer>’s future application,
what do you want to do today? <br></font>
<font size=2>
<br>
<table width="100%" border="0" cellspacing="0" cellpadding="2" height="60">
<tr valign="middle">
<td bgcolor="#BACFDA" width="33%" height="20">
<div align="center"><font face="Arial" size="2" color="#064380"><b>Manage My Activity
</b></font></div>
</td>
<td width="1%" height="20">
</td>
<td bgcolor="#BACFDA" width="33%" height="20">
<div align="center"><font face="Arial" size="2" color="#064380"><b>Manage
Donations</b></font></div>
</td>
<td width="1%" height="20">
</td>
<td bgcolor="#BACFDA" width="33%" height="20">
<div align="center"><font face="Arial" size="2" color="#064380"><b>Get Help</b></font></div>
<td width="100%" height="20">
Chapter:GENERALCONFIGURATION
60
</td>
</tr>
<tr valign="top">
<td bgcolor="#BACFDA" width="33%">
<table width="100%" border="0" cellspacing="0" cellpadding="3" height="40">
<tr bgcolor="#FFFFFF" valign="top">
<td>
<p>
<font face="Arial" size="2" color="#ABDAF3">
<a
href="/OnDemand/user/CalendarWeekly?CalendarCtrl.Date=10%2f7%2f2009&OMTGT=CalendarCtrl&OM
THD=Weekly&CalendarCtrl.ShowFullDay=0"> Plan My Week </a>
<br>
<a
href="/OnDemand/user/CRMODLS_BusinessPlan.FullList?CRMODLS_BusinessPlan.FullList.LAYOUT=CRMO
DLS_BusinessPlan.AllList&CRMODLS_BusinessPlan.FullList.LAYOUTID=&OMTGT=CRMODLS_BusinessPlan.F
ullList&OMTHD=PdqListMethod&CRMODLS_BusinessPlan.FullList.EDITFLAG=N"> Review My Business
Plans </a>
<br>
<a
href="/OnDemand/user/ContactList?ContactList.LAYOUT=Contact+List+Key+Target+Physicians&OMTGT=C
ontactList&OMTHD=PdqListMethod&ContactList.EDITFLAG=Y"> View My Members</a>
</font>
</p>
</td>
</tr>
</table>
</td>
<td width="1">
</td>
<td bgcolor="#BACFDA" width="33%">
<table width="100%" border="0" cellspacing="0" cellpadding="3" height="40">
<tr bgcolor="#FFFFFF" valign="top">
<td>
<p><font face="Arial" size="2" color="#ABDAF3">
<a
href="OnDemand/user/OpptyListPage?OpptyListPage.LAYOUT=OptyList&OpptyListPage.EDITFLAG=N&OM
TGT=OpptyListPage&OMTHD=PdqListMethod&OpptyListPage.LAYOUTID="> All Donations </a>
<br>
<a href="http://www.vetwholesaler.co.uk"> My Donations </a>
<br>
<a href="http://www.nwlabs.co.uk"> Top 10 Donation </a>
</font>
</p>
</td>
</td>
</tr>
</table>
<td width="1"></td>
<td bgcolor="#BACFDA" width="33%">
<table width="100%" border="0" cellspacing="0" cellpadding="3" height="40">
<tr bgcolor="#FFFFFF" valign="top">
Chapter:GENERALCONFIGURATION
61
<td>
<p>
<font face="Arial" size="2" color="#ABDAF3">
<a
href="/OnDemand/user/CRMOD_LS_MessagingPlan.FullList?OMTGT=CRMOD_LS_MessagingPlan.FullList&
OMTHD=PdqListMethod&CRMOD_LS_MessagingPlan.FullList.LAYOUTID=&CRMOD_LS_MessagingPlan.Full
List.EDITFLAG=N&CRMOD_LS_MessagingPlan.FullList.LAYOUT=CRMOD_LS_MessagingPlan.AllList"> Find
Messaging Plans </a>
<br>
<a href="https://secure-
ausomxama.crmondemand.com/OnDemand/user/ServiceRequestList?OMTGT=ServiceRequestList&OMTH
D=PdqListMethod&ServiceRequestList.EDITFLAG=N&ServiceRequestList.LAYOUT=SRList&ServiceRequestLi
st.LAYOUTID="> Check MedInfo requests </a>
<br>
<a href="mailto:mathieu.emanuelli@gmail.com"> My Contact</a>
</font>
</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</tr>
</table>
To understand:
Yellow : Color code to adapt
Blue: Picture path
Red: application path
Green: Other links
Note: You can adapt the code inserting the expected picture and links. When configuring internal URL do
not use any pod information so the code can be applied in many environments such as production or
staging.
This code has to be pasted in a global web applet as follows:
Chapter:GENERALCONFIGURATION
62
Figure: Global web applet to paste the I frame code
How can i create an i-frame with action bar content?
INTRODUCTION
This tip will allow you to improve content shown in the action bar. We would like to customize the action
bar letting only the most important information for business.
WHAT DO WE WANT TO DO?
We want to create an I-frame in the action bar with scroll bar giving to users the capability to access to
other non-standard functionalities:
Time to result
•20 Mins
Complexity (1 to 5)
•Level 1
Gap with out of the box cap
•90%
Chapter:GENERALCONFIGURATION
63
Figure 57: Scroll bar in the action bar
HOW CAN WE DO?
We will need to create global web applet into the action bar:
Figure 58: Web applet to create scroll bar
The code inserted is the following one:
</style><div align="left">
<table width="131" border="0">
</table>
Chapter:GENERALCONFIGURATION
64
We just need to be careful while specifying the size for the global web applet. After this, any link can be
added to the action bar in order to facilitate the access to particular information to any Oracle CRM On
Demand user in your company
How can I rename the button “Log A Call” in activity related
information?
INTRODUCTION
This tip shows you how it is possible to rename a standard button on your CRM application
BUSINESS CASES, WHEN RENAMING A STANDARD BUTTON IS USEFUL
One of my customer wanted to renamed the out of box button “log a call” because the term “call” did not
corresponded to his business language. SIince we cannot do that using standard customization capability
we have found this workaround.
WHAT WE WOULD LIKE TO DO?
We would like to rename the button “Log A call” into related information:
Before:
Figure 59: Out of the box "Log a Call" label
Time to result
•30 Mins
Complexity (1 to 5)
•Level 3
Gap with out of the box cap
•10%
Chapter:GENERALCONFIGURATION
65
After:
Figure 60: Label "Log a Call" after applying modification code
HOW CAN WE DO?
We will create a Web applet that we will embed into the contact layout with the following code:
Chapter:GENERALCONFIGURATION
66
Figure 61: Code to paste in a web applet to change the "Log a Call" label
Put this web applet on the concerned layout:
Figure 62: Web Applet embedded to modify "Log A Call" label
Code to paste:
<script type="text/javascript">
var td = document.getElementsByTagName("td");
for (var i = 0; i < td.length; i++) {
Chapter:GENERALCONFIGURATION
67
if (td[i].innerHTML == "&nbsp;Log A Call&nbsp;"){
//alert (td[i].innerHTML);
td[i].innerHTML = "&nbsp;Send Email&nbsp;";
}
if (td[i].innerHTML == "RenommerBtnConsignerAppel"){
td[i].innerHTML = "";
}
}
var a = document.getElementsByTagName("a");
// Code is for the <environment>. This part is to hide the related information title
if (document.getElementById("AIIA-RQVJL_Title")) {
document.getElementById("AIIA-RQVJL_Title").innerHTML = "";
document.getElementById("AIIA-RQVJL_Title").innerText = "";
}
</script>
To understand the code:
 Yellow: the old value
 red: le new value
 Blue: name of the related info if you want to remove it
 Green: ID of the related information you want to remove
Note: if you want to let this code flexible, working on different environments such as production and
staging, just add, before <script>:
// Code is for the <environment>. This part is to hide the related information title
if (document.getElementById("AIIA-RQVJL_Title")) {
document.getElementById("AIIA-RQVJL_Title").innerHTML = "";
document.getElementById("AIIA-RQVJL_Title").innerText = "";
}
To understand the code:
 Green: ID of the related information you want to remove
How can I create an “information bubble” on 1 or many fields?
Chapter:GENERALCONFIGURATION
68
INTRODUCTION
A “mouse over” functionality is today a very used web behavior. In many CRM on the market you can see
this type of functionality available. We couldn’t let Oracle CRM on Demand users without this workround
which cover this requirement and make easier the application adoption!
BUSINESS CASES, WHEN THE INFORMATION BUBBLE IS USEFUL
I think that all of my prospects and customers asked us at least once this functionality. Information
bubbles will help users to understand a field meaning and/or purpose and so, to adopt the application
faster.
WHAT DO WE WANT TO DO?
We would like to create a mouse over functionality based on the field display name:
Figure 63: Information Bubble with text
Or on an image:
Time to result
•30 Mins
Complexity (1 to 5)
•Level 3
Gap with out of the box cap
•10%
Chapter:GENERALCONFIGURATION
69
Figure 64: Information Bubble on image
HOW CAN WE DO?
STEP1: CREATE A WEB APPLET
In our example, the bubble will appear only on the detail page (not edit mode), let’s use the leads
Figure 65: Web applet hosted the code
STEP2: PASTE THE CODE FOR THE BUBBLE WITH “?”
Paste the following code.
<div id="dek" style="POSITION:absolute;VISIBILITY:hidden;Z-INDEX:200;"></div>
<script>
Chapter:GENERALCONFIGURATION
70
Xoffset=00; // modify these values to ...
Yoffset= 20; // change the popup position.
var old,skn,iex=(document.all),yyy=-1000;
var ns4 = document.layers;
var ns6 = document.getElementById ;
var ie4 = document.all;
skn = document.getElementById("dek").style;
skn.visibility="visible";
skn.display="none";
document.onmousemove=get_mouse;
function popup(msg,bak){
if (!bak) bak = "#EBEAF3";
var content = "<div style='font-size:10px;color:none;border-style:solid;border-width:1px;
BORDER-COLOR:#8F99EF; PADDING:3px; SPACING:0; "+
"Background-COLOR:"+bak+";' align=left>"+msg+"</div>";
yyy = Yoffset;
if (skn) {
skn.visibility="visible";
skn.display="block";
}
if(ns4){
skn.document.write(content);
skn.document.close();
skn.visibility="visible";
}
if(ns6){
document.getElementById("dek").innerHTML=content;
skn.display='';
}
if(ie4){
document.all("dek").innerHTML=content;
skn.display='';
}
}
function get_mouse(e)
{
var x;
try{
x = e.pageX;
y = e.pageY;
} catch(e){
x = event.x+document.body.scrollLeft;
y = event.y+document.body.scrollTop;
}
Chapter:GENERALCONFIGURATION
71
skn.left=x+Xoffset;
skn.top=y+yyy;
}
function kill()
{
yyy=-1000;
if(ns4) { skn.visibility = "hidden"; }
else if (ns6||ie4)
skn.display="none"
}
function set_Info_Bulle()
{
var tds = document.getElementsByTagName("td");
var CONVERT_LABEL = "Campaign";
var CONVERT_DESC = "Campaign Description...<br>This is a test to show Info Bull"; //
for (var i = 0; i < tds.length ; i++) {
if ( tds[i].innerHTML == CONVERT_LABEL ) {
//alert("in");
tds[i].innerHTML += "<font style='color:red' ><b> ?</b></font>";
tds[i].onmouseover = function(){
// do stuff. I could call this 1st or 2nd if I want
popup( CONVERT_DESC );
}
tds[i].onmouseout= function(){
// do stuff. I could call this 1st or 2nd if I want
kill();
}
}
}
}
setTimeout ( "set_Info_Bulle()", 1000 ); // To be sure the Action Bar is loaded
</script>
To understand:
Yellow: color code
Green: field display name to change
Red: Message you would like to show
STEP2 (BIS): PASTE CODE FOR BUBBLE WITH AN IMAGE
Chapter:GENERALCONFIGURATION
72
Paste the following code an in yellow modify the image URL
<div id="dek" style="POSITION:absolute;VISIBILITY:hidden;Z-INDEX:200;"></div>
<script>
Xoffset=00; // modify these values to ...
Yoffset= 20; // change the popup position.
var old,skn,iex=(document.all),yyy=-1000;
var ns4 = document.layers;
var ns6 = document.getElementById ;
var ie4 = document.all;
skn = document.getElementById("dek").style;
skn.visibility="visible";
skn.display="none";
document.onmousemove=get_mouse;
function popup(msg,bak){
if (!bak) bak = "#EBEAF3";
var content = "<div style='font-size:10px;color:none;border-style:solid;border-width:1px;
BORDER-COLOR:#8F99EF; PADDING:3px; SPACING:0; "+
"Background-COLOR:"+bak+";' align=left>"+msg+"</div>";
yyy = Yoffset;
if (skn) {
skn.visibility="visible";
skn.display="block";
}
if(ns4){
skn.document.write(content);
skn.document.close();
skn.visibility="visible";
}
if(ns6){
document.getElementById("dek").innerHTML=content;
skn.display='';
}
if(ie4){
document.all("dek").innerHTML=content;
skn.display='';
}
}
function get_mouse(e)
{
var x;
try{
x = e.pageX;
Chapter:GENERALCONFIGURATION
73
y = e.pageY;
} catch(e){
x = event.x+document.body.scrollLeft;
y = event.y+document.body.scrollTop;
}
skn.left=x+Xoffset;
skn.top=y+yyy;
}
function kill()
{
yyy=-1000;
if(ns4) { skn.visibility = "hidden"; }
else if (ns6||ie4)
skn.display="none"
}
function set_Info_Bulle()
{
var tds = document.getElementsByTagName("td");
var CONVERT_LABEL = "Campaign";
var CONVERT_DESC = "Campaign Description...<br>This is a test to show Info Bull"; //
for (var i = 0; i < tds.length ; i++) {
if ( tds[i].innerHTML == CONVERT_LABEL ) {
//alert("in");
tds[i].innerHTML += "<font style='color:red' ><b><img src="
OnDemand/1.12.0.1220.0.03/base/icons/assoc_images/zoom.png"/></b></font>";
tds[i].onmouseover = function(){
// do stuff. I could call this 1st or 2nd if I want
popup( CONVERT_DESC );
}
tds[i].onmouseout= function(){
// do stuff. I could call this 1st or 2nd if I want
kill();
}
}
}
}
setTimeout ( "set_Info_Bulle()", 1000 ); // To be sure the Action Bar is loaded
</script>
To understand:
Yellow: color code
Chapter:GENERALCONFIGURATION
74
Green: field display name to change
Red: Message you would like to show
Blue: Picture path. The picture is hosted into your Oracle CRM On demand environment.
Note: This code has to be applied on related information for an specific object. This development doesn’t
take into account multilingual configuration.
Developers that apply this code need to be aware of the image URL (if they want to use an image)…
How can I create a document including CRM merged fields and
print it?
INTRODUCTION
With Oracle CRM On Demand many additional components (add-ons) like Excel Anaylsis or mail Merge are
provided without any additional costs. In Oracle CRM On Demand’s world, the add-ons are intended to
cover features’ gaps that users can meet when using the application, sometimes the add-ons do not
provide a satisfactory answer to users expectations and Oracle administrators have then to make a choice
between a custom development by using WebServices and a standard workaround.
This book also aims to help you to optimize your budget, let’s stay on the standard then and use Oracle
CRM On Demand capabilities to improve our percentage of requirements coverage. This “How To” is
dedicated to all the companies using Oracle CRM On Demand and wanting to print in their daily activity
documents including merged information coming from the application.
BUSINESS CASES, WHEN THIS HOW TO IS USEFUL
Imagine that your company is using Oracle CRM On Demand to execute and monitor their Call Center
business processes. Imagine now that your activity includes quotidian document’s printing with variables
coming from the CRM, you will probably need to merge static text with variables stocked in the CRM … we
are almost sure that you will want to print the final results... want to know how? Keep reading then.
WHAT DO WE WANT TO DO?
Generate, merge and print many documents at once including Oracle CRM On Demand contextual
information
Time to result
•20 Mins
Complexity (1 to 5)
•Level 4
Gap with out of the box cap
•90%
Chapter:GENERALCONFIGURATION
75
Figure 66: Oracle CRM On Demand to mass merge
HOW CAN WE DO?
CREATE A NARRATIVE REPORT
Go to the reports creation module and:
Figure 67: Narrative view
Note: take care not to specify any number in the field “lines to display” in your narrative view
We will use add a page break at the end of the code:
<body>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table height="241">
<tr>
<td width="25"></td>
<td width="408"><div align="left"></div></td>
<td width="420"><div align="left"><b><font size="2"> @1 @2 @3 </b></div></td>
</tr>
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK
TTOCOD_BOOK

More Related Content

Viewers also liked

Applicatierationalisatie door Masterdatamanagement
Applicatierationalisatie door MasterdatamanagementApplicatierationalisatie door Masterdatamanagement
Applicatierationalisatie door MasterdatamanagementMarc Govers
 
cv2015 jrb word 2003
cv2015 jrb word 2003cv2015 jrb word 2003
cv2015 jrb word 2003James Barton
 
テキスト分析を用いたΩ型経営の検証
テキスト分析を用いたΩ型経営の検証テキスト分析を用いたΩ型経営の検証
テキスト分析を用いたΩ型経営の検証oonishisatomi
 
haresh_cv_08.08.13 (1)
haresh_cv_08.08.13 (1)haresh_cv_08.08.13 (1)
haresh_cv_08.08.13 (1)Haresh Nathani
 
Mcgraw hill electrical and electronic
Mcgraw hill electrical and electronicMcgraw hill electrical and electronic
Mcgraw hill electrical and electronicAmit Khowala
 
Proyecto 1-Aprendiendo sobre las TICs
Proyecto 1-Aprendiendo sobre las TICsProyecto 1-Aprendiendo sobre las TICs
Proyecto 1-Aprendiendo sobre las TICsChebis7
 
BI seminar 2013 Revival van Datamanagement v03
BI seminar 2013 Revival van Datamanagement v03BI seminar 2013 Revival van Datamanagement v03
BI seminar 2013 Revival van Datamanagement v03Marc Govers
 
4.39 te-electronics-engg
4.39 te-electronics-engg4.39 te-electronics-engg
4.39 te-electronics-enggAmit Khowala
 

Viewers also liked (12)

Applicatierationalisatie door Masterdatamanagement
Applicatierationalisatie door MasterdatamanagementApplicatierationalisatie door Masterdatamanagement
Applicatierationalisatie door Masterdatamanagement
 
cv2015 jrb word 2003
cv2015 jrb word 2003cv2015 jrb word 2003
cv2015 jrb word 2003
 
テキスト分析を用いたΩ型経営の検証
テキスト分析を用いたΩ型経営の検証テキスト分析を用いたΩ型経営の検証
テキスト分析を用いたΩ型経営の検証
 
haresh_cv_08.08.13 (1)
haresh_cv_08.08.13 (1)haresh_cv_08.08.13 (1)
haresh_cv_08.08.13 (1)
 
Manuael Reno_PYM
Manuael Reno_PYMManuael Reno_PYM
Manuael Reno_PYM
 
IBM PureData System
IBM  PureData SystemIBM  PureData System
IBM PureData System
 
Mahmoud_Emera_CV
Mahmoud_Emera_CVMahmoud_Emera_CV
Mahmoud_Emera_CV
 
Mcgraw hill electrical and electronic
Mcgraw hill electrical and electronicMcgraw hill electrical and electronic
Mcgraw hill electrical and electronic
 
Proyecto 1-Aprendiendo sobre las TICs
Proyecto 1-Aprendiendo sobre las TICsProyecto 1-Aprendiendo sobre las TICs
Proyecto 1-Aprendiendo sobre las TICs
 
BI seminar 2013 Revival van Datamanagement v03
BI seminar 2013 Revival van Datamanagement v03BI seminar 2013 Revival van Datamanagement v03
BI seminar 2013 Revival van Datamanagement v03
 
4.39 te-electronics-engg
4.39 te-electronics-engg4.39 te-electronics-engg
4.39 te-electronics-engg
 
CV Alessandro Milioto
CV Alessandro MiliotoCV Alessandro Milioto
CV Alessandro Milioto
 

Similar to TTOCOD_BOOK

Intro to Salesforce for Nonprofits
Intro to Salesforce for NonprofitsIntro to Salesforce for Nonprofits
Intro to Salesforce for NonprofitsMarc Baizman
 
ActionFlow Corporate Backgrounder
ActionFlow Corporate BackgrounderActionFlow Corporate Backgrounder
ActionFlow Corporate BackgrounderActionFlow
 
The Salesforce Advantage
The Salesforce AdvantageThe Salesforce Advantage
The Salesforce AdvantageTarik Schmidt
 
5 Foolproof Business Communication Tools Every Company Needs
5 Foolproof Business Communication Tools Every Company Needs5 Foolproof Business Communication Tools Every Company Needs
5 Foolproof Business Communication Tools Every Company NeedsAxero Solutions
 
Top 6 technologies SME manufacturers can't afford to ignore
Top 6 technologies SME manufacturers can't afford to ignoreTop 6 technologies SME manufacturers can't afford to ignore
Top 6 technologies SME manufacturers can't afford to ignoreIndex InfoTech
 
White Paper Mentor Series: Burned Out - Authored by Khalil Rehmen
White Paper Mentor Series:  Burned Out  - Authored by Khalil RehmenWhite Paper Mentor Series:  Burned Out  - Authored by Khalil Rehmen
White Paper Mentor Series: Burned Out - Authored by Khalil Rehmenbraggy
 
Salesforce.com for NonProfits, an Introduction
Salesforce.com for NonProfits, an IntroductionSalesforce.com for NonProfits, an Introduction
Salesforce.com for NonProfits, an IntroductionCharlie Havens
 
OfficeCentral SME Profile -GST Accounting India
OfficeCentral SME Profile -GST Accounting IndiaOfficeCentral SME Profile -GST Accounting India
OfficeCentral SME Profile -GST Accounting Indiaventuresmarketing
 
Transparency for Startups—A Practical Guide
Transparency for Startups—A Practical GuideTransparency for Startups—A Practical Guide
Transparency for Startups—A Practical GuideMohamed Mahdy
 
Integrating Marketing and BD into Everyones Job
Integrating Marketing and BD into Everyones JobIntegrating Marketing and BD into Everyones Job
Integrating Marketing and BD into Everyones JobDavid Blumentals
 
Interview with Jos Lieben
Interview with Jos LiebenInterview with Jos Lieben
Interview with Jos Liebenfreerkterpstra
 
Agile Ways of Working & Thinking - Introduction to Organisational Agility
Agile Ways of Working & Thinking - Introduction to Organisational AgilityAgile Ways of Working & Thinking - Introduction to Organisational Agility
Agile Ways of Working & Thinking - Introduction to Organisational AgilityIsman Tanuri
 
Enterprise 2.0: The new face of CRM
Enterprise 2.0: The new face of CRMEnterprise 2.0: The new face of CRM
Enterprise 2.0: The new face of CRMDipock Das
 

Similar to TTOCOD_BOOK (20)

Intro to Salesforce for Nonprofits
Intro to Salesforce for NonprofitsIntro to Salesforce for Nonprofits
Intro to Salesforce for Nonprofits
 
ActionFlow Corporate Backgrounder
ActionFlow Corporate BackgrounderActionFlow Corporate Backgrounder
ActionFlow Corporate Backgrounder
 
The Salesforce Advantage
The Salesforce AdvantageThe Salesforce Advantage
The Salesforce Advantage
 
5 Foolproof Business Communication Tools Every Company Needs
5 Foolproof Business Communication Tools Every Company Needs5 Foolproof Business Communication Tools Every Company Needs
5 Foolproof Business Communication Tools Every Company Needs
 
Top 6 technologies SME manufacturers can't afford to ignore
Top 6 technologies SME manufacturers can't afford to ignoreTop 6 technologies SME manufacturers can't afford to ignore
Top 6 technologies SME manufacturers can't afford to ignore
 
White Paper Mentor Series: Burned Out - Authored by Khalil Rehmen
White Paper Mentor Series:  Burned Out  - Authored by Khalil RehmenWhite Paper Mentor Series:  Burned Out  - Authored by Khalil Rehmen
White Paper Mentor Series: Burned Out - Authored by Khalil Rehmen
 
Salesforce.com for NonProfits, an Introduction
Salesforce.com for NonProfits, an IntroductionSalesforce.com for NonProfits, an Introduction
Salesforce.com for NonProfits, an Introduction
 
Agile or how to break donw barriers
Agile or how to break donw barriersAgile or how to break donw barriers
Agile or how to break donw barriers
 
OfficeCentral SME Profile -GST Accounting India
OfficeCentral SME Profile -GST Accounting IndiaOfficeCentral SME Profile -GST Accounting India
OfficeCentral SME Profile -GST Accounting India
 
Boursiquot "Privacy and The Effective Search Experience"
Boursiquot "Privacy and The Effective Search Experience"Boursiquot "Privacy and The Effective Search Experience"
Boursiquot "Privacy and The Effective Search Experience"
 
MVP
MVPMVP
MVP
 
Transparency for Startups—A Practical Guide
Transparency for Startups—A Practical GuideTransparency for Startups—A Practical Guide
Transparency for Startups—A Practical Guide
 
The CMLC 1.0.pdf
The CMLC 1.0.pdfThe CMLC 1.0.pdf
The CMLC 1.0.pdf
 
2014 Technical Communication Conference Program
2014 Technical Communication Conference Program2014 Technical Communication Conference Program
2014 Technical Communication Conference Program
 
UX_UI portfolio
UX_UI portfolioUX_UI portfolio
UX_UI portfolio
 
Integrating Marketing and BD into Everyones Job
Integrating Marketing and BD into Everyones JobIntegrating Marketing and BD into Everyones Job
Integrating Marketing and BD into Everyones Job
 
Interview with Jos Lieben
Interview with Jos LiebenInterview with Jos Lieben
Interview with Jos Lieben
 
SFDC SA Drain
SFDC SA DrainSFDC SA Drain
SFDC SA Drain
 
Agile Ways of Working & Thinking - Introduction to Organisational Agility
Agile Ways of Working & Thinking - Introduction to Organisational AgilityAgile Ways of Working & Thinking - Introduction to Organisational Agility
Agile Ways of Working & Thinking - Introduction to Organisational Agility
 
Enterprise 2.0: The new face of CRM
Enterprise 2.0: The new face of CRMEnterprise 2.0: The new face of CRM
Enterprise 2.0: The new face of CRM
 

TTOCOD_BOOK

  • 1. Tips & Tricks for Oracle CRM On Demand Volume 1 including exclusive tips First book providing for free tips and tricks to improve your Oracle CRM On Demand application Mathieu Emanuelli Joann Alejandro Bravo
  • 2.
  • 3. Times have changed. Companies are not anymore worried about its products, the production processes or even the quality, today, what really determines a company’s strategy is nothing more than people, customers or prospects are modeling their market context following their needs and privileging what really makes life easier. It seems that it is worthy then listening to people, what are their expectations, what motivates them to come and ask try and buy new products… All these changes are not just coincidences, the world has really changed, human interactions are evolving faster than never before and the Internet as well as all the communication technologies being conceives every hour all around the world have finally put people and nothing else, in the top of the priorities… and you know what? We, humans, just love it, this is actually all that we have ever wanted, to be listened and followed by our equals. If you consider this new landscape, we are sure that we will not have to make big efforts in order to convince you that you as an individual but particularly, as a company, you need to listen people around in order to adapt and improve your offer for all your prospects and clients. The CRM (Customer Relationship Management) is just a grandiose combination between new technologies and a new world giving more and more importance to each individual opinion and broadcasting those opinions everywhere in just one second. This book is intended to be a tool for all those companies using Oracle CRM On Demand and looking for better means to make the customer dreams become reality. If you have ever wanted to optimize your CRM configuration or integrate your CRM to the open internet world, this book is for you. In the book, you’ll find three indicators for each “How To”:  Time to result : how much time the user need to apply successfully  Complexity: scale from 1 to 5  Gap with out of the box cap: What is the gap with Oracle CRM On Demand out of the box capabilities: 0% is a standard functionality, 100% is a complete custom development WHY THIS PROJECT? This project was born from our customer requirements. Yes, as many of you, listening to our customers gave us the key to this project. We start at the beginning, gathering up every single requirement demanding a high level of complexity in our project’s implementation. In the earliest phases we intended those files to be exploited as a part of our internal knowledge data base. A couple of implementations later and some years of experience shown us that some “expected” features requests came over and over again in our projects and most of the time, those request came from the Oracle CRM On Demand administrators looking for the way to make easier the use of the application or wanting to integrate the application to other tools available in the internet. When the trend was confirmed, we decided to share our experiences with all the Oracle CRM On Demand community by writing this book that contains the functional and the technical points of view for every application improvement, we hope that you will find this information useful and that you will enjoy as much as we did, its implementation.
  • 4. WHO ARE WE? Author: Mr. Mathieu Emanuelli Mr. Mathieu Emanuelli is currently CRM Practice Manager for a Swiss Consulting and Systems Integration (CSI) company. He has been working with Oracle CRM On Demand from the earliest phase of the product (has implemented release 12), in the first instance as user and administrator for his former company and lately as CRM consultant and product expert, managing implementation teams in international projects all around the world. You can find more details about Mathieu’s work checking his profile in LinkedIn (type Mathieu Emanuelli) Co-Autor: Mr. Joann Alejandro Bravo Currently Mr. Joann Alejandro Bravo is a senior CRM consultant, specialized on SaaS (Software as a service) applications and Social CRM. In the past he has ensured the implementation as team member and team leader for multiple projects using Oracle CRM On Demand You can find more details about Joann Alejandro’s work checking his profile in LinkedIn (type Joann Alejandro Bravo)
  • 5. THANKS TO… Many thanks to our customers for all the new challenges during implementations, seeing Oracle CRM On Demand evolves in several business environments allow us to identify which information is worthy for most of the people using the application. Of course, thanks to our company, Business & Decision, for being the central quarter for the “Oracle CRM On Demand team”. That was always a great opportunity to be involved in many challenging projects in different industries. Thanks to our colleagues and/or external people we had the chance to meet and/or to work with: Jonathan Fouque, Elios Gibanel, Sandrine Wens, Amine Hammi, Steffen Soldner, Josselain Prost, Laurent Petitguyot for their support, their imagination and their creativity. Thanks to Oracles’ staff for being there and interact with us when particular questions concerning the application came up. And last but not least, of course our beloved families, my wife and my children to have seen sawing daddy working hard after an official day work! Thanks as well to the fabulous Fab for being understanding during the work at home and all the support and encouragement.
  • 6. TABLE OF CONTENT GENERAL CONFIGURATION .................................................................................................................... 1 How to define parent and child relationship for any object? ...................................................................... 2 How to join activity & service request with context transfert? ................................................................... 8 How can I create a link to a document in the action bar or homepage?................................................... 12 How to copy or set up a new record? ........................................................................................................ 14 How to concatenate with a workflow? ...................................................................................................... 17 How to calculate duration on a field using a default value or a workflow?............................................... 18 How to transform lower in upper case?..................................................................................................... 19 How can i create a simple custom look-up?............................................................................................... 21 How can i create a custom button that runs a custom look up from Edit and Detail page?..................... 26 How can I create a custom look up that fill in many fields in Oracle CRM On Demand? .......................... 28 How to prevent the sales stage modification after the opportunity closed?............................................ 39 How to monitor some variables evolution?............................................................................................... 41 How can to create a custom button?......................................................................................................... 43 How to avoid weekend selection for date type fields?.............................................................................. 47 How to make caps mandatory for field content? ...................................................................................... 56 How can I create an I-Frame in homepage?............................................................................................... 58 How can i create an i-frame with action bar content?............................................................................... 62 How can I rename the button “Log A Call” in activity related information? ............................................. 64 How can I create an “information bubble” on 1 or many fields? .............................................................. 67 How can I create a document including CRM merged fields and print it?................................................. 74 How to see the primary account for a campaign recipient?...................................................................... 81
  • 7. SOCIAL NETWORKS AND CRM SOCIAL CRM ................................................................................... 83 How can i analyze my products in social network?.................................................................................... 84 How can i measure my contact profile influence in the social networks?................................................. 86 How can i monitor social network content from OCOD?........................................................................... 91 How to add Twitter feeds overview? ......................................................................................................... 97 How can i tweet automatically from OCOD? ........................................................................................... 100 How can i create a button with LinkedIn link in Oracle CRM On Demand?............................................. 104 How to embed Yammer console into Oracle CRM On Demand?............................................................. 106 How to make a mashup with Xing?.......................................................................................................... 112 How can I create a shoutbox for my user’s community?......................................................................... 113
  • 8. WEB INTEGRATION ................................................................................................................................ 119 How can I create a link between Oracle CRM On Demand and Skype?................................................... 120 How can I use Skype applet for support?................................................................................................. 122 How can I create satisfaction survey, send it to customer and measure feedback?............................... 125 How can i create a link between Oracle CRM On Demand and Gmail?................................................... 134 How can i send email with Gmail or Microsoft Outlook? ........................................................................ 136 How can i embed Google capabilities? .................................................................................................... 143 How can i embed Google talk into Oracle CRM On Demand?................................................................. 146 How to create Web Applet with Google Maps?....................................................................................... 148 How can I send SMS from the application (using email)?........................................................................ 150 How can I send voice SMS from the application (using email)? .............................................................. 156 How can I send SMS from the application (using http request)?............................................................. 161 EXCLUSIVE ! ............................................................................................................................................. 164
  • 9.
  • 10. Chapter:GENERALCONFIGURATION 1 GENERAL CONFIGURATION People want their life to be easier, and let’s face it, we all want the same. When it comes to the adoption of a new application people are often asking: what is the added value that I am getting from it? As every IT Consultant knows using “out of the box” applications is not always easy and, for sure, never totally adapted to the business needs. This is not because applications are not well developed but due to the fact that each company has its own way to complete processes and so its own customization needs. Consider all the information before and you can be sure about one thing, users want the applications to be as customized as possible in order to make little effort when using it, after all the only way for users to adapt a new tool is by getting more from it than they should give. This chapter is dedicated to some of the more recurrent tricks used during the implementation for our clients, some of them concern first level data quality, some others take care about the form and the presentation and some others just integrate new features being added, in all cases as you will see, our efforts strives to ensure the adoption of the tool at every level of the company since, as you probably know, users are the success of technological evolution.
  • 11. Chapter:GENERALCONFIGURATION 2 How to define parent and child relationship for any object? INTRODUCTION Native relationships between different records of the same type are not available in OCOD, in fact only accounts (and from V19, opportunities as long as we know) propose the possibility to link “internally” their records. In companies’ everyday operations yet, users are looking for a way that easily allows defining connections and hierarchical relationships BUSINESS CASES, WHEN “ARTIFICIAL” HIERARCHICAL RELATIONSHIP IS USEFUL Marketing programs, commercial action plans Think about a company trying to define a marketing program containing multiple campaigns aiming different markets (for example one market by country) Figure 1: Parent campaign and child campaigns associated … And what about a company wanting to execute an action plan composed of a sequence actions… what to do? WHAT DO WE WANT TO DO? We would like to create a record related section providing a way to easily create a child record (related to the current record). Our example is based on activity objects but, of course, you can adapt this example. Something like this: Time to result •40 Mins Complexity (1 to 5) •Level 3 Gap with out of the box cap •45%
  • 12. Chapter:GENERALCONFIGURATION 3 Figure 2: Create a related record from custom related information HOW CAN WE DO? We need to follow these steps in order to obtain our functionality:  Create a custom field called “Related Activity ID” which would store the parent Appointment Id  Create a web applet that embed the code for the related item  Create a Report which will show the related Tasks for this particular Contact Call  Embedded the report on the Call detail page CREATE A CUSTOM FIELD TO STOCK THE RELATED ACTIVITY ID We have created a new field for the object Activity, called “Related Activity ID” and we have added it to the page layouts: Figure 3: Create the Related custom field
  • 13. Chapter:GENERALCONFIGURATION 4 Figure 4: Related custom field in page layout Figure 5: Custom field displayed on the layout CREATE THE WEB APPLET Next step, create a new web applet “Related Tasks” for both Appointments and Tasks and add it to the page layouts:
  • 14. Chapter:GENERALCONFIGURATION 5 Figure 6: New web applet "Related Task" The code is the following: <script type="text/javascript" id="customJavaScript"> var Div_id = document.getElementById("customJavaScript").parentNode.id; var endIndex = Div_id.indexOf("Div"); if(endIndex>0) { var Title_id = Div_id.substring(0, endIndex) + "_Title"; var Title_obj = document.getElementById(Title_id); var newTD = document.createElement('td'); newTD.innerHTML = "<div onclick="doNavigate('TaskNew?OMTGT=TaskEditForm&OMTHD=ActivityNewNav&TaskEditForm.Indexed Short Text 0=%%%Id%%%&TaskEditForm.Type=To+Do&OMRET0=TaskDetail%3fOMTGT%3dTaskDetailForm%26OMT HD%3dActivityDetailNav%26OCTYPE%3d%%%Type%%%%26TaskDetailForm.Id%3d%%%Id%%%&OCTYPE= To+Do',false, this, null);" onmouseover="toggleNavButton(this);" onmouseout="toggleNavButton(this);" onkeypress="onButtonPress(this);" class="buttonChildTitleBarTD" id="OpenActivitiesTB31607487*1">&#160;New Related Task&#160;</div>"; Title_obj.parentNode.insertBefore(newTD, Title_obj.nextSibling ); } </script> To understand: Yellow code: custom field ID (in this example we used an Indexed text field) Fields with the format %%%field%%% are tags coming from the application This script should work for: Tasks:  Task Standard  Visit Report
  • 15. Chapter:GENERALCONFIGURATION 6 Appointments:  Appointment Standard  Visit Once you add the web applet to the layout it appears like this: Figure 7: Button created in the custom related information Using this button you can create  Tasks related to an Appointment (when you are on ‘Appointment Standard’ or ‘Visit’ page layout)  Tasks related to a Task (when you are on ‘Task Standard’ or ‘Visit Report’ page layout) When you click on this button the New Task creation page would be opened with the ‘Related Activity ID’ field filled in automatically: CREATE EMBEDDED REPORT Upon Save or Cancel, you will return to the Appointment or Task page layout and the “Related Tasks” web applet is automatically refreshed in a few seconds to reflect the change: Figure 8: Report embedded showing the related record But how is this contextual section alimented and updated? Start going to the reporting tool and building a report which looks like this:
  • 16. Chapter:GENERALCONFIGURATION 7 Figure 9: column selected to create the report embedded Notice that we have chosen the indexed short text field to store the related Activity ID so we need to ask for this information by adding the filter “is prompted” on this field Now, you can integrate the contextual report in the application using the following code <iframe src='/OnDemand/user/analytics/saw.dll?Go&Path=%2fshared%2fCompany_HE3678- 1JAZ2_Shared_Folder%2fRelated+to&Options=rfd&&Action=Navigate&p0=1&p1=eq&p2=Activity.INDEXE D_SHORTEXT_0&p3=%%%Id%%%'frameborder="no" width="100%" height=200></iframe> To understand: Yellow: column technical name for the custom field Now you just need to add the web applet code to the script described previously, as follows: Figure 10: Web applet with the whole code Then, whole code is: <script type="text/javascript" id="customJavaScript"> var Div_id = document.getElementById("customJavaScript").parentNode.id; var endIndex = Div_id.indexOf("Div"); if(endIndex>0) { var Title_id = Div_id.substring(0, endIndex) + "_Title"; var Title_obj = document.getElementById(Title_id); var newTD = document.createElement('td');
  • 17. Chapter:GENERALCONFIGURATION 8 newTD.innerHTML = "<div onclick="doNavigate('TaskNew?OMTGT=TaskEditForm&OMTHD=ActivityNewNav&TaskEditForm.Indexed Short Text 0=%%%Id%%%&TaskEditForm.Type=To+Do&OMRET0=TaskDetail%3fOMTGT%3dTaskDetailForm%26OMT HD%3dActivityDetailNav%26OCTYPE%3d%%%Type%%%%26TaskDetailForm.Id%3d%%%Id%%%&OCTYPE= To+Do',false, this, null);" onmouseover="toggleNavButton(this);" onmouseout="toggleNavButton(this);" onkeypress="onButtonPress(this);" class="buttonChildTitleBarTD" id="OpenActivitiesTB31607487*1">&#160;New Related Task&#160;</div>"; Title_obj.parentNode.insertBefore(newTD, Title_obj.nextSibling ); } </script> <iframe src='/OnDemand/user/analytics/saw.dll?Go&Path=%2fshared%2fCompany_HE3678- 1JAZ2_Shared_Folder%2fRelated+to&Options=r&&Action=Navigate&p0=1&p1=eq&p2=Activity.INDEXED_ SHORTEXT_0&p3=%%%Id%%%' frameborder="no" width="100%" height=200></iframe> To understand: yellow: part of code to create the button associating the activities Blue: part of the code to enclosed the contextual report How to join activity & service request with context transfert? INTRODUCTION Using standard OCOD functionalities, it is impossible to create a Service Request from the detail page of an activity since service request is not a related section for the object activity. It gets even harder when in addition you need to copy some information (one or more values in different fields) coming from that activity in the new service request detail… what can you do? BUSINESS CASE Service Requests from tasks Imagine you or your client wants to create a service request from a task with the capability to keep the contact filled in into the task layout… that is what he ask us, we quickly understood that there were no relation join task and service request since service request was not a task’s related information. WHAT DO WE WANT TO DO? Simple to say: insert a button on the related information section of the object task to create a new service request (“traitement”) and pass the contact information from the task to the service request. Time to result •40 Mins Complexity (1 to 5) •Level 3 Gap with out of the box cap •30%
  • 18. Chapter:GENERALCONFIGURATION 9 Figure 11: Expected result, a new related information including a button HOW CAN WE DO? Follow the following steps to achieve the expected result: FIND A SIMILAR PAGE AND COPY URL The first thing to do is to find a similar page to the one we want to generate when clicking the button that we will insert. We have decide to start from the contact page as, in the related information sections you can add a new service request (treatment) by clicking the button ‘new’ Figure 12: Button “New” for a service request The following screenshot illustrates the page launched after the click:
  • 19. Chapter:GENERALCONFIGURATION 10 Figure 13: Layout launched after the click Now we need to copy the URL of this page. Be careful!!! do it from the edition page (instead of the consultation page) you should get something like: https://secure-ausomxXXX.crmondemand.com/OnDemand/user/ServiceRequestNew?OMCR0=AIIA- O2B12&OMTGT=ServiceRequestEditForm&OMTHD=ServiceRequestNewNav&OMCBO=Contact&OMRET0= ContactDetail%3focTitle%3d%2b%26OMTGT%3dContactDetailForm%26OMTHD%3dContactDetailNav%26 ocEdit%3dY%26OCTYPE%3dClient%26ocTitleField%3dFull%2bName%26ContactDetailForm.Id%3dAIIA- O2B12&OCNOEDITTYPE=Y&OCTYPE= Modify the URL to meet the following format: https://secure- ausomxXXX.crmondemand.com/OnDemand/user/ServiceRequestNew?OMCR0=%%%Contact_Id%%%&O MTGT=ServiceRequestEditForm&OMTHD=ServiceRequestNewNav&OMCBO=Contact&OMRET0=ContactD etail%3focTitle%3d%2b%26OMTGT%3dContactDetailForm%26OMTHD%3dContactDetailNav%26ocEdit%3 dY%26OCTYPE%3dClient%26ocTitleField%3dFull%2bName%26ContactDetailForm.Id%3d%%%Contact_Id% %%&OCNOEDITTYPE=Y&OCTYPE= To understand:  Blue: your POD  Yellow: The ID of the contact  Green : the variable for the Contact ID that will replace the ID contact (yellow) CREATION OF A WEB APPLET The web applet which contains the button is created. As the button should be propose as a related section on the object task, the web applet has to be configured from the task configuration:
  • 20. Chapter:GENERALCONFIGURATION 11 Figure 14: Web applet hosting the code to create custom related information with custom behavior button The script for the button is composed of the URL on edition mode plus the button code. Only two modifications to the script: 1. Copy the URL created previously as indicated (see URL highlighted in blue) and 2. Give a name to the button (name of the button highlighted in yellow – here “Nouvel Traitement”: <script type="text/javascript" id="customJavaScript"> var Div_id = document.getElementById("customJavaScript").parentNode.id; var endIndex = Div_id.indexOf("Div"); if(endIndex>0) { var Title_id = Div_id.substring(0, endIndex) + "_Title"; var Title_obj = document.getElementById(Title_id); var newTD = document.createElement('td'); newTD.innerHTML = "<div onclick="doNavigate('https://secure- ausomxXXX.crmondemand.com/OnDemand/user/ServiceRequestNew?OMCR0=%%%Contact_Id%%%&O MTGT=ServiceRequestEditForm&OMTHD=ServiceRequestNewNav&OMCBO=Contact&OMRET0=ContactD etail%3focTitle%3d%2b%26OMTGT%3dContactDetailForm%26OMTHD%3dContactDetailNav%26ocEdit%3 dY%26OCTYPE%3dClient%26ocTitleField%3dFull%2bName%26ContactDetailForm.Id%3d%%%Contact_Id% %%&OCNOEDITTYPE=Y&OCTYPE=',false, this, null);" onmouseover="toggleNavButton(this);" onmouseout="toggleNavButton(this);" onkeypress="onButtonPress(this);" class="buttonChildTitleBarTD" id="OpenActivitiesTB31607487*1">&#160;Nouveau traitement&#160;</div>"; Title_obj.parentNode.insertBefore(newTD, Title_obj.nextSibling ); } </script> To understand:  Blue: URL that we have created before  Yellow: display name of the custom button Add this web applet to the layout and that’s it, now, you can create service request whenever you want from the activities layout.
  • 21. Chapter:GENERALCONFIGURATION 12 How can I create a link to a document in the action bar or homepage? INTRODUCTION User’s adoption depends, frequently, on how ergonomic the application is; people do not want to change over and over again from a screen to another. Centralizing work tools is one of the greatest challenges on a project. BUSINESS CASES, ALL THE BUSINESS TOOLS IN THE SAME PLACE Knowledge data base or Dynamic catalogues Some companies use many tools to manage the Customer Relationship, although, they do not want to logout from the CRM to use it. When clients ask questions regarding products, the answers can be available in a knowledge data base and/or in a dynamic catalogue… should users leave the CRM application to have access? Not anymore! Imagine that you want to propose the access to different applications, documents or any other web tool from any screen in the application… what can you do? WHAT DO WE WANT TO DO? We would like to have one or many links show in the action bar Figure 15: Link created in the action bar Or Figure 16: Many links in the action bar Time to result •10 Mins Complexity (1 to 5) •Level 2 Gap with out of the box cap •90%
  • 22. Chapter:GENERALCONFIGURATION 13 HOW CAN WE DO? Follow the following steps: CREATE THE GLOBAL WEB APPLET To create a link in html, we use tags <a> and </a> and put the content between. Content can be image. The tag <a> can have 3 attributes:  href : indicates link address  target : defines the link’s target Figure 17: Global web applet created to embed a web applet in the action bar The code in this example is the following: <a href="http://www.helponmyproject.com" target="_blank">Help me !</a> We could imagine a more complex code, defining a table including several links: Figure 18: Global web applet created to embed a web applet (more complex) in the action bar
  • 23. Chapter:GENERALCONFIGURATION 14 The code in this case would see like: <div align="left"> <table width="131" border="0"> <tr> <td width="11">&nbsp;</td> <td width="179"><a href="www.helponmyproject.com" target="_blank">Help me ! </a></td> </tr> <tr> <td>&nbsp;</td> <td><a href="www.google.com" target="_blank">Google</a></td> </tr> <tr> <td>&nbsp;</td> <td><a href="www.linkedin.com" target="_blank">LinkedIn </a></td> </tr> <tr> <td>&nbsp;</td> <td><a href="www.facebook.com" target="_blank">Facebook</a></td> </tr> </table> </div> To understand:  Yellow: URL address  Blue: target  Red: Name of the link that will be displayed ADD THE CUSTOM GLOBAL WEB APPLET TO AN ACTION BAR LAYOUT You can define a new action bar layout or you can add quickly this global web applet by clicking on “My Set up” link. Note: you could modify URL addresses using tags coming from Oracle CRM On Demand How to copy or set up a new record? INTRODUCTION Taking advantage from a pre existent record is a common practice that very often users which to apply. After all, why should I create from scratch my record if there is another containing almost the exact values that I need? Time to result •40 Mins Complexity (1 to 5) •Level 3 Gap with out of the box cap •70%
  • 24. Chapter:GENERALCONFIGURATION 15 BUSINESS CASES Identical opportunities and several activities responding to the same problem This trick starts as a requirement from one of our clients who wished to be able to copy opportunities on his environment. Filling in the whole information in opportunities takes time because of the number of fields in this object so he wanted to take advantage from all this typing. Once we found a technical solution, we realized that this code could of course be useful when copying records, but more than that, with some little variations, the code could work when initializing new records from a particular one. Let’s see how? WHAT DO WE WANT TO DO? We would like to copy or initialize a record keeping many pre-populated fields from the original one Since the release 17 users can “copy” a record but this functionality does not exist on every object. In addition, copy a record is a standard function not allowing any customization… HOW CAN WE DO? Create a web link that will contain all the information concerning the new record. You can either copy field by field the content or decide to copy only some fields and assign fixed values to others: Figure 19: Web link created to copy a record To define the content of the opportunity that will be created, you need to go to the opportunity edition page and copy its url, then edit this url in order to initialize as you want each field (this expression was built using the weblink editor):
  • 25. Chapter:GENERALCONFIGURATION 16 Figure 20: Code to copy a record pasted in the web link definition The code used is the following: /OnDemand/user/OpptyCreateNewPageDefault?OMTGT=OpptyCreateEditForm&OMTHD=OpportunityNe wNav&OMRET0=OpportunityHomePage&OpptyCreateEditForm.Primary Revenue Close Date=%%%Primary Revenue Close Date%%%&OpptyCreateEditForm.Description=%%%Description%%%&OpptyCreateEditForm.Account=%% %Account%%%&OpptyCreateEditForm.Account Id=%%%Account_Id%%%&OpptyCreateEditForm.ZDate_26=%%%dAward_Date%%%&OpptyCreateEditFor m.ZPick_11=%%%plIntegration_Center_IC%%%&OpptyCreateEditForm.ZPick_10=%%%plSBL_Geographical _Zone%%%&OpptyCreateEditForm.ZPick_17=%%%plSegment%%%&OpptyCreateEditForm.ZPick_25=%%% plTHINT_Status%%%&OpptyCreateEditForm.ZPick_18=%%%plTHINT_Category%%%&OpptyCreateEditFor m.ZPick_4=%%%plSBL_1%%%&OpptyCreateEditForm.ZDate_29=%%%dRFP_Date%%%&OpptyCreateEditF orm.ZPick_13=%%%nP1_C%%%&OpptyCreateEditForm.ZPick_14=%%%plP2_%%%&OpptyCreateEditForm. ZPick_24=%%%plCountry_of_Origin%%%&OpptyCreateEditForm.ZPick_6=%%%plActivities%%%&OpptyCre ateEditForm.Currency Code=%%%Currency_Code%%%&OpptyCreateEditForm.ZNum_21=%%%pcExpected_Gross_Margin%%%& OpptyCreateEditForm.ZPick_21=%%%plSubActivities%%%&OpptyCreateEditForm.ZPick_15=%%%plScenari o%%%&OpptyCreateEditForm.ZPick_14=%%%nP1_C%%%&OpptyCreateEditForm.ZDate_30=%%%dPropos al_Due_Date%%%&OpptyCreateEditForm.ZPick_9=%%%plCompetitiveNegociation%%%&OpptyCreateEdit Form.OwnerAlias=%%%Owner_Alias%%%&OpptyCreateEditForm.ZPick_20=%%%plUnit%%%&OpptyCreat eEditForm.ZPick_22=%%%plSubSegment%%%&OpptyCreateEditForm.ZCur_1=%%%cGlobal_Amount%%% &OpptyCreateEditForm.ZPick_12=%%%plLegal_Entity%%%&OpptyCreateEditForm.ZCur_3=%%%cThales_A mount%%%&OpptyCreateEditForm.ZPick_8=%%%plBusiness_Unit_BU%%%&OpptyCreateEditForm.ZPick_ 19=%%%plTHINT_Type%%%&OpptyCreateEditForm.ZMSPick_1=%%%msplBid_Currency%%%&OpptyCreat eEditForm.ZPick_7=%%%plBid_Type%%%&OpptyCreateEditForm.ZPick_32=%%%plDepartment%%%&Opp tyCreateEditForm.ZPick_30=%%%plTHINT_Client_Type%%%&OpptyCreateEditForm.ZPick_31=%%%plCivil_ _Military%%%&OpptyCreateEditForm.ZText_32=%%%stOpportunity_Group%%%&OpptyCreateEditForm.Z Pick_35=%%%plInternalExternal%%%&OpptyCreateEditForm.ZCur_19=%%%cBid_Currency%%%&OpptyCr eateEditForm.ZNum_20=%%%pcP3_%%%&OpptyCreateEditForm.Indexed Pick
  • 26. Chapter:GENERALCONFIGURATION 17 1=%%%Indexed_Pick_1%%%&OpptyCreateEditForm.ZText_31=%%%stBid_Manager%%%&OpptyCreateEdi tForm.Sales Type=%%% Now you can modify the values after the equal sign (=) in order to initialize your record with fix values if needed. How to concatenate with a workflow? INTRODUCTION Concatenated fields are very often useful when a particular naming rule is defined for an object, configuring your system this way avoid the need for you asking users to keep in mind the rule so they can focus on the business needs. BUSINESS CASES Naming opportunities Imaging a company willing to name all its opportunities coming from leads following this rule: “Account name” + “Oppty ID” WHAT DO WE WANT TO DO? We want to populate the field opportunity name (or any other field) with the predefined content HOW CAN WE DO? The general syntax to use when concatenating fields and including blanks between is: [<Field_name>]+ ' ' + [<Field_name>]+ ' ' + [<Field_name>]+ ' ' + [<Field_name>] So you can now define a default value and a workflow to update the field, hereafter the concatenation for the field opportunity name Time to result •10 Mins Complexity (1 to 5) •Level 1 Gap with out of the box cap •100%
  • 27. Chapter:GENERALCONFIGURATION 18 Figure 21: Example of a concatenate formula at a field definition level Notice that, the workflow concatenation is only available for data in characters (exclude dates, timestamp or integer). If you want to concatenate with one of these type, use the function “ToChar”. How to calculate duration on a field using a default value or a workflow? INTRODUCTION Automatic calculation with dates used to be one of the better known limitations on OCOD. Values depending on time variables were just impossible to modify so very often system administrators had to use contextual reports like web applets to show the information. Fortunately, this is not a problem anymore. BUSINESS CASES Warranties expiring on … Imagine you need to fill in a date field when a particular action like a change on the opportunity sales stage is executed, or just think about the case of this example, a client trying to calculate the end date for a warranty… how can you do? WHAT DO WE WANT TO DO? My customer wanted the application to fill in automatically the ending date of warranty based on the purchasing date. HOW CAN WE DO? Time to result •15 Mins Complexity (1 to 5) •Level 2 Gap with out of the box cap •100%
  • 28. Chapter:GENERALCONFIGURATION 19 Using a post default value for the field we that we want to update (and adding a workflow if it changes on modification) with the following syntax: [<PurchaseDate>] + Duration('P2Y') Figure 22: Example of syntax pasted in the field to calculate the end date of warranty How to transform lower in upper case? INTRODUCTION Data quality is a recurrent question when working with data bases. Sometimes is very important to keep a unique format for specific fields in order to ensure data identification or integration. This how to will show you how to automate and be sure that your data will follow the format that you define. BUSINESS CASES, KEEPING YOUR DATA ON STANDARD FORMAT Often companies wish to use their customer’s data on marketing campaigns that are including information coming directly from the data base. Imagine for instance that you are generating a personalized e-mailing campaign, would you like to include names combining random upper and lowercase? WHAT DO WE WANT TO DO? We would like to ensure that a particular field will be filled in with uppercase only. We do not want any workflow to run when saving the record, instead of that, we need the function to be active while typing the field value Time to result •20 Mins Complexity (1 to 5) •Level 1 Gap with out of the box cap •20%
  • 29. Chapter:GENERALCONFIGURATION 20 Figure 23: Field in automatically in upper case HOW CAN WE DO? We will create a global web applet embedded into the action bar: Figure 24: Web Global applet to host the JavaScript The code in this applet is: <script> function uppercaseInput() { var INPUT_ID = 'LeadCreateEditForm.Company Name'; var elem = document.getElementById(INPUT_ID); if( elem != null ) { elem.style.textTransform = 'uppercase'; try {
  • 30. Chapter:GENERALCONFIGURATION 21 elem.addEventListener('keyup',function (e) { this.value=this.value.toUpperCase(); }, true); } catch(e){ elem.attachEvent('onkeyup', function (e) { this.value=this.value.toUpperCase(); }); } } } setTimeout ( "uppercaseInput()", 2000 ); </script> To understand: Yellow: Field ID where we would like functionality activated SOME APPLICATION EXAMPLES Using a field as a part of the primary key of a record in interfaces Imagine that you are interfacing 2 different systems, updating some particular information for the same set of records based on a key. Imagine as well that one (or several) field making part of the primary key is systematically filled in with caps for one of the systems … how can you ensure the primary key correspondence? We are guessing that after this reading you have a particular idea in mind… don’t you? How can i create a simple custom look-up? INTRODUCTION Oracle CRM On Demand allows users to define relationships between tables (known as “objects”). These relationships are defined in many ways including related information (for 1 to many relationship) or the lookup for 1 to 1 relationship. Some standard functions provide users with the capability to “join” two object non-related in a conventional way by using JoinfieldValue. Sometimes this function is not enough since it works only between a well defined group of objects. Do not worry if you want to go further, we have found an alternative solution for these particular requirements: just use reports’ capabilities and build a custom lookup… are you wondering how? Keep reading … BUSINESS CASES, WHEN SIMPLE CUSTOM LOOK UP IS USEFUL Many Oracle CRM On Demand users would like to fill in fields with a value coming from a non-linked object simulating thus, a standard lookup (that appears with the following icon: ) Time to result •15 Mins Complexity (1 to 5) •Level 2 Gap with out of the box cap •100%
  • 31. Chapter:GENERALCONFIGURATION 22 The most frequent example concerning this functionality is the creation of a hierarchical relationship inside a particular object. Let’s consider for instance a marketing program, launched in Europe and composed of many campaigns linked to the marketing program. In this case the simplest way to create this non-standard relationship is the custom look up. WHAT DO WE WANT TO DO? It is possible to simulate a look up behavior by creating a custom look up based on reports. This “how to” will show you how you can create a “simple” custom look up catching one field content coming from the report. (Notice that you will find the equivalent functionality for more than one field later on this book) So let’s create a report containing the required information. Please notice that this report will include a link sending the information to the right field: Figure 25: Simple custom look catching one field content HOW CAN WE DO? FIND OUT THE FIELD ID OF THE TARGET FIELD (FIELD TO FILL IN) We need to know the Oracle CRM application field id that we will fill in by clicking on the report. 1. On Firefox, select the field you would like to fill in 2. Right Click 3. Select view selection code
  • 32. Chapter:GENERALCONFIGURATION 23 Figure 26: View selection code 4. Find and keep in your notepad the field ID Note: To find out the field ID with IE you need to right click, select view source and search thanks to the field display name. CONFIGURE THE REPORT COLUMNS Our example is based on a report related to the product’s table. The value that we would like to fill in is the product name. To create a report with a custom look up behavior: 1. Create the report including the column that you would like to display 2. Add the column containing the value that you would like to send into the target field 3. Set up this column as follows: a. Select Column properties Figure 27: Click on Column Properties b. Select Data format tab and insert the following code: "http://"@[html]"<a target=_top href=""javascript:void(null)"" onclick="Callback('"@"');">Select</a>" To understand: Yellow: name of the link that will appear in the place of the value
  • 33. Chapter:GENERALCONFIGURATION 24 Figure 28: Insert the code in Data Format Tab 4. After the execution of the previous steps your report will contain two columns as shown: Figure 29: Report built overview CREATE THE REPORT NARRATIVE VIEW We have to create a narrative view using with the following code: <html> <script type="text/javascript"> function Callback(Line) { var Line = Line var theform = window.top.opener.document.getElementById("ServiceRequestEditForm"); for (n=0;n<theform.elements.length;n++) { if (theform.elements[n].name == "ServiceRequestEditForm.Product") { theform.elements[n].innerText=Line; theform.elements[n].value=Line; } } window.close(); } </script> </html>
  • 34. Chapter:GENERALCONFIGURATION 25 To understand: Yellow: page name Blue: Field id (catch in previous step) Note: usually the field ID is based on the following pattern: page_name.Field_name CREATE A WEB LINK We need now to create the custom function into a report to catch the expected value that will feed our CRM target field. To do this we just need to create a web link with the report path to run it from the target record detail page in the CRM application: Figure 30: Create a web link with the report path Note: To run a custom report we are going to need to click the “Edit” button in the target record detail page. If you want to run the custom lookup without editing the page, please read the “HowTo” “How to run a custom lookup without clicking on page Edit Button on a single object”
  • 35. Chapter:GENERALCONFIGURATION 26 How can i create a custom button that runs a custom look up from Edit and Detail page? INTRODUCTION Custom look ups are quite useful and I think we all agree about it, although, when using it, many of us have asked why we cannot use it from the simple view page with not need to previously click the edit button… surprisingly, is possible … keep reading if you want to find out WHAT DO WE WANT TO DO? We would like to create a custom button that runs a custom look up in edit and detail page: Figure 31: Button created to run the custom look up CODE TO INSERT This code has been created to launch a custom report service request in order to call a report related on product. That aims to catch a product into a Service Request through a custom lookup. The code is the following: <script> // First step: Open report and switch page in edit Mode function openLink(target) { // Open the reportrelated on custom lookup var str = "https://secure- ausomxXXX.crmondemand.com/OnDemand/user/analytics/saw.dll?Go&Path=%2fshared%2fCompany_30 701_Shared_Folder%2fProduct+Workaround&Options=rfd&Action=Prompt"; var editButton = "&nbsp;Edit&nbsp;"; var tdtd = document.getElementsByTagName("td"); for (var i = 0; i < tdtd.length; i++) { Time to result •50 Mins Complexity (1 to 5) •Level 3.5 Gap with out of the box cap •20%
  • 36. Chapter:GENERALCONFIGURATION 27 // Simul clic sur Bouton Edit if (tdtd[i].innerHTML == editButton){ if(target =="Service" ) doNamedInvoke('ServiceRequestEditNav', tdtd[i]); break ; } } window.open(str); } // End Function </script> <script> // Second step: Parse page et define location for the button function addCustomPickListButton() { var currentPage = document.getElementById('ocTitleFieldLabel'); var sr ="Consumer"; var target =""; if(currentPage != null && currentPage.innerHTML != null && (currentPage.innerHTML.match("^"+sr)==sr ) ) { target ="Service"; var tdtd = document.getElementsByTagName("td"); for (var i = 0; i < tdtd.length; i++) { // this button will be displyed close to text "Select product" if (tdtd[i].innerHTML == "Select product" || tdtd[i].innerHTML == 'Select product' ){ tdtd[i+1].innerHTML="<input type=button value=Open onclick="openLink('"+target+"')" > "; } } } } setTimeout ( "addCustomPickListButton()", 1000 ); // To be sure the Action Bar is loaded </script> To understand: Yellow: repot path. Be aware to change the POD Blue: target page name in edit mode Green: text closed to the button will be displayed Objectives of this code are to: 1. Create a button and put in the layout in Edit and Detail pages for lead and deal Objects 2. Switch the page in Edit mode if the page is not to allow the custom lookup to run 3. Open the report that embed the code for sending values into the layout
  • 37. Chapter:GENERALCONFIGURATION 28 ** Some comments have been added to let you understand code lines. EMBED THIS CODE IN OCOD The code has to be defined into a Global web applet, displayed in the action bar: Figure 32: Global Web applet displayed in the action bar Note: Do not forget to add this global web applet in the action bar and to create the custom look up. How can I create a custom look up that fill in many fields in Oracle CRM On Demand? INTRODUCTION Let’s say that this “How to” is the second of my favorites (I let you find the first one in the book…) I am sure that you know “the standard” custom lookup, I mean the one that send one value from a report into the application. Then, here is the evolved version of it ! This custom look up will be able to fill in several values in one shot, from a report to the application. BUSINESS CASES, KEEPING KEY IDENTIFICATION Imagine that you want to recover data concerning an order in the application; you want the ID in order to keep a primary key relationship but also, the order number coming from an external application. Obviously you want to do it with the minimum number of clicks… Time to result •30 Mins Complexity (1 to 5) •Level 3,5 Gap with out of the box cap •40%
  • 38. Chapter:GENERALCONFIGURATION 29 WHAT DO WE WANT TO DO? We would like to create a custom report that could fill in 2 fields in the application: OCOD with the link to the custom look up: Figure 33: Link to the custom lookup HOW CAN WE DO? Let us follow the following steps: IN ORACLE CRM CREATE CUSTOM FIELDS Fields that will receive information should be text fields and should not be defined as “Read only”: Figure 34: Fields that have been filled in FIND THE SYSTEM NAME OF THE CUSTOM FIELDS We need then to find the system name of the custom fields we have created previously:
  • 39. Chapter:GENERALCONFIGURATION 30 Figure 35: Right click and select view Source When the source page is displayed, do a search (Ctrl + F) based on the field display name. The system name follows the format: Page_name.field_name Figure 36: Edit page source and search the system name thanks to fields display name Keep these system names by copying in your favorite text editor:
  • 40. Chapter:GENERALCONFIGURATION 31 Figure 37: Copy system name Now that we have the containers waiting for the data, we need to create our report: IN ORACLE ANSWER (REPORT) We need now to create a report that will feed our custom fields: CREATE YOUR REPORT (STEP 1) Select expected columns to build your report: Figure 38: Columns selected to create our report As we want to prompt orders (opportunities) owned by the contact we are based on, we will add a filter based on the contact ID:
  • 41. Chapter:GENERALCONFIGURATION 32 Figure 39: filter to display only opportunities owned by the displayed contact CREATE THE LINK TO FEED THE APPLICATION FROM THE REPORT We will create a column that will display a link with the name “Sélectionner une commande” (“select an order”. Use a custom format for the column We will use a custom format for all data displayed on this column based on JavaScript function (“Callback):
  • 42. Chapter:GENERALCONFIGURATION 33 Figure 40: Custom format used The code is the following: "http://"@[html]"<a target=_top href=""javascript:void(null)"" onclick="Callback('"@"');">Sélectionner une commande</a>" To understand: Yellow: is the link name Define “fx” in the column In the fx defined in our column we must find all the parameters that will be used in the future: In our example, we need to find two fields:
  • 43. Chapter:GENERALCONFIGURATION 34 Figure 41: Fx definition The formula used is: CONCAT(Opportunity."Opportunity ID", CONCAT('?', Opportunity.Name)) To understand: Yellow: two fields we are interested in to fill in our application Blue (‘?’): the sign “?” allow us to separate both fields. Before selecting this key, be sure that it will not be used in any other column Note: we can also use the sign “||” to define a concatenation function as follows: "- Product Category"."Parent Product" || '?' || "- Product Category"."Category Description" Add a narrative view Now we have to host the JavaScript that will parse our report and run the callback function to fill in our two application field:
  • 44. Chapter:GENERALCONFIGURATION 35 Figure 42: Add a narrative view Figure 43: Code to paste in the narrative view Paste the code: <html> <script type="text/javascript"> function Callback(Line) { var Line = Line; // Le parameter Line permet de récupérer les valeurs contenu dans la colonne “Sélectionner” définies plus haut ( soit (CONCAT(Opportunity."Opportunity ID", CONCAT('?', Opportunity.Name)))
  • 45. Chapter:GENERALCONFIGURATION 36 var position = Line.indexOf('?'); // Index Of est une fonction Javascript permettant de renvoyer la position du parameter (?) dans la chaine Line. La variable position permet de définir la poistion du « ‘?» var MyCommandeID = Line.substring(0, position); // Commande ID est compris entre 0 et la variable position (?) var MyCommandeName = Line.substring(position+1); // Commande name est situé à la position ? +1 // Get SR form from parent page var theform = window.top.opener.document.getElementById("ServiceRequestEditForm"); for (n=0;n<theform.elements.length;n++) { if (theform.elements[n].name == "ServiceRequestEditForm.Indexed Short Text 0") { theform.elements[n].innerText=MyCommandeName; theform.elements[n].value=MyCommandeName; } if (theform.elements[n].name == "ServiceRequestEditForm.ZText_30") { theform.elements[n].innerText=MyCommandeID; theform.elements[n].value=MyCommandeID; } } window.close(); } </script> </html> To understand: Yellow: fields’ system name Blue: page name that we want to feed Note: To create a custom report with many parameters to feed, objects and method can be lightly different. You have to use the following syntax: <html> <script type="text/javascript"> function Callback(ProgramID) { var position = ProgramID.indexOf('?'); var MyProgramID = ProgramID.substring(0,position); var MyProgramName = ProgramID.substring(position+1); var theform = window.top.opener.document.getElementById("DealRegistration.EditForm"); for (n=0;n<theform.elements.length;n++) { if (theform.elements[n].id == "DealRegistration.EditForm.Product Interest") { theform.elements[n].innerText=MyProgramID; theform.elements[n].value=MyProgramID;
  • 46. Chapter:GENERALCONFIGURATION 37 } if (theform.elements[n].id == "DealRegistration.EditForm.ZText_2") { theform.elements[n].innerText= MyProgramName ; theform.elements[n].value = MyProgramName ; } } window.close(); } </script> </html> CREATE THE LINK BETWEEN ORACLE CRM ON DEMAND AND ORACLE ANSWER Now we have to create a web link that will run the prompted report: RETRIEVE THE REPORT PATH To find the report path, run it in internet Explorer, right click on it and select properties: Figure 44: Copy the report path CREATE A WEB LINK FIELD Get back to oracle CRM On Demand and create a web link that will run the prompted report
  • 47. Chapter:GENERALCONFIGURATION 38 Figure 45: Create the custom web link Figure 46: Detail on the formula used Note: You have to specify “Open in a new window” In our example, the URL is the following:
  • 48. Chapter:GENERALCONFIGURATION 39 https://secure- ausomxXXX.crmondemand.com/OnDemand/user/OpportunityDetail?ocTitle=%%%Indexed_Short_Text_0 %%%&OMTGT=OpptyDetailForm&OMTHD=OpportunityDetailNav&ocEdit=Y&OpptyDetailForm.Id=%%%stI D_Commande%%%&OCTYPE=Nouvelle+activit%C3%A9&ocTitleField=Name How to prevent the sales stage modification after the opportunity closed? INTRODUCTION Consolidating figures could be a tricky question with CRM. Sometimes users just are not that sure about the information that they are entering in CRM. You might want to ask accurate updates on the database so you can take information as real facts, thus, it would be worthy for you to prevent users from changing the Opportunity Sales Stage picklist value from ‘Closed/Lost’ or ‘Closed/Won’ back to any of the earlier stages (say, ‘Short List’, ‘Negotiation’, etc.) BUSINESS CASES, WHEN CLOSED OPPORTUNITY MODIFICATION RESTRICTION IS USEFUL Matching financial and commercial information Imagine that you need to validate your financial figures with commercial information coming from your sales force. We are guessing you do not want to find any inconsistency that push you make many calls and ask to a half of your sales why information does not match… what to do? What about “Forcing” your users to announce the final decision at the real end of the opportunity and not being able to get back if they do not? WHAT DO WE WANT TO DO? We want to block opportunities with status Closed. Does not matter if they are Won or Lost. HOW CAN WE DO? This can be achieved by writing a field validation rule for the ‘Sales Stage Id’ field in the Opportunity record-type. Usually field validation rules are written directly for the field that one wants to control, but in this case, you cannot write these rule for the Sales Stage field, since the field validation option is disabled. Instead of this, you can use the Sales Stage Id field to achieve the same result 1. Locate Sales Stage Id on the Opportunity Field Setup page and click the Edit link. 2. Enter the following rule in the Field Validation field: PRE('')'Closed/Won' AND PRE('')'Closed/Lost' Time to result •40 Mins Complexity (1 to 5) •Level 1,5 Gap with out of the box cap •100%
  • 49. Chapter:GENERALCONFIGURATION 40 If you want only users with a certain role, such as the Administrator, to have the ability to change a closed opportunity to one of the earlier stages, then you can exclude that user role in the field validation rule: (PRE('')'Closed/Won' AND PRE('')'Closed/Lost') OR (UserValue('')='Administrator') 3. Enter the error message that should be displayed when a user tries to change the sales stage value on a closed Opportunity record. 4. Click Save. 5. Test the field validation rule to make sure it works as you expect. Figure 47: Validation message after applying workflow to restrict opportunity status changes If you want to see more details, including more pictures, check out this document on My Oracle Support: Restricting Opportunity Sales Stage Value Using Field Validation (Doc ID 841398.1: You'll need to sign in with your My Oracle Support account to access the document.)
  • 50. Chapter:GENERALCONFIGURATION 41 How to monitor some variables evolution? INTRODUCTION Sometimes, is worthy for users to follow up the evolution of certain variables that will, in consequence, facilitate and encourage the team work by allowing managers to help at the right moment their team members. BUSINESS CASES, WHEN MONITORING VARIABLES IS USEFUL Following up opportunities evolution Imagine for instance, a sales rep. who has created an opportunity for the current year but it is been a while since he modified it for the last time. As a manager, you would like to see how could you help him to concretize his opportunity and win it but… how could you know who needs support at the right moment? Well in this document we will build a report concerning opportunities (you can do the same with any object) that will let you know when a particular field was modified for the last time and what was its previous value. Contact form As you can imagine from now, many uses are possible with this functionality, let’s go deeper and see some other examples. WHAT DO WE WANT TO DO? We want to follow up the changes realized on a group of fields and the dates of these changes. Then, we would like to follow up those fields in a report showing evolution and identifying need for action. HOW CAN WE DO? We are going to need some pivots fields to stock evolution information, then a report concerning those fields will alert us about actions required. STEP 1: PIVOT FIELDS Time to result •30 Mins Complexity (1 to 5) •Level 2,5 Gap with out of the box cap •100%
  • 51. Chapter:GENERALCONFIGURATION 42 Create “pivot fields” for the object that contains the date and the previous value for the fields that you want to follow up. In our example this object is the opportunity and we will follow up the field “Sales Stage”. We need to create two pivot fields for each monitored field. The first one keeping the field previous value and the second one will indicate the last modification date not for the record but for the field being monitored. Figure 48: Example of pivot field used to monitor some variables evolution STEP 2: WORKFLOWS Once the fields are available we will need to populate it automatically with the right information. To do this, let’s create a workflow for the field taking the information as shown on the figure below: Figure 49: Workflow defined to monitor some variables evolution The condition triggering the workflow is the field (and no the record) modification. The function PRE allows you to compare the previous value to the new one. Concerning the workflow activities, set the field values as follows: Figure 50: Workflow definition to monitor some variables evolution
  • 52. Chapter:GENERALCONFIGURATION 43 Figure 51: Date to monitor some variables evolution STEP 3: CREATE AND BUILD YOUR REPORT Now that your records are correctly populated, create your report and make it available for all managers wanting to monitor opportunities’ sales stage evolution. Figure: Example of report created to monitor some variables evolution Note: - Please notice that this reports needs at least two days to be finalized since new customized fields are available on analytics just the day after its creation. - If you need to go farther on modification history, you can use the same philosophy to explore previous modifications, but you will have to create two additional fields each time. How can to create a custom button? INTRODUCTION Integrating custom buttons following specific behavior is very often worthy to respond to particular requirements which are not standard functionalities in OCOD. Using code you can get to create many interesting possibilities. Let’s see how can we integrate buttons. BUSINESS CASES, WHEN CUSTOM BUTTONS ARE USEFUL Creating a custom look up filling up multiple fields Time to result •30 Mins Complexity (1 to 5) •Level 3 Gap with out of the box cap •30%
  • 53. Chapter:GENERALCONFIGURATION 44 Standard look up functionality can only fill in one field at a time… what about saving time and effort for your users when creating and/or editing records? WHAT DO WE WANT TO DO? We would like to create a custom button with a custom behavior. This “how to” is based on an example realize on "lead" object: Figure 52: Example of custom buttons created HOW CAN WE DO? CREATE THE JAVASCRIPT We need to create a code, as follows: type="text/javascript" id="customJavaScript"> // comportement du bouton function linkedIn(addr){ window.open (addr); //pour un popup. Pour ouvrir dans la page courante: window.location } function addCustomPickListButton2() { var tdtd = document.getElementsByTagName("td"); // initialisation des variables var fname =""; var lname =""; // premiere partie: affecte valeur dans les pages de detail //pour acceder a une valeur de champ en edit mode la fonction est .innerHTML
  • 54. Chapter:GENERALCONFIGURATION 45 for (var i = 0; i < tdtd.length; i++) { //parcours la page if (tdtd[i].innerHTML == "First Name"){ fname = tdtd[i+1].innerHTML; } if (tdtd[i].innerHTML == "Last Name"){ lname = tdtd[i+1].innerHTML; } } // deuxieme partie: affecte valeur dans les pages edit // va chercher l'element egal a td+1 (valeur du champs) //pour acceder a une valeur de champ en edit mode la fonction est .value if(fname == "" && document.getElementById('LeadCreateEditForm.First Name') != null ) fname = document.getElementById('LeadCreateEditForm.First Name').value; if(lname == "" && document.getElementById('LeadCreateEditForm.Last Name') != null ) lname = document.getElementById('LeadCreateEditForm.Last Name').value; //Troisieme partie: creer le bouton et reference a son comportement for (var i = 0; i < tdtd.length; i++) { // parcours la page // On place le bouton a cote du texte "Linked In" if (tdtd[i].innerHTML == "Linked In" || tdtd[i].innerHTML == '="fl">Linked In' ){ // page de detail ou page edit // reference au comportement du bouton tdtd[i+1].innerHTML=""; } } } setTimeout ( "addCustomPickListButton2()", 1000 ); // To be sure the Action Bar is loaded </script> CODE EXPLANATION We put some comments into the code, but let us explain how you can adapt this code: CREATE THE LINK FOR THE BUTTON TO FOLLOW We have to write the link in a variable because Javascript cannot follow a simple URL: function linkedIn(addr){ window.open (addr); //pour un popup. Pour ouvrir dans la page courante: window.location } function addCustomPickListButton2() {
  • 55. Chapter:GENERALCONFIGURATION 46 LOOKING FOR "TD" ELEMENTS Specify that you are looking for td elements var tdtd = document.getElementsByTagName("td"); VARIABLE DECLARATION Specify the variable(s) that will compose our URL (the example is based on tags that will compose the URL): var fname =""; var lname =""; PARSE THE CURRENT PAGE This will parse every page where the application is for (var i = 0; i < tdtd.length; i++) { SEARCH ELEMENTS IN EDIT PAGES To find elements that we are looking for in an edit page, the function is ".innerHTML" To find the element (the value in the fields called "Last Name" and "first Name"), we are looking for the elements after elements called "Last Name" and "first Name", some element after td = Last name and First name, so td+1: if (tdtd[i].innerHTML == "First Name"){ fname = tdtd[i+1].innerHTML; } if (tdtd[i].innerHTML == "Last Name"){ lname = tdtd[i+1].innerHTML; } } SEARCH ELEMENTS IN DETAILS PAGES To find elements that we are looking for in an edit page, the function is ".value" To find the element (the value in the fields called "Last Name" and "first Name"), we are looking for the elements after elements called "Last Name" and "first Name", some element after td = Last name and First name, so td+1
  • 56. Chapter:GENERALCONFIGURATION 47 if(fname == "" && document.getElementById('LeadCreateEditForm.First Name') != null ) fname = document.getElementById('LeadCreateEditForm.First Name').value; if(lname == "" && document.getElementById('LeadCreateEditForm.Last Name') != null ) lname = document.getElementById('LeadCreateEditForm.Last Name').value; Of course, you have to adapt the page name depending object where you want to put the custom button SELECT THE PLACE WHERE WE WOULD LIKE TO PUT THE CUSTOM BUTTOM We will parse de page and find the display name "Linked In" in the current page to place the button right after. Once again in the edit page specify ".innerHTML" and in detail page ".value" if (tdtd[i].innerHTML == "Linked In" || tdtd[i].innerHTML == 'Linked In' ){ SPECIFY BEHAVIOR ON THE BUTTON if (tdtd[i].innerHTML == "Linked In" || tdtd[i].innerHTML == 'Linked In' ){ PUT THE CODE IN A CUSTOM WEB APPLET The code, once adapted to your environment, has to be copied in a custom web applet Figure: Global Web applet created to create a custom button And don't forget to add this web applet to the action bar for users... How to avoid weekend selection for date type fields? Time to result •50 Mins Complexity (1 to 5) •Level 4 Gap with out of the box cap •20%
  • 57. Chapter:GENERALCONFIGURATION 48 INTRODUCTION Business rules and daily work restrictions can add complexity to the configuration of a CRM. Imaging that you are using your application to monitor your deliveries and, as many of us, some of the members of your supply chain do not work on weekends. You do not want to plan shipping and deliveries in those dates since performance indicators will not correspond to reality… what to do without checking carefully the calendar each time that you create and/or edit a record? BUSINESS CASES, WHEN AVOIDING WEEKENDS IS USEFUL Avoiding weekend choice Imagine that your customer wants an automatic calculation to be launched on a date field type in order to avoid week end and this, for the “Service Request” object which includes a dynamic layout (rule should be triggered just for a particular service request type) The dates in question represent the final shipment date and the pickup start date (commitment from the shipping provider) which are, as well, calculated depending on a department selection and a original pickup and shipment date selection. WHAT DO WE WANT TO DO? We want to avoid work on weekends… well even if it is funny this is pretty much right, let’s check the business rule We should not be able to select “pickup date” and “shipment date” when: We are on a layout type “Assistance Service FR” (dynamic layout value) And Field “Issue du diagnostique”= “Décision Pickup” And Select the pickup date or shipment date that represents the original date and Filled in field “Pickup code postal” (pick up zip code) or “Livraison code postal” (shipment zip code) And You select the department number
  • 58. Chapter:GENERALCONFIGURATION 49 A workflow rule is applied to calculate the final shipment or pickup date where the provider is committed with following definition: DestinationZip code Days in Transit DestinationZip code Days in Transit 01xxx 1 45xxx 1 02xxx 1 46xxx 2 03xxx 1 47xxx 1 04xxx 3 48xxx 1 05xxx 3 49xxx 1 06xxx 2 50xxx 1 07xxx 2 51xxx 1 08xxx 1 52xxx 1 09xxx 1 53xxx 1 10xxx 1 54xxx 1 11xxx 2 55xxx 1 12xxx 1 56xxx 1 13xxx 2 57xxx 1 14xxx 1 58xxx 1 15xxx 2 59xxx 1 16xxx 1 60xxx 1 17xxx 2 61xxx 1 18xxx 1 62xxx 1 19xxx 1 63xxx 1 20xxx 5 64xxx 2 21xxx 1 65xxx 1 22xxx 1 66xxx 2 23xxx 1 67xxx 1 24xxx 2 68xxx 1 25xxx 1 69xxx 1 26xxx 2 70xxx 1 27xxx 1 71xxx 1
  • 59. Chapter:GENERALCONFIGURATION 50 28xxx 1 72xxx 1 29xxx 2 73xxx 2 30xxx 2 74xxx 1 31xxx 1 75xxx 1 32xxx 1 76xxx 1 33xxx 1 77xxx 1 34xxx 2 78xxx 1 35xxx 1 79xxx 1 36xxx 1 80xxx 1 37xxx 1 81xxx 1 38xxx 1 82xxx 1 39xxx 1 83xxx 2 40xxx 1 84xxx 2 41xxx 1 85xxx 2 42xxx 1 86xxx 1 43xxx 1 87xxx 1 44xxx 1 88xxx 1 HOW CAN WE DO? Simple: a workflow calculating our final date AND a Javascript that we will embed into a Global Web applet in the action bar. DEFINE WORKFLOW We need to create a workflow involving the shipment and the pickup start date to calculate the final date depending on the department rule and the original date: Figure 53: Workflow formula to calculate final date depending on the department rule based on the original date
  • 60. Chapter:GENERALCONFIGURATION 51 The workflow formula is the following: IIf(Left([<stPickup_CP_ITAG>],2)='06' OR '07' OR '11' OR '13' OR '15' OR '17 'OR '24' OR '26' OR '29' OR '30' OR '34' OR '46' OR '64' OR '66' OR '73' OR '83' OR '84' OR '85' OR '98', [<A_ITAG>]-2, IIf(Left([<stPickup_CP_ITAG>],2)='04'OR '05', [<A_ITAG>]-3, IIf(Left([<stPickup_CP_ITAG>],2)='20', [<A_ITAG>]-5, [<A_ITAG>]-1))) To understand: [<stPickup_CP_ITAG>]: zip code [<A_ITAG>]: Original date DEFINE THE SCRIPT The script will do following action:  Parse correct layout and get elements  Trigger the workflow rule (calculation)  If result is a week end, then alert the user  And finally add the next working day (correct date) The code that we’ll need to use is the following (explanation are embedded with the code (marked as comment): <script type="text/javascript"> function startW (s, str) { return (s.match("^"+str)==str); } // keep date, parse and define variable new Date() function getDateFromOcodStringDate(sDate) { var v = sDate; var start = v.indexOf("/", 0 ); var j = v.substr(0,start); var m = v.substr(start+1,2); var a = v.substr(start+4,4); var d = new Date(); d.setFullYear(a,m-1,j); return d; } ///////////////////////////////////////////////////////////////////////////////
  • 61. Chapter:GENERALCONFIGURATION 52 // Define day depending date function getDay( d ) { var weekday = new Array(7); weekday[0]="Sunday"; weekday[1]="Monday"; weekday[2]="Tuesday"; weekday[3]="Wednesday"; weekday[4]="Thursday"; weekday[5]="Friday"; weekday[6]="Saturday"; //alert("Today is " + weekday[d.getDay()] ); return weekday[d.getDay()]; } // alerte definition if result is a week end function isWeekendDay( d) { var weekday = new Array(7); weekday[0]="Sunday"; weekday[1]="Monday"; weekday[2]="Tuesday"; weekday[3]="Wednesday"; weekday[4]="Thursday"; weekday[5]="Friday"; weekday[6]="Saturday"; //alert("Today is " + weekday[d.getDay()] ); if( weekday[d.getDay()] == "Saturday" || weekday[d.getDay()] == "Sunday" ) return true; return false; } //////////////////////////////////////////////////////////////////////////// // Parse page function GetElement( id ) { if( document.getElementById(id) ) { return document.getElementById(id); } else { //alert("Not found Element by id : "+ id); return false; } }
  • 62. Chapter:GENERALCONFIGURATION 53 function checkDates() { // Get needed input values var type = GetElement('ServiceRequestEditForm.SR Type').value; var pick = GetElement('ServiceRequestEditForm.Indexed Pick 4').value; // Keep field shipment zip code and pickup zip code var codePLivraison = GetElement('ServiceRequestEditForm.ZText_39').value; var codePPickup = GetElement('ServiceRequestEditForm.ZText_36').value; var result; // Check expected condition if ( type == "Assistance Service FR" && pick =="Décision pickup" && codePPickup != "" ) { var dd = GetElement('ServiceRequestEditForm.ZDate_25').value; // format String date to Date var date = getDateFromOcodStringDate ( dd ); var oldDate = getDateFromOcodStringDate ( dd ); // Get the number of days to back from zip code date.setDate ( date.getDate() - getBackDayNumber (codePPickup) ); // We will Add 1 day if date is a Sunday and 2 days if date is a saturday if( isWeekendDay (date) ) { if(getDay(date) == "Sunday"){ // Add one day oldDate.setDate ( oldDate.getDate() + 1 ) } else { // Add two day oldDate.setDate ( oldDate.getDate() + 2 ) } // format new Date var nDate = oldDate.getDate() + "/" + (oldDate.getMonth() + 1) + "/" + oldDate.getFullYear(); // Message defined if date is a week end alert("Date Départ pickup est un Weekend.nNouvelle date pickup : " + nDate); // Change the date input value GetElement('ServiceRequestEditForm.ZDate_25').value = nDate; //return true; } } //////////////////////////////////////////////////////////////////////////////////////////// // We do the substraction with date.getdate() and getBackDayNumber (codePLivraison) and apply behavior. The substraction is done on the shipment and pickup date to let the workflow being applied. if ( type == "Assistance Service FR" && pick =="Décision pickup" && codePLivraison != "" ) { var dd = GetElement('ServiceRequestEditForm.ZDate_26').value; var date = getDateFromOcodStringDate ( dd );
  • 63. Chapter:GENERALCONFIGURATION 54 var oldDate = getDateFromOcodStringDate ( dd ); date.setDate ( date.getDate() - getBackDayNumber (codePLivraison) ); if( isWeekendDay (date) ) { if(getDay(date) == "Sunday"){ oldDate.setDate ( oldDate.getDate() + 1 ) } else { oldDate.setDate ( oldDate.getDate() + 2 ) } var nDate = oldDate.getDate() + "/" + (oldDate.getMonth() + 1) + "/" + oldDate.getFullYear(); // Message defined if date is a week end alert("Date Départ Livraison est un Weekend.nNouvelle date Livraison: " + nDate); GetElement('ServiceRequestEditForm.ZDate_26').value = nDate; //return true; } } return true; } ////////////////////////////////////////////////////////////////////////////////// // getBackDayNumber calculation: Define number depending postal code function getBackDayNumber( codeP ) { var code = codeP.substr(0, 2); if( code == "06" || code =="07" || code =="11" || code =="13" || code =="15" || code =="17" || code =="24" || code =="26" || code =="29" || code =="30" || code =="34" || code =="46" || code =="64" || code =="66" || code =="73" || code =="83" || code =="84" || code =="85" || code =="98") return 2; if ( code =="04" || code =="05") return 3; if ( code =="20" ) return 5; return 1; } ////////////////////////////////////////////////////////////////////////////////////////// // Detect the form where the script has to run function detectAddForm() { // Wait two seconds after changing the value type in the picklist because we are using a dynamic layout
  • 64. Chapter:GENERALCONFIGURATION 55 // Check SR Type attribute if exist if ( GetElement('ServiceRequestEditForm.SR Type') ) { var elem = GetElement('ServiceRequestEditForm.SR Type'); try{ // Re-add the same method on this attribute every time the user choose different type, because when change SR Type the page is reloading and we lost Javascript Event // addEventListener: all browsers except IE before version 9 elem.addEventListener('change',function (e) { setTimeout ( "detectAddForm()", 2000 ); }, true); } catch(e){ // attachEvent: IE before version 9 elem.attachEvent('onchange', function (e) { setTimeout ( "detectAddForm()", 2000 ); }); } } var e = document; e = e.getElementsByTagName('td'); // Parse HTML page to find ‘Save’ button and change his behavior by Check Date function var i=0; while( i < e.length) { // Check SR form if( startW (e[i].id, "ServiceRequestNewForm") || startW (e[i].id, "ServiceRequestEditForm") ) { // Check Save button if(e[i].innerHTML == "&nbsp;Enregistrer&nbsp;" || e[i].innerHTML == "&nbsp;Enregistrer &amp; Nouvelle Traitement&nbsp;" ) { document.getElementById( e[i].id ).onclick = function(e){ // Add check date functionality before saving if( checkDates() == true ) { // doNamedInvoke : default function used when clicking on Save button doNamedInvoke('Save', this); } } } } i++ ; } } // Run the script 2 seconds after action bar loaded //detectAddForm(); setTimeout ( "detectAddForm()", 2000 );
  • 65. Chapter:GENERALCONFIGURATION 56 </script> To understand:  ServiceRequestEditForm.ZText_39: Pick up zip code  ServiceRequestEditForm.ZText_36: shipment zip code  Assistance Service FR: picklist value that defines dynamic layout  Dccision pickup: value of the "type" field Adapt and paste the code in a global web applet associated to the Action Bar and you will be done!!! How to make caps mandatory for field content? INTRODUCTION Data bases are being more and more integrate to business processes in the last years. Today interfaces, web marketing and many other functionalities are finding support on brut data base content. From the practical point of view what this introduces is the need for every system administrator to manage data quality. BUSINESS CASES, WHEN MANDATORY CAPS ARE USEFUL Emailing on your data base contacts Imagine that you are sending marketing e-mails campaigns to all or a segment of your data base contacts. Imagine as well that you are merging some of the fields on the contact record profile… you do not want to include orthographic errors which can bother your potential client, do you? If you say no, this how to is for you. Time to result •10 Mins Complexity (1 to 5) •Level 1,5 Gap with out of the box cap •100%
  • 66. Chapter:GENERALCONFIGURATION 57 WHAT DO WE WANT TO DO? Just to push users to use ONLY a predefined set of characters when filling in a particular field. HOW CAN WE DO? STEP1: CREATE THE WORKFLOW EXPRESSION We need to use the Field validation capabilities. You need to add a field validation formula, which will define the allowed characters for the field. In this case, capital letters, numbers and some other symbols. Use the following expression: Figure 54: Syntaxe définie dans la validation du champ (FindNoneOf((FieldValue('<AccountName>')),"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-() _/")) = 0 To understand: <AccountName> can be replaced by any other field name! FINDNONEOF FUNCTION EXPLANATION: The FindNoneOf function in Expression Builder returns the position of the first instance in the first argument (string1) that does not match any character in the second argument (string2). THE SYNTAX TO FOLLOW The syntax to follow is: FindNoneOf(string1, string2) RESULT TYPE The result type is an Integer STEP 2: SPECIFY THE FIELD VALIDATION ERROR MESSAGE
  • 67. Chapter:GENERALCONFIGURATION 58 Once you have the validation expression, you can now create a message that will show up whenever users try to save a record not matching the established conditions. Here and example: “Only capital letters, numbers, spaces and the characters period, parenthesis, dash, slash and underscore, can be used for the field Account Name, please modify your entry accordingly” How can I create an I-Frame in homepage? INTRODUCTION This tip has often been used to personalize Oracle CRM On Demand application. This customization allows users to create shortcuts based on user business processes BUSINESS CASES, WHEN A HOMEPAGE I-FRAME IS USEFUL I had a customer who wanted to personalize his application with the look of a Partner Portal. The aim of this customization was to create an I Frame in the homepage, embedding some quick links to main functionalities and most consulted information. WHAT DO WE WANT TO DO? Your CRM could have this more attractive than the standard look: Figure 55: I Frame in Homepage. Illustration from a customer Or Time to result •10 Mins Complexity (1 to 5) •Level 2 Gap with out of the box cap •40%
  • 68. Chapter:GENERALCONFIGURATION 59 maybe this one: Figure 56: I Frame in Homepage. Illustration from a customer CREATE A GLOBAL WEB APPLET Insert this code: <body> <style type="text/css"> a:link {COLOR: #0033BB; TEXT-DECORATION: none} a:visited{COLOR: #0033BB; TEXT-DECORATION: none} a:active{COLOR: #0033BB; TEXT-DECORATION: none} a:hover {COLOR: #0033BB;TEXT-DECORATION: underline} </style> <table cellspacing="10" width="100%" bgcolor="#F9F9F9"> <tr> <br> <br> <td width="100"><img src="http://t3.gstatic.com/images?q=tbn:pkSvMmwgOsBelM:http://www.oekumenischekampagne.ch/cm s/uploads/media/Signet_BFA_RGB.jpg"></td> <td width="100%"><font size=3 color="black"><b>Welcome to your <Customer>’s future application, what do you want to do today? <br></font> <font size=2> <br> <table width="100%" border="0" cellspacing="0" cellpadding="2" height="60"> <tr valign="middle"> <td bgcolor="#BACFDA" width="33%" height="20"> <div align="center"><font face="Arial" size="2" color="#064380"><b>Manage My Activity </b></font></div> </td> <td width="1%" height="20"> </td> <td bgcolor="#BACFDA" width="33%" height="20"> <div align="center"><font face="Arial" size="2" color="#064380"><b>Manage Donations</b></font></div> </td> <td width="1%" height="20"> </td> <td bgcolor="#BACFDA" width="33%" height="20"> <div align="center"><font face="Arial" size="2" color="#064380"><b>Get Help</b></font></div> <td width="100%" height="20">
  • 69. Chapter:GENERALCONFIGURATION 60 </td> </tr> <tr valign="top"> <td bgcolor="#BACFDA" width="33%"> <table width="100%" border="0" cellspacing="0" cellpadding="3" height="40"> <tr bgcolor="#FFFFFF" valign="top"> <td> <p> <font face="Arial" size="2" color="#ABDAF3"> <a href="/OnDemand/user/CalendarWeekly?CalendarCtrl.Date=10%2f7%2f2009&OMTGT=CalendarCtrl&OM THD=Weekly&CalendarCtrl.ShowFullDay=0"> Plan My Week </a> <br> <a href="/OnDemand/user/CRMODLS_BusinessPlan.FullList?CRMODLS_BusinessPlan.FullList.LAYOUT=CRMO DLS_BusinessPlan.AllList&CRMODLS_BusinessPlan.FullList.LAYOUTID=&OMTGT=CRMODLS_BusinessPlan.F ullList&OMTHD=PdqListMethod&CRMODLS_BusinessPlan.FullList.EDITFLAG=N"> Review My Business Plans </a> <br> <a href="/OnDemand/user/ContactList?ContactList.LAYOUT=Contact+List+Key+Target+Physicians&OMTGT=C ontactList&OMTHD=PdqListMethod&ContactList.EDITFLAG=Y"> View My Members</a> </font> </p> </td> </tr> </table> </td> <td width="1"> </td> <td bgcolor="#BACFDA" width="33%"> <table width="100%" border="0" cellspacing="0" cellpadding="3" height="40"> <tr bgcolor="#FFFFFF" valign="top"> <td> <p><font face="Arial" size="2" color="#ABDAF3"> <a href="OnDemand/user/OpptyListPage?OpptyListPage.LAYOUT=OptyList&OpptyListPage.EDITFLAG=N&OM TGT=OpptyListPage&OMTHD=PdqListMethod&OpptyListPage.LAYOUTID="> All Donations </a> <br> <a href="http://www.vetwholesaler.co.uk"> My Donations </a> <br> <a href="http://www.nwlabs.co.uk"> Top 10 Donation </a> </font> </p> </td> </td> </tr> </table> <td width="1"></td> <td bgcolor="#BACFDA" width="33%"> <table width="100%" border="0" cellspacing="0" cellpadding="3" height="40"> <tr bgcolor="#FFFFFF" valign="top">
  • 70. Chapter:GENERALCONFIGURATION 61 <td> <p> <font face="Arial" size="2" color="#ABDAF3"> <a href="/OnDemand/user/CRMOD_LS_MessagingPlan.FullList?OMTGT=CRMOD_LS_MessagingPlan.FullList& OMTHD=PdqListMethod&CRMOD_LS_MessagingPlan.FullList.LAYOUTID=&CRMOD_LS_MessagingPlan.Full List.EDITFLAG=N&CRMOD_LS_MessagingPlan.FullList.LAYOUT=CRMOD_LS_MessagingPlan.AllList"> Find Messaging Plans </a> <br> <a href="https://secure- ausomxama.crmondemand.com/OnDemand/user/ServiceRequestList?OMTGT=ServiceRequestList&OMTH D=PdqListMethod&ServiceRequestList.EDITFLAG=N&ServiceRequestList.LAYOUT=SRList&ServiceRequestLi st.LAYOUTID="> Check MedInfo requests </a> <br> <a href="mailto:mathieu.emanuelli@gmail.com"> My Contact</a> </font> </p> </td> </tr> </table> </td> </tr> </table> </tr> </table> To understand: Yellow : Color code to adapt Blue: Picture path Red: application path Green: Other links Note: You can adapt the code inserting the expected picture and links. When configuring internal URL do not use any pod information so the code can be applied in many environments such as production or staging. This code has to be pasted in a global web applet as follows:
  • 71. Chapter:GENERALCONFIGURATION 62 Figure: Global web applet to paste the I frame code How can i create an i-frame with action bar content? INTRODUCTION This tip will allow you to improve content shown in the action bar. We would like to customize the action bar letting only the most important information for business. WHAT DO WE WANT TO DO? We want to create an I-frame in the action bar with scroll bar giving to users the capability to access to other non-standard functionalities: Time to result •20 Mins Complexity (1 to 5) •Level 1 Gap with out of the box cap •90%
  • 72. Chapter:GENERALCONFIGURATION 63 Figure 57: Scroll bar in the action bar HOW CAN WE DO? We will need to create global web applet into the action bar: Figure 58: Web applet to create scroll bar The code inserted is the following one: </style><div align="left"> <table width="131" border="0"> </table>
  • 73. Chapter:GENERALCONFIGURATION 64 We just need to be careful while specifying the size for the global web applet. After this, any link can be added to the action bar in order to facilitate the access to particular information to any Oracle CRM On Demand user in your company How can I rename the button “Log A Call” in activity related information? INTRODUCTION This tip shows you how it is possible to rename a standard button on your CRM application BUSINESS CASES, WHEN RENAMING A STANDARD BUTTON IS USEFUL One of my customer wanted to renamed the out of box button “log a call” because the term “call” did not corresponded to his business language. SIince we cannot do that using standard customization capability we have found this workaround. WHAT WE WOULD LIKE TO DO? We would like to rename the button “Log A call” into related information: Before: Figure 59: Out of the box "Log a Call" label Time to result •30 Mins Complexity (1 to 5) •Level 3 Gap with out of the box cap •10%
  • 74. Chapter:GENERALCONFIGURATION 65 After: Figure 60: Label "Log a Call" after applying modification code HOW CAN WE DO? We will create a Web applet that we will embed into the contact layout with the following code:
  • 75. Chapter:GENERALCONFIGURATION 66 Figure 61: Code to paste in a web applet to change the "Log a Call" label Put this web applet on the concerned layout: Figure 62: Web Applet embedded to modify "Log A Call" label Code to paste: <script type="text/javascript"> var td = document.getElementsByTagName("td"); for (var i = 0; i < td.length; i++) {
  • 76. Chapter:GENERALCONFIGURATION 67 if (td[i].innerHTML == "&nbsp;Log A Call&nbsp;"){ //alert (td[i].innerHTML); td[i].innerHTML = "&nbsp;Send Email&nbsp;"; } if (td[i].innerHTML == "RenommerBtnConsignerAppel"){ td[i].innerHTML = ""; } } var a = document.getElementsByTagName("a"); // Code is for the <environment>. This part is to hide the related information title if (document.getElementById("AIIA-RQVJL_Title")) { document.getElementById("AIIA-RQVJL_Title").innerHTML = ""; document.getElementById("AIIA-RQVJL_Title").innerText = ""; } </script> To understand the code:  Yellow: the old value  red: le new value  Blue: name of the related info if you want to remove it  Green: ID of the related information you want to remove Note: if you want to let this code flexible, working on different environments such as production and staging, just add, before <script>: // Code is for the <environment>. This part is to hide the related information title if (document.getElementById("AIIA-RQVJL_Title")) { document.getElementById("AIIA-RQVJL_Title").innerHTML = ""; document.getElementById("AIIA-RQVJL_Title").innerText = ""; } To understand the code:  Green: ID of the related information you want to remove How can I create an “information bubble” on 1 or many fields?
  • 77. Chapter:GENERALCONFIGURATION 68 INTRODUCTION A “mouse over” functionality is today a very used web behavior. In many CRM on the market you can see this type of functionality available. We couldn’t let Oracle CRM on Demand users without this workround which cover this requirement and make easier the application adoption! BUSINESS CASES, WHEN THE INFORMATION BUBBLE IS USEFUL I think that all of my prospects and customers asked us at least once this functionality. Information bubbles will help users to understand a field meaning and/or purpose and so, to adopt the application faster. WHAT DO WE WANT TO DO? We would like to create a mouse over functionality based on the field display name: Figure 63: Information Bubble with text Or on an image: Time to result •30 Mins Complexity (1 to 5) •Level 3 Gap with out of the box cap •10%
  • 78. Chapter:GENERALCONFIGURATION 69 Figure 64: Information Bubble on image HOW CAN WE DO? STEP1: CREATE A WEB APPLET In our example, the bubble will appear only on the detail page (not edit mode), let’s use the leads Figure 65: Web applet hosted the code STEP2: PASTE THE CODE FOR THE BUBBLE WITH “?” Paste the following code. <div id="dek" style="POSITION:absolute;VISIBILITY:hidden;Z-INDEX:200;"></div> <script>
  • 79. Chapter:GENERALCONFIGURATION 70 Xoffset=00; // modify these values to ... Yoffset= 20; // change the popup position. var old,skn,iex=(document.all),yyy=-1000; var ns4 = document.layers; var ns6 = document.getElementById ; var ie4 = document.all; skn = document.getElementById("dek").style; skn.visibility="visible"; skn.display="none"; document.onmousemove=get_mouse; function popup(msg,bak){ if (!bak) bak = "#EBEAF3"; var content = "<div style='font-size:10px;color:none;border-style:solid;border-width:1px; BORDER-COLOR:#8F99EF; PADDING:3px; SPACING:0; "+ "Background-COLOR:"+bak+";' align=left>"+msg+"</div>"; yyy = Yoffset; if (skn) { skn.visibility="visible"; skn.display="block"; } if(ns4){ skn.document.write(content); skn.document.close(); skn.visibility="visible"; } if(ns6){ document.getElementById("dek").innerHTML=content; skn.display=''; } if(ie4){ document.all("dek").innerHTML=content; skn.display=''; } } function get_mouse(e) { var x; try{ x = e.pageX; y = e.pageY; } catch(e){ x = event.x+document.body.scrollLeft; y = event.y+document.body.scrollTop; }
  • 80. Chapter:GENERALCONFIGURATION 71 skn.left=x+Xoffset; skn.top=y+yyy; } function kill() { yyy=-1000; if(ns4) { skn.visibility = "hidden"; } else if (ns6||ie4) skn.display="none" } function set_Info_Bulle() { var tds = document.getElementsByTagName("td"); var CONVERT_LABEL = "Campaign"; var CONVERT_DESC = "Campaign Description...<br>This is a test to show Info Bull"; // for (var i = 0; i < tds.length ; i++) { if ( tds[i].innerHTML == CONVERT_LABEL ) { //alert("in"); tds[i].innerHTML += "<font style='color:red' ><b> ?</b></font>"; tds[i].onmouseover = function(){ // do stuff. I could call this 1st or 2nd if I want popup( CONVERT_DESC ); } tds[i].onmouseout= function(){ // do stuff. I could call this 1st or 2nd if I want kill(); } } } } setTimeout ( "set_Info_Bulle()", 1000 ); // To be sure the Action Bar is loaded </script> To understand: Yellow: color code Green: field display name to change Red: Message you would like to show STEP2 (BIS): PASTE CODE FOR BUBBLE WITH AN IMAGE
  • 81. Chapter:GENERALCONFIGURATION 72 Paste the following code an in yellow modify the image URL <div id="dek" style="POSITION:absolute;VISIBILITY:hidden;Z-INDEX:200;"></div> <script> Xoffset=00; // modify these values to ... Yoffset= 20; // change the popup position. var old,skn,iex=(document.all),yyy=-1000; var ns4 = document.layers; var ns6 = document.getElementById ; var ie4 = document.all; skn = document.getElementById("dek").style; skn.visibility="visible"; skn.display="none"; document.onmousemove=get_mouse; function popup(msg,bak){ if (!bak) bak = "#EBEAF3"; var content = "<div style='font-size:10px;color:none;border-style:solid;border-width:1px; BORDER-COLOR:#8F99EF; PADDING:3px; SPACING:0; "+ "Background-COLOR:"+bak+";' align=left>"+msg+"</div>"; yyy = Yoffset; if (skn) { skn.visibility="visible"; skn.display="block"; } if(ns4){ skn.document.write(content); skn.document.close(); skn.visibility="visible"; } if(ns6){ document.getElementById("dek").innerHTML=content; skn.display=''; } if(ie4){ document.all("dek").innerHTML=content; skn.display=''; } } function get_mouse(e) { var x; try{ x = e.pageX;
  • 82. Chapter:GENERALCONFIGURATION 73 y = e.pageY; } catch(e){ x = event.x+document.body.scrollLeft; y = event.y+document.body.scrollTop; } skn.left=x+Xoffset; skn.top=y+yyy; } function kill() { yyy=-1000; if(ns4) { skn.visibility = "hidden"; } else if (ns6||ie4) skn.display="none" } function set_Info_Bulle() { var tds = document.getElementsByTagName("td"); var CONVERT_LABEL = "Campaign"; var CONVERT_DESC = "Campaign Description...<br>This is a test to show Info Bull"; // for (var i = 0; i < tds.length ; i++) { if ( tds[i].innerHTML == CONVERT_LABEL ) { //alert("in"); tds[i].innerHTML += "<font style='color:red' ><b><img src=" OnDemand/1.12.0.1220.0.03/base/icons/assoc_images/zoom.png"/></b></font>"; tds[i].onmouseover = function(){ // do stuff. I could call this 1st or 2nd if I want popup( CONVERT_DESC ); } tds[i].onmouseout= function(){ // do stuff. I could call this 1st or 2nd if I want kill(); } } } } setTimeout ( "set_Info_Bulle()", 1000 ); // To be sure the Action Bar is loaded </script> To understand: Yellow: color code
  • 83. Chapter:GENERALCONFIGURATION 74 Green: field display name to change Red: Message you would like to show Blue: Picture path. The picture is hosted into your Oracle CRM On demand environment. Note: This code has to be applied on related information for an specific object. This development doesn’t take into account multilingual configuration. Developers that apply this code need to be aware of the image URL (if they want to use an image)… How can I create a document including CRM merged fields and print it? INTRODUCTION With Oracle CRM On Demand many additional components (add-ons) like Excel Anaylsis or mail Merge are provided without any additional costs. In Oracle CRM On Demand’s world, the add-ons are intended to cover features’ gaps that users can meet when using the application, sometimes the add-ons do not provide a satisfactory answer to users expectations and Oracle administrators have then to make a choice between a custom development by using WebServices and a standard workaround. This book also aims to help you to optimize your budget, let’s stay on the standard then and use Oracle CRM On Demand capabilities to improve our percentage of requirements coverage. This “How To” is dedicated to all the companies using Oracle CRM On Demand and wanting to print in their daily activity documents including merged information coming from the application. BUSINESS CASES, WHEN THIS HOW TO IS USEFUL Imagine that your company is using Oracle CRM On Demand to execute and monitor their Call Center business processes. Imagine now that your activity includes quotidian document’s printing with variables coming from the CRM, you will probably need to merge static text with variables stocked in the CRM … we are almost sure that you will want to print the final results... want to know how? Keep reading then. WHAT DO WE WANT TO DO? Generate, merge and print many documents at once including Oracle CRM On Demand contextual information Time to result •20 Mins Complexity (1 to 5) •Level 4 Gap with out of the box cap •90%
  • 84. Chapter:GENERALCONFIGURATION 75 Figure 66: Oracle CRM On Demand to mass merge HOW CAN WE DO? CREATE A NARRATIVE REPORT Go to the reports creation module and: Figure 67: Narrative view Note: take care not to specify any number in the field “lines to display” in your narrative view We will use add a page break at the end of the code: <body> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <table height="241"> <tr> <td width="25"></td> <td width="408"><div align="left"></div></td> <td width="420"><div align="left"><b><font size="2"> @1 @2 @3 </b></div></td> </tr>