2011-01-21 3 views
1

У меня есть внешний интерфейс VB6, SQL Server 2005 в качестве задней части и Crystal Reports 8.5 для отчетов.Crystal Reports 8 - задано динамическое расположение в vb6

Мне нужно установить местоположение во время выполнения в моем приложении, так как у меня есть 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 
+0

+1 для наглядности. добро пожаловать в SO. – PowerUser

+0

Для моих собственных знаний, какую библиотеку CR вы используете? CRAXDDRT.dll? CRAXDRT.dll? – PowerUser

+0

привет, Бобби, я не уверен, поскольку я немного новичок в кристалле report.I только что вставить кристалл отчета управления из компонента в vb6. Где я могу найти эти dll's.Thanks для вашего времени. – Monshine

ответ

0

Попробуйте форматировать строку подключения следующим образом:

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

Значение DSN, UID, DSQ являются нелогичными, они перегруженными Crystal.

Также проверьте, что у вас нет подзаголовков, чьи свойства Connect должны быть изменены аналогичным образом.

+0

Привет и спасибо за ваш ответ. Я положил его так, как вы говорите, но теперь я получаю сообщение: ошибка во время выполнения '20599' не может открыть строку подключения sql server.my, как это: crystalreport1.Connect = "DSN = datapro1; UID = sal_mil; PWD = ss; DSQ = sa "где datapro1 - мое имя сервера и sal_mil моя база данных. Любая идея? Еще раз спасибо за ваше время и ответ. – Monshine

+0

Общая проблема заключается в том, что имя сервера и имя базы данных сохраняются в отчете о кристалле. То, что я сделал для решения этой проблемы, - создать объект Crystalreport в коде VB6 и установить строку соединения на правильный сервер и базу данных, а затем установить источник отчетов на запрос, соответствующий существующему кристаллу SQL, но без указания имени базы данных ... SELECT * FROM MyTable вместо SELECT * FROM MyDatabase.dbo.MyTable. Я получил свое начало в разработке с использованием MS Access, поэтому это было большое изменение, когда я работал с Crystal. Crystal 10 намного лучше, если вы можете обновить. –

+0

привет и благодарю вас за ваш ответ. Моя проблема заключается в том, как изменить местоположение базы данных в отчете о кристалле во время выполнения в vb6.If вы получили образец кода, это будет здорово – Monshine

2

Попробуйте такой код:

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 
1
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 
0

Почему бы не передать набор записей в отчет? Таким образом, вы сможете получать данные из любых поддерживаемых (я имею в виду VB6 может подключаться к) базам данных динамически, вы даже можете объединять данные из нескольких баз данных, для вашего отчета потребуются только данные (набор записей), и отчет будет создан с помощью Data Определение поля.

Смежные вопросы