Opinions of ReportBuilder
Hi,
I've been using the same report writer since D1, and have come to the
conclusion that it may be time to convert to a new report writing system.
I've searched around at different report writers, and so far, only one has
been able to raise to a standard that may make me consider changing report
writers - and that is ReportBuilder.
Firstly, I'm interested in any opinions or suggestions that people may have
about Reportbuilder. (I understand that they are most likely biassed, being
in this newsgroup, but that's fine - at least it'll give me more selling
points to give to my wife. ;-)
Also - apart from any opinions you may be able to give me, I'm also
interested in the following areas, and if ReportBuilder is capable of doing
this. (And how difficult. )
1) Their's talk about a query designer within the report. Does this work
with DBISam?
2) Can someone confirm that there are no external packages (dll's) that need
to be shipped. (I like shipping only a .exe with my program).
3) I like to create a default header for reports in each of my application.
In the past, I have created one band on a "master report" of my application,
where I place things like Logo's, addresses, contact information, etc. Then
when I print each seperate report from my application, it 'pulls'
information from this band into a pageheader band on the report I am running
before it compiles the report. This way all reports I have look uniform
(same header), and I only have to change this in one spot for it to change
for all reports. Can this be done with Reportbuilder easily?
4) Is it possible to have the report manually step through the underlying
datasets. (ie - instead of the report automatically going to the next record
in a table, and finishing when it gets to the bottom, I have events where I
tell the table when to skip to the next record, and when the table is
finished).
5) Is it easy to programically (during design time), specify which printer a
report will print to (or to allow users to select a default printer for each
individual report).
I'd appreciate any feedback (as long as it's not a flame ;-)
Thanks & Regards
Adam.
I've been using the same report writer since D1, and have come to the
conclusion that it may be time to convert to a new report writing system.
I've searched around at different report writers, and so far, only one has
been able to raise to a standard that may make me consider changing report
writers - and that is ReportBuilder.
Firstly, I'm interested in any opinions or suggestions that people may have
about Reportbuilder. (I understand that they are most likely biassed, being
in this newsgroup, but that's fine - at least it'll give me more selling
points to give to my wife. ;-)
Also - apart from any opinions you may be able to give me, I'm also
interested in the following areas, and if ReportBuilder is capable of doing
this. (And how difficult. )
1) Their's talk about a query designer within the report. Does this work
with DBISam?
2) Can someone confirm that there are no external packages (dll's) that need
to be shipped. (I like shipping only a .exe with my program).
3) I like to create a default header for reports in each of my application.
In the past, I have created one band on a "master report" of my application,
where I place things like Logo's, addresses, contact information, etc. Then
when I print each seperate report from my application, it 'pulls'
information from this band into a pageheader band on the report I am running
before it compiles the report. This way all reports I have look uniform
(same header), and I only have to change this in one spot for it to change
for all reports. Can this be done with Reportbuilder easily?
4) Is it possible to have the report manually step through the underlying
datasets. (ie - instead of the report automatically going to the next record
in a table, and finishing when it gets to the bottom, I have events where I
tell the table when to skip to the next record, and when the table is
finished).
5) Is it easy to programically (during design time), specify which printer a
report will print to (or to allow users to select a default printer for each
individual report).
I'd appreciate any feedback (as long as it's not a flame ;-)
Thanks & Regards
Adam.
This discussion has been closed.
Comments
Being a Digital Metaphors engineer, my opinion of ReportBuilder is probably
obvious so I will gladly answer your questions below and hopefully some
others reading this newsgroup will give you their opinions on our product's
reliability, support, features, etc...
1. Yes. ReportBuilder Pro comes with DADE (Data Access Development
Environment). This adds a new section to the Report Designer that enables
developers and end-users to visually design and preview SQL queries. We
provide many database plugins for DADE (including DBISAM) along with demos
to make connecting to a database very simple.
2. Yes, it is possible to ship your application as one executable using
ReportBuilder. This is granted you do not need to ship with several
different language translations in which case you will need to install the
included language .dll files on your user's machine for the translation to
show up.
3. All Reports are created as Templates which can be saved as files (.rtm)
or saved as a BLOB field on a database. It is possible to create a template
that just includes your header information and dynamically load that into a
Subreport in your current report's header band. This would give every one
of your reports a uniform header without having to recreate it each time.
An example of how to do this can be downloaded below.
http://www.digital-metaphors.com/tips/HeaderUsingSubReport.zip
4. ReportBuilder uses a component named TppDataPipeline which essentially
connects any TDataSet descendent to a Report component. The DataPipeline
includes methods that give you the ability to move forward, backward and set
bookmarks to navigate through the connected data.
5. There is a complete PrinterSetup class which can be accessed from the
Report object that controls most aspects of the printer to be printed to and
it's options. These options can be set as default at design time or at
runtime by an end-user before the report is printed or in the print dialog
(which you can customize).
Feel free to download a trial version of ReportBuilder from our website and
work through some of our demo applications for a better look at what
ReportBuilder is capable of. I hope this information helps .
--
Nico Cizik
Digital Metaphors
http://www.digital-metaphors.com
way back i started reporting in QR, wich was a real pita
as soon as rave came out i bought it to dump it rather quikly (although i
was very fond of the inheritance features)
then i started with reportbuilder and never looked back
and i can say i've done some fairly complex things with rb, my biggest rtm
file is 1,5 Gb, consisting of sub reports in sub reports in sub reports and
so on
furthermore i've found the support to be superb throughout the years, and
i'm reportbuilding since version 3 or 4 i guess
defenately have a look at RAP
cu
marc
Thanks for your reply. I have taken your advice, and downloaded the demo
copy. I'm enjoying what I'm seeing so far, but have a few queries please:
(.rtm)
template
a
I'm trying to do this, but keep it all contained within the .exe. The script
I've tried is as follows:
var
tsub : TppSubReport;
ts1 : TStream;
begin
tsub := TppSubReport.Create(Report.Header);
tsub := TppSubReport.Create(Self);
tsub.ParentPrinterSetup := False;
tsub.Band := Report.headerband;
tsub.ResetPageNo := False;
ts1 := TMemoryStream.Create;
reporttemplate.ppHeaderBand1.Report.Template.SaveToStream(ts1);
tsub.Report.Template.LoadFromStream(ts1);
Report.Print;
tsub.Free;
freeandnil(ts1);
end;
Report refers to the current report that I'm going to print, and that I want
the 'template' header attached to. ppHeaderBand1 refers to a header band
stored within a TppReport, in a form called reporttemplate. (That I want to
'copy' across to the current report).
I get an access violation when I call the
tsub.Report.Template.LoadFromStream(ts1);
Can you please show me where I'm getting this wrong. Thansk.
set
Fantastic. Is it possible to manipulate this, even if the TppDataPipeline is
not connected to any sort of dataset?
Thanks very much for your help.
Best Regards
Adam.
Thanks for evaluating ReportBuilder!
For your first question. To create a subreport in code you will need a
TppSubreport (the component you place on your main report) and a
TppChildReport (the acutal design of the subreport and descendent of
TppReport). Check out the article I copied at the bottom of this message
for instructions on creating a subreport in code. Also, if you are looking
to keep your entire application in one .exe, you could also simply place
another TppReport component on your form, stream its template and load it
into a subreport in your main report. This could make things a bit easier
at first.
In addition to the TppDataPipeline, ReportBuilder also comes with a
JITPipeline and TextPipeline. The JITPipeline can be used to connect to
just about any type of data... from an Excel worksheet to a TStringList.
This pipeline also gives you the most freedom to do what ever you want with
your data. If you would like to see a few examples of what is possible with
the ReportBuilder Pipelines, please check out the Report Demo located in the
\RBuilder\Demos\1. Reports\... directory. Demos 111-120, and 131-140 should
give you a better idea what is possible using RB.
-------------------------------------------------
TECH TIP: Creating a SubReport in Code
-------------------------------------------------
A subreport is comprised of two objects:
1. SubReport control
The subreport control is added to a band of the
'parent' report. It has properties such as
ShiftRelativeTo, PrintBehavior, etc.
In the Report Designer, the subreport is drawn
as a rectangle.
2. ChildReport
The child report is a descendant of CustomReport and has
most of the same properties as a standard Report.
The child report has a separate layout workspace in the report
designer that is accessible by selecting the tabs at the bottom
of the designer.
When dynamically creating a subreport in code you need to
create the subreport and the underlying child report.
The subreport.Report property can then be used to access
the child report.
This is demonstrated in the following example:
var
lSubReport: TppSubReport;
lReport: TppChildReport;
lLabel: TppLabel;
lDBText: TppDBText;
begin
lSubReport := TppSubReport.Create(Self);
{add to the main report's detail band}
lSubReport.Band := ppReport1.DetailBand;
{create the child report (parameters: main report) }
lSubReport.CreateReport(ppReport1);
lReport := TppChildReport(lSubReport.Report);
{assign a datapipeline}
lReport.DataPipeline := plCustomers;
{create the default set of bands}
lReport.CreateDefaultBands;
lLabel := TppLabel.Create(Self);
lLabel.Band := lReport.TitleBand;
lLabel.Caption := 'Customers';
lLabel.Font.Name := 'Times New Roman';
lLabel.Font.Size := 24;
lDBText := TppDBText.Create(Self);
lDBText.Band := lReport.DetailBand;
lDBText.DataPipeline := plCustomers;
lDBText.DataField := 'CustNo';
lDBText.Color := clYellow;
lDBText.Font.Name := 'Times New Roman';
lDBText.Font.Size := 12;
end;
--
Nico Cizik
Digital Metaphors
http://www.digital-metaphors.com
So far I have enjoyed my short bit of time playing with your demo - and
really like what I've seen so far. Thanks!
Exactily what I'm looking for! This would be fantastic. :-) I've tried to
do this with the code you attached to the bottom of your last email, as
follows, but I still get an access violatoin. Can you please check the code
below , and see if I've missed anything. If not, would you mind if I emailed
you a copy of my little test project, so you can see what's happening?
procedure TReportTemplate.Printit(Report: TppReport; Header : TppSubReport);
var
tsub : TppSubReport;
tchd : TppChildReport;
ts1 : TStream;
begin
if not assigned(reporttemplate) then
Application.CreateForm(Treporttemplate, reporttemplate);
tsub := TppSubReport.Create(Header);
tchd := TppChildReport.Create(tsub.Report);
tchd.DataPipeline := reporttemplate.ppJITPipeline1;
tchd.CreateDefaultBands;
ts1 := TMemoryStream.Create;
reporttemplate.ppHeaderBand1.Report.Template.SaveToStream(ts1);
tsub.Report.Template.LoadFromStream(ts1); **********ACCESS VIOLATION
HERE*****
Report.Print;
tsub.Free;
freeandnil(ts1);
reporttemplate.free;
end;
Thanks & Regards
Adam Hair.
Thanks very much for your input. Also - being the only one to reply (Besides
Nico), and to have such a good report, you may strike it lucky and get a
discount on the next update.
Cheers
Adam.
and
Please dismiss my last post, as I found out what was wrong.
I still needed to call Tsub.CreateReport(Report);
Thanks for all your help...
Adam.
used QuickReports (only because I was required to and the existing reports
were built with it) and absolutely hated it. I have demonstrated Report
Builder to my members in my users group and everyone was floored by it's
ease of use and short learning curve.
While I am no expert with Report Builder, I am the local "guru" and "flag
waver" for it. It has made life much simpler in the reporting arena. I
still have questions from time to time but the Digital Metaphors team has
always been quick to try to help and for the most part successful. The few
times they have been stumped was due to third party components used in the
reports.
I would strongly recommend Report Builder as your reporting tool especially
if you are starting a new project.
Sincerely,
Mark Greenhaw
One Domain, Inc.
--