Creare un Report per più database

mercoledì 24 febbraio 2010 - 18.32

Alexander23 Profilo | Newbie

Ciao a tutti
ho modificato un report chiamato "ordine fornitore" per l'azienda "A", collegandomi al suo DB, ora vorrei utilizzare questo report anche per le altre aziende che vengono gestite dallo stesso programma di contabilità. come posso fare e dire al report che deve collegarsi a DB diversi?

Spero che mi possiate aiutare

Ps. il report iniziale funzionava su tutte le società, ma una volta che ho aggiunto dei campi non ha più funzionato.

carloalberto Profilo | Junior Member

dipende come hai collegato il report al db ...
io per fare quello che dici , creo un file dsn ad esempio file1.dsn
es:
[ODBC]
DRIVER=SQL Server
UID=adme
PWD=eeeeeeee
Database=AZI_aff
SERVER=carloalberto1
(il file lo creo da pannello di controllo odbc ;-)

collego il db in crystal al file1.dsn
se i due database sono uguali , basta modificare (o ricreare da codice ogni volta) il file1.dsn ed il gioco è fatto

ciao

Alexander23 Profilo | Newbie

Non so se ho capito molto bene... ma non credo che sia fattibile nella mia situazione! Perchè il programma di contabilità nella stampa "ordine fornitore" va a richiamare quel report quindi come potrei dire di creare il file dns da codice? oppure tutto lo fa il report?

io non posso mettere mano al programma di contabilità!

Ho notato che aprendo il report originale il Server a cui fa riferimento si chiama "Diabolik" e l'azienda "Azienda_Tx" ma questo server e l'azienda non esistono...


Grazie mille

carloalberto Profilo | Junior Member

... l'ho capito dopo , non avevo letto l'ultima tua riga ...
probabilmente devi rimappare il campo che hai aggiunto
ovvero deve essere 'collegato' al db come gli altri campi
dal menu, database,set dabase location

Alexander23 Profilo | Newbie

Infatti ora che ho modificato il report a mio piacimento collegandomi ai campi della società "A" il report funziona solo su quella società... a ma servirebbe che funzionasse per tutte le altre come l'originale!

Quindi avrei bisogno che i campi non fossero collegati direttamente ad un unico DB ma che fossero generici ed in base all'azienda con cui lavoro si collegassero.

I campi sono sempre chiamati allo stesso modo!

Grazie

carloalberto Profilo | Junior Member

ok, immagino che il programma di contabilita è lo stesso il db è lo stesso, , quello che cambia è il nome del server
la connessione del report originale come si collegava ?
se vai dove dicevo prima cosa vedi?

Alexander23 Profilo | Newbie

Allora il programma di contabilità è lo stesso come il server... quello che cambia è il DB. Il problema che ogni DB fa riferimento ad un unico report!

Aprendo come hai detto tu il report originale il server a cui fa riferimento si chiama "DIABOLIK" ed il db "AZIENDA_T75", ma come ho detto prima questi non esistono in azienda... oppure non riesco a collegarmi, ma penso che sia più probabile la prima!!! quindi quando provo a collegarmi mi da esito negativo. C'è la possibilità di cambiare il nome server e db senza che tenti di effettuare il collegamento? così proverei a lanciare la stampa per vedere se riesce a stampare.

Grazie mille spero che possiate illuminarmi!

Alexander23 Profilo | Newbie


Niente di nuovo? nessuno può aiutarmi!!!

Quello che sto cercando di fare se non sbaglio è un report con campi disconnessi... che vada bene per più DB uguali nella loro forma!

Sto utilizzando Crystal Report 2008

Grazie Mille

freeteo Profilo | Guru

Ciao Alexander23,
quello che vuoi fare tu è gestibile molto semplicemente tramite codice, infatti il report in sè è un "telaio" di una collection di dati che gli arriveranno, la sorgente dati effettiva non è indispensabile, puoi passare infatti qualsiasi cosa anche generata in memoria, sempre però che abbia la stessa struttura (in termini di campi e tipi di campo).

Guarda quest'esempio (scaricabile infondo):
http://www.dotnethell.it/articles/Crystal-Reports-Integration-Windows-Form.aspx

come vedi i dati vengono passati al report tramite il metodo "SetDatasource" (nella funzione GetDatiFromDatabase) dove vai a dare la tabella e i dati che vuoi visualizzare, il report quindi scarta quello che aveva a design per visualizzare quelli passati.
Nell'esempio vengono cmq caricati dal "mdb" tramite la query, ma chiaramente potrebbero arrivare da qualsiasi posizione, tanto è una cosa che fai con il codice ado.net classico...

Ciao.

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

Alexander23 Profilo | Newbie

Fantastico... forse ho capito! ma ora sono in casino sul SQL!!!

questo sarebbe SQL originale:
DIABOLIK
"AZIENDA_T75"."dbo"."PR_StampaOrdFor";1 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,

NULL, NULL
EXTERNAL JOIN PR_StampaOrdFor.ID_ORDINE={?DIABOLIK: D_ORDINI_FOR.ID_ORDINE} AND PR_StampaOrdFor.COD_PRODOTTO={?DIABOLIK:

D_ORDINI_FOR.COD_PRODOTTO} AND PR_StampaOrdFor.RIGA={?DIABOLIK: D_ORDINI_FOR.PROGRESSIVO_RIGA} AND

