2010-02-01 2 views
2

위로 Crystal Reports가 여전히 ActiveX를 지원하는 경우 ODBC 데이터 원본이 Access 또는 SQL 데이터베이스를 가리 키도록 작성된 수정 보고서가 있습니다. 런타임에는 ODBC 대신 OLE DB (ADO)를 사용하도록 보고서를 변경하고 서버 이름, 데이터베이스 이름, 사용자 이름, 암호를 사용자 고유의 것으로 변경하고 보고서를 실행하여 정상적으로 작동합니다.코드에서 Crystal Reports 연결 속성을 변경하는 방법은 무엇입니까?

Crystal Reports 2008에서는 ActiveX를 더 이상 지원하지 않으므로 .NET에서는 똑같은 작업을 수행하려고하지만 성공하지는 못합니다.

다음은 지금까지 코드 : 그것은) (boReportDocument.VerifyDatabase 할 때까지

Public Function ChangeConnectionInfo() As ReportDocument 
     Dim boReportDocument As New ReportDocument 
     '**EDIT** Change the path and report name to the report you want to change. 
     boReportDocument.Load("c:\CustomerListSQL.Rpt", OpenReportMethod.OpenReportByTempCopy) 

     'Create a new Command Table to replace the reports current table. 
     Dim boTable As New CrystalDecisions.ReportAppServer.DataDefModel.CommandTable 

     'boMainPropertyBag: These hold the attributes of the tables ConnectionInfo object 
     Dim boMainPropertyBag As New PropertyBag 
     'boInnerPropertyBag: These hold the attributes for the QE_LogonProperties 
     'In the main property bag (boMainPropertyBag) 
     Dim boInnerPropertyBag As New PropertyBag 

     'Set the attributes for the boInnerPropertyBag 
     boInnerPropertyBag.Add("Auto Translate", "-1") 
     boInnerPropertyBag.Add("Connect Timeout", "15") 
     boInnerPropertyBag.Add("Data Source", "K2") 
     boInnerPropertyBag.Add("General Timeout", "0") 
     boInnerPropertyBag.Add("Initial Catalog", "DBNAME") 
     boInnerPropertyBag.Add("Integrated Security", "True") 
     boInnerPropertyBag.Add("Locale Identifier", "5129") 
     boInnerPropertyBag.Add("OLE DB Services", "-5") 
     boInnerPropertyBag.Add("Provider", "SQLOLEDB") 
     boInnerPropertyBag.Add("Tag with column collation when possible", "0") 
     boInnerPropertyBag.Add("Use DSN Default Properties", "False") 
     boInnerPropertyBag.Add("Use Encryption for Data", "0") 

     'Set the attributes for the boMainPropertyBag 
     boMainPropertyBag.Add("Database DLL", "crdb_ado.dll") 
     boMainPropertyBag.Add("QE_DatabaseName", "DBNAME") 
     boMainPropertyBag.Add("QE_DatabaseType", "OLE DB (ADO)") 
     'Add the QE_LogonProperties we set in the boInnerPropertyBag Object 
     boMainPropertyBag.Add("QE_LogonProperties", boInnerPropertyBag) 
     boMainPropertyBag.Add("QE_ServerDescription", "K2") 
     boMainPropertyBag.Add("QE_SQLDB", "True") 
     boMainPropertyBag.Add("SSO Enabled", "False") 

     'Create a new ConnectionInfo object 
     Dim boConnectionInfo As New CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo 
     'Pass the database properties to a connection info object 
     boConnectionInfo.Attributes = boMainPropertyBag 
     'Set the connection kind 
     boConnectionInfo.Kind = CrConnectionInfoKindEnum.crConnectionInfoKindCRQE 
     '**EDIT** Set the User Name and Password if required. 
     'boConnectionInfo.UserName = "UserName" 
     'boConnectionInfo.Password = "Password" 
     'Pass the connection information to the table 
     boTable.ConnectionInfo = boConnectionInfo 

     'Get the Database Tables Collection for your report 
     Dim boTables As CrystalDecisions.ReportAppServer.DataDefModel.Tables = _ 
      boReportDocument.ReportClientDocument.DatabaseController.Database.Tables  

     'For each table in the report: 
     ' - Set the Table Name properties. 
     ' - Set the Command table's command text. 
     ' - Set the table location in the report to use the new modified table 
     For Each boReportTable In boTables 
      boTable.Name = boReportTable.Name 
      boTable.QualifiedName = "DBNAME.dbo." + boReportTable.Name 'boReportTable.QualifiedName 
      boTable.Alias = boReportTable.Alias  
      boReportDocument.ReportClientDocument.DatabaseController.SetTableLocation(boReportTable, boTable) 
     Next 

     'Verify the database after adding substituting the new table. 
     'To ensure that the table updates properly when adding Command tables or Stored Procedures. 
     boReportDocument.VerifyDatabase() 

     Return boReportDocument 
    End Function 

코드는 작동, 나는 오류 '실패에 로그인'은을 얻을 때 그건. 중 하나가 작동하지 않았다

Dynamically change the connection of a Crystal Report

, 나는 그것이 OLE DB에 ODBC에서 전환과 관련이 있는지 여부 (ADO)를 모르는 :

은 나뿐만 아니라 여기에 코드를 사용하여 시도

답변

1

나는이 질문이 3 세이며 OP가 이미 옮겨 갔을 것임을 알고 있지만 아마도 다른 사람이 답을 찾는 데 도움이 될 수 있습니다.

이 여러 데이터 소스로부터보고를 매일 사용하는 작업 응용 프로그램에서 가져온 단순화 된 매개 변수 값과 같은 연결 정보 및 기타 물건 변경 VB.NET에서 보고서를로드의 전체 예입니다

Private Sub ReportGo() 
     'Main Report 
     Dim crxRpt As New CrystalDecisions.CrystalReports.Engine.ReportDocument 
     'Subreport objects, if you need them 
     Dim crxSubrpt1 As New CrystalDecisions.CrystalReports.Engine.ReportDocument, crxSubrpt2 As New CrystalDecisions.CrystalReports.Engine.ReportDocument 
     'Parameter fields objects and values, if you need them 
     Dim crxPar1 As New CrystalDecisions.Shared.ParameterField 
     Dim crxVal1 As New CrystalDecisions.Shared.ParameterDiscreteValue 

     'Load report file 
     crxRpt.Load("myreport.rpt") 

     'Load subreports, if you have them. Otherwise comment these lines 
     crxSubrpt1 = crxRpt.OpenSubreport("MySubr1") 
     crxSubrpt2 = crxRpt.OpenSubreport("MySubr2") 

     'Login Main Report 
     Dim myTables As CrystalDecisions.CrystalReports.Engine.Tables = crxRpt.Database.Tables 
     crxRpt.SetDatabaseLogon("Username", "Password", "Servername", "Database") 
     Dim crConnInfo1 As CrystalDecisions.Shared.ConnectionInfo = New CrystalDecisions.Shared.ConnectionInfo 
     crConnInfo1.DatabaseName = "Database" 
     crConnInfo1.UserID = "Username" 
     crConnInfo1.Password = "Password" 
     crConnInfo1.ServerName = "Servername" 

     'If your report uses more than one datasource, then uncomment and add the other login info here: 
     'crxRpt.SetDatabaseLogon("Username2", "Password2", "Servername2","Database2") 
     'Dim crConnInfo2 As CrystalDecisions.Shared.ConnectionInfo = New CrystalDecisions.Shared.ConnectionInfo 
     'crConnInfo2.DatabaseName = "Database2"    
     'crConnInfo2.UserID = "Username2" 
     'crConnInfo2.Password = "Password2" 
     'crConnInfo2.ServerName = "Servername2" 

     For Each myTable As CrystalDecisions.CrystalReports.Engine.Table In myTables 
      Dim myTableLogonInfo As CrystalDecisions.Shared.TableLogOnInfo = myTable.LogOnInfo 
      If myTable.LogOnInfo.ConnectionInfo.DatabaseName = "Database" Then 
       myTableLogonInfo.ConnectionInfo = crConnInfo1 
       myTable.ApplyLogOnInfo(myTableLogonInfo) 
      Else 
       'This here only applies if you have more than one datasource 
       'myTableLogonInfo.ConnectionInfo = crConnInfo2 
       'myTable.ApplyLogOnInfo(myTableLogonInfo) 
      End If 
     Next 

     'Subreport Login. Comment this section if you don't use them 
     crxSubrpt1.SetDatabaseLogon("Username", "Password","Servername", "Database") 
     'again, only if you use 2 datasources 
     'crxSubrpt1.SetDatabaseLogon("Username2", "Password2", "Servername2", "Database2") 
     crxSubrpt1.RecordSelectionFormula = "Subreport 1 Selection formula goes here" 
     crxSubrpt2.SetDatabaseLogon("Username", "Password","Servername", "Database") 
     'again, only if you use 2 datasources 
     'crxSubrpt2.SetDatabaseLogon("Username2", "Password2", "Servername2", "Database2") 
     crxSubrpt2.RecordSelectionFormula = "Subreport 2 selection formula goes here" 

     Dim mySections As CrystalDecisions.CrystalReports.Engine.Sections = crxRpt.ReportDefinition.Sections 
     For Each mySection As CrystalDecisions.CrystalReports.Engine.Section In mySections 
      Dim myReportObjects As CrystalDecisions.CrystalReports.Engine.ReportObjects = mySection.ReportObjects 
      For Each myReportObject As CrystalDecisions.CrystalReports.Engine.ReportObject In myReportObjects 
       If myReportObject.Kind = CrystalDecisions.Shared.ReportObjectKind.SubreportObject Then 
        Dim mySubreportObject As CrystalDecisions.CrystalReports.Engine.SubreportObject = CType(myReportObject, CrystalDecisions.CrystalReports.Engine.SubreportObject) 
        Dim subReportDocument As CrystalDecisions.CrystalReports.Engine.ReportDocument = mySubreportObject.OpenSubreport(mySubreportObject.SubreportName) 
        Dim mytablessub As CrystalDecisions.CrystalReports.Engine.Tables = subReportDocument.Database.Tables 
         For Each myTable As CrystalDecisions.CrystalReports.Engine.Table In mytablessub 
          Dim myTableLogonInfo As CrystalDecisions.Shared.TableLogOnInfo = myTable.LogOnInfo 
          If myTable.LogOnInfo.ConnectionInfo.DatabaseName = "Database" Then 
           myTableLogonInfo.ConnectionInfo = crConnInfo1 
           myTable.ApplyLogOnInfo(myTableLogonInfo) 
          Else 
           'Only if you use 2 datasources 
           'myTableLogonInfo.ConnectionInfo = crConnInfo2 
           'myTable.ApplyLogOnInfo(myTableLogonInfo) 
          End If 
         Next 
        End If 
       Next 
      Next 
     End If 

     'If the report uses Parameter fields, uncomment this and fill as appropiate 
     'crxVal1.Value = "Parameter 1 Value" 
     'crxPar1.Name = "Parameter 1 name" 
     'crxPar1.CurrentValues.Add(crxVal1) 
     'crxPar1.HasCurrentValue = True 

     'Apply main report selection formula 
     crxRpt.RecordSelectionFormula = "Main report selection formula goes here" 
     crxRpt.Refresh() 


     'Now, if you preview the report in your VB app with a CrystalReportViewer, uncomment this: 
     'YourForm.CristalReportViewer.ReportSource = crxRpt 

     'If you use Parameter fields... 
     'YourForm.CrystalReportViewer.ParameterFieldInfo.Clear() 
     'YourForm.CrystalReportViewer.ParameterFieldInfo.Add(crxPar1) 

     'Finally, if you need to export the report automatically 
     CrxRpt.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, "Yourfile.pdf") 

