Crystal Reports: how to inventory hundreds of .rpt files before a migration
Why reporting breaks during a legacy migration, how to find every .rpt file, how to work out which ones are still used, and how to recover business logic hidden in report formulas.
Best for: Anyone planning to replace an application that has Crystal Reports attached to itThe inventory step almost always shrinks the project. It is worth doing before you commit to a number.
Who this is for
Project sponsors and IT managers replacing a legacy application that has Crystal Reports attached.
Question this answers
How much work is our reporting going to be, and how do we find out before committing?
What you'll leave with
Why .rpt files are a separate system from your application
How to locate every report, including the ones nobody mentioned
How to establish which reports are genuinely in use
Why report formulas often hold business rules that exist nowhere else
How to stage the work so reporting does not block the migration
Reporting is what derails legacy migrations, and it derails them late. The
application gets scoped, the budget gets approved, and then somebody discovers
four hundred Crystal Reports that nobody counted, each with its own connection
string, pointing at a database that is about to change shape.
The good news is that the inventory almost always makes the project smaller
rather than larger. This guide is the method.
Why reporting breaks during a migration
The core fact, and the one that surprises people: a .rpt file is
largely self-contained. It typically holds
its own database connection details
its own SQL, often written directly into the report rather than calling a stored procedure
its own formula logic, written in Crystal's formula language
its own grouping, sorting and formatting rules
So the reports are not really part of your application. They are a parallel
system that happens to point at the same database. Change the database
underneath and every report that reads a changed table stops working, all at
once, with no warning at build time.
It is also why reports survive application changes that everybody expected to
break them, and then break during a change nobody thought was risky.
Step 1: find every report
Reports are rarely in one place. Search for *.rpt across
everywhere, not just the obvious folder:
The application server and any reporting server
Shared network drives, including departmental ones IT does not manage
Individual desktops, particularly finance and operations staff
Any scheduling tool that emails reports out overnight
Attachments in shared mailboxes, which is where the version somebody actually uses often lives
For each one, record the filename, where it was found, the tables it references
and the connection it points at. That last field is what tells you whether it
will survive the migration.
Expect duplicates and near-duplicates: SalesSummary.rpt,
SalesSummary_v2.rpt, SalesSummary_FINAL.rpt and
SalesSummary_FINAL_use_this_one.rpt. Resolving which is current is
part of the inventory, and it is usually quicker to ask the person who runs it
than to compare the files.
Step 2: work out which are actually used
This is where the project shrinks, and it is worth doing carefully because the
saving is large.
Ways to establish real usage, in rough order of reliability:
Scheduler configuration. Anything on a schedule is being produced. Whether anybody reads it is a separate question worth asking.
File access timestamps. Crude, and affected by backups touching files, but a report last opened in 2019 is a strong signal.
Application logs, if the application launches reports and logs it.
Ask the people. Go to finance and operations with the list and ask which they run. This is the most reliable method and the most commonly skipped.
In our experience the live set is a small fraction of the total. A system with
four hundred report files often has thirty that anybody would notice
disappearing. The other three hundred and seventy become an archive, which costs
almost nothing compared with rebuilding them.
Step 3: recover the logic in the formulas
Crystal formulas are worth reading even for reports you are not going to rebuild.
They routinely contain business rules that exist nowhere else in the
organisation, because somebody needed a figure calculated a particular way and
the report was the fastest place to put it.
Typical examples we find:
How a margin is actually calculated, including which cost components are excluded
Which customer or product categories are deliberately left out of a summary, and why
Date logic for a financial period that does not match the calendar
Rounding and tolerance rules applied before a figure is presented
Exception cases hardcoded for a specific customer years ago
If a report produces a number the board sees, read its formulas before
replacing it. Rebuilding the report from the visible output rather
than the formula is how organisations quietly change what a figure means, and
nobody notices until somebody asks why this year does not compare with last.
Step 4: rebuild and reconcile
For the live set, rebuild in whatever reporting tool suits where the data is
going and who writes reports. The tool matters far less than the reconciliation.
Reconciliation means running the old report and the new one over the same period
and comparing figure by figure until they agree. Not approximately, exactly.
Reporting is the part of a migration the business checks first and trusts least,
and a single unexplained variance will cost you more credibility than the whole
rest of the project earns.
Keeping Crystal while you change the application
A useful and underused option: if the database structure survives the migration
largely intact, the Crystal reports can keep running against it while the
application is replaced. You then deal with reporting as a separate project
afterwards.
This works when you are replacing the application layer and keeping the
database. It does not work when the data model itself changes, which is the
case in most true legacy migrations, so check early rather than assuming.
Either way the inventory comes first. It is a few days of work, it usually
reduces the reporting scope by an order of magnitude, and it turns the one part
of the project most likely to produce a nasty surprise into a known quantity
before anybody commits to a number.
Key takeaways
A .rpt file usually holds its own database connection, its own SQL and its own formula logic. It is not really part of your application, which is why it breaks when the application changes.
Reports are almost never in one place. Expect to find them on the server, on desktops, in email attachments and in a folder somebody made in 2014.
The great majority of reports in a mature system have not been run in years. Establishing which are live is the single biggest cost reduction available.
Crystal formulas frequently contain the only written definition of how a figure is calculated. Losing them loses knowledge, not just a report.
Keeping Crystal while you replace the application is a legitimate way to stage the work and reduce risk.
Ask it here and it comes straight to Kasun, who wrote this. No sales call, no obligation, and a real answer even if the answer is that you do not need us.
Kasun Wijayamanna Founder, replies within one business day
Get Started
Want help choosing the right next step?
Tell us what you are comparing, replacing, or trying to improve. We will come back with a practical recommendation and realistic scope.
Australian owned and operated
Built here. Your data stays here.
No offshore development.
Everything is written by our own team in Australia. Nothing is subcontracted overseas.
Your data stays onshore.
Hosted in Australia, on infrastructure you own, under Australian law.
Every state, not just ours.
Perth, Melbourne, Sydney, Brisbane, Adelaide and everywhere between.
A personal promise from
Kasun Wijayamanna
Founder & Lead Developer, HELLO PEOPLE
“When you work with us, you get a clear price, an honest timeline, and the same person you spoke to on day one, right through to delivery.”
Fixed prices, in writing
Your quote is the price you pay. No surprise invoices, no creeping scope.
Realistic costs, honest scope
We’ll tell you what’s worth building now, and what can wait, before you spend a cent.
On-time delivery, every sprint
Weekly demos, fixed milestones, and a launch date we both commit to.
Direct line to the founder
Call or email me any time, no account managers, no ticket queues.
20+ years building software•Perth-based team•1 business day reply