Crystal Reports versions over time (2018)

Sunday 12 August 2018 @ 9:41 am

I do this chart each year based on my newsletter subscribers. It shows the version of Crystal Reports that they were using when they signed up for the newsletter. Over time, it shows which versions have staying power and how quickly new versions take hold. I have included numbers for 2018, even though the year is only about two thirds over. Those numbers will shift a bit in next year’s chart when 2018 is complete.

The chart shows that over 25% of my 2018 subscribers are still using Crystal Reports XI (circa 2005) which is version 11.x. Last year I was concerned that some of these users might really be on CR 2011 (version 14.o) since those do get confused.  But when I Emailed some of those people they all said that they were using the old XI version. For some of them, upgrading past Crystal Reports XI would be a major undertaking, because all the newer versions are limited to the .NET runtime. Customers that have built an application around the older runtime engine would have to rebuild the Crystal components of that app in order to upgrade to a later version of CR.

Version of Crystal Reports used by my new subscribers each year

Why is the group tree ODD sometimes?

Thursday 9 August 2018 @ 6:15 pm

When you preview a report in Crystal the left side of the screen should show you the “group tree”.  This lists all of the groups in the report.  It also allows you to go directly to the first page of any group, just by clicking on that value in the tree.

But a few times a year I work with a report where the group tree is in “Only Drill-Down” mode (ODD). In this mode, every entry in the group tree is accompanied by the drill-down indicator (a magnifying glass).  Clicking on an entry no longer takes you to the first page of that group but instead it takes you to a drill-down tab for that group. To get to the correct page for a group I have to do a search.

It is a minor irritation so I have let it go for years.  It just never seemed worth the time to figure out why some reports do this. But I figured it had something to do with the Hide/Suppress properties of the Group Header (GH) and Group Footer (GF). This week I got an ODD report from a customer, and so I decided to test all the combinations and see which ones were ODD.

I found four rules that control this behavior:

  • If either the GH or the GF is visible you get the normal group tree.
  • If both of those sections are suppressed you get the normal group tree.
  • If both of those sections are hidden you get the ODD behavior.
  • If one of those two sections is hidden and the other is suppressed you get the ODD behavior.

I can’t explain the reasoning behind this pattern (or even the purpose for the ODD behavior) but at least now I know how to change it when I see it.

RPT management utilities for 2018

Friday 27 July 2018 @ 12:57 pm

I have just updated my comparison of RPT management utilities for 2018. These are tools that allow you to scan, document, compare and in some cases batch update RPT files. The list includes 9 tools:

Report Runner Documentor by Jeff-Net
R-Tag Documentation and Search by R-Tag
CR Data Source Updater by R-Tag
Visual CUT and DataLink Viewer by Millet Software
Report Miner by the Retsel Group
Code Search Professional by Find it EZ Software Corp.
Dev Surge 365 by Find it EZ Software Corp.
.rpt Inspector 3 Professional Suite by Software Forces, LLC
.rpt Inspector Online by Software Forces, LLC (new)

Cloaking Groups

Tuesday 24 July 2018 @ 7:49 pm

There are times when you want a group level to be optional. Maybe you want to give the user a choice between having 1 group level or 2 group levels in a report. While it is easy to suppress Group Headers and Group Footers for group 2, this doesn’t make the group level go away. Group 2 will still put the records in order, and will take priority over any sorting you have specified. A group can’t be removed based on a parameter, but you can have the same effect by ‘cloaking’ the group. Even though it is still there, it has no effect on the report.

To cloak a group you first create a parameter with 2 choices. For example, our user has a parameter called {?Group choice} that allows them to select the number of group levels:

Group by State only
Group by State and City

You set Group 1 to use the field “state”. Group 2 is set to use a formula that says:

If {?Group choice} = “Group by State only”
then “All”
else {table.City}

So, if the user picks “Group by State and City”, then the second group will be the field “city”. But, if the user picks “Group by State only”, then Group 2 will be one big group. Since all the records in Group 2 have the same value, the details will sort as if there were only one group.

So what do you do with the Group 2 Header and Footer? You suppress these sections with a suppress condition that says:

{?Group choice} = “Group by State only”

Now the Group 2 has no effect on the sort, and it is invisible.

A more complex example is when the user wants to see the Top 10 customers but wants to choose if the Top 10 is based on the Average or the Sum of the amount. There is no option for this in the Group Sort Expert. The workaround is to create a parameter so the user can choose either “Sum” or “Average”. Then create two cloaking formulas like the one above, using the Customer field and opposite IF conditions. Group on both fields and set the Group Sort for one group to the average and the other to the sum. Add suppression logic to the group headers and footers to completely cloak one group or the other.

First day of the calendar quarter

Wednesday 18 July 2018 @ 9:53 pm

Finding the the beginning date for most date periods is simple. For example:
First day of this Year: Minimum (YearToDate)
First day of this month: Minimum (MonthToDate)
First day of Last month: Minimum (LastFullMonth)
First day of this week: Minimum (WeekToDate)

But there isn’t a comparably simple way to get the first day of the current calendar quarter. So if you ever need that calculation you can use the following formula:

