Трех-звенка и отчеты, проблемы
Я попробовал использовать FR в трех-звенке
Вот такая упрощенная схема получилась (потом можно оптимизировать через хранение отчетов в базе)
1) Клиент вызывает метод сервера, указывает отчет, который он хочет получить (по какому-то индексу)
2) Сервер по этому индексу определяет .fr3 файл и грузит его
pReport->LoadReportFromFile(...)
3) Затем сервер препарит отчет
pReport->PrepareReport(...)
4) И сохраняет препариный отчет в файл
pReport->SavePreparedReportToFile(...)
5) Создает стрим на этом файле и возвражает стрим клиенту
SHCreateStreamOnFile(...)
6) Клиент выкачивает по этому стриму препареный отчет и сохраняет его в файл
5) Затем грузит препаренный отчет и показывает его пользователю
pReport->LoadPreparedReportFromFile(...)
pReport->ShowPreparedReport()
?1) Для оптимизации можно использовать SavePreparedReportToStream(). Но у вас нет встречной функции LoadPreparedReportFromStream(). Хотелось бы ее заиметь.
?2) Большая беда случается в пункте 3., если в отчете есть формы. Сервер пытается отобразить эти формы... а это совсем не то что надо. Вот это действительно проблема.
Вам виднее как ее можно решить... мое предложение:
Сделать возможность на клиенте (без соединения с базой)... показать все формы... а потом сохранить отчет в файл(стрим) с ответами пользователей. У вас наверняка уже какие-то наработки есть... когда вы делали FastReportServer.
Хотелось бы такой последовательности действией:
pReport->LoadReportFromFile(...);
pReport->PrepareReportForms();
pReport->SaveFormsPreparedReportToFile(...);
...
pReport->LoadFormsPreparedReportFromFile(...);
pReport->PrepareReport(...); //тут уже никаких форм показываться не должно
pReport->SavePreparedReportToFile(...)
...
и т.д.
Итого: два мои вопроса этого поста выделены жирным цветом
Вот такая упрощенная схема получилась (потом можно оптимизировать через хранение отчетов в базе)
1) Клиент вызывает метод сервера, указывает отчет, который он хочет получить (по какому-то индексу)
2) Сервер по этому индексу определяет .fr3 файл и грузит его
pReport->LoadReportFromFile(...)
3) Затем сервер препарит отчет
pReport->PrepareReport(...)
4) И сохраняет препариный отчет в файл
pReport->SavePreparedReportToFile(...)
5) Создает стрим на этом файле и возвражает стрим клиенту
SHCreateStreamOnFile(...)
6) Клиент выкачивает по этому стриму препареный отчет и сохраняет его в файл
5) Затем грузит препаренный отчет и показывает его пользователю
pReport->LoadPreparedReportFromFile(...)
pReport->ShowPreparedReport()
?1) Для оптимизации можно использовать SavePreparedReportToStream(). Но у вас нет встречной функции LoadPreparedReportFromStream(). Хотелось бы ее заиметь.
?2) Большая беда случается в пункте 3., если в отчете есть формы. Сервер пытается отобразить эти формы... а это совсем не то что надо. Вот это действительно проблема.
Вам виднее как ее можно решить... мое предложение:
Сделать возможность на клиенте (без соединения с базой)... показать все формы... а потом сохранить отчет в файл(стрим) с ответами пользователей. У вас наверняка уже какие-то наработки есть... когда вы делали FastReportServer.
Хотелось бы такой последовательности действией:
pReport->LoadReportFromFile(...);
pReport->PrepareReportForms();
pReport->SaveFormsPreparedReportToFile(...);
...
pReport->LoadFormsPreparedReportFromFile(...);
pReport->PrepareReport(...); //тут уже никаких форм показываться не должно
pReport->SavePreparedReportToFile(...)
...
и т.д.
Итого: два мои вопроса этого поста выделены жирным цветом
Комментарии
Метод LoadPreparedReportFromStream() есть у класса TfrxPreviewX.
Я не могу сразу ответить на этот вопрос. Сервер действительно умеет показывать формы, скоее всего возможно портировать код оттуда.