使用C1ReportDesigner > 导入Microsoft Access报表 |
C1ReportDesigner应用程序众多强大的功能之一是能够导入MicrosoftAccess创建的报表。该功能需要在确保电脑上安装了Access。一旦报表被导入设计器中,将不再依赖Access程序。
单击Application按钮并从菜单选择Import。将会显示一个对话框,提示您选择希望导入的文件名。
选择一个MicrosoftAccess文件(MDB或者ADP),之后设计器将扫描该文件,并显示一个对话框。您可以选择希望导入的报表:
该对话框允许您指定是否设计器在开始导入过程之前需要清除全部当前定义的报表。
导入过程将处理源报表的大部分元素,除了一些列外:
? 事件处理器代码
Access报表可以使用VBA,宏以及表单以动态格式化报表。C1Report可以做同样的事情,但是只能够使用VBScript。正因如此,全部的报表代码需要手动翻译并迁移。
? 面向表单的字段类型
Access报表可能包含一些特定的字段,这些字段不会被设计器的导入过程处理。以下字段类型不被支持:Chart,CommandButton,ToggleButton,OptionButton,OptionGroup,ComboBox,ListBox,TabCtl,以及CustomControl。
? 使用了VBScript保留字的报表
由于Access不支持VBScript,因此可能在之前设计报表的时候用到了VBScript保留关键字做为报表对象的标识符或数据集字段的名称。这将使得当VBScript引擎尝试解析并计算表达式的时候遇到问题,并会导致报表不能正确地呈现。
不应当作为标识符使用的保留关键字包括Date,Day,Hour,Length,Minute,Month,Second,Time,TimeValue,Value,Weekday,以及Year。关于保留关键字的全部列表,请参见“VBScript参考”
? 按照季度(或者周,月份等等)对日期排序的报表
C1Report使用ADO.NET数据集的Sort属性对分组进行排序。该属性仅按照字段的值对数据集进行排序,不支持表达式。(注意您能够按照任意表达式进行分组,但是不能排序。)一个按照季度对分组进行排序的Access报表将在导入之后按照日期对分组进行排序。为了修正这个问题,您有两种方式:创建一个新的字段,该字段包含希望进行排序的表达式的值;或者改变SQL表达式,创建一个新的数据集并对新的数据集执行排序。
这些限制将影响为数不多的一些报表,不过在导入这些报表之后您应当预览全部的报表,确保它们可以正常工作。
为了演示设计器如何在一个现实的示例中工作,请尝试导入Nwind.mdb文件。它包含以下十三个报表。(随C1Report发布的Nwind.xml文件已经包含了以下全部的改动。)
不需要做任何改动。
不需要做任何改动。
不需要做任何改动。
该报表包含代码,需要手动转换。以下代码应当设置给Group1 Header 对象的OnPrint属性:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
If SalespersonTotal > 5000 Then ExceededGoalLabel.Visible = True SalespersonLine.Visible = True Else ExceededGoalLabel.Visible = False SalespersonLine.Visible = False End If |
C#
C# |
拷贝代码
|
---|---|
if (SalespersonTotal > 5000) { ExceededGoalLabel.Visible = true; SalespersonLine.Visible = true; } else { ExceededGoalLabel.Visible = false; SalespersonLine.Visible = false; } |
Invoice
不需要做任何改动。
Products by Category
不需要做任何改动。
Sales by Category
该报表包含一个图表控件,该控件无法被导入。为了向导入的报表添加一个图表,您需要使用一个非绑定的图片字段,之后使用VB事件处理器创建这个图表并做为图片保存到该字段。
Sales by Category Subreport
不需要做任何改动。
Sales by Year
该报表包含一段引用Form对象的代码,该代码需要被手工迁移。为替代Form对象,编辑RecordSource属性以添加一个[ShowDetails]参数:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
PARAMETERS (Beginning Date) DateTime 1/1/1994, (Ending Date) DateTime 1/1/2001, (Show Details) Boolean False; ... |
C#
C# |
拷贝代码
|
---|---|
PARAMETERS [Beginning Date] DateTime 1/1/1994, [Ending Date] DateTime 1/1/2001, [Show Details] Boolean False; ... |
Use the new parameter in the report's OnOpen event:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
Dim script As String = _ "bDetails = [Show Details]" & vbCrLf & _ "Detail.Visible = bDetails" & vbCrLf & _ "[Group 0 Footer].Visible = bDetails" & vbCrLf & _ "DetailsLabel.Visible = bDetails" & vbCrLf & _ "LineNumberLabel2.Visible = bDetails" & vbCrLf & _ "Line15.Visible = bDetails" & vbCrLf & _ "SalesLabel2.Visible = bDetails" & vbCrLf & _ "OrdersShippedLabel2.Visible = bDetails" & vbCrLf & _ "ShippedDateLabel2.Visible = bDetails" & vbCrLf & _ "Line10.Visible = bDetails" c1r.Sections.Detail.OnPrint = script |
C#
C# |
拷贝代码
|
---|---|
string script = "bDetails = [Show Details]" + "Detail.Visible = bDetails\r\n" + "[Group 0 Footer].Visible = bDetails\r\n" + "DetailsLabel.Visible = bDetails\r\n" + "LineNumberLabel2.Visible = bDetails\r\n" + "Line15.Visible = bDetails\r\n" + "SalesLabel2.Visible = bDetails\r\n" + "OrdersShippedLabel2.Visible = bDetails\r\n" + "ShippedDateLabel2.Visible = bDetails\r\n" + "Line10.Visible = bDetails"; c1r.Sections.Detail.OnPrint = script; |
最后,需要转换其他两行代码:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
Sections ("Detail").OnPrint = _ "PageHeader.Visible = True" Sections("Group 0 Footer).OnPrint = _ "PageHeader.Visible = False" |
C#
C# |
拷贝代码
|
---|---|
Sections ("Detail").OnPrint = "PageHeader.Visible = true"; Sections("Group 0 Footer).OnPrint = "PageHeader.Visible = false"; |
Sales by Year Subreport
不需要做任何改动。
Sales Totals by Amount
此报表包含需要手工迁移的代码。以下代码需要指定给PageHeader的OnPrint属性:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
PageTotal = 0 |
C#
C# |
拷贝代码
|
---|---|
PageTotal = 0; |
以下代码应当指定给Detail的OnPrint属性:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
PageTotal = PageTotal + SaleAmount HiddenPageBreak.Visible = (Counter = 10) |
C#
C# |
拷贝代码
|
---|---|
PageTotal = PageTotal + SaleAmount; HiddenPageBreak.Visible = (Counter = 10); |
Summary of Sales by Quarter
该报表具有一个按照季度排序的分组(参见之前第四项)。为了解决这个问题,向源数据集添加一个字段,该字段包含ShippedDate字段所表达的季度值,然后按照以下方式修改RecordSource属性:
SELECT DISTINCTROW Orders.ShippedDate,
Orders.OrderID,
[Order Subtotals].Subtotal,
DatePart("q",Orders.ShippedDate) As ShippedQuarter
FROM Orders INNER JOIN [Order Subtotals]
ON Orders.OrderID = [Order Subtotals].OrderID
WHERE (((Orders.ShippedDate) Is Not Null));
Change the group's GroupBy property to use the new field, ShippedQuarter.
Summary of Sales by Year
不需要做任何改动。
归纳一下上表的信息,有十三个报表从Northwind数据库导入:八个不需要做任何改动,三个需要对脚本代码做手工迁移,一个需要对SQL表达式做改动,还有一个存在无法替换的图表控件。