Origine dati da una classe

domenica 09 dicembre 2007 - 20.02

Silvano Profilo | Newbie

Ciao a tutti!
Sono anch'io a primi approcci a CR.
Dovrei definire l'origine dei dati per un report in una classe, con la necessità di ottenere anche delle liste di dimensione indefinita a priori ( anche una pagina o due).
Come posso fare?
Vorrei che mi indicaste anche solo un precedente post, visto che sicuramente è un problema che avete già affrontato.

Vi ringrazio

freeteo Profilo | Guru

Ciao,
sicuramente devi scriverti il codice che ti popola le liste, e poi le passi al report.
Operativametne ti suggerisco questi passi:
- Creare il report specificando nell'esperto database una sorgente dati che sia la classe .net che ti interessa (es: "Articolo")
Te la trovi nella treeview, sul nodo "project Data"

- adesso costruisci il report, rtgascinando le proprieta' che ti trovi nella finestra "field explorer"
- dalla form usi un codice di questo tipo:
List<Articolo> articoli = new List<Articolo>(); ...popoli la lista facendo le tue logiche ReportDocument report = new ReportDocument(); report.Load(@"c:\...\report.rpt"); report.SetDataSource(articoli); CrystalReportViewer1.ReportSource = report;

Come vedi hai usato i generics, e il metodo "SetDataSource" dell'oggetto "Reportdocument" per passare la lista di oggetti della tua classe.Prova in questa direzione...

ciao.

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

Silvano Profilo | Newbie

Non ho spiegato tutto ...
... io devo costruire un report abbastanza articolato, con un insieme di campi singoli, 4 liste di 3 campi ognuna delle quali non conosco a priori il numero di righe, un paio di campi testo lunghi anche più pagine, il tutto proveniente da una classe (prima di stampare devo svolgere alcune elaborazioni) ...
Come posso procedere ?

freeteo Profilo | Guru

