DatabaseLogOnList - Use the LogOnInfos property to specify logon infos...

mercoledì 19 marzo 2008 - 09.58

Teresa Profilo | Newbie

Ciao a tutti,

avrei bisogno di creare dinamicamente un report (CRYSTAL REPORT 2008) contenente al suo interno un sottoreport. Entrambi utilizzano una connessione identica ad un db Sql server 2005.

Il codice che ho implementato è il seguente:

ParameterField parametro;
ParameterDiscreteValue parametroVal;
DataTable dt;
ReportDocument crReportDocument;
FormulaFieldDefinition crFormulaDefinition;

string db = System.Configuration.ConfigurationManager.AppSettings["Database"].ToString();
string user = System.Configuration.ConfigurationManager.AppSettings["Username"].ToString();
string pwd = System.Configuration.ConfigurationManager.AppSettings["Password"].ToString();
string server = System.Configuration.ConfigurationManager.AppSettings["Server"].ToString();

string RPTtemplatePath;

//-----------inizializzazione report---------
crReportDocument = new ReportDocument();
crReportDocument.Load(RPTtemplatePath);
//-----------inizializzazione report---------

ConnectionInfo crConnInfo = new ConnectionInfo();
crConnInfo.DatabaseName = db;
crConnInfo.UserID = user;
crConnInfo.Password = pwd;
crConnInfo.ServerName = server;
crConnInfo.IntegratedSecurity = false;

//autentico il mio report principale
SetDBLogonForReport(crConnInfo, crReportDocument);

//autentico tutti i sottoreport richiamati dal report principale
SetDBLogonForSubreports(crConnInfo, crReportDocument);

//-----------istanza ODS per report (DATATABLE)---------

dt = new DataTable();
it.cdlan.gestionale.bll.objectManager.report.Report_Mgr MGR = new it.cdlan.gestionale.bll.objectManager.report.Report_Mgr();
dt = MGR.GetDTInterventiFatturazione(idAnagrafica, idServizio, dataFatturazione);
crReportDocument.SetDataSource(dt);
//-----------istanza ODS per report (DATATABLE)---------

//-----------parametri per report---------
parametro = new ParameterField();
parametroVal = new ParameterDiscreteValue();
parametro.Name = "idAnagrafica";
parametroVal.Value = idAnagrafica;
crReportDocument.SetParameterValue("idAnagrafica", parametroVal.Value);

parametro = new ParameterField();
parametroVal = new ParameterDiscreteValue();
parametro.Name = "idServizio";
parametroVal.Value = idServizio;
crReportDocument.SetParameterValue("idServizio", parametroVal.Value);

parametro = new ParameterField();
parametroVal = new ParameterDiscreteValue();
parametro.Name = "dataFatturazione";
parametroVal.Value = dataFatturazione;
crReportDocument.SetParameterValue("dataFatturazione", parametroVal.Value);
//-----------parametri per report---------

//-----------parametri Per Intestazione Titolo Report---------
crFormulaDefinition = crReportDocument.DataDefinition.FormulaFields["Intestazione"];
crFormulaDefinition.Text = "\" " + DateTime.Parse(dataFatturazione.ToString()).ToString("dd/MM/yyyy") + "\"";
//-----------parametri Per Intestazione Titolo Report---------

CrystalReportViewer1.ReportSource = crReportDocument;

private void SetDBLogonForSubreports(ConnectionInfo crConnInfo, ReportDocument crReportDocument)
{
Sections sections = crReportDocument.ReportDefinition.Sections;
foreach (Section section in sections)
{
ReportObjects crReportObjects = section.ReportObjects;
foreach (ReportObject crReportObject in crReportObjects)
{
if (crReportObject.Kind == ReportObjectKind.SubreportObject)
{
SubreportObject subReport = (SubreportObject)crReportObject;
ReportDocument subReportDocument = subReport.OpenSubreport(subReport.SubreportName);
SetDBLogonForReport(crConnInfo, subReportDocument);
}
}
}
}

