Sunday, October 4, 2015 - Deactivating a Trigger

Just a quick note to follow trigger deactivation: 

  1. Comment the Apex test classes invoking trigger ad save changes, run test method and set trigger to Inactive in Sandbox.
  2. Deploy changes in production and this will help ensure trigger de-activation without issues.
Written by Prabha Krishnamurthy - How to set a customized “Matching Rule” for Duplicate Detection

To add a custom matching rule in Duplicate Detection, perform the following steps:

  1. Go to Setup -> Administration
  2. Select Matching RulesClick “New Rule”
  3. Select Object and Provide a Rule Name.  Then add customized filter criteria.
  4. After saving, activate the matching rule and use as explained in previous tip.

Written by Prabha Krishnamurthy - Duplicate Management with “Standard Matching Rule”

Below is a quick cheat sheet note to enable duplicate management in using “Standard Matching Rule”. Let us consider the Account object for an example and look into steps involved for enabling duplicate management on account object.
  1. Go to Setup -> Administration

  2. Select Matching Rules
  3. Activate “Standard Account Matching Rule”
  4. Now select “Duplicate Rules” option under Administration->Duplicate Management
  5. Create a New Rule for Account Object
  6. Activate the Duplicate Rule
  7. Now when you a duplicate account record is created, you will get an alert as below

Written by Prabha Krishnamurthy

Wednesday, September 30, 2015

Crystal Reports : Use Fornulas to Group

One of the most effective techniques I've learned is how to group on a formula.
Think of it this way: the logic of the formula can be whatever you want it to be. So, any "high-level" corporate logic can be expressed here.
Take for example a table called HISTORY in which are listed history items per user.
Let us create a formula that will "kick-out" a value based on HISTORY.DATE.

IF {HISTORY.DATE} > CURRENTDATE - 30 THEN "History within 30 Days" ELSE
IF {HISTORY.DATE} < CURRENTDATE - 30 THEN "History beyond 30 Days" ELSE

Now this formula can be used as a Group.

You will notice that the last line is an ELSE {HISTORY.DATE}. This is because if a {HISTORY.DATE} does NOT fall into our formula criteria, then it will be "skipped". The final ELSE works as a "catch-all".

Crystal Reports : NULL vs Zero

Depending on your usage, the returning of NULL (from a formula or running total) can be more stubborn at times.

First, check what NULL conversion options the report is using:

1. Select from the top level menu File | Report Options.
2. Look for the "Convert NULL field value to default" checkbox.

If this box is checked, NULL is returned as a special "automagical" DEFAULT value.
This typically will convert NULL to zero in formulas and running totals.

Folks who are using newer versions of Crystal will notice an additional checkbox in Report Options called "Convert Other NULL Values to Default".

This checkbox refers to the NULLs being returned by objects other than database rows (i.e. formulas and running totals). Typically a combination of both of these checkboxes is required to properly fix a zero totaling problem. (Depending on back-end database and usage)

As always, try it out.

Crystal Reports : Calculating Hours

You may need to at some point or other calculate the number of hours between two dates. Keep in mind that if you are using a robust back-end database like SQL, a data type also holds the time precision down to the second. So this could be applicable for calculating billing hours, time clock hours, etc.

To make this happen we will be using the magic of the DATEDIFF() function.
Simply put, DATEDIFF calculates the length between two dates using a specified interval.

Let us suppose that our table has two values, {TIMECLOCK.START} and [TIMECLOCK.END}.

Create a formula called {@DAYLENGTH} and insert the following text:


The 1st parameter ("n"), specifies we want an interval of Minutes. Other valid intervals are "YYYY" for Years or "m" for Months.
So the code returns the number of Minutes between the two dates and then divides that value by 60, giving the hours.

Thursday, September 24, 2015

ZOHO CRM - Restrict Access to Reports

Sometimes we have situations where we don't want all users to have access to certain reports.  The secret to restricting access to reports is through permissions on report folders.

