Full join e CR

domenica 15 giugno 2008 - 21.06

albedo Profilo | Junior Member

Salve a tutti.

Non riesco a visualizzare su un report i dati relativi a due tabelle legati insieme da una full join.
Il fatto è che lo stesso dataset se richiamato per popolare una Datagriview funzione egregiamente:

sql = "SELECT CARICHI.DATA, CARICHI.ARTICOLO, CARICHI.ESISTENZA, CARICHI.CARICO, " _
& "CARICHI.RESO, VENDITE.COLLI " _
& "FROM CARICHI INNER JOIN VENDITE ON CARICHI.ID_ART = VENDITE.ID_ART " _
& "AND CARICHI.ID_FOR = VENDITE.ID_FOR AND CARICHI.DATA = VENDITE.DATA " _
& "WHERE VENDITE.DATA BETWEEN #2008/01/01# AND #2008/12/30# " _
& " GROUP BY CARICHI.DATA, CARICHI.ARTICOLO, CARICHI.ESISTENZA, " _
& "CARICHI.CARICO, CARICHI.RESO, VENDITE.COLLI " _
& " UNION ALL SELECT CARICHI.DATA, CARICHI.ARTICOLO, CARICHI.ESISTENZA, " _
& "CARICHI.CARICO, CARICHI.RESO, IIF(ISNULL(VENDITE.COLLI),0 , VENDITE.COLLI) " _
& "FROM CARICHI LEFT JOIN VENDITE ON VENDITE.ID_ART = CARICHI.ID_ART " _
& "AND VENDITE.ID_FOR = CARICHI.ID_FOR AND CARICHI.DATA = VENDITE.DATA " _
& "WHERE ISNULL(VENDITE.ID_ART) AND CARICHI.DATA BETWEEN #2008/01/01# AND #2008/12/30#" _
& " GROUP BY CARICHI.DATA, CARICHI.ARTICOLO, VENDITE.COLLI, " _
& "CARICHI.ESISTENZA, CARICHI.CARICO, CARICHI.RESO, VENDITE.COLLI" _
& " UNION ALL SELECT VENDITE.DATA, VENDITE.ARTICOLO, IIF(ISNULL(CARICHI.ESISTENZA), 0, CARICHI.ESISTENZA)," _
& "IIF(ISNULL(CARICHI.CARICO), 0, CARICHI.CARICO), IIF(ISNULL(CARICHI.RESO), 0, CARICHI.RESO), VENDITE.COLLI " _
& "FROM VENDITE LEFT JOIN CARICHI ON CARICHI.ID_ART = VENDITE.ID_ART " _
& "AND CARICHI.ID_FOR = VENDITE.ID_FOR AND CARICHI.DATA = VENDITE.DATA " _
& "WHERE ISNULL(CARICHI.ID_ART) AND VENDITE.DATA BETWEEN #2008/01/01# AND #2008/12/30#" _
& " GROUP BY VENDITE.DATA, VENDITE.COLLI, " _
& "CARICHI.ESISTENZA, CARICHI.CARICO, CARICHI.RESO, VENDITE.ARTICOLO"

Penso dipenda da una qualche impostazione di CR.

Grazie

freeteo Profilo | Guru

cosa intendi per non riuscire, il report ti compare bianco?
Supponendo che la query sia giusta, che tipo di connessione hai usato? ti consiglio di usare Oledb

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

albedo Profilo | Junior Member

Ciao, scusa e scusa se rispondo dopo tanto tempo.

La query è correta, infatti se la uso per riempire un Dataset e quindi una Datagridview tutto fila liscio, ma se provo ad usarla per popolare un report... beh si comporta in maniera strana, come se venissero meno le join della query....

questa è la parte di codice che uso per riempire il report... ho idea che ci sia qualcosa di errato nel modo in cui assegno la tabella al Dataset:

Dim RepFor As New ReportDocument
Dim RepPath As String


RepPath = "C:\Documents and Settings\Fabio\Documenti\Visual Studio 2005\Projects\...\CrystalReport1.RPT"