ciao,
scusami, forse non ho capito bene cosa intendi quando dici "proveniente da una classe", vuol dire che hai una classe in memoria riempita, che ha tutti gli oggetti come proprieta?
Es:
class DaStampare { public List<Oggetto> oggetti; public List<Altro> altri; public List<AltroAncora> altriAncora; public string TestoLungo; ...
cosi'? o forse non ho capito bene...prova a farmi un esempio su cosa ti arriva dal tuo codice, poi vediamo come stamparlo.
Grazie.

ciao.

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

Silvano Profilo | Newbie

Esattamente!
Devo necessariamente usase i dataset o posso fare derivare tutto dalla classe?

Saluti e grazie

freeteo Profilo | Guru

ciao,
il problema è che la "gerarchia" di oggetti non è supportata da Crystal, puoi agganciare al report una classe (che deve essere pubblica dentro al progetto purtroppo perche' non vede riferimenti a Librerie di classi di altri progetti) e agganciarlo.
Di questa classe pero', rende disponibili solo gli elementi "piatti" diciamo, ovvero le proprieta' dirette, non quelle che sono Collection.
Quindi nell'esempio mio precedente non sarebbero viste nel "field explorer" mentre costruisci il report.

Percui dovresti farlo con sottoreport o cmq agganciando altre classi, poi da codice setti con le collection delle tue classi, le rispettive tables del report, ad esempio:

- report con 2 tables (aggiunti da "esperto database") una con "Ordine", una con "Articolo"
- da codice setti al report 2 collection distinte List<Ordine> e List<Articolo> rispettivaemnte a REport.DataBase.Tables[0 e 1]

cosi' va.
Se pero' hai una classe in memoria gerarchica, non la puoi bindare direttamente, ovvero lo puoi fare ma non funziona come ti aspetti.
La stessa cosa vale per Sql Reporting, entrambi questi tool di reportistica si aspettano set "piatti" di dati, ripicamente risultanti da una query (dritta o in leftjoin con campi ripetuti sui quali fai raggruppamenti) .
Questa sorgente dati puo' essere datatable, ma anche collection di tuoi oggetti non fa differenza, pero' cmq sia deve essere "piatta"...

ciao.

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

Silvano Profilo | Newbie

Avevo intuito che fosse come hai scritto. Cercherò di utilizzare i dataset anche se non mi convingono molto; ho avuto delle esperienze abbastanza strane con questi ultimi. Nei sottoreports modificando il nome del campo che mette automaticamente nella testata del report, spariscono i valori nei campi corrispondenti, bisogna manipolarli in qualche modo per farli rimanere visibili. Ti risulta qualcosa del genere?

Ti ringrazio, Silvano

freeteo Profilo | Guru

>Avevo intuito che fosse come hai scritto. Cercherò di utilizzare
>i dataset anche se non mi convingono molto; ho avuto delle esperienze
>abbastanza strane con questi ultimi. Nei sottoreports modificando
>il nome del campo che mette automaticamente nella testata del
>report, spariscono i valori nei campi corrispondenti, bisogna
>manipolarli in qualche modo per farli rimanere visibili. Ti risulta
>qualcosa del genere?
non ho capito quando dici "modificando il nome", cosa intendi, che da stringa sql gli cambi il campo con cui hai fatto il raggurppamento?
Il report purtroppo vuole la stessa struttura con cui l'hai creato, quindi se ad esempio hai fatto un report con 4 campi, devi passargli i 4 campi con lo stesso nome/ordine di quelli come l'hai creato.Quidni la DAtaTable del dataset deve avere quelle stesse colonne con lo stesso ordine per intenderci...

ciao.

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

Silvano Profilo | Newbie

Scusa! Non avevo ancora capito.
Quando inserisco un campo in un sottoreport prelevandolo dalla finestra 'explorer campo', se lo posiziono all'estremità dx della pagina (il campo è al limite dell'area stampata), non viene caricato, resta abblankato.
Ti è mai capitato?

Saluti, Silvano.

freeteo Profilo | Guru

>Scusa! Non avevo ancora capito.
>Quando inserisco un campo in un sottoreport prelevandolo dalla
>finestra 'explorer campo', se lo posiziono all'estremità dx
>della pagina (il campo è al limite dell'area stampata), non viene
>caricato, resta abblankato.
>Ti è mai capitato?
sinceramente da me va...ho messo un campo (e poi passato nella sorgente dati del sottoreport) a destra, il campo c'e'.
Non lo vedi se il sottoreport l'hai diensionato nel report principale, piu' piccolo dell'effettivo spazio della pagina, quindi magari il campo che è a destra, non si vede perche' l'area del sottoreport è piu' piccola (quando vai in edit di un sottoreport l'area bianca che vedi è sempre la larghezza della pagina, ma quando sei nel report princiale, al sottoreport puoi cmq dare una dimensione minore...)

ciao.

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

Silvano Profilo | Newbie

Quando inserisco un campo da un sottoreport e lo allineo all'estrema destra, nella stampa il campo non lo vedo più! Mi trovo tutti i campi allineati a destra che non si vedono, basta che li sposto di 0,5 cm che riappaiono; il sottoreport è più piccolo del report principale quindi non è per questo motivo. Comunque grazie ugualmente, con i dataset sono riuscito a stampare tutto, anche se ho dovuto tenerli mezzo cm più a sinistra.

Mi sei stato molto utile! Ti ringrazio ancora coni tutta la mia gratitudine per il grosso lavoro di sostegno che porti avanti con coloro che iniziano l'avventura.

Saluti, Silvano.

freeteo Profilo | Guru

>di 0,5 cm che riappaiono; il sottoreport è più piccolo del report
>principale quindi non è per questo motivo. Comunque grazie ugualmente,
>con i dataset sono riuscito a stampare tutto, anche se ho dovuto
>tenerli mezzo cm più a sinistra.
mmm strana come cosa, non è che sia un problema di margini impostati? nelle proprieta' della pagina (tastoDX->design->page setup) puoi fare qualche aggiustamento...
eventualmente posta un'imagine del comportamento finale ma anche del report/sottoreport a design, cosi' magari provo a simularlo...


>Mi sei stato molto utile! Ti ringrazio ancora coni tutta la mia
>gratitudine per il grosso lavoro di sostegno che porti avanti
>con coloro che iniziano l'avventura.
siamo qui per questo, e si fa quello che si puo'

>Saluti, Silvano.
grazie a te.


ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo
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