Persistenza in memoria di un report

mercoledì 13 aprile 2011 - 10.12
Tag Elenco Tags  VB.NET  |  Visual Studio 2008  |  Crystal Reports 2008

gammash Profilo | Newbie

VB.net 2008 e cr 2008
mi capita questo:
lancio la stampa di un report e va tutto bene, poi lancio la stampa di un secondo report :
ha in comune il tipo ( es. una fattura) ma i dati sono diversi.

Ed invece mi ristampa il report precedente.

Una successiva ristampa del secondo report mi da quello giusto.

Appoggio i dati di stampa su un DB in access in cui svuoto le tabelle prima di ricaricarle e controllandolo risultano
correttamente caricate.

Ho letto da qualche parte la frase "scollegare l'oggetto CR" ma non saprei come fare

ho i clienti che stanno impazzendo : stampano fatture che ovviamente non corrispondono
qualcuno ha qualche consiglio ?

freeteo Profilo | Guru

Ciao,
come passi i dati al report? Posta un po' di codice così diventa più possiamo indagare in maniera più precisa...cmq se vuoi un consiglio su come gestire i report in applicazioni Win32 puoi prendere spunto da qui: http://www.dotnethell.it/articles/Crystal-Reports-Integration-Windows-Form.aspx

Per quanto riguarda applicazione web il codice è praticamente uguale, solo che lo devi fare nel Page_Load della pagina il passaggio di dati.

Ciao.

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

gammash Profilo | Newbie

ti ringrazio per il link, ma da quell'articolo ho già preso spunto : ho ottenuto di stampare ed è stato già un grande passo avanti

per le stampe faccio in questo modo:
ho un DB in access di appoggio per i dati verso i report
quindi quando lancio una stampa per prima cosa svuoto la tabella di competenza di access e la popolo con i dati che m'interssano. e chiudo il db access

Ho poi un form a cui passo il nome della stampa ( ho una tabella in SQL che mi relaziona il nome stampa al report da utilizzare), il numero di copie e la destinazione ( Stampante o Video) con questo codice
If e.Button = Windows.Forms.MouseButtons.Left Then dovestampo = "P" Else dovestampo = "V" End If Dim frmdialogo As New U_lanciastampa(nomestampa, dovestampo, 1) If dovestampo = "P" Then frmdialogo.Show(Me) Else frmdialogo.ShowDialog(Me) End If

a questo punto il controllo passa a U_lanciastampa il cui codice è tutto qui

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

a questo punto , a seconda se ho chiesto la stampa a video o direttamente alla stampante,
ottengo UN qualcosa, ma senza una logica ( o almeno senza che ce lo spieghiamo)
il qualcosa può essere sia la stampa richiesta, sia l'ultima stampa effettuata nella sessione di lavoro

freeteo Profilo | Guru

Ciao,
stavo riflettendo sul fatto che forse potresti usare un diverso overload del metodo "Load(...)" del report, quello che ha un parametro dove gli dici ci aprirlo come una copia temporanea (OpenReportMethod.OpenReportByTempCopy) che dovrebbe essere quindi nuovo ogni volta che viene chiamato...

Ciao.

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

gammash Profilo | Newbie


purtroppo il problema continua a manifestarsi anche facendo questa modifica.

Stavo pensando di passare dall'appoggio ad DB esterno all'uso di formule direttamente da programma.

Come la vedi ?

freeteo Profilo | Guru

>
>purtroppo il problema continua a manifestarsi anche facendo
>questa modifica.
mmhhh hai un progetto da poter allegare in modo da vedere dove potrebbe stare l'inghippo?



>Stavo pensando di passare dall'appoggio ad DB esterno all'uso
>di formule direttamente da programma.
io non uso mai un db esterno...almeno non ho mai avuto la necessità perchè lo ritengo una pratica "poco ortodossa"
Cmq sia vedi tu, io ho gestito tutto anche le query più complesse da codice e passato al report una DataTable (o più a seconda del report, o dei sottoreport) con il risultato della query sul db principale, ma senza avere mai una reale necessità di un db esterno.

Ciao.

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

gammash Profilo | Newbie

sfrondo un po' il progetto e te lo invio

per quanto riguarda il passaggio di dati via DB, lo uso perche' così mi riesce più facile modificare il report ( prendo i dati dal DB modificandolo a seconda di quello che mi serve, invece di dover mandare in esecuzone ogni volta il progr), ma resto apertissimo a soluzioni diverse e certamente meno "ortodosse" della mia

stavo provando con un REFRESH, ma pare che mi dia lo stesso risultato

freeteo Profilo | Guru

>così mi riesce più facile modificare il report ( prendo i dati
>dal DB modificandolo a seconda di quello che mi serve, invece
>di dover mandare in esecuzone ogni volta il progr),
sì certo questo per quanto riguarda il disegnare il report è una cosa che faccio spesso anche io, perchè di fatto quando lo disegni il source non importa quale sia, meglio che sia il più comodo per te, quello che intendevo io era che quando lo visualizzi nel programma lo agganci al databse temporaneo e riempi quello con i dati...ho visto fare anche questo...comodo ma non "molto elegante"

Aspetto il tuo progetto cmq mi è venuto in mente che nel report c'è un'impostazione che è "save data with report" se non ricordo male da qualche parte...che non sia quello prova a vedere se la trovi nel designer, in qualche voce di menu Crystal Report...

