2009-07-15 2 views
5

Sto cercando di visualizzare alcune rapporto con alcuni subreports al suo interno, ma ogni dimostra il rapporto che getta un po finestra di dialogo che chiede per la connessione al database. Sto usando questo codice:banca dati con Crystal Reports

private void frmReporte_Load(object sender, System.EventArgs e) 
    { 
     Clave = ConfigurationSettings.AppSettings["Password"].ToString(); 
     NombreBD = ConfigurationSettings.AppSettings["CatalogBD"].ToString(); 
     NombreServidor = ConfigurationSettings.AppSettings["Servidor"].ToString(); ; 
     UsuarioBD = ConfigurationSettings.AppSettings["UserID"].ToString(); 
     this.crtReportes.ReportSource = this.prepareReport(); 
    } 
    public void imprimirReporte() 
    { 
     ReportDocument rpt = new ReportDocument(); 
     rpt.Load(mvarRutaReporte); 
     rpt.SetDataSource(clsReportes.dsReporte); 
     rpt.PrintToPrinter(1, false, 1, 1); 
    } 
    private ReportDocument prepareReport() 
    { 
     Sections crSections; 
     ReportDocument crReportDocument, crSubreportDocument; 
     SubreportObject crSubreportObject; 
     ReportObjects crReportObjects; 
     ConnectionInfo crConnectionInfo; 
     Database crDatabase; 
     Tables crTables; 
     TableLogOnInfo crTableLogOnInfo; 
     crReportDocument = new ReportDocument(); 
     crReportDocument.Load(RutaReporte); 
     crReportDocument.SetDataSource(clsReportes.dsReporte.Tables[0]); 
     crDatabase = crReportDocument.Database; 
     crTables = crDatabase.Tables; 
     crConnectionInfo = new ConnectionInfo(); 
     crConnectionInfo.ServerName = NombreServidor ; 
     crConnectionInfo.DatabaseName = NombreBD; 
     crConnectionInfo.UserID = UsuarioBD; 
     crConnectionInfo.Password = Clave; 
     foreach (CrystalDecisions.CrystalReports.Engine.Table aTable in crTables) 
     { 
      crTableLogOnInfo = aTable.LogOnInfo; 
      crTableLogOnInfo.ConnectionInfo = crConnectionInfo; 
      aTable.ApplyLogOnInfo(crTableLogOnInfo); 
     } 
     // Para los reportes que poseen subreportes 
     // pongo el objeto seccion del la seccion actual del reporte 
     crSections = crReportDocument.ReportDefinition.Sections; 
     // busco en todas las secciones el objeto reporte 
     foreach (Section crSection in crSections) 
     { 
      crReportObjects = crSection.ReportObjects; 
      //busco en todos los reportes por subreportes 
      foreach (ReportObject crReportObject in crReportObjects) 
      { 
       if (crReportObject.Kind == ReportObjectKind.SubreportObject) 
       { 
        crSubreportObject = (SubreportObject)crReportObject; 
        //abro el subreporte y me logeo con los datos del reporte general 
        crSubreportDocument = crSubreportObject.OpenSubreport(crSubreportObject.SubreportName); 
        crDatabase = crSubreportDocument.Database; 
        crTables = crDatabase.Tables; 
        foreach (CrystalDecisions.CrystalReports.Engine.Table aTable in crTables) 
        { 
         crTableLogOnInfo = aTable.LogOnInfo; 
         crTableLogOnInfo.ConnectionInfo = crConnectionInfo; 
         aTable.ApplyLogOnInfo(crTableLogOnInfo); 
        } 
       } 
      } 
     } 
     return crReportDocument; 
    } 
+0

ho anche affrontato questo problema, se hai ottenuto la soluzione, pls condividere qui !. – Sagotharan

+0

Anche io sto affrontando lo stesso problema, se hai la soluzione per favore condividi qui –

+0

@LajjaThaker Ho dovuto ricostruire il rapporto in un altro modo che non ricordo ora –

risposta

1

a Crystal è possibile specificare se richiederla db login @ l'ora di creazione dei report in Crystal Management Console (CMC) @ ogni livello del report. Accedi a CMC, apri il rapporto> Processo> Database. Nella parte inferiore della pagina è possibile specificare "Richiedi all'utente per l'accesso al database", "Usa contesto SSO per l'accesso al database" o "Utilizza lo stesso accesso al database durante l'esecuzione del report". Selezionare la terza opzione per utilizzare le credenziali memorizzate nel server.

+0

il software finale è installato in qualche posto che non ha CMC –

1

È possibile scrivere solo report.SetDatabaseLogon ("nomeutente", "pwd", @ "server", "database"); fornire le informazioni di accesso, quindi la casella di accesso al database non verrà visualizzata quando si eseguirà il codice.

+2

non funziona affatto anche io ... –

+2

... non funziona. Chi vota qui, ha detto pls se hai risolto questo problema. – Sagotharan

2

Ho avuto un problema simile ed è risolto ora, quindi sto aggiungendo questa risposta nel caso in cui potrebbe aiutare qualcun altro nella mia situazione.

Quando si impostano le informazioni di accesso di SQL Server per il report, assicurarsi di includere il nome del servizio. Ad esempio, assicurati di dare a Crystal "myserver \ myservice" invece di "myserver".

Il mio programma è in grado di accedere ai dati da SQL Server utilizzando solo "myserver", ma a Crystal è necessario fornire "myserver \ myservice".

+0

puoi per favore condividere il tuo codice qui? –

+0

Lajja, ti suggerisco di dare un'occhiata a questo articolo: http://www.codeproject.com/Articles/15024/Crystal-Reports-helper-class –