Differences Between Crystal Reports and Bold Reports
Converting Crystal Reports (.rpt) to RDL (Report Definition Language) can be challenging due to differences in architecture and features. Bold Reports provides support to help you seamlessly convert your reports to the RDL format. The process involves understanding the differences between Crystal Reports and Bold Reports, migrating data sources and logic, and redesigning report layouts to fit the Bold Reports platform. This guide outlines the key differences between the 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 facilitate a seamless migration of your crystal reports to Bold Reports.
See Also:
How to Convert Crystal Reports to RDL in Bold Reports
Equivalent SSRS-VB Expressions in Bold Reports for Crystal Syntax