Local numberVar x := Month (CurrentDate);
Date (
Year(CurrentDate), //Year
if x > 9 then 10 else
if x > 6 then 7 else
if x > 3 then 4 else 1, //Month
1 //Day

If you want the beginning of the quarter related to a field other than today’s date you can substitute a database field, formula or parameter in the two places that say “CurrentDate”.

The end of Crystal Dashboard Design

Tuesday 3 July 2018 @ 11:26 am

I just read an interesting blog post from Andrew Baines entitled “Farewell Xcelsius/BOB Dashboards/Crystal Dashboards“.

Apparently, SAP will stop supporting their dashboard tool some time next year, and they have dropped it from the price list. I also just checked the SAP “30-day trial” page and the listing for “SAP Crystal Dashboard Design” is no longer listed there.

I can’t say that I will miss this tool, since it never really fit with what I did. You can read my approach to dashboards here. But if you are using this software it is time to start looking for something else.

Set Datasource Location from tables to an SP

Saturday 30 June 2018 @ 11:14 pm

A customer had a report that read a handful of tables. He decided to write a stored procedure to return the same data as the tables. He planned to use “Set Datasource Location” to point the tables to the stored procedure, but soon realized that it wouldn’t work.

He could set the location of any ONE of the tables to the SP, but not all of them. If he tried to set the location of the second table to the same SP, Crystal would create a second instance of the SP and link it to the first, matching the links used in the original tables. I have never found a way to to set the location of several tables to a single query/view/SP.

So what is the best solution if you have to do this? Identify the table that provides the most fields to the report, and set the location of that table to the SP. That will map the largest group of fields automatically. The other tables will have to be removed and their fields added manually.

Another thing to keep in mind is that it is usually easier to change formulas than it is to delete and replace database fields on the report. So if one table is used primarily in formulas while another table provides raw fields for display, you might want to set the location of the table that provides the raw fields. Jamie Wiseman wrote an article years ago about creating reports that could be easily set to a new datasource. His method was to create a simple formula field for every database field used, then use those formulas for everything else in the report.  I sometimes do this, and I call these “feeder” formulas.  With Jamie’s method you can delete and add tables and then simply update the feeder formulas as needed.

Review Crystal Reports and earn a $25 Amazon gift card

Friday 22 June 2018 @ 5:38 pm

The SAP Vancouver office celebrated the 25th anniversary of Crystal Reports last fall. They even sent me a commemorative pin as part of the celebration.

Now, in keeping with the ’25’ theme, they have asked TrustRadius to collect independent user reviews of Crystal Reports and Crystal Server. If you complete the process you get a $25 Amazon Gift Certificate.

Note that these reviews are structured and very detailed. I wrote a review of Crystal Reports, both to support the product and so that I could write about the process for my readers. It took me about an hour to complete. There are 9 different sections to the review and many of the sections ‘recommend’ at least 50 words. The sections are:

  • Use Case
  • Pros
  • Cons
  • Rating
  • Alternatives
  • Features
  • Data Sources
  • Data Sharing
  • Context

You can read my review here.

A few other notes.
1) TrustRadius is independent of SAP and SAP doesn’t see the reviews before they are published. However TrustRadius has to approve and publish your review before you get your gift card. It can take up to a week after your review is published to get the card.
2) Before you can start the process, you have to sign into TrustRadius using your LinkedIn account.

If you decide to write a review you can use this link. If you encounter any problems, let me know.

Crystal Reports new features by version

Friday 15 June 2018 @ 11:25 am

My customers use a wide variety of Crystal Reports versions.  Just this past week I fixed a report for a customer using CRv8.5, which was released somewhere around 2001. There have been 8 newer releases since then and most have included new design features. Sometimes I forget which versions are needed to do certain things. Often I have tried to update a report for a customer, only to realize that my Plan A won’t work in their version. Whenever I need to check when a specific feature was introduced, I refer to the front page of my site which has links to my reviews for each new Crystal release. These articles include the list of new features for each version. But, this still means scrolling through through several pages to find each feature.

To make the process simpler I have created a grid that lists all of the new features added in the past 15 years, roughly 50. For each of the features I show when it was introduced, and which versions that support that feature.  Not only will this help me identify which features I can use for specific customers, it will also help me answer questions about the value of upgrading. I can point a customer to the grid and they can quickly see all the features that have been added since their version.  They can then decide if those features are worth the cost of the upgrade.

You can check out the grid on my site.  The features listed in blue are the ones I use the most.

Another free method for comparing rpt files

Friday 8 June 2018 @ 4:56 pm

One of my readers, Jiri Bus, needed a thesis project.  He decided to write an application that performed a detailed comparison between two reports and showed all the differences. He calls it rpt_diff and released it under the MIT open source license. I recently wrote up a simple method that relies on the features included in the “Report Definition” export.  Jiri’s project takes a deeper dive into the object model and includes many more features for comparison.
His application is free but it takes a few extra steps to deploy and use. Here is what you need to do to use rpt_diff:

1) Download and install the 32-bit Crystal Reports runtime for .net.
2) Download and install KDiff or another equivalent program for comparing text files.
3) Create a new folder for the rpt_diff application file and associated files.
4) Download the (already compiled) rpt_diff.exe and place it in the new folder (no need to install it).
5) Place the two reports you want to compare into that same new folder.
6) Right click on my sample batch file and download it in the same new folder:

sample batch file

(Note – if you just click on the file link the file will open in the browser rather than downloading.)

7) Edit the batch file so that it has the correct path to KDiff and the correct names of the two rpt files to compare.
8) Save the modified batch file, close the file and then run it by double-clicking on it.

You should see two XML files open in KDiff, with all their differences color coded.

Any time you want to compare another pair of files, just copy them to this folder and put their names into the batch file.

And thanks again to Jiri Bus for sharing his work.

«« Previous Posts
Recrystallize Pro

The Expert Series