To change the permissions on a folder, click the Edit link to the right of the folder in the Reports module:
To bring up the folder permissions setting form.
You can choose to allow all users, restrict access to only you, or define a set of users that have access to the report.

Zoho CRM - Matrix Reports Explained

I have many clients that are confused about matrix reports, so I thought an example of how they can be used would be a useful tip.

Example: Sum of potentials in each stage broken out by month

  • Reports-> Create Report ->
  • Choose "Potentials" as the module - no related data is needed for this report
  • Under Groupings Tab:
    • Choose "Stage" as row headings
    • Choose Closing Date as Column Header (specify sort and date grouping)
  • Under Columns to Total - choose Potential Amount - Sum
  • Add criteria if desired (e.g. only open potentials - pipeline), and add date filter at top (e.g. current fiscal quarter)
  • The result looks something like this (with your stages of course!)

ZOHO CRM - Schedule Reports

With Zoho CRM you can schedule reports to be delivered right to your inbox!  Here's how

  • Click on Reports in the top Navigation bar to get to the reports module.
  • Click the Report Scheduler Button near the top
  • The Scheduler Configuration form will open:
    • Name the Schedule
    • Choose the report that will be sent
    • enter start date and time
    • select a repeat cycle (none, weekly, monthly,etc...)
    • Add Recipients - these can be Users (must be active/confirmed) selected individually, by group, or by role - or non-users (simply enter email address in box provided.
    • Click Save
Recipients will receive the report as an Excel spreadsheet.

MSCRM 2015: Failed System Job View

As a CRM administrator, you need to make sure your workflows and system jobs are functioning correctly. It is a good idea to regularly review the system jobs to determine if anything is failing. An easy way to make sure you do this is to create a Failed System Job View.

Navigate to Settings > System Jobs. In the view drop-down, choose "All System Jobs." Activate the view filters and choose "Failed" from the Status Reason options.
Then, under the "More Actions" button, choose to "Save Filters to New View." Then you can give your view a name.
When you refresh the page, you will now see your new view in the view drop-down. You could also add this view to a dashboard to see it more easily and regularly.

MSCRM 2015: Goal Rollup Job Not Updating Goals

Have you noticed that your goals are not being updated by the goal rollup job that runs regularly? The first thing you should do is check that the job is not failing. You can do this by navigating to Settings > System Jobs. Then choose "All System Jobs" from the View drop-down and filter to see jobs that have failed. If it is failing, investigate further to determine why.

If you're like me, then you're still scratching your head because the job has not failed yet the goals aren't being updated. I had created several (288 actually!) monthly goals beginning in January 2015 and clicking the "Recalculate" button to update them manually was not appealing at all.

I checked my System Settings to find that the rollup was set to stop after 30 days from the end date of the goal. Aha! This is why all of my goals from earlier in the year were not updating.

I changed the number of days to 365, rescheduled my goal rollup job to run now, and then all of my goals were updated. Yay! After I knew all of my historical goals were updated, I set the expiration date back to 30 days because my old goals will only need to be updated once.

MSCRM 2015: Global Search Results & Quick Find View

Ever wonder how to change the fields that are displayed when you do a global search in Microsoft Dynamics CRM? In the screenshot below, it looks like the fields being displayed are Full Name, Account, and possibly Owner.
It turns out that the search results will display the fields associated with the first three columns of the Quick Find View. If I check out this view for Contacts, I see that I'm correct. We have Full Name, Account, and Owner.
Instead of Owner, I want the search results to display the contact's email address. With a quick change to the Quick Find View, I can make this possible.

Tuesday, September 22, 2015

GoldMine : Create a Contact while Scheduling

Did you know that you can perform a few handy contact-related actions right from the "Schedule" window in GoldMine? One of the most useful is the ability to create a new Contact.

1. In GoldMine, select Schedule | Call.

2. From within the Schedule window, click the little "person" button to the right of the "Link to Selected Contact" line. Then, select "Create a new Contact".

3. GoldMine will bring up the "New Contact" window. Fill this out normally, then hit OK.

4. You'll notice that your phone call is now being scheduled against the newly created contact.

Try it!

GoldMine : Turning on Auto-Fill

Did you know that fields can be set up to auto-fill when a user starts to type in the field?

1. Go to the field you want to have auto filled.

2. Click on the arrow at the end of the field box to give you the pop-up box with the drop
down list.

3. Click on Setup.

4. Check the box next to Auto Fill and click Okay.

5. Anytime anyone starts to type in that field it will automatically fill the field from the list.

GoldMine : Showing Summaries in Lists

As always, the most useful functions are the best kept secrets. Did you know that you can see list counts in almost any GoldMine list?

1. Right-click within the list.

2. Select "Summary" so that it is checked.

You can now see the number of rows in the bottom left hand corner of your list. This works in the Search Center, History Tab, Pending Tab, etc.

Thursday, September 3, 2015

QB Tips: Apps That Work With QuickBooks

QB Tips: Memorizing Reports

Is there a report that you're constantly using?  Did you customize a report and would like to repeatedly generate it without having to customize it over and over again?  Well, you can!  Memorize the report and all you need to do is click on it ... with minor adjustments.  Here's how!

  1. Generate a report:

      2.  Click on the "Memorize" button  

     3.  Give the report whatever name you wish   

     4.  Save your report in a specific group  

You have now saved your report and can access it, easily, whenever you need it.  When you generate the report, make sure to change the dates for the time frame desired.

Wednesday, September 2, 2015

Crystal Reports : Crosstab Summaries

I often find is helpful to display both a SUM and a COUNT within the rows of a Crosstab object. A recent client needed to see both the SUM of {INVOICES.AMOUNT} and the COUNT of invoices based on {INVOICES.DATE}.

After adding your Crosstab as normal, go into the "Crosstab" tab under "Format Crosstab"

1. Add a row to the crosstab for a SUM of {INVOICES.AMOUNT}
2. Add a row to the crosstab for a COUNT of {INVOICES.INVOICENUM}
a. What we want to count here is the uniqueID field in the INVOICES table
3. Hit OK
4. In order to make the values stand apart in the Crosstab cells, I like to change the text alignment (left and right) of each summarized field.

Crystal Reports : Dealing with Notes Fields

When inserting "notes" fields into a Crystal Report, some things must be considered:

- After inserting the field, you may specify whether or not it "can grow" (meaning vertically) by going to the fields' Formatting page and selecting "Can Grow". You may also specify how many lines it "can grow" by.

- Certain databases keep their notes in HTML format, in which case the output will look garbled. You may, again, go to the fields' Formatting page and go to the Paragraph Formatting tab, then select a "Text Interpretation". Choices include HTML and RTF (Rich Text Format).

Crystal Reports : The Specified Sort Order

When selecting sort options for your Group, select Specified Order. Notice that a Specified Order tab appears when you do so. Simply choose in which order you’d like your Group printed. This is helpful in situations (for example) when the Group named "Thirty Days" must come before "Sixty Days", yet "Ninety Days" must be the last. Note that neither Ascending nor Descending order will solve this problem.

Monday, August 31, 2015 - Duplicate Management, which objects are supported?

For's newest duplicate detection management, only certain objects are supported.  They are:

  • Account
  • Contact
  • Lead
  • All Custom Objects.

All other standard objects including opportunities is not supported.

Written by Prabha Krishnamurthy - How to use Partner Object in

This in-built object object will help to define mutual many-many relationship between account and opportunity object. Partner roles can be customized and a reverse role should also be defined for every partner role.

Steps to customize Partner role:

Click on Setup – Customize – Account – Partner Roles –

Click on New

Define the partner role and reverse role and we are all set to use it.

Written by Prabha Krishnamurthy - How to Add Additional Custom Fields to Salesforce Partner Object

The Partner Object itself does not have the ability to have custom fields added. However, if the field can be populated as part of Account and/or Opportunity, it can be added as a field to be displayed in related lists.  Here's how to select additional fields from account/opportunity object to show in Partner related lists:

Click on Setup – Customize – Account Layout – Related Lists

Go to Partner Related List –

Click on Settings icon. Select fields that needs to be displayed on Partner list and save changes.  

Written by Prabha Krishnamurthy


Say you have 10 Zoho CRM User licenses... one employee is leaving the company and another is joining, and you want to transfer Accounts/Contacts (records) ownership from the old employee to the new employee.  You have to delete the old employee first to make room for the new employee, right? And you think that that action will somehow mess with the old employee's record ownership, but it doesn't!  The system maintains knowledge of the old employee, they are just considered a deleted employee.

to make the transfer:

  • Click the Accounts Tab in the top nav bar
  • Click the Account Tools Drop down (upper right) and select Mass Transfer Accounts
  • Click the spy glass next to the Transfer From field to display the list of users
  • By default active users are displayed
  • Change the display to Deleted users by using the drop down in the upper right hand corner (as shown).
  • Repeat the same for the Transfer To selection, selecting your new active user.
  • You also have the option of defining criteria for the transfer 
NOTE - by transferring accounts, all related contacts, potentials and activities are also transferred.

ZOHO - Navigating to other Zoho Applications from Zoho CRM

When you sign up for a Zoho CRM account, you are really signing up for a Suite of Zoho Applications.  Many of these additional applications integrate very nicely and enhance the functionality of your CRM.

If you go to and sign-in you'll see a nice display of icons, each representing a difference application.

If you go to you USED to see the list of applications down the right hand side and other "Settings" type links in the main view to managing your account.  Now when you go to, you'll see the Settings-related features in tiles on the main screen, but what happened to the list of applications??

They are hiding right here: (upper left)

Simply click the Grid icon to display a list of all the Zoho Applications organized by function:

ZOHO CRM - Calendar Integration Trick

To add Events created in Zoho CRM to your "other" calendar you use, simply invite yourself to the event as a participant!

  • Create the Event as you normally would
  • Under the Participants area click the Add link
  • Add you email address (either in the top part under Users, or in the "Invite by Email Address")
  • When you save the event, choose Send Invites.
  • You'll get an email with an .ics file you can double click to add to your calendar!

Thursday, August 27, 2015

GoldMine : Requiring Input

When customizing your GoldMine record layout, you can make any field "required". This means that the user will not be able to navigate away from the Contact Record until the field has been filled.

To do this;

1. Enter Customization Mode by right-clicking on the Contact Record and selecting "Screen Design".
2. Find and right-click on the field you'd like to make Required.
3. Select "Properties".
4. Go to the "Security" Tab.
5. Check the box which says "Required Data Entry".

"Ok" your way back out. Users may need to restart their GoldMine to get the new changes.

GoldMine : Using Duration for Whatever you Want

I've had a few calls over the last couple weeks with folks who'd like to use their histories in GoldMine to generate billing for clients. I actually do this myself every week. Where the challenge lies is in the fact that the "Duration" field on a History item reads like this: "00:30:00" (30 minutes).
This makes any totaling of these durations (say, on a report or within a query) difficult to say the least.

I find it much easier to enter in "Decimal" times for my histories. So, instead of using "00:30:00" for a half hour, I use ".5" Note that the Duration field is a simple text field, and will accept almost any input you give it. So my 01:45:00 becomes 1.75 and so on.

This way, any totaling you want to do becomes easy. It is possible to "parse" out the HH:MM:SS duration value, but you'll spend more time doing  that than working on the report itself...
This also brings up a good concept; whenever possible, structure your data entry model to make reporting easier.

Try it, and have fun!

GoldMine : To Code or Not to Code

We're going to wax philosophical here for a minute. I've done a lot of service this week for clients that like to use "codes". That is, a lot of Activity Codes and Result Codes. I've seen a bazillion of these over the years and two camps emerge; those with too many and those with not enough. Too many and a system is needlessly complex; too few and the system is literally useless. But where do you draw the line?

It's all about segmentation. 
Whenever we use the word "code", we really mean "category". And when we say "category", what we REALLY mean is "segmentation identifier". It's how we know a thing is a thing. We know a Contact Record is a Prospect or Customer because we fill in the "Customer Type" field. We know that something happened in the past because it's in the History Tab, etc.

This may sound trivial, but it is fundamental to any data model design. Segmentation drives list management. Think of how many times you sort by a column in a list. How many times you filter a list based on an identifier!

So, if we're going to use the Activity or Result Code fields on GoldMine calls, we should think about the following;

1. Do I need to sort on it? If I'm looking at a list of Calls, would it help if I could sort it a different way? A good idea might be to use Activity Code to track a "pseudo-stage", like "1ST" for First Introductory Call and "2ND" for Second Followup Call. Those two identifiers could be used to sort a list to see where sales or management should direct their attention.

2. Is it information I can get somewhere else? I see a lot of folks think they need to code calls as "PRO" for Prospect and "CUS" for Customer. Which is handy to have on a Call Report, but it's information already being tracked in Customer Type on the Contact Record. If we need to see that in a list, we can always grab it from there.

3. Don't feel obligated. You wouldn't believe how many "COM"s (for Completed Call) I see in Result Code. The fact that the Call is being Completed into History already segments it as a Completed Call. I almost think this is mostly because when folks start using the Activity Code field, an empty Result Code field looks, well, bare. Like it lacks symmetry. But remember, every code you force an end-user to plug in, the closer they get to overwhelmed.

4. Don't overwhelm end-users. Most of you out there are thinking to yourselves "these codes would be a nice problem to have because I can't get anyone to complete anything". Which may illustrate my point. End users can be resistant, especially to changes which don't obviously benefit them. For example, management forcing salespeople to track Product Model in Result Code for every new business call works better after you show them how to run and sort a list of calls. I see too many data models fail over this deceptively simple-to-address issue.

And, of course, start simple. Think about it, and have fun!

Wednesday, August 26, 2015

MSCRM 2015: JS to Disable Custom Quote Number

In my previous two posts, I discussed how to create a custom quote number and use it with revisions. Now I'm going to provide a bit of JavaScript that you can use to lock the field. You'll want to do this so that users can't modify the field themselves.

1. Edit the Quote form and go to Form Properties.
2. On the Events tab, add a Form library or create new one. Then add the following script to the library. The part in quotes will be the name of your custom quote number.

function disableCustomQuoteNum(){
  var quoteNum = Xrm.Page.getAttribute("new_customquoteid").getValue();
  if (quoteNum != null) {

3. Then add the function name, which is disableCustomQuoteNum, as an Event Handler.

4. Click OK then Save & Publish the changes to your form.

Now when we look at the quote, we can see that the Custom Quote ID field is locked.



MSCRM 2015: Using Revisions with a Custom Quote Number

In my previous blog post, I provided instructions on creating a custom quote number. Now I'm going to go into more detail about using it on your forms and with the revision ID that MSCRM provides.

In my case, the client wanted to use a custom quote number along with the revision functionality that Microsoft provides. In order to do this, I had to make sure that the custom quote number stayed the same if a quote was revised. I needed it to behave in the same way as the OOTB quote ID.

1. The first thing I did was hide the OOTB quote ID on my quote form. Edit the form then open the field properties to uncheck the box that says "Visible by default."

2. Next I modified my original workflow that creates and sets the custom quote number. I added a "Check Condition" clause that checks if the revision ID is 0 or blank.

3. Then the steps from my original workflow are executed within the clause. Here is what the workflow looks like now:
4. Now when I revise a quote, my custom quote number will stay the same but my revision ID will increase as intended.