Converting Crystal Reports (.rpt) files to RDL (Report Definition Language) format can be challenging due to differences in report architecture, rendering engines, and feature implementations. To simplify migration, Bold Reports provides a dedicated Crystal Reports to SSRS/RDL Converter Utility that automates the conversion of Crystal Reports (.rpt) files into RDL reports compatible with Bold Reports and SQL Server Reporting Services (SSRS). The utility supports both single-file and bulk conversions while preserving supported report elements such as layouts, data connections, parameters, charts, formulas, and report structure wherever possible.
The migration process typically includes:
- Converting Crystal Reports (.rpt) files to RDL format using the Crystal Reports to SSRS Converter Utility.
- Reviewing and validating converted report elements, datasets, parameters, expressions, and formatting.
- Adjusting report layouts and unsupported features, if required, to align with the Bold Reports platform.
- Publishing and testing the converted RDL reports in Bold Reports.
This article outlines the key differences between Crystal Reports and Bold Reports to help you better understand the migration process and platform capabilities.
Key Differences Between Crystal Reports and Bold Reports
Fundamental Architecture
| Aspect |
Crystal Reports |
Bold Reports |
| Design Interface |
Section-based (Header, Footer, Detail) |
Tablix-based (Tables, Matrices, Lists) |
| Data Handling |
Direct connection to various data sources |
Uses datasets via SQL queries/stored procedures |
| Formulas/Expressions |
Proprietary Crystal syntax |
Uses VB.NET expressions (=IIF(), =SUM(), etc.) |
| Sub-reports |
Commonly used for modular reports |
Less efficient; use nested datasets and data regions instead |
| Export Options |
Multiple custom export formats |
Focuses on Microsoft stack compatibility |
String Functions
| Function |
Crystal Reports |
Bold Reports |
| Concatenate |
“FirstName” & " " & “LastName” |
Fields!FirstName.Value & " " & Fields!LastName.Value |
| Substring |
Mid({Field}, 2, 5) |
Mid(Fields!Field.Value, 2, 5) |
| Left |
Left({Field}, 4) |
Left(Fields!Field.Value, 4) |
| Right |
Right({Field}, 4) |
Right(Fields!Field.Value, 4) |
| Length |
Len({Field}) |
Len(Fields!Field.Value) |
| Replace |
Replace({Field}, “old”, “new”) |
Replace(Fields!Field.Value, “old”, “new”) |
| Uppercase |
UCase({Field}) |
UCase(Fields!Field.Value) |
| Lowercase |
LCase({Field}) |
LCase(Fields!Field.Value) |
| Trim |
Trim({Field}) |
Trim(Fields!Field.Value) |
| Proper Case |
ProperCase (string) |
StrConv(Fields!YourField.Value, vbProperCase) |
| Reverse String |
StrReverse(string) |
StrReverse(Fields!YourField.Value) |
| Is Numeric |
IsNumeric (string) |
IsNumeric(Fields!YourField.Value) |
| String Compare |
StrCmp(“string1”, “string2”) |
StrComp(“string1”, “string2”) |
| Number to String |
ToText(number, decimals) |
FormatNumber(Fields!number.Value, “N2”) |
| String to Number |
ToNumber(string) |
CInt(Fields!string.Value) |
| String to Date |
ToDate(string) |
CDate(Fields!string.Value) |
| Finds Position |
Instr(string, substring) |
InStr(Fields!string.Value, “substring”) |
| Join |
Join (list of sub strings) |
Join([List of SubStrings], “,”) |
| Split |
Split (inputString) |
Split(“String”, “,”) |
Date and Time Functions
| Function |
Crystal Reports |
Bold Reports |
| Current Date |
CurrentDate |
Today() |
| Current DateTime |
CurrentDateTime |
Now() |
| Date Part (Year) |
Year({DateField}) |
Year(Fields!DateField.Value) |
| Date Part (Month) |
Month({DateField}) |
Month(Fields!DateField.Value) |
| Date Part (Day) |
Day({DateField}) |
Day(Fields!DateField.Value) |
| Add Days |
DateAdd(“d”, 5, {DateField}) |
DateAdd(“d”, 5, Fields!DateField.Value) |
| Format Date |
ToText({DateField}, “MM/dd/yyyy”) |
Format(Fields!DateField.Value, “MM/dd/yyyy”) |
| Time Only |
Time({DateTimeField}) |
Format(Fields!DateField.Value, “hh:mm:ss tt”) |
| Print Date |
PrintDate |
Globals!ExecutionTime.ToShortDateString() |
| Print Time |
PrintTime |
Globals!ExecutionTime.ToShortTimeString() |
| Difference b/w dates |
DateDiff(interval, date1, date2) |
DateDiff(“d”, Fields!date1.Value, Fields!date2.Value) |
| WeekDay |
WeekDay (date) |
Weekday(Fields!YourDate.Value) |
| DayOfWeek |
DayOfWeek (date) |
Weekday(Fields!YourDate.Value) |
| Month Name |
MonthName ({month (from 1 - 12)}) |
MonthName(Month(Fields!YourDate.Value)) |
| Week Day Name |
WeekdayName (weekday (as number)) |
WeekdayName(Weekday(Fields!YourDate.Value)) |
| IsDate |
IsDate (string / number) |
IsDate(Fields!YourField.Value) |
Mathematical Functions
| Function |
Crystal Reports |
Bold Reports |
| Absolute |
Abs({Field}) |
Abs(Fields!Field.Value) |
| Round |
Round({Field}, 2) |
Round(Fields!Field.Value, 2) |
| Ceiling |
Ceiling({Field}) |
Ceiling(Fields!Field.Value) |
| Floor |
Floor({Field}) |
Floor(Fields!Field.Value) |
| Remainder |
Remainder({Field1}, {Field2}) |
Fields!Field1.Value Mod Fields!Field2.Value |
| Round down to nearest integer |
Int (number) |
Int(Fields!number.Value) |
| Round Up |
RoundUp (number) |
Ceiling(Fields!number.Value) |
| Truncate |
Truncate (number) |
Fix(Fields!number.Value) |
| MRound |
MRound (number, multiple) |
Round(Fields!YourField.Value / multiple, 0) * multiple |
| Fix |
Fix (number) |
Fix(Fields!number.Value) |
| Sign (+ / 0 / -) |
Sgn (number) |
Sign(Fields!number.Value) |
| Sin |
Sin (number) |
Sin(Fields!number.Value) |
| Cos |
Cos (number) |
Cos(Fields!number.Value) |
| Tan |
Tan (number) |
Tan(Fields!number.Value) |
| Atn |
Atn (number) |
Atan (number) |
| Pi |
pi |
Math.PI |
| Square Root |
Sqr (number) |
Sqrt(Fields!number.Value) |
| Exponentiation |
Exp (number) |
Exp(Fields!number.Value) |
| Natural logarithm |
Log (number) |
Log(Fields!number.Value) |
Aggregate and Logical Functions
| Function |
Crystal Reports |
Bold Reports |
| If / Else |
If {Field} > 10 Then “High” Else “Low” |
IIF(Fields!Field.Value > 10, “High”, “Low”) |
| Nested If |
If x > 10 Then “A” Else If x > 5 Then “B” Else “C” |
Switch(Fields!x.Value > 10, “A”, Fields!x.Value > 5, “B”, True, “C”) |
| Null Handling |
If IsNull({Field}) Then 0 Else {Field} |
IIF(IsNothing(Fields!Field.Value), 0, Fields!Field.Value) |
| Sum |
Sum({Field}) |
Sum(Fields!Field.Value) |
| Average |
Average({Field}) |
Avg(Fields!Field.Value) |
| Minimum |
Minimum({Field}) |
Min(Fields!Field.Value) |
| Maximum |
Maximum({Field}) |
Max(Fields!Field.Value) |
| Count |
Count({Field}) |
Count(Fields!Field.Value) |
| Standard Deviation |
StdDev({fields}) |
StDev(Fields!YourField.Value) |
| Population Standard Deviation |
PopulationStdDev({fields}) |
StDevP(Fields!YourField.Value) |
| Variance |
Variance({fields}) |
Var(Fields!YourField.Value) |
| Population Variance |
PopulationVariance({fields}) |
VarP(Fields!YourField.Value) |
| Distinct Count |
DistinctCount({fields}) |
CountDistinct(Fields!YourField.Value) |
Percentage and Advanced Functions
| Function |
Crystal Reports |
Bold Reports |
| Percentage of Sum |
PercentOfSum ({field1}, {field2}) |
Fields!field1.Value / Sum(Fields!field2.Value) |
| Percentage of Average |
PercentOfAverage ({field1}, {field2}) |
Fields!field1.Value / Avg(Fields!field2.Value) |
| Percentage of Minimum |
PercentOfMinimum ({field1}, {field2}) |
Fields!field1.Value / Min(Fields!field2.Value) |
| Percentage of Maximum |
PercentOfMaximum ({field1}, {field2}) |
Fields!field1.Value / Max(Fields!field2.Value) |
| Percentage of Count |
PercentOfCount ({field1}, {field2}) |
Fields!field1.Value / Count(Fields!field2.Value) |
| Percentage of Distinct Count |
PercentOfDistinctCount ({field1}, {field2}) |
Fields!field1.Value / CountDistinct(Fields!field2.Value) |
Global and User-Related Functions
| Function |
Crystal Reports |
Bold Reports |
| Page Number |
PageNumber |
Globals!PageNumber |
| Total Pages |
TotalPageCount |
Globals!TotalPages |
| Report Name |
ReportName |
Globals!ReportName |
| User Name |
UserName |
User!UserID |
| Selection locale |
SelectionLocale |
User!Language |
Migration Summary
By understanding these differences and limitations, you can migrate your Crystal Reports to Bold Reports seamlessly. The key is recognizing:
- Syntax Changes: Crystal Reports uses curly braces
{} for field references, while Bold Reports uses Fields!FieldName.Value
- Formula Language: Crystal Reports uses its proprietary syntax, while Bold Reports uses VB.NET expressions
- Architecture Shift: Moving from section-based to tablix-based design paradigm
- Function Equivalents: Most functions have direct equivalents, though some require minor adjustments
- Automation Limits: The converter utility handles ~50-60% automatically; plan for manual reconfiguration of advanced features
See Also