powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / Crystal Report смена базы данных
3 сообщений из 3, страница 1 из 1
Crystal Report смена базы данных
    #35015481
LadyShack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер.
Я понимаю что на форуме несколько раз затрагивался этот вопрос, но к сожалению вразумительных ответов так и не было.
Есть отчет, который составлен для некоторой базы. Теперь я программно хочу отобразить этот отчет и передать ему параметры к другой базе данных (могут быть изменены название БД, сервер БД, даже провайдер). Делаю следующие пасы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    CRApp := CreateOleObject('CrystalRuntime.Application.11');
    CRReport := CRApp.OpenReport(ReportName);
    for i :=  1  to CRReport.Database.Tables.Count do
    begin
      ConnectionInfo := CRReport.Database.Tables[i].ConnectionProperties;
     // ConnectionInfo.DeleteAll;
      ConnectionInfo.Item ['Provider'] := FICadresUser.ProviderName;
      ConnectionInfo.Item ['Data Source'] := VarToStr(FdmReportList.cntStableConnection.Properties['Data Source'].Value);
      if FdmReportList.Platform = dbpOracle then
      begin
        ConnectionInfo.Item ['User ID'] := FICadresUser.SupervisorName;
        ConnectionInfo.Item ['Password'] := FICadresUser.SupervisorName;
      end;
      if FdmReportList.Platform = dbpMSSQL then
      begin
        ConnectionInfo.Item ['User ID'] := FICadresUser.UserID;
        ConnectionInfo.Item ['Password'] := FICadresUser.UserPassword;
      end;
    end;
Лезет ошибка "Logon failed". Отчет сохраняю без данных (где-то вычитала, что это тоже влияет).
Помогите, плз.
...
Рейтинг: 0 / 0
Crystal Report смена базы данных
    #35017884
LadyShack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отвечу себе.
1. Нужно сначала удалить все свойства и добавлять необходимые
2. Когда изменяются свойства, относящиееся к соединению (провайдер, сервер), то теряется связь таблиц с базами. Любые проверки говорят, что все хорошо, но тем не менее связь рушится и восстановить ее можно достаточно странным присвоением
Код: plaintext
CRReport.Database.Tables[i].Location := CRReport.Database.Tables[i].Location;
Судя по всему это свойство, которое вызывает необходимые действия для восстановления связи
Итак, получаем следующую модификацию
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
CRReport := CRApp.OpenReport(ReportName);
for i :=  1  to CRReport.Database.Tables.Count do
    begin
      ConnectionInfo := CRReport.Database.Tables[i].ConnectionProperties;
      CRReport.Database.Tables[i].DllName := 'crdb_ado.dll';
      
      if FdmReportList.Platform = dbpOracle then
      begin
        Provider := ConnectionInfo.Item['Provider'];
        ConnectionInfo.DeleteAll;
        ConnectionInfo.Add('Provider', 'MSDAORA');
        ConnectionInfo.Add('Data Source', FdmReportList.cntStableConnection.Properties['Data Source'].Value);
        ConnectionInfo.Add('User ID', FICadresUser.SupervisorName);
        ConnectionInfo.Add('Password', FICadresUser.SupervisorName);
        if Pos('ORA',UpperCase(Provider))<= 0  then
          CRReport.Database.Tables[i].Location := CRReport.Database.Tables[i].Location;
      end;
      if FdmReportList.Platform = dbpMSSQL then
      begin
        ConnectionInfo.DeleteAll;
        ConnectionInfo.Add('Provider', 'SQLOLEDB');
        ConnectionInfo.Add('Data Source', FdmReportList.cntStableConnection.Properties['Data Source'].Value);
        ConnectionInfo.Add('Initial Catalog', FICadresUser.SupervisorName);
        ConnectionInfo.Add('User ID', FICadresUser.UserID);
        ConnectionInfo.Add('Password', FICadresUser.UserPassword);
        CRReport.Database.Tables[i].Location := CRReport.Database.Tables[i].Location;
      end;
    end;
    FRMCRViewer.ShowModal;
  end;
Тут тоже есть странные пассы, но проверяно экспериментально, что если отчет был создан для Oracle и передается коннект к Oracle, то переприсвоение свойства не нужно.

Но, к сожалению, это тоже не панацея. При передачи коннекта к базе MSSQL, все нормально. А вот если передавать коннект к Oracle, то открываются только отчеты, созданные на Oracle.
Есть подозрение, что параметры для Oracle хранят название базы, но вот где не могу понять.

Если у кого есть какие сообжания на эту тему, выкладывайте плз.
...
Рейтинг: 0 / 0
Crystal Report смена базы данных
    #35022968
LadyShack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Завершу решение по созданному вопросу.

1. Присвоение имени dll-ки нужно обрамить в try ... except
Код: plaintext
1.
2.
3.
try
  CRReport.Database.Tables[i].DllName := 'crdb_ado.dll';
except
end;
Если в отчете несколько таблиц, то для первой присвоение происходит, а для других лезет ошибка, что там уже составлена связь. Честно скажу, не совсем понимаю, что за связь, но при таком подходе это сработает столько раз, сколько возможно.

2. Присвоение локейшина в ветки для коннекта к Oracle для таблицы нужно делать без условия и используя полный путь
Код: plaintext
CRReport.Database.Tables[i].Location := '<имя базы>.'+CRReport.Database.Tables[i].Location;
Именно так Oracle определяет с какой базой нужно работать.

Вот как бы и все, после этой модификации все работает без проблем.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / Crystal Report смена базы данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]