End Sub 
0

을 이 방법을 사용하여 원하는 Crystal Report를 로그온 할 수 있습니다.

Public Sub LogOn(ByVal poReport As CrystalDecisions.CrystalReports.Engine.ReportDocument, ByVal strServer As String, ByVal strTable As String, ByVal strUsername As String, ByVal strPassword As String) 
    Dim loConnInfo As New CrystalDecisions.Shared.ConnectionInfo 
    loConnInfo.ServerName = strServer 
    loConnInfo.DatabaseName = strTable 
    loConnInfo.UserID = strUsername 
    loConnInfo.Password = strPassword 
    loConnInfo.IntegratedSecurity = False 
    Dim loTables As CrystalDecisions.CrystalReports.Engine.Tables 
    Dim loTable As CrystalDecisions.CrystalReports.Engine.Table 
    Dim loTableLogonInfo As CrystalDecisions.Shared.TableLogOnInfo 
    loTables = poReport.Database.Tables 

    For Each loTable In loTables 
     loTableLogonInfo = loTable.LogOnInfo 
     loTableLogonInfo.ConnectionInfo.UserID = strUsername 
     loTableLogonInfo.ConnectionInfo.Password = strPassword 
     loTableLogonInfo.ConnectionInfo.ServerName = strServer 
     loTableLogonInfo.ConnectionInfo.DatabaseName = strTable 
     loTableLogonInfo.ConnectionInfo.IntegratedSecurity = False 
     loTable.ApplyLogOnInfo(loTableLogonInfo) 
    Next 
End Sub 

을 그리고 다음과 같이 호출 :

그냥 매개 변수를 전달하는 포트를 설정하는 방법

LogOn(yourReportDocument, serverPath, databaseName, userName, password) 
+0

어떤 생각을? – Mzn

+0

ServerName 속성은 "192.168.1.1,1234"를 받아 들여야합니다. 여기서 1234는 포트 번호입니다. IP/서버 이름 뒤에 콜론을 적어 둡니다. – KalaNag