Как динамически изменить информацию для входа в Crystal Report и MS Access? - PullRequest
0 голосов
/ 23 ноября 2010

У меня есть файл Crystal Reports с доступом к данным из базы данных msaccess.

Теперь при загрузке отчета мне нужно передать информацию для входа в базу данных msaccess вместе с именем базы данных из vb.net.

Я пытался использовать

    Dim ConnInfo As ConnectionInfo = New ConnectionInfo()

    CRpt.ReportOptions.EnableSaveDataWithReport = False

    ConnInfo.IntegratedSecurity = False
    ConnInfo.ServerName = ""
    ConnInfo.UserID = ""
    ConnInfo.Password = ""
    ConnInfo.DatabaseName = OLEDBLayer.GetDBLocation()
    ConnInfo.Type = ConnectionInfoType.DBFile

    'CCINFo.ServerName = 
    For Each CTable As Table In CRpt.Database.Tables
        CTableLogInfo = CTable.LogOnInfo
        CTableLogInfo.ConnectionInfo = ConnInfo
        'CTable.Location = OLEDBLayer.GetDBLocation
        CTable.ApplyLogOnInfo(CTableLogInfo)
    Next

Но не работает.Чего мне не хватает?

Ответы [ 3 ]

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

Я много искал и, наконец, после тестирования себя, создав новый отчет, используя статические данные, я получил решение для динамического.

Моя процедура тестирования:
1.) Создан новый файл Crystal Report:
2.) Создано новое подключение базы данных к файлу .accdb access 2007
3.) Создано новая форма
4.) Добавлен элемент управления Crystal Report Viewer в форму
5.) Назначен документ отчетаранее созданный отчет.
6.) установите точку останова при загрузке формы
7.) Прочитайте все настройки
8.) Скопированы настройки документа отчета, информация о входах в таблицы документов.
9.) Вставил прочитанные настройки в мой проект.
10.) Работало нормально ... :)

Мой код:

    //here crpt is a sample report document
    Dim CTableLogInfo As TableLogOnInfo
    Dim ConnInfo As CrystalDecisions.Shared.ConnectionInfo = New ConnectionInfo()
    ConnInfo.Type = ConnectionInfoType.CRQE
    ConnInfo.ServerName = DBLayer.GetAbsoluteDBPath()
    ConnInfo.DatabaseName = ""
    ConnInfo.UserID = "Admin"
    ConnInfo.AllowCustomConnection = False
    ConnInfo.IntegratedSecurity = False

    For Each CTable As Table In CRpt.Database.Tables
        CTable.LogOnInfo.ConnectionInfo = ConnInfo
        CTableLogInfo = CTable.LogOnInfo
        CTableLogInfo.ReportName = CRpt.Name
        CTableLogInfo.TableName = CTable.Name
        CTable.ApplyLogOnInfo(CTableLogInfo)
    Next

    CrystalReportViewer1.ReportSource = CRpt
    CrystalReportViewer1.RefreshReport()

Я понял, что настройкапуть к базе данных имя_сервера разрешит это

1 голос
/ 24 октября 2011

Попробуйте это:

        Dim CTableLogInfo As TableLogOnInfo
        Dim ConnInfo As CrystalDecisions.Shared.ConnectionInfo = New ConnectionInfo()
        Dim  CRpt As New ReportDocument
        String filename = "rptSales.rpt"

        ConnInfo.Type = ConnectionInfoType.CRQE
        ConnInfo.ServerName = AppSettings("server")
        ConnInfo.DatabaseName = AppSettings("dbNm")
        ConnInfo.UserID = AppSettings("username")
        ConnInfo.Password = AppSettings("pas")
        ConnInfo.AllowCustomConnection = False
        ConnInfo.IntegratedSecurity = False

        CRpt.Load(AppSettings("reppath") & filename)

        For Each CTable As Table In CRpt.Database.Tables
            CTable.LogOnInfo.ConnectionInfo = ConnInfo
            CTableLogInfo = CTable.LogOnInfo
            CTableLogInfo.ReportName = CRpt.Name
            CTableLogInfo.TableName = CTable.Name
            CTable.ApplCTableLogInfo)
        Next
1 голос
/ 15 декабря 2010

Вы можете использовать следующий код, чтобы применить определенные детали подключения к отчету во время выполнения.
Извините, код в c #.
Используйте этот метод сразу после загрузки файла отчета rpt и перед его печатью / экспортом / просмотром.

    public static void CrystalReportLogOn(ReportDocument reportParameters,
                                          string serverName,
                                          string databaseName,
                                          string userName,
                                          string password)
    {
        TableLogOnInfo logOnInfo;
        ReportDocument subRd;
        Sections sects;
        ReportObjects ros;
        SubreportObject sro;

        if (reportParameters == null)
        {
            throw new ArgumentNullException("reportParameters");
        }

        try
        {
            foreach (CrystalDecisions.CrystalReports.Engine.Table t in reportParameters.Database.Tables)
            {
                logOnInfo = t.LogOnInfo;
                logOnInfo.ReportName = reportParameters.Name;
                logOnInfo.ConnectionInfo.ServerName = serverName;
                logOnInfo.ConnectionInfo.DatabaseName = databaseName;
                logOnInfo.ConnectionInfo.UserID = userName;
                logOnInfo.ConnectionInfo.Password = password;
                logOnInfo.TableName = t.Name;
                t.ApplyLogOnInfo(logOnInfo);
                t.Location = t.Name;
            }
        }
        catch
        {
            throw;
        }

        sects = reportParameters.ReportDefinition.Sections;
        foreach (Section sect in sects)
        {
            ros = sect.ReportObjects;
            foreach (ReportObject ro in ros)
            {
                if (ro.Kind == ReportObjectKind.SubreportObject)
                {
                    sro = (SubreportObject)ro;
                    subRd = sro.OpenSubreport(sro.SubreportName);
                    try
                    {
                        foreach (CrystalDecisions.CrystalReports.Engine.Table t in subRd.Database.Tables)
                        {
                            logOnInfo = t.LogOnInfo;
                            logOnInfo.ReportName = reportParameters.Name;
                            logOnInfo.ConnectionInfo.ServerName = serverName;
                            logOnInfo.ConnectionInfo.DatabaseName = databaseName;
                            logOnInfo.ConnectionInfo.UserID = userName;
                            logOnInfo.ConnectionInfo.Password = password;
                            logOnInfo.TableName = t.Name;
                            t.ApplyLogOnInfo(logOnInfo);
                        }
                    }
                    catch
                    {
                        throw;
                    }
                }
            }
        }
    }
...