Dim DS As New DataSet("NEW_CAR")
Dim DA As New OleDb.OleDbDataAdapter(sql, cn)

DA.Fill(DS, "NEW_CAR")


RepFor.Load(RepPath)
RepFor.SetDataSource(DS)
RepFor.Refresh()
CrystalReportViewer1.ReportSource = RepFor

se al Dataset associo la tabella VENDITE o la tabella CARICHI si comporta come se ignorasse di volta in volta i dati provenienti dalla tabella CARICHI nel primo caso, e quelli provenienti dalla tabella VENDITE nel secondo.

Ciao e grazie

freeteo Profilo | Guru

ciao,
ma la struttura che ti torna la query è la stessa che ti trovi nella tabella del dataset?
Intendo singola tabella del dataset, non che il dataset abbia 2tabelle a loro volta in join tramite "Relation", intendo proprio una tabella singola con dei campi che hanno valori duplicati che infatti sono nella join...

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

albedo Profilo | Junior Member

Non ti seguo, scusa è da poco che ho a che fare con i dataset, cmq io pensavo che il dataset venisse riempito tramite il Dataadapter, che venisse riempito cioè con una nuova tabella che è la risultante della query...

Ciao

freeteo Profilo | Guru

non preocccuparti, è giusto per capire se al report arrivano gli stessi dati che hai usato nel crearlo ed intendo come struttura, quindi posizione dei campi, nomi, tipi etc..ovviamente non i valori .

Il fatto è che se hai costruito un report con uan query tipo:
select campo1, campo2, campo3 from tabella...

poi il dataAdapter deve tornarti una tabella con quei 3 campi e con lo stesso nome e dello stesso tipo e allora puoi passargli la tabella al report, tramite il metodo "SetDataSource"...

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

albedo Profilo | Junior Member

Sì, al report arrivano gli stessi valori... ho modificato la query aggiungendo degli alias ed ho fatto in modo che la condizione 'WHERE' relativa all'intervallo di date da prendere in considerazione fosse pari ad un solo giorno così da capire meglio cioò che accade e sembra che le join non vengano affatto prese in considerazione.... in pratica nella tabella carichi ho quattordici record di cui solo quattro con un valore di data pari a '2008/06/01' invece il report mi ritorna 17 record.

la stessa qery, con il dataset impostato allo stesso modo per riempire una Datagridview mi riprota tutti i valori corretti. a questo punto penso sia un problema di CR, magari mi sbaglio.

ecco la query con gli alias e il codice che uso per popolare il report:

sql = "SELECT CARICHI.DATA AS D, CARICHI.ARTICOLO AS A, CARICHI.ESISTENZA AS E, CARICHI.CARICO AS C, " _
& " CARICHI.RESO AS R, VENDITE.COLLI AS V " _
& "FROM CARICHI INNER JOIN VENDITE ON CARICHI.ID_ART = VENDITE.ID_ART " _
& "AND CARICHI.ID_FOR = VENDITE.ID_FOR AND CARICHI.DATA = VENDITE.DATA " _
& "WHERE VENDITE.DATA BETWEEN #2008/06/01# AND #2008/06/01#" _
& "UNION ALL SELECT CARICHI.DATA AS D, CARICHI.ARTICOLO AS A, CARICHI.ESISTENZA AS E, " _
& "CARICHI.CARICO AS C, CARICHI.RESO AS R, IIF(ISNULL(VENDITE.COLLI),0 , VENDITE.COLLI) AS V " _
& "FROM CARICHI LEFT JOIN VENDITE ON VENDITE.ID_ART = CARICHI.ID_ART " _
& "AND VENDITE.ID_FOR = CARICHI.ID_FOR AND VENDITE.DATA = CARICHI.DATA " _
& "WHERE ISNULL(VENDITE.ID_ART) AND CARICHI.DATA BETWEEN #2008/06/01# AND #2008/06/02#" _
& " UNION ALL SELECT VENDITE.DATA AS D, VENDITE.ARTICOLO AS A, " _
& "IIF(ISNULL(CARICHI.ESISTENZA), 0, CARICHI.ESISTENZA) AS E, " _
& "IIF(ISNULL(CARICHI.CARICO), 0, CARICHI.CARICO) AS C, IIF(ISNULL(CARICHI.RESO), NULL, CARICHI.RESO) AS R, " _
& "VENDITE.COLLI AS V " _
& "FROM VENDITE LEFT JOIN CARICHI ON CARICHI.ID_ART = VENDITE.ID_ART " _
& "AND CARICHI.ID_FOR = VENDITE.ID_FOR AND CARICHI.DATA = VENDITE.DATA " _
& "WHERE ISNULL(CARICHI.ID_ART) AND VENDITE.DATA BETWEEN #2008/06/01# AND #2008/06/01# "

