Thursday 21 June 2007

Real-world tools #1: ReportBuilder

There are some third-party components I use that I'm still not sure about, but that are so embedded in my work now that the thought of changing them isn't all that appealing. ReportBuilder (RB), by Digital Metaphors, isn't one of those. This, it turns out, is one of the best decisions I ever made. My experience below is based on version 10 Enterprise.

I think I first read about it in the Delphi Informant magazine about eight or nine years ago when an article was written that was a semi-tutorial and review at the same time. One of the nice things for me is that this is all that Digital Metaphors do: a report writer for Delphi. The product has now been around for a long time and during the time that Delphi Informant was running, ReportBuilder won Best Reporting Tool and Best Product of the Year for several years running.

There are a few really good reporting solutions out there, all of which are such a pleasure to use after using QuickReports! I guess a lot of Delphi developers use Rave Reports since it started being bundled with Delphi, but by the time this had happened, I was already ensconced in ReportBuilder.

For a start, it is written fantastically well. If you ever needed convincing that object-oriented code was the way forward but and never looked at the Delphi VCL, you should see ReportBuilder's code. It's simply the most extensible, accessible and flexible code I have ever come across. There isn't a part of the software that you can't change, get to, manhandle or simply read. As each version progresses and they add new features, they actually go back and make the existing features easier to use as well by exposing more properties.

