Category / Section
What Are the Differences Between Crystal Reports and Bold Reports?
Published:
Updated:
Converting Crystal Reports (.rpt) files to RDL (Report Definition Language) format can be complex due to differences in architecture and features. Bold Reports supports migration by providing tools and guidance to help convert reports to the RDL format.
The conversion process includes:
- Understanding the structural and functional differences between Crystal Reports and Bold Reports
- Migrating data sources, datasets, and business logic
- Redesigning report layouts to align with the Bold Reports platform
This article outlines the key differences between Crystal Reports (.rpt) and Bold Reports.
Key Differences Between Crystal Reports and Bold Reports
| 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 |
| 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) |
| 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”) |
| 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 |
| 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) |
| Page Number | PageNumber | Globals!PageNumber |
| Total Pages | TotalPageCount | Globals!TotalPages |
| Report Name | ReportName | Globals!ReportName |
| User Name | UserName | User!UserID |
| Difference b/w dates | DateDiff(interval, date1, date2) | DateDiff(“d”, Fields!date1.Value, Fields!date2.Value) |
| Finds Position | Instr(string, substring) | InStr(Fields!string.Value, “substring”) |
| 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) |
| Sign of a number (+ / 0 / -) | Sgn (number) | Sign(Fields!number.Value) |
| Round down to the 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) |
| 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 | Sqr (number) | Sqrt(Fields!number.Value) |
| Exponentiation | Exp (number) | Exp(Fields!number.Value) |
| natural logarithm of a number | Log (number) | Log(Fields!number.Value) |
| Standart Deviation | StdDev({fields}) | StDev(Fields!YourField.Value) |
| population standard deviation of a set of values | PopulationStdDev({fields}) | StDevP(Fields!YourField.Value) |
| variance of a set of values | Variance({fields}) | Var(Fields!YourField.Value) |
| population variance of a set of values | PopulationVariance({fields}) | VarP(Fields!YourField.Value) |
| get a distinct count of the values | DistinctCount({fields}) | CountDistinct(Fields!YourField.Value) |
| 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) |
| Replace | Replace (inputString, findString, replaceString) | Replace(Fields!inputString.Value, “findString”, “replaceString”) |
| Join (joining a number of substrins) | Join (list of sub strings) | Join([List of SubStrings], “,”) |
| Split | Split (inputString) | Split(“String”, “,”) |
| IsDate | IsDate (string / number) | IsDate(Fields!YourField.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)) |
| Print Date | PrintDate | Globals!ExecutionTime.ToShortDateString() |
| Print Time | PrintTime | Globals!ExecutionTime.ToShortTimeString() |
| Selection locale | SelectionLocale | User!Language |
By understanding these differences, you can migrate your Crystal Reports to Bold Reports seamlessly.