Recupero relazioni Datatable dentro un report CR

martedì 11 novembre 2008 - 17.47

joeputrisino Profilo | Junior Member

Salve a tutti e complimenti per il vostro lavoro.
Avrei un problema da postarvi forse vi sembrerà banale ma non riesco a risolverlo. Dunque il mio problema è che ho un campo nel database SqlServer 2005 dove contengo la path del file immagine che devo inserire nel report. Leggendo sul sito ho trovato una sintassi query per fare una Vista che mi da un campo fittizzio di tipo blob da mettere sul report. Nel form che contiene il Crystalviewer passo tutto mediante datatable prendo le tabelle nel report e dopo gli passo il file immgaine che ho in memoria tramite file stream. Dopo metto tutto in un dataset e lo faccio puntare al report. Mi funziona tutto e vi ringrazio per le dritte, l'immagine mi cambia a secondo del path, solo che facendo così perdo le relazioni che avevo nel report e quindi mi escono sempre i dati ripetuti. "Freeteo" diceva di recuperare i link delle tabelle in questa maniera :

"report.Database.Tables(0).SetDataSource(...)"

Ebbene sicuramente sto sbagliano ma se lo faccio non mi funziona più la formula. Vi posto il codice sperando che mi illuminate sul mio errore. Vi posto solo la parte dove mi costruisco le datatable mediante array. Sto parametrizzando tutto e mi funziona solo che perdo i links delle tabelle. Sotto poi passo tutto al dataset


[code]Dim report As New CrystalDecisions.CrystalReports.Engine.ReportDocument
Dim dsreport As New DataSet
Dim tabellerpt() As DataTable = Nothing
Dim numtabellerpt As Integer = 0
Dim arraytabella As Integer = 0
'
ReDim tabellerpt(0) 'inizializzo a 0 per contenere il primo
For numtabellerpt = 0 To report.Database.Tables.Count - 1
'controllo il numero delle tabelle effettive, non quelle alias (Sul Report avranno un suffisso)
If report.Database.Tables(numtabellerpt).Name = report.Database.Tables(numtabellerpt).Location Then
arraytabella = arraytabella + 1
Array.Resize(tabellerpt, arraytabella) 'Aumento l'array di tabelle
'tabellerpt(arraytabella - 1) = New DataTable(report.Database.Tables(numtabellerpt).Location)
tabellerpt(arraytabella - 1) = New DataTable(report.Database.Tables(numtabellerpt).Name)
' report.Database.Tables(numtabellerpt).SetDataSource(tabellerpt(arraytabella - 1).TableName)
End If
Next
dsreport.Clear()
dsreport.Dispose()
'Per ogni tabella riempo in memoria
For numtabellerpt = 0 To tabellerpt.Length - 1
Dim miaDataAdapterimage As New SqlClient.SqlDataAdapter("Select distinct* from " & tabellerpt(numtabellerpt).TableName, db)
'Intercettare il nome tabella contente il path del logo e aggiornare i datai dalla memoria
If nometabellalogorpt = tabellerpt(numtabellerpt).TableName Then
miaDataAdapterimage.SelectCommand.CommandText = "Select * from " & tabellerpt(numtabellerpt).TableName & " Where TB02_CODDITTA=" & codicenodo
miaDataAdapterimage.Fill(tabellerpt(numtabellerpt))
Dim miadr As DataRow
For Each miadr In tabellerpt(numtabellerpt).Rows
miadr.Item("Immagine") = getFile(pathlogorpt) 'la funzione get file è definita in una sub
Next
End If
miaDataAdapterimage.Fill(tabellerpt(numtabellerpt))
dsreport.Tables.Add(tabellerpt(numtabellerpt))
Next
report.SetDataSource(dsreport)
report.RecordSelectionFormula = formulareport
Come vedete le parti commentate, tranne per le descrizioni, ci sono perchè non mi fanno funzionare la formula che gli passo dopo al report. Dove sbaglio?

In questo momento mi restituisce il report con dati doppi, tipo su 150 records che mi esce in progettazione, in runtime me ne esce 300, dove nelle pagine dispari ci sono i loghi che ho cambiato in memoria nelle pari invece il file immagine non compare. Ci sbatto un pò. Se qualcuno può aiutarmi ne sarei grato.

freeteo Profilo | Guru

Ciao,
il fatto che siano tutte doppie le righe potrebbe anche influire sulle relazioni effettivamente.
Mi sembra di aver visto dal codice che viene riempita 2 volte chiamando "miaDataAdapterimage.Fill(tabellerpt(numtabellerpt))" prima di girare e settare l'immagine dal path, e di nuovo subito prima di passarla al report tramite setDataSource.

Come mai fai queste 2 chiamate uguali? La prima basta, anche perchè giustamente poi giri sulle righe e setti le immagini dal file su disco, poi devi passarla al report e non ricaricarla nuovamente.
Prova a vedere se togliendo questo doppio passaggio cambia.

ps: la prossima volta il codice selezionalo, e premi il link "Formatta codice" che vedi in alto, così viene scritto indentato ed è più facile da leggere.


ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

joeputrisino Profilo | Junior Member

Grazie Tante, mi hai risolto il problema e svegliato allo stesso tempo, "rifillavo" due volte mi è bastato mettere un else nell' if ed ho risolto, così lo posso parametrizzare del tutto il codice. Grazie di tutto
Maurizio Maccarrone
Enyasoftware srl
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5