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_strDbg_strServerg_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 报告的任何时候调用。

嗯,终于找到解决办法了……

  1. 在我的 BD 连接中使用 ODBC,此连接的关联用户在 BD 中没有模式关联,然后当存储过程创建临时表时,在 shchema bdo 下创建,但是当 crystal 报告上升时,报告(将我的 ODBC 与关联用户一起使用)没有找到临时表。所以我将模式关联到我的 ODBC 中使用的用户。

  2. 我的原始报告很旧,然后我不得不在 VS2012 中打开每个报告,覆盖报告以更新格式并在主报告预览中进行测试。