For me, the best example of this is the report query itself (if you're not attaching to a dataset which, of course, you can). Once you have built up your query (using either the standard Query Wizard or Designer, or your own custom Query Wizard or Designer), you can then access the query as an object. And each part of that query is an object too, so you have the Criteria object and the Join object, etc. You can access this at run-time so you can amend the query to suit your needs just before the report runs, or at least see the query that has been generated for you. Simply use the object properties and methods to change the query and the SQL text itself is updated. This is simply genius and so much easier than having to manually trawl through the query text in order to add a table and its join at a later stage.

As I mentioned, any of the wizards or dialogs can be descended from to make your own class, which you then register with RB and use those instead.

And this mechanism is what allows it to communicate with any database class out there. Of course you're given default support for the BDE, text files and "Just-In-Time" data sources, but because they all descend from a base class, you can use any others on the market. I myself wrote ones for Titan Access and Titan SQLAnywhere by Reggatta Systems when we used those components (more on that another day), and I've had some input on the class for ODBCExpress. Once compiled, RB can connect to your third-party database interface and you'll never think about it again.

Similarly, the new email feature in version 10 supports MAPI and Indy 9 and 10 from different classes, but if you use another SMTP facility then a new class can be derived to support it.

Like Delphi, RB comes in different flavours for different prices. Standard is the entry level system which only allows you to write reports; the next step up, Professional, allows you to include the designer within your software to offer a report-writing solution. Enterprise adds RAP capability which I'll come to below, and Server Edition adds web server support for displaying your reports on the web.

RAP was formally introduced I think in about version 6, although it had been available in beta stage for some versions prior to that. Report Application Pascal is basically a mini-Delphi within the report writer, whereby you can add code to events of the report or any of its components - just like a TForm and the components you drop on it. With each new version, the RAP language expands allowing more and more control over the look and data output of your report. This is so powerful that I can't imagine how I ever wrote a report without it. If you use Crystal Reports, it's similar to the formula language used within it. And like Crystal, you can extend it if a method or class you want isn't in it.

This isn't meant to be a sales pitch for Digital Metaphors so I won't go on to list all of its features, but I should commend them for their excellent technical support via the newsgroups. There are groups for the different sections of report writing and often they will contact you directly if you have raised an issue so you can sort it out between you before the newsgroup is given the solution.

No matter what happens, this is one toolset that actually drives which version of Delphi we use, and as ever they are supporting the latest version of Delphi almost as soon as anyone.

Personally, I believe ReportBuilder is about as good as third-party components get. We recently made significant database changes to our main software in order that we could move forward with bigger and better features. This wasn't an easy change, it took almost 6 months to get the software working as it was before the changes, and of course it was going to affect every user-defined report written using our software, over which we have no control (that's the point after all, isn't it?). So how did we get all these user reports to play nicely with the massive database restructure? We wrote a conversion utility that changed the SQL of the reports, using RB's SQLBuilder object. How easy did that make it? Well let's just say that I'd still be manually changing them now if that wasn't available. As it was, we never received a single user report by email to convert; we could see the reports as code, change the code as necessary, and save it back.

That alone was worth the price.

9 comments:

Fernando Madruga said...

I used a prior version of ReportBuilder while working on an in-house job, and liked it very much. They have a standalone program for you to try out the reports and create your owns, even without having a development tool installed, and that complements the tutorial they have.

A *very* cool flexible and powerful report generator and most likely the one I'd use if/when I need to do something that requires report generation...

Unknown said...

Fernando

I'm glad you liked it, the real gem is when you come to embed it in your software and realise you can do practically anything with it.

Third-party components can be a very personal thing to developers and there's a sense that you have to defend the choice you've made because you've invested time & money in it. It's likely that some people reading this will have had an awful experience with RB and will agree with you & I, but that's the joy of an open community. I welcome the debates, as long as they're civil.

Trust me, some of the future posts may not be so out-and-out complimentary about these component sets though!

Anonymous said...

100% agreed, Reportbuilder Rocks!

Anonymous said...

Like many other Delphi applications and components, ReportBuilder's development now appears to have stagnated (they abandoned a VCL.NET port and are focusing on a .NET version?). And there is still so much room for improvement. I hope they turn it into an open-source project before it disappears, or at the very least include the RAP source code.

Steffen Friismose said...

I absolutely agree. ReportBuilder is a wonderful tool. We have been able to change practically anything we have wanted to, and have a reporting solution uniquely fitted for our customer base. I can only recommend this tool, as the supports is among the best.

I would like to know what comments you had to the ODBCExpress DADE plugin, as I re-wrote it some time ago. We do not use it anymore, so it might be outdated. If it needs a bit of work, I would be happy to do it.

To "anonymous": Development have not stagnated - at least we have no problem with the pace they keep.

GreenparkPaul said...

I've been using RB 7 since 2001 as part of an integrated reporting solution built-in to some 2rd party software that we use. Its soo much better that Quick Reports/Rave that I also use it in our in-house Delphi projects.

PS. I also live in Plymouth, although I work in Paignton - 70 mile daily round trip commute :-(

Any jobs going at Carval?

Paul Bennett.

Unknown said...

Nothing at the moment Paul but send me a CV as it might be a matter of time. Send it to the Plymouth address at the bottom of carval.co.uk.

Anonymous said...

I've used ReportBuilder since v4. It's typically always been a great but heavyweight solution. It continues to live up to that reputation IMO.

However, when I want to deliver something more lightweight, I am comfortable using FastReport as well. It's also a component set that has only improved with age while keeping it's smaller footprint.

Jacob said...

Just to give an opposing view point... I evaluated ReportBuilder (version 7 I think) a few years ago when I was starting a project that would have lots of reporting and I hated it. Some of the things that really bothered me:

-No support for simple expressions. e.g. Say you wanted to concatenate two names fields together. i.e. [lastname] + ", " + [firstname] or something like that. From what I could tell you would either need to write callbacks in Delphi or would need to purchase the high end version of the product with their own scripting language. It boggles my mind that a feature that is pervasively supported in lots of other reporting packages would be so complicated. Perhaps there was a way to do this but I couldn't find it in the docs...

-Terrible documentation. From what I remember it was hundreds of pages of mundane step by step instructions like:
1. place text box on form
2. set left property to 50
3. set top property to 20
4. etc...

-Lots of plumbing components were required. Connecting a report to some data required about four components pipelined together. To make it worse, it appeared as the components couldn't be easily reused because they all individually streamed their settings. Making it impossible to easily manage reports in a single file.

-Forced use of it's visual tools like the SQL statement designer and sorting/grouping settings. I like to minimize the actual number of reports in my projects by making reports dynamic enough to accept various data sets sorted and grouped according to runtime choices. From what I could tell all this stuff could only be done using the visual tools.

Now perhaps these aren't real problems and it was my inexperience with the product that made it difficult to use, but I ended up chosing another much more useable package.