Создание отчетов с наследованием

Обсуждение Stimulsoft Reports.NET
DmitryRu
Сообщения: 163
Зарегистрирован: 19 май 2014, 10:40

Re: Создание отчетов с наследованием

Сообщение DmitryRu »

Aleksey Andreyanov писал(а):Если вы сохраните класс как CSharp Classes for Inherited Report, то текущий отчёт будет сохранён в поле MasterReport.
Это я понимаю.
Перефразирую вопрос: зачем нужно Save As CSharp Classes for Inherited Report?
Ответ "чтобы сохранить текущий отчет в MasterReport" не подходит :-)
Подходящие варианты
"Чтобы в дальнейшем использовать этот сохраненный отчет как базовый для первого варианта наследования отчетов из ссылки http://www.stimulsoft.com/ru/documentat ... oaches.htm"
или
"В таком формате надо сохранять отчеты, созданные с помощью наследования от другого отчета".
или
что-то еще?
Aleksey Andreyanov писал(а): Стоит также заметить, что, если вы сохранили отчёт как класс, то вы уже не можете его открыть в дезайнере или загрузить в него другой шаблон отчёта (mrt-файл). Этот вариант подходит, если вы генерируете отчёт из кода.
Это не проблема, всегда можно хранить в проекте оригинальный .mrt базового отчета, а из него генерировать хоть при сборке .cs файл. Этим ваш фреймворк мне нравится - что его можно интегрировать в приложение.


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

Код: Выделить всё

<Inherited>True</Inherited>
Более в целевом отчете упоминаний о мастер-отчете нет. Дизайнер помечает такие "унаследованные" контролы значком. Впрочем, никакого хинта у этого значка нет, потому незнающий человек может большинство таких контролов править, и это будет работать, до тех пор, пока однажды снова не будет вызван код

Код: Выделить всё

report.MasterReport = masterReport.SaveToString()
Этот вызов сбросит все "унаследованные" контролы в то состояние, в котором они в мастер-отчете.
Если этот код не вызывать, то целевой отчет тоже будет вполне работоспособен, за счет того, что все "мастер-контролы" скопированы в целевой, а не просто вставлены ссылки на "мастер-отчет".

Есть у этого подхода и недостатки - есть например желание кастомизировать в целевом отчете некоторые контролы из мастера, но это не возможно, судя по всему.

На мой взгляд, информация на страничке http://www.stimulsoft.com/ru/documentat ... oaches.htm не в полной мере описывает механизм "наследования" в вашей реализации.

Спасибо за быстрые и качественные консультации
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Re: Создание отчетов с наследованием

Сообщение HighAley »

Здравствуте, Дмитрий.
DmitryRu писал(а):
Aleksey Andreyanov писал(а):Если вы сохраните класс как CSharp Classes for Inherited Report, то текущий отчёт будет сохранён в поле MasterReport.
Это я понимаю.
Перефразирую вопрос: зачем нужно Save As CSharp Classes for Inherited Report?
Ответ "чтобы сохранить текущий отчет в MasterReport" не подходит :-)
Подходящие варианты
"Чтобы в дальнейшем использовать этот сохраненный отчет как базовый для первого варианта наследования отчетов из ссылки http://www.stimulsoft.com/ru/documentat ... oaches.htm"
или
"В таком формате надо сохранять отчеты, созданные с помощью наследования от другого отчета".
или
что-то еще?
Aleksey Andreyanov писал(а): Стоит также заметить, что, если вы сохранили отчёт как класс, то вы уже не можете его открыть в дезайнере или загрузить в него другой шаблон отчёта (mrt-файл). Этот вариант подходит, если вы генерируете отчёт из кода.
Во второй цитате содержится ответ для вопроса после первой цитаты. Вы можете использовать класс для генерации отчёта из кода.

Вообще наш продукт построен так, что существует множество вариантов его использования. Иногда проще сказать, чего нельзя делать, чем описывать что можно. Некоторые наши клиенты используют наш продукт таким образом, который мы и не могли и представить.
DmitryRu писал(а):незнающий человек может большинство таких контролов править
Наследованные компоненты править нельзя. Они заблокированы.

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

Спасибо.
DmitryRu
Сообщения: 163
Зарегистрирован: 19 май 2014, 10:40

Re: Создание отчетов с наследованием

Сообщение DmitryRu »

Здравствуйте.
По ряду причин приходится писать свою реализацию "наследования внешнего вида отчета".
Выяснилось, что на русской локали, с разделителем "," не работают функции SaveToJsonObject, LoadFromJsonObject
Пример кода:

Код: Выделить всё

            var dto = templateComponent.SaveToJsonObject(StiJsonSaveMode.Report);
            destination.LoadFromJsonObject(dto);
(В данном коде я переношу все свойства компонента из родительского отчета в наследник)
Получаем исключение:
System.Exception : Parsing Error
at Stimulsoft.Base.StiJsonReportObjectHelper.Deserialize.RectangleD(String text)
at Stimulsoft.Report.Components.StiComponent.LoadFromJsonObject(JObject jObject)
at Stimulsoft.Report.Components.StiSimpleText.LoadFromJsonObject(JObject jObject)
at Stimulsoft.Report.Components.StiText.LoadFromJsonObject(JObject jObject)
Спасибо
Ivan
Сообщения: 641
Зарегистрирован: 10 авг 2006, 05:40
Откуда: Stimulsoft Office

Re: Создание отчетов с наследованием

Сообщение Ivan »

Здравствуйте.

Уточните пожалуйста, какой билд вы используете.
За последнее время было много доработок.
Попробуйте пожалуйста последний билд и сообщите нам о результатах.

Спасибо.
DmitryRu
Сообщения: 163
Зарегистрирован: 19 май 2014, 10:40

Re: Создание отчетов с наследованием

Сообщение DmitryRu »

Здравствуйте.
Последний доступный билд - 2015.1.21.0
В нем ошибка воспроизводится (локаль русская, разделитель ",")
Ivan
Сообщения: 641
Зарегистрирован: 10 авг 2006, 05:40
Откуда: Stimulsoft Office

Re: Создание отчетов с наследованием

Сообщение Ivan »

Здравствуйте.
DmitryRu писал(а):Выяснилось, что на русской локали, с разделителем "," не работают функции SaveToJsonObject, LoadFromJsonObject
Уточним: функции работают, но работают некорректно.
Для обеспечения нормальной работы продукта сохранение и загрузка отчетов должны происходить в одной и той же локали.
Для этого внутри методов сохранения/загрузки отчетов на время работы методов принудительно устанавливается локаль "en-US".
Методы SaveToJsonObject / LoadFromJsonObject реализованы у каждого компонента, но они рассчитаны на внутреннее применение, т.е. вызываются при сохранении/загрузке отчета.
Таким образом в каждом отдельном методе установка локали не предусмотрена.
Поэтому для решения проблемы вам необходимо добавить в ваш код установку английской локали на время работы с json:

Код: Выделить всё

            System.Globalization.CultureInfo currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
            try
            {
                System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US", false);

                var dto = templateComponent.SaveToJsonObject(StiJsonSaveMode.Report);
                destination.LoadFromJsonObject(dto);
            }
            finally
            {
                System.Threading.Thread.CurrentThread.CurrentCulture = currentCulture;
            }
Спасибо.
Ответить