Изменить свойство каталога Crystal Report в VS 2005 - PullRequest
1 голос
/ 24 сентября 2008

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

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

Ответы [ 2 ]

2 голосов
/ 25 сентября 2008

Если вам просто нужно сделать это в конструкторе, щелкните правой кнопкой мыши в пробеле и выберите База данных-> установить местоположение источника данных. Оттуда вы можете использовать текущее соединение или добавить новое соединение. Установите новое соединение, используя новый каталог. Затем нажмите на текущее соединение в верхнем разделе и нажмите обновить. Ваш источник данных изменится. Но если вам нужно сделать это во время выполнения, то следующий код - лучший способ.

#'SET REPORT CONNECTION INFO
        For i = 0 To rsource.ReportDocument.DataSourceConnections.Count - 1
            rsource.ReportDocument.DataSourceConnections(i).SetConnection(crystalServer, crystalDB, crystalUser, crystalPassword)
        Next
0 голосов
/ 24 сентября 2008

РЕДАКТИРОВАТЬ: увидел ваши изменения, так что я сохраню свой исходный пост, но должен сказать ... У меня никогда не было отчета Crystal в режиме дизайна в VS, так что я не могу помочь там извините.

report.SetDatabaseLogon(UserID, Password, ServerName, DatabaseName);

После этого вам нужно пролистать все ссылочные таблицы в отчете, выполнить перезапуск через подотчеты и сбросить их logoninfo в одну, основанную на отчетах connectioninfo.

    private void FixDatabase(ReportDocument report)
    {
        ConnectionInfo crystalConnectionInfo = someConnectionInfo;

        foreach (Table table in report.Database.Tables)
        {
            TableLogOnInfo logOnInfo = table.LogOnInfo;

            if (logOnInfo != null)
            {
                logOnInfo.ConnectionInfo = crystalConnectionInfo;

                table.LogOnInfo.TableName = table.Name;
                table.LogOnInfo.ConnectionInfo.UserID = someConnectionInfo.UserID;
                table.LogOnInfo.ConnectionInfo.Password = someConnectionInfo.Password;
                table.LogOnInfo.ConnectionInfo.DatabaseName = someConnectionInfo.DatabaseName;
                table.LogOnInfo.ConnectionInfo.ServerName = someConnectionInfo.ServerName;
                table.ApplyLogOnInfo(table.LogOnInfo);

                table.Location = someConnectionInfo.DatabaseName + ".dbo." + table.Name;
            }
        }

        //call this method recursively for each subreport
        foreach (ReportObject reportObject in report.ReportDefinition.ReportObjects)
        {
            if (reportObject.Kind == ReportObjectKind.SubreportObject)
            {
                this.FixDatabase(report.OpenSubreport(((SubreportObject)reportObject).SubreportName));
            }
        }
    }
...