Наследование бизнес-классов (постановка)
До текущего момента времени мы могли создавать в платформе только прямых наследников от классов Делфи с помощью т.н. Подтипа (Subtype) бизнес-объекта. Цель настоящей доработки -- реализация наследования бизнес-классов неограниченной вложенности.
Подтип (Subtype)
Формат строки подтипа не будет меняться. Напомним, что сейчас подтип это или произвольная строка, или имя таблицы, или РУИД типа документа.
GetSubTypeList
В вызов функции следует добавить два параметра:
- Subtype -- подтип.
- OnlyDirect -- если True, то возвращаются только непосредственные наследники. В противном случае -- возвращается вся иерархия наследников.
InheritsFromSubtype
Реализовать такую функцию класса. На вход передается анализируемый класс и подтип, а также подтип текущего класса. Возвращает True, если анализируемый класс + подтип являются наследниками от текущего класса и подтипа или соответствуют им. Т.е. аналог InheritsFrom только с учетом подтипов.
ClassParentSubtype
Реализовать такую функцию класса. На вход передается подтип. Возвращает родительский подтип, если он есть, или пустую строку. Т.е. аналог ClassParent, только с учетом подтипов.
Определение иерархии через Хранилище
Сейчас в папке SubTypes глобального Ханилища находятся строковые параметры. Имя параметра задает имя класса из Дельфи, а значение -- перечисленные через запятую подтипы, которые являются прямыми наследниками. Нам не известны случаи из практики, где бы определялось более одного подтипа для класса.
Предлагается оставить как есть, только теперь имя переменной будет имя класса + подтип. Например, для иерархии:
TgdcCompany | +--TgdcCompanyA | | | +--TgdcCompanyB | | | +--TgdcCompanyD | +--TgdcCompanyC
В папке будут прописаны следующие пары (имя параметра = значение):
TgdcCompany = A,C TgdcCompanyA = B TgdcCompanyB = D
Определение иерархии для справочников
Сейчас создание таблицы-справочника приводит к созданию нового подтипа для одного из следующих классов: TgdcAttrUserDefined, TgdcAttrUserDefinedTree, TgdcAttrUserDefinedLBRBTree.
Предлагается сделать создание вложенных типов через создание таблиц, связанных 1-к-1 (в дополнение к существующему типу метаданных TgdcTableToTable, который мы не будем трогать). Поясним на примере. Пусть мы "с нуля", не опираясь на существующие справочники, реализуем следующую иерархию:
ТМЦ
|
+--БСО
|
+--Продукты питания
|
+--Промтовары
|
+--Основные средства
Последовательность действий:
- Создаем таблицу ТМЦ
- Создаем 1-к-1 таблицу БСО, связанную с ТМЦ
- Создаем 1-к-1 таблицу Продукт питания, связанную с ТМЦ
- Создаем 1-к-1 таблицу Промтовары, связанную с ТМЦ
- Создаем 1-к-1 таблицу ОС, связанную с Промтовары
В запросах объектов БСО, Продукты питания, Промтовары должен быть JOIN с таблицой ТМЦ.
В запросе объекта ОС -- JOIN с таблицами Промтовары и ТМЦ.
Содержимое запроса объекта ТМЦ должно управляться некоторым свойством. В одном случае, нам нужны только записи из ТМЦ без подключения сторонних таблиц. В другом -- записи всех объектов по иерархии наследования, т.е. в запросе должны быть LEFT JOIN на таблицы БСО, Продукты питания, Промтовары, ОС. Аналогично -- для объекта Промтовары.