TRootCustomGridForm
– класс для наследования, содержит грид и его контекстное меню, базовый функционал для фильтрации по значению ячейки и набором с клавиатуры, группированных справочников, удаления данных, позиционирования, взаимодействия в фильтром форм, подменю настройки грида GridFunctions
и итоговых функций GridTotalFunctions
. Здесь определен виртуальный метод GetEditorClass
, возвращающий в формах-потомках класс формы для изменения и добавления данных – карточки. И метод, вызывающий карточку – CallEditor
.
TRootGridForm
– здесь реализован базовый функционал для печати из формы.
TRootClipboardGridForm
– здесь реализован базовый функционал для буферов обмена и использования форм в «плавающем» режиме в качестве отправителя и получателя (см. далее). Здесь определен виртуальный классовый метод GetEditorClass
, зависящий от внешнего контекста, который в основном используется в Менеджере.
TRootCustomDirectory
– здесь реализован функционал для изменения и наследования данных справочника, виртуальный метод для изменения диалога подтверждения удаления (в корзину или без возможности восстановления) DeleteConfirmationClass
.
TRootCustomFilteredDirectory
- здесь реализован функционал для внутренней фильтрации (см. далее).
TRootDirectory
- справочник, получающий данные с сервера с полным набором функционала. Он содержит датасет с SQL-запросом, функционал для экспорта данных. Этот класс используется для наследования конкретных списков, , и так далее.
TRootChildDirectory
– класс справочника, получающего данные от родительской формы. Многие карточки в проекте содержат вложенные списки, такие как спецификация документа. Получение данных с сервера для таких списков происходит в датасете карточки, где и хранится SQL-запрос, а датасет этого справочника подключается к его потоку. Данные внутреннего списка не обязаны содержать данные заголовка, их объединением и обновлением занимается джойн-датасет на форме (dsJoin: TssJoinDataSet
). То есть, в спецификации документа мы видим столбцы заголовка, но они не возвращаются в наборе для спецификации. При изменении заголовка (шапки) документа в кэше карточки мы так же видим эти изменения в датасете спецификации без дополнительных действий по их обновлению там.
То есть, чтобы создать список с полным функционалом справочника нужно пронаследовать форму от TRootDirectory
, в унаследованном датасете dsItems написать SQL-запрос, описать поток в свойстве Streams
датасета и перекрыть несколько виртуальных методов: GetIcon
, GetEditorClass
, GetDBObjectsNames
. Streams
в датасете определяет таблицу, данные которой будут изменяться из этого справочника. Там же указывается ключевое поле: <имя потока>(<ключевое поле>)
. Двойным щелчком на компоненте TssNetDataSet
вызываем редактор его свойства Query
. Вкладка General – Streams и вкладка SQL служат для этого. GetIcon
возвращает номер иконки формы, GetEditorClass
– класс формы-редактора – карточки, GetDBObjectsNames
– имена таблиц, определяющих доступ. То есть, если основная таблица для построения данных – Склады, то возвращаем строку 'tp_Stores'
. Открывающие наш справочник команды меню будут невидимыми для пользователя, у которого нет доступа на просмотр складов.
Чтобы создать встроенный список в карточке, нужно пронаследовать форму от TRootChildDirectory
, указать имя потока данных в dsSlaveItems.StramName
, в датасете EditDataSet
родительской карточки написать SQL-запрос для ее потока, добавить через ; описание потока в Streams и создать форму нашего класса с помощью конструктора CreateEmbedded.
Такой встроенный список поддерживает редактирование данных в кэше основного датасета, сохранение которых на сервер происходит в одной транзакции с сохранением заголовка из родительской карточки (кнопки
, в ней). Возможно вложенное встраивание, то есть, карточка вложенного списка содержит свой вложенный список. Сохранение данных всех дочерних карточек так же происходит в кэше, а отправка изменений на сервер при сохранении из корневой карточки.