Изменения в обработке бизнес-объектов
Всем привет,
Новый билд (1.1.20) содержит совершенно новый движок для обработки бизнес-объектов. Он был разработан, чтобы снять ограничения старой версии движка:
- при регистрации бизнес-объекта надо было указывать параметр - максимальный уровень вложенности. Это было необходимо для корректного представления бизнес-объекта в виде дерева источников данных (не все бизнес-объекты являются деревьями; некоторые содержат ссылки типа parent-child, что приведет к бесконечному циклу). Теперь это ограничение снято, вы можете выбрать столько уровней вложенности, сколько необходимо в отчете. Это можно сделать в окне "Данные|Выбрать данные для отчета";
- старый движок некорретно работал с вложенными источниками данных, если они принадлежали простому св-ву (не источнику). Например, рассмотрим следующую структуру классов:
В старой версии, это конвертировалось в следующее дерево данных:
(т.е. источник Detail принадлежал источнику Master, что не соответствует исходной структуре).
В новой версии данные представлены в натуральном виде:
К сожалению, нововведения привели к частичной несовместимости со старыми отчетами. Здесь приведен список того, что нужно поменять:
1) Метод
report.RegisterData(IEnumerable, string, BOConverterFlags, int)
оставлен для обратной совместимости. Вместо него используйте
report.RegisterData(IEnumerable, string)
-или-
report.RegisterData(IEnumerable, string, int)
Последний метод создает n-уровневую структуру начальных данных и может быть использован, если вы создаете отчет в коде. В подавляющем большинстве случаев, используйте первый метод.
2) Новый движок работает только с публичными свойствами объектов. Поля объектов не поддерживаются.
Если у вас есть код типа
вам нужно переделать поле в свойство:
3) Как говорилось выше, новый движок обрабатывает вложенные источники данных иначе. По этой причине, вам нужно исправить старые отчеты, если они используют вложенные источники данных:
- откройте отчет в дизайнере;
- откройте окно "Данные|Выбрать данные для отчета" и снимите флажок с корневого источника данных (в примере выше это "Master"). Закройте окно кнопкой ОК;
- сохраните отчет;
- откройте отчет снова;
- откройте окно "Данные|Выбрать данные для отчета" и пометьте флажками источники данных, которые вам нужны.
Шаги, описанные выше, необходимы для удаления старых (неправильных) объектов данных, которые хранятся в отчете, и создания новых. Теперь необходимо привязать элементы отчета к новым источникам данных:
- назначьте нужные источники данных каждому дата-бэнду в отчете (сделайте двойной щелчок на бэнде и выберите источник данных). Если вы используете объект "Матрица", проверьте также его св-во DataSource;
- вам может понадобиться исправить ссылки на поля данных. Так, в классе, рассмотренном выше, для доступа к св-ву Detail.SomeProperty, вы должны использовать полный путь к св-ву:
"Master.Info.Detail.SomeProperty"
В старой версии движка источник Detail принадлежал источнику Master, и путь к св-ву был таким:
"Master.Detail.SomeProperty"
Новый билд (1.1.20) содержит совершенно новый движок для обработки бизнес-объектов. Он был разработан, чтобы снять ограничения старой версии движка:
- при регистрации бизнес-объекта надо было указывать параметр - максимальный уровень вложенности. Это было необходимо для корректного представления бизнес-объекта в виде дерева источников данных (не все бизнес-объекты являются деревьями; некоторые содержат ссылки типа parent-child, что приведет к бесконечному циклу). Теперь это ограничение снято, вы можете выбрать столько уровней вложенности, сколько необходимо в отчете. Это можно сделать в окне "Данные|Выбрать данные для отчета";
- старый движок некорретно работал с вложенными источниками данных, если они принадлежали простому св-ву (не источнику). Например, рассмотрим следующую структуру классов:
public class Master
{
public DetailInfo Info { get; set; }
}
public class DetailInfo
{
public List<Detail> Detail { get; set; }
}
public class Detail
{
public int SomeProperty { get; set; }
}
В старой версии, это конвертировалось в следующее дерево данных:
Master
|
+- Info
|
+- Detail
(т.е. источник Detail принадлежал источнику Master, что не соответствует исходной структуре).
В новой версии данные представлены в натуральном виде:
Master
|
+- Info
|
+- Detail
К сожалению, нововведения привели к частичной несовместимости со старыми отчетами. Здесь приведен список того, что нужно поменять:
1) Метод
report.RegisterData(IEnumerable, string, BOConverterFlags, int)
оставлен для обратной совместимости. Вместо него используйте
report.RegisterData(IEnumerable, string)
-или-
report.RegisterData(IEnumerable, string, int)
Последний метод создает n-уровневую структуру начальных данных и может быть использован, если вы создаете отчет в коде. В подавляющем большинстве случаев, используйте первый метод.
2) Новый движок работает только с публичными свойствами объектов. Поля объектов не поддерживаются.
Если у вас есть код типа
public MyClass
{
public string MyField;
}
вам нужно переделать поле в свойство:
public MyClass
{
private string _myField;
public string MyField
{
get { return _myField; }
set { _myField = value; }
}
}
3) Как говорилось выше, новый движок обрабатывает вложенные источники данных иначе. По этой причине, вам нужно исправить старые отчеты, если они используют вложенные источники данных:
- откройте отчет в дизайнере;
- откройте окно "Данные|Выбрать данные для отчета" и снимите флажок с корневого источника данных (в примере выше это "Master"). Закройте окно кнопкой ОК;
- сохраните отчет;
- откройте отчет снова;
- откройте окно "Данные|Выбрать данные для отчета" и пометьте флажками источники данных, которые вам нужны.
Шаги, описанные выше, необходимы для удаления старых (неправильных) объектов данных, которые хранятся в отчете, и создания новых. Теперь необходимо привязать элементы отчета к новым источникам данных:
- назначьте нужные источники данных каждому дата-бэнду в отчете (сделайте двойной щелчок на бэнде и выберите источник данных). Если вы используете объект "Матрица", проверьте также его св-во DataSource;
- вам может понадобиться исправить ссылки на поля данных. Так, в классе, рассмотренном выше, для доступа к св-ву Detail.SomeProperty, вы должны использовать полный путь к св-ву:
"Master.Info.Detail.SomeProperty"
В старой версии движка источник Detail принадлежал источнику Master, и путь к св-ву был таким:
"Master.Detail.SomeProperty"