Ciao.

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

gammash Profilo | Newbie


>sì certo questo per quanto riguarda il disegnare il report è
>una cosa che faccio spesso anche io, perchè di fatto quando lo
>disegni il source non importa quale sia, meglio che sia il più
>comodo per te, quello che intendevo io era che quando lo visualizzi
>nel programma lo agganci al databse temporaneo e riempi quello
>con i dati...ho visto fare anche questo...comodo ma non "molto
>elegante"

ehm.......forse perchè .....non ho mai saputo farlo decentemente......
mi sa che devo approfondire.....magari vedendo un po' di esempi

>c'è un'impostazione che è "save data with report" se non ricordo
>male da qualche parte...che non sia quello prova a vedere se
>la trovi nel designer, in qualche voce di menu Crystal Report...

provato, ma non è quello

ma la notizia "bomba" è che sfrondando e semplificando il progetto ho potuto restringere un po' la casistica :
1) il problema si presenta SEMPRE sulla seconda stampa consecutiva di uno stesso report; ristampando poi aggiorna i dati
2) se chiamo anche la stessa stampa da 2 form diversi il problema si presenta ( ma in maniera random);
3)se invece continuo a stampare dallo stesso form il problema non si presenta.

bel grattacapo.......

ma in una "prova della disperazione" ho trovato quello che penso sia la soluzione :

ho messo all'uscita del modulo di stampa un

cryRpt.Close()

ed ora FUNZIONA

Non so se sono stato stupido io a non metterlo mentre tutti sanno che occorre inserirlo, oppure è una lacuna nella manualistica.
Fatto sta che ora pare funzionare

Qualche altra prova "sotto stress" e posso dire chiuso questo threads.( incrocio le dita !)

freeteo Profilo | Guru

mmhhh...ma la variabile "cryRpt" è comune ossia sempre la stessa per report diversi? Perchè allora resta qualcosa in cache...io sono abituato a fare una variabile report diversa ad ogni stampa, perchè di fatto è "una nuova stampa"...

Ciao.

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

gammash Profilo | Newbie

>mmhhh...ma la variabile "cryRpt" è comune ossia sempre la stessa
>per report diversi? Perchè allora resta qualcosa in cache...io
>sono abituato a fare una variabile report diversa ad ogni stampa,
>perchè di fatto è "una nuova stampa"...

ho realizzato un modulo che si occupa delle stampe : è unico e viene richiamato da tutti gli altri moduli passandoci solo il nome del report da utilizzare

Dal momento che una stampa può o essere indirizzata direttamente alla periferica di competenza ( che però può essere diversa a seconda del tipo di report ed anche diversa tra la prima e le copie seguenti) oppure essere visualizzata e poi stampata con un print Dialog o anche realizzata in pdf (ed anche qui potrebbe cambiare il tipo di report) oppure inviata per email, ho preferito centralizzare la funzione di stampa.
Si potebbe pensare a fare una variabile diversa per ogni tipo di report, però.......a parte che sarebbeun bel casino, ma dovrei mettere mano al modulo di stampa ogni volta che aggiungo un report al programma.

Sono d'accordo con te che è un problema di cache che non viene ripulita.
Oggi va sotto test il metodo del "close" ........vediamo come va.

freeteo Profilo | Guru

>Si potebbe pensare a fare una variabile diversa per ogni tipo
>di report, però.......a parte che sarebbeun bel casino, ma dovrei
>mettere mano al modulo di stampa ogni volta che aggiungo un report
>al programma.
sì beh ti basterebbe fare un "cryRpt = new ReportDocument()" ogni volta che apri un report, non occorre fare una "varibile nuova" è di fatto il creare un oggetto nuovo che appoggi su quella variabile... o fai già così?


>Sono d'accordo con te che è un problema di cache che non viene
>ripulita.
>Oggi va sotto test il metodo del "close" ........vediamo come va.
ok


Ciao.

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

gammash Profilo | Newbie

>sì beh ti basterebbe fare un "cryRpt = new ReportDocument()"
>ogni volta che apri un report, non occorre fare una "varibile
>nuova" è di fatto il creare un oggetto nuovo che appoggi su quella
>variabile... o fai già così?

si, è nel codice ( non visualizzato direttamente) che ti ho postato più sopra.
in realtà è stato uno dei primi tentativi fatti : "la soluzione è ovvia :utilizziamo una nuova variabile ad ogni stampa"...ed invece......

volevo chiederti, anche se mi rendo conto che è un threads diverso, se mi puoi consigliare qualche link di esempio di passaggio di variabili e data table direttamente da programma a report, senza passare per db

freeteo Profilo | Guru

>volevo chiederti, anche se mi rendo conto che è un threads diverso,
>se mi puoi consigliare qualche link di esempio di passaggio di
>variabili e data table direttamente da programma a report, senza
>passare per db
per quanto riguarda il passaggio di dati puoi prendere spunto da qui (infondo alla pagina c'è anche l'allegato da poter scaricare):
http://www.dotnethell.it/articles/Crystal-Reports-Integration-Windows-Form.aspx

per quanto riguarda passare una variabile fai presto, ti basta includere nel report un campo "formula" che puoi lasciare vuoto e mettere dove ti serve nel report.
Poi da codice gli passi il valore che vuoi visualizzare:
report.DataDefinition.FormulaFields["nome"].Text = " 'valore da visualizzare' ";

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5