Для копирования записей таблицы базы данных и записей связанных таблиц используется копирование иерархических данных. В Creatio иерархическое копирование данных доступно к использованию для копирования таблиц [ProductHierarchyDataStructureObtainer] и [ProductConditionHierarchyDataStructureObtainer]. Чтобы скопировать данные с других таблиц, необходимо выполнить кастомизацию иерархического копирования данных.
Иерархическое копирование можно использовать в пользовательском веб-сервисе, например, при копировании данных из внешнего сервиса в приложение Creatio или при подключении к внешней базе данных.
Например, есть раздел Продукты (Products), который сформирован на основе таблицы [Product] базы данных. Страница продукта содержит пользовательские детали. При иерархическом копировании записи раздела будут скопированы и данные записи, и данные связанных деталей.
При копировании учитываются права доступа к таблицам. Например, пользователь не имеет прав на чтение и добавление записей в таблицу [Contact]. При вызове копирования иерархических данных запись не будет скопирована и приложение вернет сообщение о невозможности выполнения данной операции.
Структура и алгоритм работы копирования иерархических данных
Составляющие копирования иерархических данных представлены в таблице.
Название | Описание | Классы и интерфейсы |
---|---|---|
Контроллер | Контролирует процесс копирования |
IHierarchyDataCopyingController HierarchyDataCopyingController — контроль создания копии записи таблицы и связанных данных из базы данных. |
Получатель | Получает из базы данных структуру текущей таблицы и связанных таблиц |
HierarchyDataStructureObtainerContext — выбор алгоритма для получения иерархической структуры таблицы и связанных таблиц. IHierarchyDataStructureObtainer HierarchyDataStructureObtainer — получение иерархической структуры таблицы и связанных таблиц. BaseHierarchyDataStructureObtainer ProductHierarchyDataStructureObtainer — получение иерархической структуры таблицы [Product] и связанных таблиц. |
Контейнер | Сохраняет структуру текущей таблицы и связанных таблиц |
HierarchyDataStructure — контейнер для сохранения информации о структуре иерархических данных. |
Мапер | Работает со структурой |
IEntityCollectionMappingProcessor EntityCollectionMappingProcessor — получение структуры из базы данных, копирование. |
Диаграмма классов копирования иерархических данных представлено на рисунке ниже.
Алгоритм работы копирования иерархических данных:
- Класс сервиса вызывает контроллер процесса копирования и передает в него название таблицы и идентификатор записи, данные которой будут копироваться.
-
Контроллер начинает поэтапное создание копии:
- Получает структуру таблицы и связанных таблиц в унифицированной форме.
- Cохраняет полученную структуру таблицы в унифицированной форме.
- Контроллер копирует записи в соответствии со структурой, полученной на этапе сохранения.
Унифицированная форма — это cохранение полученной структуры таблицы в объект с типом HierarchyDataStructure. Если таблица имеет связанные таблицы (колонка по внешнему ключу ссылается на запись другой таблицы), то они помещаются в созданный объект (в коллекцию из объектов аналогичного типа). При необходимости расширения или обновления механизма получения структуры использование унифицированной формы позволяет обработать новую структуру без дополнительных изменений кода в контроллере.
Шаблон унифицированной формы, которая используется при сохранении полученной структуры таблицы, приведен ниже.
Кастомизировать копирование иерархических данных
Кастомизация копирования иерархических данных позволяет:
- Добавить пользовательскую реализацию получателя данных (класс HierarchyDataStructureObtainer).
- Изменить реализацию получателя данных (класс HierarchyDataStructureObtainer).
- Изменить реализацию контроллера (класс HierarchyDataCopyingController).
- Добавить пользовательскую реализацию копирования иерархических данных.
Добавить пользовательскую реализацию получателя данных
Способы добавления пользовательской реализации получателя данных (класс HierarchyDataStructureObtainer):
- Через базовый интерфейс.
- Через наследование базового класса.
Добавить пользовательскую реализацию получателя данных через базовый интерфейс
- Создайте класс, который реализует интерфейс IHierarchyDataStructureObtainer. Шаблон названия класса: [НазваниеОбъектаКопирования]HierarchyDataStructureObtainer.
- Добавьте пользовательскую реализацию метода интерфейса ObtainStructure(). Обязательно укажите модификатор virtual.
Пример реализации получателя данных через базовый интерфейс содержится в пакете ProductBankCustomerJourney —> классы ProductHierarchyDataStructureObtainer и ProductConditionHierarchyDataStructureObtainer.
Добавить пользовательскую реализацию получателя данных через наследование базового класса
Под базовой реализацией необходимо понимать стандартное копирование записи без связанных записей. Получатель реализован в классе BaseHierarchyDataStructureObtainer базового пакета NUI.
- Создайте класс, который реализует интерфейс BaseHierarchyDataStructureObtainer (пакет NUI —> класс BaseHierarchyDataStructureObtainer). Шаблон названия класса: [НазваниеОбъектаКопирования]HierarchyDataStructureObtainer.
- Расширьте базовую реализацию получателя.
Пример реализации получателя данных через наследование базового класса содержится в пакете ProductBankCustomerJourney —> класс ProductHierarchyDataStructureObtainer).
Изменить реализацию получателя данных
- Создайте класс, который замещает один из классов BaseHierarchyDataStructureObtainer (пакет NUI), ProductConditionHierarchyDataStructureObtainer (пакет ProductBankCustomerJourney), ProductHierarchyDataStructureObtainer (пакет ProductBankCustomerJourney).
- В замещающий класс добавьте пользовательскую реализацию замещающего метода ObtainStructure() базового класса.
Изменить реализацию контроллера
- Создайте класс, который реализует интерфейс IHierarchyDataCopyingController. Шаблон названия класса: [НазваниеОбъекта]HierarchyDataController.
-
В метод интерфейса CopyRecord добавьте пользовательский алгоритм копирования.
Один шаг алгоритма должен содержать вызов одного метода другого класса. Шаг алгоритма также должен включать в себя создание объекта класса, который необходимо вызвать, или минимальную подготовку данных, которые будут передаваться в метод.
Добавить пользовательскую реализацию копирования иерархических данных
- Добавьте реализацию контроллера процесса копирования (класс HierarchyDataCopyingController). Контроллер должен поэтапно вызывать получателя структуры (класс HierarchyDataStructureObtainer), обработчика структуры (класс EntityCollectionMappingProcessor), контейнера структуры (класс HierarchyDataStructure).
- Добавьте реализацию получателя иерархической структуры данных (класс HierarchyDataStructureObtainer).
-
Создайте класс, который реализует интерфейс. Шаблон названия класса: [НазваниеОбъекта]HierarchyDataProcessor.
Рекомендуется добавить интерфейс для класса обработчика. Это позволяет добавить другую реализацию и заменить существующую, а также используется для унификации всех обработчиков.
- Создайте класс, реализующий интерфейс IEntityCollectionMappingHandler.
- В метод контроллера CopyRecord добавьте вызовы методов получателя структуры (класс HierarchyDataStructureObtainer), обработчика структуры (класс EntityCollectionMappingProcessor), контейнера структуры (класс HierarchyDataStructure).
-
Создайте в пользовательском классе объект класса HierarchyDataCopyingController.
Пример создания объекта контроллера -
Вызовите метод копирования copyController.
Пример вызова метода копирования
Вызвать копирование иерархических данных
Копирование иерархических данных можно вызвать из front-end и из back-end части.
Вызвать иерархическое копирование из front-end части
Чтобы вызвать копирование иерархических данных из front-end части, используйте метод callService().
Пример вызова содержится в пакете ProductBankCustomerJourney —> схема ProductConditionDetailV2 —> метод callCopyRecordService().
Вызвать иерархическое копирование из back-end части
Чтобы вызвать копирование иерархических данных из back-end части, в пользовательском классе создайте объект класса HierarchyDataCopyingController.
Чтобы работать с данными таблиц по маппингу колонок:
-
В пользовательском классе создайте объект класса маппера, который реализует интерфейс IEntityCollectionMappingHandler.
Пример создания объекта класса маппера -
Вызовите методы маппера через объект.
Пример вызова метода копирования
Чтобы получить структуру определенной таблицы в виде объекта с типом HierarchyDataStructure:
-
В пользовательском классе создайте объект класса HierarchyDataStructureObtainerContext.
Пример создания получателя структуры таблицы -
Получите структуру определенной таблицы.
Способы получения структуры:
- Вызовите метод ObtainStructureByObtainerStrategy и передайте ему параметр schemaName — название таблицы, запись которой необходимо скопировать.
- Вызовите реализацию существующего получателя структуры — ProductHierarchyDataStructureObtainer или ProductConditionHierarchyDataStructureObtainer.