Crystal reprot 11 e dati in datagrid

mercoledì 27 gennaio 2010 - 21.22

giovy87 Profilo | Newbie

Ciao a tutti vi espongo il mio problema:

Sto creando una piccola applicazione basata su visual basic e ado net, sostanzialmente il software non fa altro che interrogare un database access e restituire i risultati in una datagrid. Ora viene il bello, infatti mi piacerebbe poter stampare il contenuto della mia datagrid su un report creato in precedenza con crystal report 11 ma non so cosa mi sfugga non riesco a passare i dati della data grid al crystal report in fase di runtime.
Nel report in fase di design ho creato una crossTable con una query simile a quella che utilizzo per cercare i dati nel database ma in fase di runtime visualizzo i dati della query non i dati della data grid.

il codice da me usato è

report.SetDataSource(Form1.dtgrid.DataSource)

la data grid è in un altro form. Ho visto qualche altro esempio nel forum ma non riesco a farlo funzionare.

Se qualcuno potesse aiutarmi magari descrivendo non solo il codice ma il rpocedimento corretto per disegnare il report

Jeremy Profilo | Guru

Ciao.
Con il metodo SetDataSource, devi passare l'istanza della dataTable(popolata con i dati), o del dataset, che sia perfettamente uguale, in termini di struttura, all'origine dati utilizzata per la progettazione del Report.

Facci sapere...
Ciao

giovy87 Profilo | Newbie

non riesco a capire cosa si intende per struttura uguale. Non riesco a creare una tabella su crystal report con la struttura che desidero ho provato sia crosstable che group ma non riesco a capire come fare credo che il problema sia tutto qui

PS: Sto usando cristal report 11 professional

Jeremy Profilo | Guru

Ciao.
Per la progettazione del Report hai usato un Dataset come origine dati?
Se si ..... e supponiamo che si chiami Dataset1 .... dovrai popolare un'istanza del Dataset1(che sarà anche il datasource del datagridView) e passarlo al report con il metodo SetDataSource.
Ad ogni modo..... Se mostri un pò di codice ci capiamo meglio.

Facci sapere....
Ciao

giovy87 Profilo | Newbie

adesso ho cambiato il tipo di connessione in crystal sto utilizzando oledb ado, creando la tabella con la solita query contenente i campi visualizzati nella dtgrid nel momento di richiamare il report nel crystal report viewer ottengo un errore "Accesso non riuscito. Riprovare", premendo ok sulla finestra ottengo il report con i campi selezionati con la query statica data da crystal.

posto il codice da me utilizzato per aprire il report

Dim report As New ReportDocument

report.Load("Report1.rpt")
report.SetDataSource(Form1.dtgrid.DataSource)
CrystalReportViewer1.ReportSource = report
CrystalReportViewer1.RefreshReport()


vorrei aggiungere inoltre che la tabella nel report la creo selezionando add command e inserendo la query sql che genera i risulatati che in visual vengono visualizzati in una datagrid.

Il report l'ho disegnato con il wizard scegliendo new connection poi OLE DB ADO come stringa microsoft jet 4.0 e infine il file mdb contenete il database

nelle finestre successive ho lasciato tutto di default tranne il fatto che ho creato questo nuovo comando per creare questa tabella.

Spero di non aver tralasciato nulla.

Jeremy Profilo | Guru

Ma per progettare il Report .... Hai usato un Dataset??? O hai usato una connesione "diretta" al database???

facci sapere...
Ciao

giovy87 Profilo | Newbie

no penso sia una connessione diretta... mentre tu mi stavi rispondendo io stavo editando il messaggio

Jeremy Profilo | Guru

Ma allora a che ti serve impostare a RunTime un Nuovo datasource?
Ti basta fare in modo che la tabella collegata al report contenga i dati filtrati secondo i tuoi criteri ... no?
C'è un motivo in particolare per cui devi/vuoi utilizzare il metodo SetDataSource?

facci sapere...
Ciao

giovy87 Profilo | Newbie

forse mi sono espresso male ciò che scrissi 2 post fa riguardava la procedura da me seguita non quello che vorrei fare. In sostanza io dovrei visualizzare in un report i dati provenienti da una datagrid di visual. i dati da me letti non vengono poi passati ad una tabella.
Non capisco come si fa a disegnare un report con un data set...

giovy87 Profilo | Newbie

ciò che provo a fare è quello di assegnare come datasource del report una dataset che dovrebbe essere restituita da form1.dtgrid.datasource tengo presente che la griglia e il report sono dichiarati in due form differenti.

Il report l'ho costruito con una query e pensavo di riempirlo cambiando semplicemente da datasource del report stesso... mi sfugge qualcosa ma non riesco a capire questo "cosa"

AGGIORNAMENTO

Ho fatto una prova ho creato un nuovo form con una nuova datagrid se in questo nuovo oggetto voglio vedere le stesse cose che ci non nella datagrid nel form1 mi accorgo che se non setto il datamenber oltra al datasource non vedo nulla.

Jeremy Profilo | Guru

Ciao.
Allora ... facciamo un pò di ordine.
La tua applicazione ha bisogno di visualizzare dei dati su di un datagridview e, gli stessi dati, visualizzarli anche nel report ..... giusto?
Il motivo per cui hai creato un report con un origine dati "connessa" è soltanto casuale .... giusto?
Se SI a tutte e 2 le domande ... vediamo di cambiare approccio.
Probabilmente dovrai riprogettare il tuo report usando, come origine dati, un Dataset tipizzato creato a Design-Time .... ma mi servirebbe capire se sei in grado di farlo tu o se ti devo mandare un progettino di esempio.

Facci sapere....
Ciao

giovy87 Profilo | Newbie

