【问题标题】:crystal reports 8 - set location dynamically in vb6水晶报告8 - 在vb6中动态设置位置
【发布时间】:2011-01-21 07:26:02
【问题描述】:

我有一个 VB6 前端,SQL Server 2005 作为后端,Crystal Reports 8.5 用于报表。

我需要在运行时在我的应用程序中设置位置,因为我有 2 个数据库。我的问题是,当我更改数据库时,位置保持不变。如果有人可以帮助我,那就太好了。提前感谢您的宝贵时间,这是我的代码。

Private Sub prin_Click()
With CrystalReport1
    .Connect = MDI1.txtcn --> this is my connection info "driver={sql server};server=server;database=database;uid=user;pwd=password"        
    .DiscardSavedData = True
    .Action = 1
    .PrintReport
End With

【问题讨论】:

  • +1 为清楚起见。欢迎来到 SO。
  • 据我所知,您使用的是什么 CR 库? CRAXDDRT.dll? CRAXDRT.dll?
  • 嗨,鲍比,我不确定,因为我对水晶报表有点陌生。我刚刚从 vb6 的组件中插入水晶报表控件。我在哪里可以找到这些 dll。谢谢您的时间。跨度>

标签: vb6 crystal-reports


【解决方案1】:

试试这样的代码:

Private Sub cmdSetLocations_Click()
    Dim CrxApp As New CRAXDRT.Application
    Dim CrxRep As CRAXDRT.Report
    Dim CrxSubRep As CRAXDRT.Report

    Dim strReport As String
    Dim i As Integer, ii As Integer

    strReport = "[Path to report file]"
    Set CrxRep = CrxApp.OpenReport(strReport)

    SetReportLocation CrxRep

    For i = 1 To CrxRep.Sections.Count
        For ii = 1 To CrxRep.Sections(i).ReportObjects.Count
            If CrxRep.Sections(i).ReportObjects(ii).Kind = crSubreportObject Then
                Set CrxSubRep = CrxRep.OpenSubreport(CrxRep.Sections(i).ReportObjects(ii).SubreportName)
                SetReportLocation CrxSubRep
            End If
        Next ii
    Next

    'open your report in the report viewer

    Set CrxApp = Nothing
    Set CrxRep = Nothing
    Set CrxSubRep = Nothing
End Sub

Private Sub SetReportLocation(ByRef RepObj As CRAXDRT.Report)
    Dim CrxDDF As CRAXDRT.DatabaseTable
    Dim CP As CRAXDRT.ConnectionProperties

    For Each CrxDDF In RepObj.Database.Tables
        Set CP = CrxDDF.ConnectionProperties
        CP.DeleteAll
        CP.Add "Connection String", "[Your connection string goes here]"
    Next

    Set CrxDDF = Nothing
    Set CP = Nothing

End Sub

【讨论】:

    【解决方案2】:
    With CR
         .ReportFileName = App.Path + "\Labsen2.rpt"
         .SelectionFormula = "{PersonalCalendar.PersonalCalendarDate}>= Date(" & Year(DTPicker1) & "," & Month(DTPicker1) & "," & Day(DTPicker1) & ") and {PersonalCalendar.PersonalCalendarDate}<=date(" & Year(DTPicker2) & "," & Month(DTPicker2) & "," & Day(DTPicker2) & ") and {Department.DepartmentName}= '" & Combo1.Text & "'"
         .Formulas(0) = "tglAwal = '" & DTPicker1.Value & "'"
         .Formulas(1) = "tglAkhir = '" & DTPicker2.Value & "'"
         .Password = Chr(10) & "ithITtECH"
         .RetrieveDataFiles
         .WindowState = crptMaximized
         .Action = 1
     End With
    

    【讨论】:

      【解决方案3】:

      尝试像这样格式化连接字符串:

      DSN=server;UID=database;PWD=password;DSQ=user

      DSNUIDDSQ 的含义是反直觉的,它们被 Crystal 重载了。

      还要检查您没有需要类似更改其Connect 属性的子报表。

      【讨论】:

      • 嗨,谢谢你的回复。我已经像你说的那样说但现在收到消息:运行时错误'20599'无法打开sql server。我的连接字符串如下:水晶报告1.连接= "DSN=datapro1;UID=sal_mil;PWD=ss;DSQ=sa" 其中 datapro1 是我的服务器名称,sal_mil 是我的数据库。有什么想法吗?再次感谢您的时间和回复。
      • 常见问题是服务器名和数据库名保存在水晶报表中。我为解决这个问题所做的是在VB6代码中创建一个Crystalreport对象并将连接字符串设置为正确的服务器和数据库,然后将reportsource设置为与现有Crystal SQL匹配但不指定数据库名称的查询...选择* FROM MyTable 而不是 SELECT * FROM MyDatabase.dbo.MyTable。我开始使用 MS Access 进行开发,所以当我使用 Crystal 时,这是一个很大的变化。如果可以升级,Crystal 10 会更好。
      • 您好,谢谢您的回复。我的问题是如何在 vb6 运行时更改水晶报表中的数据库位置。如果您有示例代码,那就太好了
      【解决方案4】:

      为什么不将记录集传递给您的报告?通过这种方式,您将能够从任何支持的(我的意思是 VB6 可以连接到)数据库动态获取数据,您甚至可以合并来自多个数据库的数据,您的报告将只需要数据(记录集),并且将使用数据创建报告字段定义。

      【讨论】:

        猜你喜欢
        • 2013-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多