2009-07-15 15 views
5

Próbuję wyświetlić niektóre raport z niektórych podraportami wewnątrz niego, ale co pokazuje raport rzuca jakieś okno dialogowe z prośbą o połączenie z bazą danych. Używam tego kodu:bazie okno logowania z 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

Mam również do czynienia z tym problemem, jeśli masz rozwiązanie, pls udostępnij tutaj !. – Sagotharan

+0

Mam również ten sam problem, jeśli masz rozwiązanie, proszę podziel tutaj –

+0

@LajjaThaker Musiałem przebudować raport w jakiś inny sposób, którego nie pamiętam teraz –

Odpowiedz

1

W krysztale można określić, czy poprosi o db logowania @ momencie generowania raportu w Kryształowej Management Console (CMC) @ każdym poziomie raportu. Zaloguj się do CMC, otwórz raport> Proces> Baza danych. U dołu strony można podać "Pytaj użytkownika o logowanie do bazy danych", "Użyj kontekstu logowania SSO do logowania do bazy danych" lub "Użyj tego samego logowania do bazy danych, jak przy uruchamianiu raportu". Wybierz trzecią opcję użycia poświadczeń przechowywanych na serwerze.

+0

ostateczne oprogramowanie jest zainstalowane w pewnym miejscu, które nie ma CMC –

1

Możesz po prostu napisać raport.SetDatabaseLogon ("nazwa użytkownika", "pwd", @ "serwer", "baza danych"); podaj dane logowania, a pole logowania do bazy danych nie pojawi się po uruchomieniu kodu.

+2

nie działa w ogóle –

+2

ja też ... to nie działa. Kto głosuje tutaj, pls powiedział, jeśli masz rozwiązać ten problem. – Sagotharan

2

Miałem podobny problem i został rozwiązany, więc dodam tę odpowiedź, na wypadek, gdyby pomogło komuś innemu w mojej sytuacji.

Podczas ustawiania informacji logowania do serwera SQL dla raportu, należy podać nazwę usługi usługi. Na przykład upewnij się, że nadajesz Crystal "myserver \ myservice" zamiast "myserver".

Mój program może uzyskać dostęp do danych z serwera SQL przy użyciu "myserver", ale Crystal musi otrzymać "myserver \ myservice".

+0

czy możesz podać swój kod tutaj? –

+0

Lajja, proponuję dobrze przyjrzeć się temu artykułowi: http://www.codeproject.com/Articles/15024/Crystal-Reports-helper-class –

Powiązane problemy