PR_StampaOrdFor.ID_ORDINE={?DIABOLIK: VW_ORDINI_FOR.ID_ORDINE} AND PR_StampaOrdFor.RIGA={?DIABOLIK:

VW_ORDINI_FOR.PROGRESSIVO_RIGA} AND PR_StampaOrdFor.CAMPO_RICERCA={?DIABOLIK: VW_ORDINI_FOR.CAMPO_RICERCA}


DIABOLIK
SELECT "D_ORDINI_FOR"."VOCE_SPESA", "D_ORDINI_FOR"."DATA_SPEDIZIONE", "D_ORDINI_FOR"."KEY_CONTO",

"VW_ORDINI_FOR"."RIF_DOC_BOLFAT", "VW_FT_FORN"."RIF_DOCUMENTO", "D_ORDINI_FOR"."F_SALDO", "D_ORDINI_FOR"."PROGRESSIVO_RIGA",

"D_ORDINI_FOR"."COD_PRODOTTO", "D_ORDINI_FOR"."ID_ORDINE", "VW_ORDINI_FOR"."CAMPO_RICERCA",

"VW_ORDINI_FOR"."PROGRESSIVO_RIGA", "VW_ORDINI_FOR"."ID_ORDINE"
FROM ((("AZIENDA_T75"."dbo"."D_ORDINI_FOR" "D_ORDINI_FOR" CROSS JOIN "AZIENDA_T75"."dbo"."VW_ORDINI_FOR" "VW_ORDINI_FOR")

LEFT OUTER JOIN "AZIENDA_T75"."dbo"."CROSS_REF_DOCS" "CROSS_REF_DOCS" ON

("D_ORDINI_FOR"."ID_ORDINE"="CROSS_REF_DOCS"."ID_DOC_ORIG") AND

("D_ORDINI_FOR"."PROGRESSIVO_RIGA"="CROSS_REF_DOCS"."NR_RIGA_ORIG")) LEFT OUTER JOIN "AZIENDA_T75"."dbo"."T_FATTURE_FOR"

"T_FATTURE_FOR" ON "CROSS_REF_DOCS"."ID_DOC_DEST"="T_FATTURE_FOR"."ID_FATTURA") LEFT OUTER JOIN

"AZIENDA_T75"."dbo"."VW_FT_FORN" "VW_FT_FORN" ON (("T_FATTURE_FOR"."TIPO_DOC"="VW_FT_FORN"."TIPO_DOC") AND

("T_FATTURE_FOR"."ANNO_DOC"="VW_FT_FORN"."ANNO_DOC")) AND ("T_FATTURE_FOR"."NUMERO_DOC"="VW_FT_FORN"."NUMERO_DOC")
WHERE "D_ORDINI_FOR"."ID_ORDINE"={?DIABOLIK: PR_StampaOrdFor.ID_ORDINE} AND "D_ORDINI_FOR"."COD_PRODOTTO"={?DIABOLIK:

PR_StampaOrdFor.COD_PRODOTTO} AND "D_ORDINI_FOR"."PROGRESSIVO_RIGA"={?DIABOLIK: PR_StampaOrdFor.RIGA} AND

"VW_ORDINI_FOR"."ID_ORDINE"={?DIABOLIK: PR_StampaOrdFor.ID_ORDINE} AND "VW_ORDINI_FOR"."PROGRESSIVO_RIGA"={?DIABOLIK:

PR_StampaOrdFor.RIGA} AND "VW_ORDINI_FOR"."CAMPO_RICERCA"={?DIABOLIK: PR_StampaOrdFor.CAMPO_RICERCA}




Ne capisci qualcosa, perchè a me sta fondendo il cervello!
Ti ringrazio infinitamente

freeteo Profilo | Guru

Ciao,
scusa ma non ho capito, sono stringhe sql con cui costruire il report? Se si, ti basta aggiungerle come "comando" al posto di un'intera tabella, nella finestra "esperto database":

800x600 224Kb


Poi come dicevamo prima, resta valido il fatto di passare da codice i dati provenienti da da diversi database a runtime...
Ciao.

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

Alexander23 Profilo | Newbie

Ma come faccio dire al report di prendersi i dati da un database o da un altro col LogonInfo, in modo che vada a prenderseli da solo i dati corretti?

Grazie mille

freeteo Profilo | Guru

Ciao,
puoi usare un codice di questo tipo:
...
Dim mioreport as new ReportDocument() mioreport.Load("c:\...\mioreport.rpt") Dim logOnInfo As New TableLogOnInfo logOnInfo = mioreport.Database.Tables.Item("Tabella").LogOnInfo logOnInfo.ConnectionInfo.ServerName = "SERVER" logOnInfo.ConnectionInfo.DatabaseName = "miodb" logOnInfo.ConnectionInfo.UserID = "User" logOnInfo.ConnectionInfo.Password = "pwd" logOnInfo.TableName = "miaTabellaDelDatabase" mioreport.Database.Tables(0).ApplyLogOnInfo(logOnInfo) CrystalReportViewer1.ReportSource = mioreport ...