ok perfetto devo fare un data set perchè hai centrato il problema. Purtroppo so creare questo dataset a dire la verità non so neanche cosa sia sulla piattaforma net mi sono ritrovato tutte queste nuove strutture per la gestione dei dati e mi sono confuso un pò.
Si la connessione al database nel report è casuale l'ho fatta perchè ho letto in un forum che bisognava creare il report con la tabella strutturata come la datagrid

Ricordo che ul database è access

Jeremy Profilo | Guru

Se hai pazienza .... entro domani notte ti posto un progettino di esempio .... prima non posso perchè sono un pò indietro con il lavoro.

Ciao

giovy87 Profilo | Newbie

va bene ti ringrazio del tempo che m istai dedicando io vedo se riesco a trovare qualcosa online nel caso affermativo ti mando un post così da non farti perdere tempo inutile

giovy87 Profilo | Newbie

allora ho fatto dei progressi e sono riuscito nel mio intento al 90%, ti spiego meglio sono riuscito a creare questo benedetto dataset tipizzato tramite menu di visual studio ho importato le tabelle che mi servono e creato questo dataset. Poi ho ricreato il report dando come origine dati proprio il data set.
Ho creato il report con i campi che voglio visualizzare non ho usato nessun ragguppamento e nessun filtro ora popolando il report con la solita stringa

report.SetDataSource(form1.dtgrid.DataSource) e finalmente funziona anche se mi sono accorto che il campo data ordine non viene visualizzato rimane vuoto premetto che i primi 4 campi visualizzati sono presi da una tabella che chiameremo tabella1 e il campo data viene estratto con un join da un altra tabella che chiameremo tabella 2.

Premetto che ho passato alla datagrid come dataMember solo tabella1, ma nonostante ciò nella datagrid visualizzo tutti i campi.

Cosa avrei sbagliato?

Jeremy Profilo | Guru

Hai sicuramente sbagliato la struttura del dataset associato al Report .....
Il Dataset(origine dati del Report) deve essere tipizzato a modi "vista" ..... provo a spiegarmi meglio.
Tabella1
Campo1_1 Campo2_1 Campo3_1

Tabella2
Campo1_2 Campo2_2

Per visualizzare tutti i campi .... la struttura del Dataset associato al report dovrà essere una datatable contente i campi:
Campo1_1 Campo2_1 Campo3_1 Campo1_2 Campo2_2

oppure, se vuoi mantenere la stessa struttura del Db(quindi 2 datatable differenti) .... dovrai preoccuparti di popolare le due datatable ed utilizzare un sottoreport come filtro dei dati.

Spiegato così .... potrebbe essere difficile da comprendere, pertanto rinnovo la mia disponibilità a prepararti un esempio entro domani.
Ciao

giovy87 Profilo | Newbie

finche non scrivo che risolvo la 100% tu se puoi compatibilmente con i tuoi impegni fai il progetot di esempio, quindi se ho capito il dataset lo devo creare sulla base di una query... vediamo se riesco a sistemare da solo

Jeremy Profilo | Guru

>il dataset lo devo creare sulla base di una query
NO!
Devi dimenticare per un attimo la struttura delle tabelle del Db ..... dimentica!
Crea un dataset tipizzato con una singola DataTable che contenga i campi che ti servono per costruire il Report (ricorda di dimenticare la struttura delle tabelle del Db).
Popola quel dataset con i dati provenienti dal Db e passa quel dataset con il metodo setDataSource al Report.
Fatto questo .... se funziona .... puoi complicarti un pò le cose, se preferisci, usando lo stesso DataSet(se sei solito farlo) che usi come contenitore dati disconesso per la gestione dei dati per l'intera applicazione.
Ciao


giovy87 Profilo | Newbie

ho creato il dataset chiamato table1 ma non capisco come popolarlo con i risultati della datagrid
il dataset l'ho creato tramite editor di visual studio e tramite query ho forse sbaglaito? se ti faccio perdere troppo tempo lascia stare aspetto domani

Jeremy Profilo | Guru

Non è questione di perdere o meno tempo .... quando rispondo, lo faccio perchè mi va di farlo.
E' questione di capirsi o meno .... lavorando su qualcosa di "comune" forse ci si capisce meglio....non credi?

A domani.
Ciao

giovy87 Profilo | Newbie

sicuramente ok a domani

giovy87 Profilo | Newbie

Ciao finalmente stamattina a mente lucida ho capito il dafarsi...Allora ho costruito un nuovo dataset DataSet1 dove ho costruito una nuova dataTable chiamata ROR_ Qui ho aggiunto le 5 colonne che mi servivano, successivamente ho popolato il mio dataset con una query e un oledbdataadapter e passato in dataset alla griglia, successivamente ho passato il datasource della griglia al report e funziona correttamente.

L'unico problema rimasto è che eseguendo una nuova ricerca il dataset accoda i nuovi dati a quelli già presenti, a tal proposito volevo chiederti se esistesse un metodo che svuota il dataset.

giovy87 Profilo | Newbie

risolto con il metodo clear() comunque se potesimo parlarne meglio di questa tecnica del dataset mi piacerebbe poter approfondire l'argomento

Jeremy Profilo | Guru

Complimenti per lo spirito .... non hai aspettato che qualcuno risolvesse il problema al posto tuo!
Per il resto .... chiedi pure.
Se quello di cui hai bisogno informazioni non c'entra nulla con il titolo del thread, sarebbe meglio che ne aprissi un'altro.

Facci sapere...
Ciao

giovy87 Profilo | Newbie

si ok devo mettere qualcosa per indicare che ho risolto?

Jeremy Profilo | Guru

Se ritieni utili i suggerimenti che ti ho dato puoi accettare una delle mie risposte .... verrà sovraposto un flag verde sul titolo del thread per indicare che il problema è stato risolto.
Ciao.
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5