Dim myRep As New ReportDocument
Dim RepPath As String
RepPath = "C:\Documents and Settings\Fabio\Documenti\Visual Studio 2005\Projects\...\CrystalReport1.RPT"
Dim DS As New DataSet("XXX")
Dim DA As New OleDb.OleDbDataAdapter(sql, cn)
DA.Fill(DS, "XXX")
myRep.Load(RepPath)
myRep.SetDataSource(DS)
myRep.Refresh()
CrystalReportViewer1.ReportSource = myRep

Ciao

albedo Profilo | Junior Member

Tanto per essere più precisi. a sinistra c'è una datagridview popolata mediante lo stesso Dataset che, a destra,restituisce quell'accozzaglia ri records...
Se riuscite a farmi capire qualcosa.

Grazie

831x579 105Kb

freeteo Profilo | Guru

ciao,
scusa non ho capito cosa ti serve visualizzare, forse ti basta aggiungere un raggruppamento per il campo "data" e così vedi quelli di quel giorno (e puoi mettere campi aggiuntivi come somme etc...)?

Ti basta fare TastoDX->Insert->group e scegli il campo data.

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

albedo Profilo | Junior Member

Ciao, Freeteo

Vorrei visualizzare sul report gli stessi record che compaiono nella datagrid, ripeto che lo stesso Dataset riempita mediante la stessa query produece due risultati completamente diversi§: corretti nel primo caso, mentre nel primo caso sembra che ignori del tutto la tabella del dataset e che prenda in considerazione solo i record che rispondono ai criteridi collegamnto impostati di default (es: data con dat, id_for con id_for etc...)

Non so se sono riuscito a farmi capire.

In sostanza: perchP il report non mi restituisce pari pari la tabella presente nel dataset?

cIAO

freeteo Profilo | Guru

ciao,
non ho capito cosa intendi per "completamente diversi", il fatto è che sono "arrangiati" in maniera diversa ma mi sembra di vedere gli stessi dati.
Ti ripeto, dipende da come li hai ordinati...o come li hai raggruppati...e fare la stessa cosa nel report.

Ad ogni modo, puoi controllare che non sia un problema di passare al report il dataset intero, prova a passare una tabella per volta:

report.DataBase.Tables[0].SetDataSource( dataset.Tables[0] ) ; report.DataBase.Tables[1].SetDataSource( dataset.Tables[1] ) ;

etc...e verifica che ci sia un link tra le table che sia corretto (ad es: il campo della prima sia dello stesso tipo della seconda)

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

albedo Profilo | Junior Member

I dati riportati nella datagridview e nel report non sono gli stessi.
Come avrai notato, nella query ho specificato che mi interessavano solo i dati del primo e del due giugno e in effetti il dataset viene riempito correttamente solo con i dati che soddisfano questo criterio... quindi la tabella risultante è quella che ame interessa visualizzare. solo che con una datagridview ci riesco, mentre non so come fare con un report.... credevo bastasse far puntare la sorgente del record alla tabella del dataset, ma evidentemente qualche passaggio mi sfugge.

Forse vanno rispettati i nomi delle colonne... il dataset va implementatato direttamente nel progetto ... dovrei usare un datatable?

Davvero non riesco ad andare avnti....

HELP!!!
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