Crystal 报告 - 更改 Table 位置 无效
Crystal Reports - Changing Table Locations No working
我有一个用 VB6 开发的应用程序,我正在将其迁移到 .Net Framework 4.0。有一份报告在原始应用程序中可以正常工作,但迁移后的应用程序无法在原始应用程序中运行。作为一项特殊功能,此报告在 运行 时间属性 "location" 中发生了两次 table 更改(实际上它们是可见的),用于生成报告所用的 SQL ,但是当 "shooting" 报告 table 中属性 "location" 的变化没有反映出来时,我可以使用 "SQL Server Profiler" 工具显示:
objReportDocument.Database.Tables(0).Location = "NameReferenceTable""
我的观点是:在构建报表时,他们使用了数据库的5 个数据库table:Table1、Table2、Table3、Table4 和Table5。后来在de数据库中删除了tables Table1和Table2。这个想法是,en 运行 时间存储过程构造 Table1 和 Table2 像临时 tables 与原始名称更多的任何 id 字符串;这个新数据库 tables 必须在报告上升时使用。
当您浏览报表 (ReportDocument.DataBase.Tables(n)) 的表格数组时,对于每个 table,您可以看到两个关键属性:名称和位置。据我了解,Location 属性指示 Crystal 报告 table 应该使用哪些报告来构建报告,这是真的吗?
我对Crystal报告没有太多经验,我调查了两个星期为什么会产生这个错误而没有答案......我希望你能帮助我一点,我真的很感激。
问候,
法比安.
我将提供一种用于我的应用程序中的 Crystal 报告对象的方法。这只是用于设置报告的登录信息(我们的报告使用内置安全性),但如果我正确理解你的问题,那么你应该可以 add/modify 这个方法来设置 Location
还有。
以下方法中使用的属性是:
Me.ConnectionInfo
是类型 CrystalDecisions.Shared.ConnectionInfo
Me.LogOnInfo
是类型 CrystalDecisions.Shared.TableLogOnInfo
Me.Report
是类型 CrystalDecisions.CrystalReports.Engine.ReportDocument
此外,g_strDb
、g_strServer
、g_strMirror
是一些String
,其值无关紧要。
我发现在 .NET 中使用 Crystal 报告时,您需要在 Table
级别设置属性,如下面的方法所示。希望这可以帮助您解决问题。
''' <summary>
''' Apply the database connection info to all tables recursively.
''' </summary>
''' <param name="crxRpt">The report document (or subreport) to apply connection info.</param>
Private Sub SetConnectionInfo(ByVal crxRpt As ReportDocument)
Dim reportObject As ReportObject
Dim subReportObject As SubreportObject
Dim section As Section
Dim t As Table
For Each t In crxRpt.Database.Tables
' if the DatabaseName in the report is <special db name>,
' we need to make sure to set the DatabaseName to the environment
' that the user is currently connected to in order to be able to
' pull the correct information for the report
If t.LogOnInfo.ConnectionInfo.DatabaseName = "<special db name>" Then
Me.ConnectionInfo.DatabaseName = g_strDb
Else
Me.ConnectionInfo.DatabaseName = t.LogOnInfo.ConnectionInfo.DatabaseName
End If
' only ApplyLogOnInfo for tables that are being pulled from the SQL
' server, this avoids problems that arise with reports that are
' created using field definition files
If t.LogOnInfo.ConnectionInfo.ServerName = g_strServer OrElse t.LogOnInfo.ConnectionInfo.ServerName = g_strMirror Then
t.ApplyLogOnInfo(Me.LogOnInfo)
End If
Next t
For Each section In crxRpt.ReportDefinition.Sections
For Each reportObject In section.ReportObjects
If reportObject.Kind = ReportObjectKind.SubreportObject Then
subReportObject = CType(reportObject, CrystalDecisions.CrystalReports.Engine.SubreportObject)
SetConnectionInfo(subReportObject.OpenSubreport(subReportObject.SubreportName))
End If
Next reportObject
Next section
End Sub
上述方法是从设置方法中调用的:
''' <summary>
''' Initialize the database connection info.
''' </summary>
Public Sub SetUpReport()
Me.LogOnInfo = New TableLogOnInfo
Me.ConnectionInfo.UserID = conUID
Me.ConnectionInfo.Password = conPWD
Me.ConnectionInfo.ServerName = g_strServer
Me.ConnectionInfo.DatabaseName = g_strDb
Me.SetConnectionInfo(Me.Report)
End Sub
并且 SetUpReport()
会在我们需要 display/print 报告的任何时候调用。
嗯,终于找到解决办法了……
在我的 BD 连接中使用 ODBC,此连接的关联用户在 BD 中没有模式关联,然后当存储过程创建临时表时,在 shchema bdo 下创建,但是当 crystal 报告上升时,报告(将我的 ODBC 与关联用户一起使用)没有找到临时表。所以我将模式关联到我的 ODBC 中使用的用户。
我的原始报告很旧,然后我不得不在 VS2012 中打开每个报告,覆盖报告以更新格式并在主报告预览中进行测试。
我有一个用 VB6 开发的应用程序,我正在将其迁移到 .Net Framework 4.0。有一份报告在原始应用程序中可以正常工作,但迁移后的应用程序无法在原始应用程序中运行。作为一项特殊功能,此报告在 运行 时间属性 "location" 中发生了两次 table 更改(实际上它们是可见的),用于生成报告所用的 SQL ,但是当 "shooting" 报告 table 中属性 "location" 的变化没有反映出来时,我可以使用 "SQL Server Profiler" 工具显示:
objReportDocument.Database.Tables(0).Location = "NameReferenceTable""
我的观点是:在构建报表时,他们使用了数据库的5 个数据库table:Table1、Table2、Table3、Table4 和Table5。后来在de数据库中删除了tables Table1和Table2。这个想法是,en 运行 时间存储过程构造 Table1 和 Table2 像临时 tables 与原始名称更多的任何 id 字符串;这个新数据库 tables 必须在报告上升时使用。
当您浏览报表 (ReportDocument.DataBase.Tables(n)) 的表格数组时,对于每个 table,您可以看到两个关键属性:名称和位置。据我了解,Location 属性指示 Crystal 报告 table 应该使用哪些报告来构建报告,这是真的吗?
我对Crystal报告没有太多经验,我调查了两个星期为什么会产生这个错误而没有答案......我希望你能帮助我一点,我真的很感激。
问候,
法比安.
我将提供一种用于我的应用程序中的 Crystal 报告对象的方法。这只是用于设置报告的登录信息(我们的报告使用内置安全性),但如果我正确理解你的问题,那么你应该可以 add/modify 这个方法来设置 Location
还有。
以下方法中使用的属性是:
Me.ConnectionInfo
是类型 CrystalDecisions.Shared.ConnectionInfo
Me.LogOnInfo
是类型 CrystalDecisions.Shared.TableLogOnInfo
Me.Report
是类型 CrystalDecisions.CrystalReports.Engine.ReportDocument
此外,g_strDb
、g_strServer
、g_strMirror
是一些String
,其值无关紧要。
我发现在 .NET 中使用 Crystal 报告时,您需要在 Table
级别设置属性,如下面的方法所示。希望这可以帮助您解决问题。
''' <summary>
''' Apply the database connection info to all tables recursively.
''' </summary>
''' <param name="crxRpt">The report document (or subreport) to apply connection info.</param>
Private Sub SetConnectionInfo(ByVal crxRpt As ReportDocument)
Dim reportObject As ReportObject
Dim subReportObject As SubreportObject
Dim section As Section
Dim t As Table
For Each t In crxRpt.Database.Tables
' if the DatabaseName in the report is <special db name>,
' we need to make sure to set the DatabaseName to the environment
' that the user is currently connected to in order to be able to
' pull the correct information for the report
If t.LogOnInfo.ConnectionInfo.DatabaseName = "<special db name>" Then
Me.ConnectionInfo.DatabaseName = g_strDb
Else
Me.ConnectionInfo.DatabaseName = t.LogOnInfo.ConnectionInfo.DatabaseName
End If
' only ApplyLogOnInfo for tables that are being pulled from the SQL
' server, this avoids problems that arise with reports that are
' created using field definition files
If t.LogOnInfo.ConnectionInfo.ServerName = g_strServer OrElse t.LogOnInfo.ConnectionInfo.ServerName = g_strMirror Then
t.ApplyLogOnInfo(Me.LogOnInfo)
End If
Next t
For Each section In crxRpt.ReportDefinition.Sections
For Each reportObject In section.ReportObjects
If reportObject.Kind = ReportObjectKind.SubreportObject Then
subReportObject = CType(reportObject, CrystalDecisions.CrystalReports.Engine.SubreportObject)
SetConnectionInfo(subReportObject.OpenSubreport(subReportObject.SubreportName))
End If
Next reportObject
Next section
End Sub
上述方法是从设置方法中调用的:
''' <summary>
''' Initialize the database connection info.
''' </summary>
Public Sub SetUpReport()
Me.LogOnInfo = New TableLogOnInfo
Me.ConnectionInfo.UserID = conUID
Me.ConnectionInfo.Password = conPWD
Me.ConnectionInfo.ServerName = g_strServer
Me.ConnectionInfo.DatabaseName = g_strDb
Me.SetConnectionInfo(Me.Report)
End Sub
并且 SetUpReport()
会在我们需要 display/print 报告的任何时候调用。
嗯,终于找到解决办法了……
在我的 BD 连接中使用 ODBC,此连接的关联用户在 BD 中没有模式关联,然后当存储过程创建临时表时,在 shchema bdo 下创建,但是当 crystal 报告上升时,报告(将我的 ODBC 与关联用户一起使用)没有找到临时表。所以我将模式关联到我的 ODBC 中使用的用户。
我的原始报告很旧,然后我不得不在 VS2012 中打开每个报告,覆盖报告以更新格式并在主报告预览中进行测试。