Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Crystal report ..cosa sbaglio ?

Ciao a tutti, scusatemi ma è la prima volta che uso il crystal report
Devo stampare un report creato precedentemente.
Alla prima istruzione dove vorrei dirgli di usare il DataControl (che ha dei
dati dentro) come riferimento per i dati.....
      FormCRmain.CrystalReport1.DataSource = DataControl
ma mi dice " tipo non corrispondente "
      FormCRmain.CrystalReport1.ReportFileName = App.Path & "\label01.rpt"
      FormCRmain.CrystalReport1.PrintReport
Come faccio ?
Tra l'altro ..MOLTO IMPORTANTE ! come faccio a creare il report se devo
perforza dichiarare un database mentre io voglio che il report faccia
riferimento ai dati contenuti al DataControl ?
Vi ringrazio per una Vostra risposta
bob
ik1...@libero.it



 ha scritto nel messaggio
news:repost.JJFQ5.67644$BF.24...@news.infostrada.it...

CR non può fare riferimento a dati dinamici. Devi per forza legarlo ad
un database (per esteso che sia il termine). Il trucco sta ad
utilizzare il suo linguaggio query per selezionare gli stessi dati
visualizzati nel datacontrol, ma non nel fare riferimento al
datacontrol.
In poche parole, creati il report in modo di fare riferimento a tutti
i campi e tabelle del database di cui hai bisogno. In run time
passerai a CR la SelectionFormula utile a selezionare solo i dati che
ti servono.
--
 
federic...@planet.it
Eliminare NOSPAM dall'indirizzo! Delete NOSPAM from address!

Ti consiglio di buttare via l'OCX e di usare la DLL crpe32.dll, fornita con
il cristal report. Quando ho iniziato a usare la versione pro di CR5 non
riuscivo piů a stampare e mi davo il tuo stesso errore. Ho iniziato a
utilizzare la DLL e il tutto ha ripreso a funzionare. Ti invio la funzione
che usavo per stampare.
Per utilizzarla DEVI inserire nel tuo programma il modulo fornito con
crystal repot che se non sbaglio si chiama GLOBAL.bas (io per mia esigenza
l'ho rinominato)
Ciao
--o--o--o--o--o--o--o--o--o--o--o--o--o--o--o--o--
Tutte le risposte che cercavi, gratis
http://www.ioloso.it
Vieni a vedere
--o--o--o--o--o--o--o--o--o--o--o--o--o--o--o--o--
Variabili da passare:
Nome_report č il nome del report
Current database č la stringa che definisce il percorso del database
Ftext č il testo della formula.
La funzione :
Public Sub Stampa(Nome_Report As String, CurrentDatabase As String, Ftext As
String)
    Dim MyTable             As PETableLocation
    Dim MySubInfo           As PESubreportInfo
    Dim i                   As Integer
    Dim f                   As Integer
    Dim Result              As Integer
    Dim OpenEngineResult    As Integer
    Dim Process             As Integer
    Dim DiscardingResult    As Integer
    Dim NumTables           As Integer
    Dim SetLocResult        As Integer
    Dim GetLocResult        As Integer
    Dim Formula             As Integer
    Dim SR_Open             As Integer
    Dim SR_Number           As Long
    Dim SR_Handle           As Long
    Dim SR_Info             As Long
    Dim SR_Name             As String
    Dim SelectionText       As String
' Apre il Report Engine
    OpenEngineResult = PEOpenEngine
' Apre il report
    Process = PEOpenPrintJob(Nome_Report)
' Manda il report alla stampante
    PEOutputToPrinter Process, 1
' Cicla tutte le sezioni del report
    For i = 1000 To 8000 Step 25
' Legge il numero di SubReports nella sezione corrente
        SR_Number = PEGetNSubreportsInSection(Process, i)
' Se esiste uno o piů SubReport...
        If SR_Number > 0 Then
' Cicla i SubReports
            For f = 0 To SR_Number - 1
' Legge l'handle del SubReport
                SR_Handle = PEGetNthSubreportInSection(Process, i, f)
' Legge il nome del SubReport
                MySubInfo.StructSize = PE_SIZEOF_SUBREPORT_INFO
                SR_Info = PEGetSubreportInfo(Process, SR_Handle, MySubInfo)
                SR_Name = MySubInfo.Name
' Apre il SubReport
                SR_Open = PEOpenSubreport(Process, SR_Name)
' Setta la nuova locazione
                SetPrintTablesLocation SR_Open, CurrentDatabase
' Rinfresca il SubReport
                DiscardingResult = PEDiscardSavedData(SR_Open)
' Chiude il SubReport
                PECloseSubreport SR_Open
            Next f
        End If
    Next i
' Setta la nuova locazione per le tabelle del processo principale
    SetPrintTablesLocation Process, CurrentDatabase
' Setta la formula
    If Ftext <> "" Then
        SelectionText = Ftext & Chr$(0)
        Formula = PESetSelectionFormula(Process, SelectionText)
    End If
' Refresh del report
    DiscardingResult = PEDiscardSavedData(Process)
' Stampa il report
    PEStartPrintJob Process, True
' Chiude il report
    PEClosePrintJob Process
' Chiude il Report Engine
    PECloseEngine
End Sub

Ho provato la tua procedura per stampare utilizzando la DLL e mi sembra
interessante e pure più veloce che l'OCX.
Non riesco però a trovate corrispondenza per la funzione
SetPrintTablesLocation SR_Open, CurrentDatabase
Non ho trovato da nessuna parte SetPrintTablesLocation
Con l'OCX utilizzo qualcosa di simile che però con la DLL non riesco a
tradurre:
    With CryOCX
         For n = 0 To .GetNSubreports - 1
            .SubreportToChange = .GetNthSubreportName(n)
            .RetrieveDataFiles
            i = 0
            While .DataFiles(i) <> ""
               .DataFiles(i) = strDataFile
               i = i + 1
            Wend
        Next
    End CryOCX
Potresti, perfavore, indicarmi come utilizzare quella riga di codice?
Grazie
      Pino Saffioti
-------------------------
pino.s...@tiscalinet.it

Ti rispondo io velocemente (sono in ritardo come sempre)
con un opezzo di codice di un mio prg.
Tieni presente che il Subreport non è altro che un oggetto tra i tanti del
Report.
Non mki pare ci sia (almeno non l'ho trovato) tra i metodi della classe
CRPEAuto un modo per referenziarlo direttamanete, perciò faccio un loop tra
tutti gli oggetti disponibili e...
(AdoSetings è un tipo definito dall'utente contenente i parametri della
connessione Ado corrente)
ciao
ugo
        Set sectsVar = Report.Sections
        For Each sectVar In sectsVar
            Set objs = sectVar.ReportObjects
            For Each subObj In objs
                If TypeOf subObj Is CRPEAuto.SubreportObject Then
                    Set subReport = Report.OpenSubreport(subObj.Name)
                    Set SubReportDb = subReport.Database
                    Set subReportTable = SubReportDb.Tables(1)
                    With subReportTable
                        .SetLogOnInfo "Provider=" & AdoSettings.Provider &
";Password=" & AdoSettings.UserPwd & "User ID=" & AdoSettings.UserId &
";Initial Catalog=" & AdoSettings.Catalog & ";Data Source=" &
AdoSettings.DataSource, AdoSettings.Catalog, AdoSettings.UserId,
AdoSettings.UserPwd
                        '.TestConnectivity
                    End With
                    'SubReportDb.Verify
                End If
            Next subObj
        Next sectVar