private void SetDBLogonForReport(ConnectionInfo crConnInfo, ReportDocument crReportDocument)
{
Tables tabelle = crReportDocument.Database.Tables;
foreach (CrystalDecisions.CrystalReports.Engine.Table tabella in tabelle)
{
TableLogOnInfo myTableLogonInfo = tabella.LogOnInfo;
myTableLogonInfo.ConnectionInfo = crConnInfo;
tabella.ApplyLogOnInfo(myTableLogonInfo);
}
}

Eseguendo l'applicazione in locale il report mi viene visualizzato correttamente, mentre se pubblico su un server l'applicazione web mi ritorna il seguente errore:
"DatabaseLogOnList - Use the LogOnInfos property to specify logon infos".

Spero che qualcuno possa aiutarmi a capire l'errore.....

Buona Giornata
Teresa

freeteo Profilo | Guru

ciao,
l'errore è quello di quando il report non riesce a fare la connessione al database, probabilmente perche' non tutti i parametri necessari sono stati passati al report, ed in locale funziona perche' cmq sono uguali a quelli che hai messo quando hai disegnato il report.

Percio' mi viene da pensare che potrebbe essere un problema della proprieta' "location".
Intendo:

private void SetDBLogonForReport(ConnectionInfo crConnInfo, ReportDocument
crReportDocument)
{
...
TableLogOnInfo myTableLogonInfo = tabella.LogOnInfo;
myTableLogonInfo.ConnectionInfo = crConnInfo;
tabella.ApplyLogOnInfo(myTableLogonInfo);

//--- io aggiungerei questo
tabella.Location = tabella.Location.Substring(tabella.Location.LastIndexOf(".")+1);
...
ciao.

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

Teresa Profilo | Newbie

Ciao ,

grazie del consiglio, in realtà dopo vari tentativi ho risolto il problema!

Il mio report master estrae un'elenco di dati filtrati secondo determinati parametri (idAnagrafica, idServizio, dataFatturazione):
dt = MGR.GetDTInterventiFatturazione(idAnagrafica, idServizio, dataFatturazione);

Nel sottoreport avevo associato un datatable che aveva bisogno di un parametro(campo id contenuto nel datatable del report master) per l'estrazione dei dati.
dt = MGR.GetDTtimesheetByID(id);

In questo modo quando effettuavo il collegamento del paramentro, del report master, con il campo del sottoreport, mi ritornava l'errore:
"DatabaseLogOnList - Use the LogOnInfos property to specify logon infos".

Ho risolto il problema impostando nel sottoreport un datatable contenente un elenco di tutti i dati:
dt = MGR.GetDTtimesheet();
e dal report master ho definito in base a quale colonna filtrare i dati nel sottoreport.

Spero di esser stata chiara....

Ti ringrazio della risposta.

Buona Giornata
Teresa

freeteo Profilo | Guru

>Nel sottoreport avevo associato un datatable che aveva bisogno
>di un parametro(campo id contenuto nel datatable del report master)
>per l'estrazione dei dati.
>dt = MGR.GetDTtimesheetByID(id);
ok



>Ho risolto il problema impostando nel sottoreport un datatable
>contenente un elenco di tutti i dati:
>dt = MGR.GetDTtimesheet();
>e dal report master ho definito in base a quale colonna filtrare
>i dati nel sottoreport.
ok va benissimo... se la query non ti da problemi di prestazioni allora la scelta è ottima, altrimenti possiamo pensare a qualche alternativa ulteriore.


>
>Spero di esser stata chiara....
precisissima


>Ti ringrazio della risposta.
grazie a te
ciao.

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

Teresa Profilo | Newbie

Ciao,

l'estrazione dei dati momentaneamente avviene su una mole di dati contenuta, se hai dei suggerimenti da darmi per migliorare le prestazioni possiamo discuterne.

Ho appena iniziato ad utilizzare Crystal Report 2008 e quindi non lo conosco benissimo!

Ciao
Teresa

freeteo Profilo | Guru

ciao,
ok lascia cosi', il tuo codice non è per niente male.
Casomai se in futuro riscontri dei problemi allora analizziamo dettagliatamente il report, il tipo di campi che carichi (se sono tutti necessari al report) e facciamo qualche prova assieme, cambiando l'accesso (usando le proprieta' LogonInfo delle tabelle del report).

Posta pure i tuoi problemi o le tue perplessita in questa stanza, saremo ben felici di discuterne insieme e trovare qualche soluzione.
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