Why I Hate Crystal Reports

Over the past few months, I’ve had to deal with a number of things in Crystal Reports.  For the most part, it has just sort of worked (although with some odd behaviour).  Today, though, something really rubbed me the wrong way – worse than usual.  Bad enough for me to rant about it, and to warn other people about it.

One of the applications I get the pleasure of working on* has to do with card scanning.  A particular report shows who has scanned in a particular location.  The people who use the application wanted a change made to the report, so that instead of showing “True/False” for a particular column, they wanted it to display as “Yes/No”.  Easy enough, so I thought.  I opened up the report and created a new formula.  The column that was displaying “True/False” was actually coming from the database (a <a href=”http://thedailywtf.com/“> worse than failure</a> in itself), yet somehow within Crystal Reports was being converted to a boolean.  OK, easy enough – just convert the value in the formula to a boolean, compare on it, and display “Yes” if it’s true, and “No” if it’s false.

Nope, no dice.

Whatever Crystal Reports was doing to validate the formula wasn’t the same as how it was actually validating the data in the report.  If the formula looked like this:

If {data.SomeValue} = 0 Then

…it wouldn’t validate in the report itself.  Crystal Reports would complain that it needed a boolean in there.  If I changed it to:

If {data.SomeValue} =  True Then

… it wouldn’t validate in the formula editor.  Either way, I was screwed.  Unless…

If CBool({data.SomeValue}) =  True Then

Nope.  That didn’t work either.  Again, it would either complain in the formula editor or in the report itself.

How did I get around this?  Like so:

If CDbl({data.SomeValue}) =  0 Then

Yes, that’s right – cast it to a double.  Does that make any sense at all?  None whatsoever.  Crystal Reports seems to have the native ability to convert integers to booleans, but can’t do it in the report editor.  Nor can it properly compare on booleans.  Maybe I’m just old and cranky and like to yell at kids to keep off the grass, but everything that I’ve seen in all my years of programming (in half a dozen different languages over more than a decade) I haven’t seen something that stupid before.

It’s things like this why I never want to use Crystal Reports again.  Sure, it might be good for hacking together a quick report, but in the long run it’ll eat you alive.

Here’s a list of other things that I’ve found wrong with Crystal Reports:

  • If you have changed something in the properties of a report object, it won’t allow you to change any of it’s settings via the toolbar so long as you have something in the property window selected.
  • Objects don’t have a ‘Visible’ property, but it does have a ‘suppress’ property. This is completely backwards from everything else in Visual Studio.
  • When updating a data source for a report that contains subreports, it pops up with two message boxes for each subreport, as well as two message boxes for the main report. The report I was working on had two subreports = 6 message boxes to let me know that a data source had been updated.
  • When checking to verify that a formula is correct, the message box that pops up (notice a theme here?) to indicate that the formula is correct has a warning icon in it.  If you don’t read what says, it makes it look like something is wrong with the formula.
  • If you don’t manually call Close() and Dispose(). If they don’t get called they leave temporary files around.  This resulted in a client having 78 GB of temporary files.  It was my understanding that if something is IDisposable, the Dispose method should automatically be called.  This isn’t the case with Crystal Reports.
  • Rather than having a format string like every other .Net control, Crystal Reports controls date formatting with a dozen or so different fields: day/month/year order, separators, time formatting, whether or not to show seconds, minutes, hours, etc.
  • In order to get images to show correctly when using the web viewer control, you either need to add a handler in your web.config or to create a virtual directory in the Default Web Site with a particular name.  It seems as though the fine folks at Crystal decided that hard-coded paths and fixed names were a good idea.  I’m not the only one with this problem, and it has been around for at least 5 years.
  • The Crystal Reports web viewer will refuse to print if you use QueryString parameters named “From” or “To”.
  • Several links from one Knowledge Base article on the SAP website are password protected.  Apparently knowing how to fix problems is only restricted to SAP employees.
  • Rather than having a help link to either an external website or a local website, it hosts it starts its own web server in order to show a page with a few links on it.

There’s only one thing that I haven’t been able to figure out yet: Why hasn’t someone come up with a viable alternative to Crystal Reports?  They are ripe for the picking, and could be eaten alive by another, better product.  Perhaps the time is right that someone else comes along with a better reporting system.  I can only hope that this will happen sooner than later, so that our posterity doesn’t have to see such abominable things.

*Note: that sentence is a complete lie, and is dripping with sarcasm.  The previous developer left me with a steaming pile of feces to deal with.


  1. Steve Ballmer

    yeah, it’s called Sql server reporting services.. which has its own PILE of faeces to deal with 🙂

  2. Dan G.

    Thanks Joel. Had the exact problem you described with the boolean comparison that was driving me mad and this cleared it up. I totally agree with you on Crystal and that we need something less spooky, more standard, easier to debug reports, and FASTER. I built an application that printed pdf’s for a bunch of records and it takes over 4 seconds per report. Should be faster. I haven’t used Reporting services much, but what I’ve seen and what I’ve read makes me think it’s not much better. I’ve been considering my company’s next project and I’ve actually considered building an improved reporting system. Maybe we should start with a small, simple, and solid platform and build from there. Thanks for sharing.

  3. Ben

    If CDbl({data.SomeValue}) = 0 Then

    Nope… does not work either. I have similar problem…

    If CDbl({Tablename.colname}) = 0 Then

    which evaluates always to “Condition1Text”

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s