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 it The 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.
Crystal ReportsReportingLegacy migrationData & reporting

Ask the author

Question about Crystal Reports?

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 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.