Классы объектов
| Класс Код | То есть класс, объекты которого выполняют произвольные SQL предложения в пределах допустимых динамическим SQL. Мой самый любимый и трудный класс. |
Как написать новый класс?
Если кто-нибудь захочет врукопашную совершить крестный ход создания нового класса в рамках Nexus технологии, то, несомненно, это будет лишнее подтверждение его способностям. Но скорости создания информационной системы при таком подходе не получить. Скорость создания достигается другими средствами разработки, которые дают неплохие результаты по созданию новых классов. Я назвал их Авто Порождение, поскольку новые классы порождаются таким же классом, который был мною разработан ранее.
Насколько сложен процесс написания нового класса? Сколько должен знать человек при постановке такой задачи? От ответов на эти вопросы будет зависеть время создания информационной системы. Этот раздел отвечает на вышепоставленные вопросы. Необходимо отметить тот факт, что все тексты хранимых процедур как ядра так и дополнительных классов объектов являются открытыми и не шифруются. Хотя такая возможность существует как штатная для MS SQL сервера. Поскольку API по созданию нового класса – это таблицы и хранимые процедуры MS SQL сервера, то человек, решивший использовать Nexus технологию, должен знать SQL (Structure Queried Language) и основы работы с MS SQL сервером в сетевом окружении.
Для того, чтобы создать класс надо выполнить хранимую процедуру в базе данных, в которой откомпилировано Nexus ядро:
Obj Create Class? Obj Create Class? Name,Uname,Based On?,Symmetric,Del Type?,Resident,Folder Like?,Max Cnt?
В Name задается имя класса (короткое, до 32 символов английское название). Имена процедур, обслуживающих события этого класса, содержат это имя как часть своего названия.
В Uname пишется подробное широкоупотребительное название класса, имеющее национальный синтаксис и смысловое содержание.
В параметре Based On? задается Id класса, от которого класс произведен.
В параметре Symmetric задается 1, если зрительно не различаются сами документы и shortcut. При этом при удалении многочисленных представлений документа они удаляются без каких либо действий, кроме последнего, когда и производится фактическое удаление
В параметре Del Type? задается тип удаления: 0 – удаление логическое, документу проставляется флаг Deleted, но сама запись не удаляется и ее можно восстановить, 1 – удаление физическое (delete), практикуется только для папок и файлов, и 2 – удаление запрещено, используется для системных объектов
Если Resident=1, то объект нельзя перемещать
Если Folder Like?=1, то объект является папкой и его можно раскрыть
Параметр Max Cnt? используется для ограничения количества Shortcut на объект: 0 означает отсутствие ограничения, 1 – создание shortcut невозможно, 2 – только один shortcut и т.д.
Если класс базируется на другом, то несмотря на его флаги реальные (действующие) флаги могут быть другими. Взведенные значения флагов Symmetric, Resident, Folder Like? заставляют все производные от них классы обладать тем же свойством. Значение Del Type? наследуется по максимальному. Значение Max Cnt? наследуется по минимуму, но значение 0 означает бесконечность.
При создании класса в системной папке ‘Классы\Абстрактный документ’ отображается созданный класс в соответствии с иерархией классов. Класс – создан, но дело еще не окончено...
Для того,чтобы объекты нового класса начали жить в системе необходимо Создать Таблицы для хранения объектов класса и добавить хранимые процедуры, отвечающие за обработку событий и методов над объектами нового класса.
Механизм событий
События в системе – это ситуации, в которых производится поиск и вызов stored procedure с определенными именами. События в системе могут быть именованными и неименованными.
Имена процедур, обслуживающих неименованные события, имеют вид:
<имя класса>_<метод>_<имя события>_ @p1, @p2, @p3
Последнее подчеркивание обозначает, что оно выполняется до начала изменений в таблицах, может отсутствовать и является событием типа pre, отсутствие подчеркивания – это событие типа post. Когда события лучше делать типа pre, а когда post? Проверки лучше делать вначале, тогда будет быстрее откат транзакции, а коррекцию данных по результатам делать в post. Каждая процедура обработки события имеет три целых параметра: @p1, @p2 и @p3. В @p1 передается уникальный номер (UDN) документа. Не все события используют все параметры, в этом случае передается 0. Процедуры обработки событий не начинают и не заканчивают транзакций.
Следующие неименованные события определены в системе:
| move | Перемещение документа из фолдера в другой фолдер. Параметры: @p1–UDN документа, @p2–фолдер откуда, @p3–фолдер куда. |
| off | Документ удаляется логически. Использует @p1, тоже для всех остальных событий. |
| era | Документ удаляется физически. |
| on | Документ вступает в силу: он был создан или было сделано undelete. |
| und | Событие, характерное только для undelete, вызывается совместно с on. |
| upd | Любое изменение документа. |
| getp | Очень важное событие, вызываемое по нажатию правой клавиши мыши (Get properties). Процедуры, обслуживающие это событие формируют состав возникающего меню. Внимание: у события есть только post-составляющая. |
| filt | Событие, возникающее при запросе фильтров. |
| corr | Это событие вызывается следом за _read_, после того как в Detailed добавлены расширения класса. Оно позволяет управлять показом расширений в форме, т.е. можно например удалить часть расширений или сделать их readonly в режиме редактирования документа. |
Имена процедур, обслуживающих именованные события выглядят также, но вместо слота <имя события>_ там ставится название метода отображения: view(просмотр), edit(редакция), print(печать). События существуют только в post-форме. Поэтому для данного класса для данного события и определенного метода может существовать ТОЛЬКО ОДНА процедура обработки события. Однако, для одного объекта, а не класса их может вызваться несколько для всех классов, входящих в иерархию.
В системе есть следующие именованные события:
| gets | Вызывается перед отображением окна для создания нового объекта. Процедура должна указывать, какие поля и как надо заполнять. @p1 – UDN. Внимание: имя метода в данном случае: edit. Во всех остальных событиях имя метода – из выбранной property. |
| cre | Вызывается после заполнения форм при создании документа. @p1 – отрицательное число, используемое как номер среза таблицы Detailed, @p2 – номер только что созданного нового документа, @p3 не используется. Процедура должна создать записи в связанных таблицах с UDN=@p2, и, если объект имеет поля типа названия, то сделать update полям No, Name, Dat в таблице Docs по UDN=@p2 |
| read | Вызывается при детализации документа для просмотра или редактирования документа. Процедура должна сформировать поля для просмотра или редактирования. |
| put | Запись документа после изменения. Производит коррекцию таблиц документа и возможно Docs. |
| cycl | Используется при выполнении recycle при редактировании. Изменяет в форме значения одних полей на основании других. |
| detp | Вызывается до редактирования или просмотра. Может запросить параметры перед отображением, например, вариант кратко/детально, диапазон дат и т.д. |
Примеры хранимых процедур, выполняющих роль обработчиков в системе для класса с именем Command Run?/ Указатель команды. Данный класс объектов реализует запуск исполняемой задачи на сервере с рабочего места клиента.
CREATE PROCEDURE
| Command Run_getp_edit_ @p1 int, @p2 int, @p3 int |
| Command Run_ Run @UDN int |
| Command Run_ Block_ @UDN int |
| Command Run_ Unblock_ @UDN int |
| Command Run_gets_edit_ @p1 int, @p2 int, @p3 int |
| Command Run_cre_edit_ @p1 int, @p2 int, @p3 int |
| Command Run_read_edit_ @p1 int, @p2 int, @p3 int |
| Command Run_put_edit_ @p1 int, @p2 int, @p3 int |
| Command Run_read_view_ @p1 int, @p2 int, @p3 int |
| Command Run_off_del_ @p1 int, @p2 int, @p3 int |
После того, как хранимые процедуры отлажены и откомпилированы в базу данных, осталось совсем немного, чтобы новый класс полноценно заработал в рамках Nexus портала. Для этого необходимо создать привилегии для методов и опереционных свойств нового класса, связать эти привилегии с конкретными пользователями системы и перекомпилировать классы, чтобы новые связи вступили в силу. Для этого существует штатная процедура из следующих шагов(на примере класса ):
Создание привилегий для нового класса
GO
Перекомпилировать классы
exec Doc Patch? 'CommandRun', 'Указатель команды класс'
GO
Перекомпилировать привилегии
exec Compile Security? 0
GO