Crystal Reports Tip for the Day
As I alluded to in a blog post earlier this week, I am embarking on the journey of learning Crystal Reports and integrating them into an ASP.NET site. While I have definitely learned a lot over the past 36 hours or so, it still feels a bit frustrating because sloshing through this stuff seems to take forever. The upside is that I find myself celebrating often, when accomplishing even the most trivial tasks. In any event, I've decided to add a few blog entries on my learning experiences with CR, in a hope that others who have to pick this up in the future might benefit from my hiccups along the way. (To group these CR-related posts, I added a Crystal Reports category to my blog.)
Today's Crystal Reports tip is how to display some piece of random data in a report. As you may know, Crystal Reports provides a designer that makes it (relatively) easy to create a report that is tightly bound to database data. But sometimes you have some odd bit of data floating out there that you need to have displayed, that doesn't really relate or fit in with the data being bound to the report. For example, in an invoice report, I might want to add a user-defined sign-off, like “Thank you for your business.” To accomplish this, here's what I did (and, yes, I'm more than happy to hear that I did it the wrong way, as long as you can provide a better way):
- I started by creating a new Formula Field named SignOffMessage and dragged it onto my designer precisely where I wanted it to appear (in the Report Footer, if you must know). (When creating a new Formula Field it will ask you for the field's formula. For just squirting in a value from the code-behind class, I simply left the formula blank.)
- Next, in my code-behind class, I have a reference to the actual report in a local variable named invReport (see my earlier blog post on CR for a code snippet that shows creating this invReport local variable). To set the formula field to a particular value, I used:
invReport.DataDefinition.FormulaFields("SignOffMessage").Text = valueFromDatabase
That's it, worked like a charm.
Another nice thing about Formula Fields is that they can be used to perform formulas upon existing data-bound elements. For example, my invoice report binds a set of activities to an invoice, with each activity having fields like Description, Date, AmountDue, and so on. Using a Formula Field, I can have in my Report Footer a summation of the AmountDue fields. To accomplish this, I simply created a new Formula Field and set its Formula to Sum( {Invoice.AmountDue} ).