запрос на вход в базу данных с отчетами Crystal - PullRequest
5 голосов
/ 15 июля 2009

Я пытаюсь отобразить некоторый отчет с некоторыми вложенными отчетами внутри него, но каждый, который показывает отчет, выдает какое-то диалоговое окно, запрашивающее соединение с базой данных.Я использую этот код:

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;
    }

Ответы [ 3 ]

2 голосов
/ 17 февраля 2012

У меня была похожая проблема, и теперь она решена, поэтому я добавляю этот ответ на случай, если он может помочь кому-то еще в моей ситуации.

При настройке данных для входа в SQL Server для отчета обязательно указывайте имя service . Так, например, убедитесь, что вы даете Crystal «myserver \ myservice» вместо просто «myserver».

Моя программа может получать доступ к данным с SQL Server, используя только «myserver», но Crystal необходимо предоставить «myserver \ myservice».

1 голос
/ 15 января 2010

Вы можете просто написать report.SetDatabaseLogon ("имя пользователя", "pwd", @ "сервер", "база данных"); введите информацию для входа в систему, после чего код входа в базу данных не появится, когда вы запустите код.

1 голос
/ 17 июля 2009

В Crystal вы можете указать, запрашивать ли у db login @ время создания отчета в Crystal Management Console (CMC) @ для каждого уровня отчета. Войдите в CMC, откройте свой отчет> Процесс> База данных. В нижней части страницы вы можете указать «Запросить пользователя для входа в базу данных», «Использовать контекст единого входа для входа в базу данных» или «Использовать тот же вход в базу данных, что и при запуске отчета». Выберите третий вариант использования учетных данных, хранящихся на сервере.

...