chiaramente se hai più tabelle puoi farlo per tutte...

Ciao.

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

Alexander23 Profilo | Newbie

Eccomi nuovamente qua alle prese con questi report. Ora, però, sono a buon punto.

Il famoso report modificato secondo le mie esigenze sono riuscito a farlo andar bene per tutti i DB, ma solo in parte.

cerco di essere più chiaro.

il report originale "OrdiniFornitore" non è una mia creazione, ma bensì di chi gestisce il ns programma di contabilità. All'interno del report è presente la seguente tabella "PR_StampaOrdFor", la connessione del report e della tabella, se non ho capito male, viene gestita da Run Time.
A questo report ho aggiunto altre 5 tabelle, ma la loro connessione non viene gestita da Run Time, quindi tutti i loro campi vengono valorizzati solamente per un DB.

C'è la possibilità di far aggiornate automaticamente la connessione di queste tabelle, come "PR_StampaOrdFor", senza utilizzare le Run Time?


Grazie mille

freeteo Profilo | Guru

Ciao,
hai provato con il codice riportato da me nel post precedente?
Questo saltando la tabella che il programma setta da codice.

Per la mia esperienza non mi è mai capitato di avere questa situazione mista, dove una tabella viene settata da codice ed altre vengono impostate in fase di design...teoricamente il report dovrebbe andare ad usare la connessione che ha impostata a design se non viene passato altro, quindi (sempre in teoria, visto che non mi è mai capitato) dovrebbe funzionare ugualmente.

Dipende però da cosa viene fatto nell'altro programma, perchè se invece di passare il resulset di dati alla tabella, viene cambiata la connessione con un foreach su tutte le tabelle, allora sei sempre fregato...forse è proprio questo che viene fatto, in quel caso allora non ci sono possibilità purtroppo...

Forse potresti provare con un sottoreport, sperando che da codice non venga fatto un set di parametri di connessione anche per quelli...

Ciao.

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

Alexander23 Profilo | Newbie

Ma dove devo inserire il tuo codice?

freeteo Profilo | Guru

>Ma dove devo inserire il tuo codice?
prima di visualizzarlo.
Prendi spunto dall'esempio che trovi qui: http://www.dotnethell.it/articles/Crystal-Reports-Integration-Windows-Form.aspx
quello mostra altro, ma se guardi la parte di codice che aggancia il report ti aiuta a capire cosa puoi fare per passare i dati.

ps: prima tu mi dicevi "Il famoso report modificato secondo le mie esigenze sono riuscito a farlo andar bene per tutti i DB..." cosa intendi, hai fatto qualcosa da codice per cambiare la connessione etc o altro?

Ciao.

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

Alexander23 Profilo | Newbie


810x579 86Kb


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

Ora, sempre in parte, funziona per tutti i DB, perchè sbagliavo a settare il collegamento con la tabella principale "PR_StampaOrdFor". una volta che impostato a Tipo Join: Esterno Sinistro ho sbloccato e tutti i dati presenti nella tabella principale sono visibili per tutti i DB.

Per questo motivo ho desunto che il collegamento venisse impostato direttamente dal programma di contabilità ma ovviamente solo per la tabella "PR_StampaOrdFor".

A questo punto posso dire in qualche modo alle altre tabelle di prendere lo stesso collegamento, automaticamente ed autonomamente, della principale?

Grazie


Ps. ho allegato un immagine dei collegamenti del report

Alexander23 Profilo | Newbie

Ritiro tutto quello che ho detto...

ho parlato col programmatore e mi ha detto che per la tabella principale il programma di contabilità elabora un DataSet che viene dato in pasto al report... quindi nessuna connessione!

a questo punto è possibile una volta lanciata la stampa chiedere all'utente tramite una maschera generata dal report a quale DB collegarsi?

Grazie mille

freeteo Profilo | Guru

>ho parlato col programmatore e mi ha detto che per la tabella
>principale il programma di contabilità elabora un DataSet che
>viene dato in pasto al report... quindi nessuna connessione!
mmmhhh immaginavo qualcosa del genere, è un classico perchè i dati solitamente vengono preparati per essere passati al report...


>a questo punto è possibile una volta lanciata la stampa chiedere
>all'utente tramite una maschera generata dal report a quale DB
>collegarsi?
no, se il report viene integrato nell'applicazione in quel modo, a meno di non modificare il codice dell'applicazione non c'è niente sul report per queste funzionalità.
L'unica cosa è farlo da codice, dunque dovresti chiedere che questa maschera (e le relative funzionalità che ci stanno dietro) vengano implementate dal programmatore, ma sempre a livello applicazione diciamo, non certo a livello report...


Ciao.

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

Alexander23 Profilo | Newbie

A questo punto lascio stare.

Comunque grazie mille per il supporto.

Buona giornata

freeteo Profilo | Guru

>A questo punto lascio stare.
ok, come vuoi


>Comunque grazie mille per il supporto.
di niente figurati.


>Buona giornata
grazie anche a te


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