Структуризированный язык запросов (SQL)
Предыдущая часть
3. Разработка структуры данных “Обобщенный Документ”
3.1. Основные сведения
Как правило реальные данные в проблемной области имеют иерархическую структуру,
поэтому целесообразно использовать объекты БД имеющие идентичную структуру. В
связи с этим на основе общих возможностей и компонент CASE – средства qWORD5 разработана
новая структура данных, названная “Обобщенный документ” (ОД).
Новая структура данных - это просто реализация одного из возможных вариантов
построения БД и интерфейсных элементов, разработанная с помощью общего метода
переопределения свойств и методов. Все стандартные методы, отличные от общих методов
qWORD5-PRO, переопределены для фрейма № 25.
- Переопределены функции порождения кода экземпляра фрейма и связанные
с этим функции навигации по БД, получения/записи/корректировки значений понятий
в ЭФ.
- Добавлен ряд функций (событий) для более удобной работы со структурами.
- Созданы параметризуемые экраны-прототипы, с помощью которых упрощено
проектирование интерфейсных пользовательских экранов.
В Обобщенном документе мы имеем дело с одним-единственным объектом данных,
называемым - документ. Как структура данных, он представляет из себя совокупность
записей с атрибутами. Документы одинаковой структуры группируются в папки. Документ
состоит из шапки и документострок. Любая документострока в свою очередь может
иметь подстроки и т.д. Любой документ однозначно характеризуется кодом экземпляра
документа. Совокупность всех папок с содержащимися в них экземплярами документов
образуют базу.
Структуру данных документа можно представить в виде некоторой иерархии уровней,
где на первом уровне сгруппированы реквизиты, названные шапкой, на втором - документостроки,
и так далее. Любой реквизит на любом уровне называется понятием. Структура документа
приведена на рис.3.1. Для её описания достаточно определить следующие вещи для
каждого уровня:
· список понятий, находящихся на этом уровне;
· правило порождения кода этого уровня
Рис.3.1. Структура Обобщенного документа
На уровне папки хранится описание данного вида документа, включающее в себя
следующие системные понятия:
- код документа,
- наименование документа,
- код задачи,
- наименование задачи,
- код фрейма-описателя данного вида документа,
- наименование фрейма-описателя данного вида документа,
- номер основного экрана для ввода, просмотра документов,
- номер экрана для вывода документа в виде печатной формы.
Для однозначной идентификации документа (вообще говоря, любых его реквизитов-понятий,
находящихся на любом уровне иерархии) используется также как и для любого фрейма
в qW т.н. структурированный ключ.
Ключ=Папка#ключ1#ключ2#ключ3#...
В таком случае естественно говорить об уровнях:
- уровень папки(полный ключ определяется только кодом папки),
- уровень документов (
Папка#ключ1
) ,
- уровень документострок (
Папка#ключ1#ключ2),
- уровень подстрок
(Папка#ключ1#ключ2#ключ3)
и так далее. На каждом уровне могут быть привязаны понятия, скажем, на уровне
2 - номер_документа, дата_документа, на уровне 3 - наименование_товара, количество_по_накладной
и т.п. При такой структуре кода, зная значение кода для экземпляра понятия третьего
уровня, мы сразу знаем значения кодов экземпляров понятий этого экземпляра документа,
лежащих на более высоких уровнях.
Это оказывается очень удобным при различных поисках, когда найдя, например,
ссылки на все строки с определенным видом товара, мы автоматически найдем связанные
с ними номера документов, или еще что-нибудь.
Для быстрых поисков по базе данных значения понятий могут иметь словарь значений
понятий.
Словарь[Имя_понятия][Значение_понятия]=ключ
Связь между словарем данных и объектом данных устроена очень просто - каждое
хранимое в словаре значение имеет ссылку на требуемый код экземпляра объекта данных
(фрейм) (см. рис. 2.2).
3.2. Принципы проектирования базы данных в Обобщенном документе
Для проектирования БД в ОД и работы с ней имеется стандартный набор методов.
Как разработчик приложения, так и пользователь взаимодействует с БД через некоторые
интерфейсные элементы, с помощью которых осуществляется как проектирование БД,
ее наполнение и корректировка содержащейся в БД информации.
Для отображения имеющихся задач и работы с ними имеется “Основное окно проектирования
задач”, представленное на . Здесь отображаются следующие системные понятия: код
документа (папки), наименование документа, код задачи, наименование задачи, код
фрейма-описателя данного вида документа, наименование фрейма-описателя данного
вида документа, номер основного экрана для ввода и просмотра документов, номер
экрана для вывода документа в виде печатной формы.
Рис.3.2.Основное окно проектирования задач
Задача имеет имя и код (идентификатор задачи). В дальнейшем имя можно изменять,
код же остается неизменным. По развертке можно посмотреть наличие каких-либо других
задач и выбрать необходимую. Код папки задается произвольно, либо присваивается
автоматически. Код задачи - это заглавная латинская буква (как правило, буква,
с которой начинается имя задачи, например: C Справочники) и затем две цифры порядкового
номера 01, 02, 03 и т.д. По развертке можно посмотреть наличие каких-либо других
папок этой задачи;
Наименование и код фрейма-описателя - здесь указывается имя и номер
фрейма, отвечающего за эту папку, т.е. в этом фрейме хранится описание экранов
данной папки, функции, отвечающие за работу и т.п. Номер фрейма (0,1,2,...,88,89)
выбирается самостоятельно или присваивается автоматически (по порядку).
Все свойства для заданного вида документов содержатся в специальном понятии
Yfeat (пример приведен в приложении1).
Приложение 1
Структура системного понятия Yfeat
- ^gl("A01.000000.000000.000","Yfeat","Type")=
- ^gl("A01.000000.000000.000","Yfeat","level")=level;
Уровни; Номер, Список, Ключевые,
- Обязательные, Список бр., Название, Размеры, Обобщения; 6,60,10,15,20,30,20,50
- ^gl("A01.000000.000000.000","Yfeat","level",1)=
- ^gl("A01.000000.000000.000","Yfeat","level",1,1,"CSerCli")=CSerCli
- ^gl("A01.000000.000000.000","Yfeat","level",1,1,"Cngd")=Cngd
- ^gl("A01.000000.000000.000","Yfeat","level",1,1,"Cqqfa")=Cqqfa
- ^gl("A01.000000.000000.000","Yfeat","level",1,1,"Cqqfd")=Cqqfd
- ^gl("A01.000000.000000.000","Yfeat","level",1,1,"DcodeOD")=DcodeOD
- ^gl("A01.000000.000000.000","Yfeat","level",1,1,"Dnmd")=Dnmd
- ^gl("A01.000000.000000.000","Yfeat","level",1,1,"SerCli")=SerCli
- ^gl("A01.000000.000000.000","Yfeat","level",1,1,"Thlp25")=Thlp25
- ^gl("A01.000000.000000.000","Yfeat","level",1,1,"Yfeat")=Yfeat
- ^gl("A01.000000.000000.000","Yfeat","level",1,1,"Ynn")=Ynn
- ^gl("A01.000000.000000.000","Yfeat","level",1,1,"YobjOD")=YobjOD
- ^gl("A01.000000.000000.000","Yfeat","level",1,1,"ngd")=ngd
- ^gl("A01.000000.000000.000","Yfeat","level",1,1,"nmd")=nmd
- ^gl("A01.000000.000000.000","Yfeat","level",1,1,"qqfa")=qqfa
- ^gl("A01.000000.000000.000","Yfeat","level",1,1,"qqfd")=qqfd
- ^gl("A01.000000.000000.000","Yfeat","level",1,1,"qqnump")=qqnump
- ^gl("A01.000000.000000.000","Yfeat","level",1,4)=Dnmd,nmd
- ^gl("A01.000000.000000.000","Yfeat","level",1,5)=Код,Наименование
- ^gl("A01.000000.000000.000","Yfeat","level",1,6)=6,30
- ^gl("A01.000000.000000.000","Yfeat","level",2)=
- ^gl("A01.000000.000000.000","Yfeat","level",2,1,"studGR")=studGR
- ^gl("A01.000000.000000.000","Yfeat","level",2,1,"studK")=studK
- ^gl("A01.000000.000000.000","Yfeat","level",3)=
- ^gl("A01.000000.000000.000","Yfeat","level",3,1,"studF")=studF
- ^gl("A01.000000.000000.000","Yfeat","level",3,1,"studI")=studI
- ^gl("A01.000000.000000.000","Yfeat","level",3,1,"studO")=studO
- ^gl("A01.000000.000000.000","Yfeat","level",4)=
- ^gl("A01.000000.000000.000","Yfeat","level","*")=
- ^gl("A01.000000.000000.000","Yfeat","level","*",1,"C")=C
- ^gl("A01.000000.000000.000","Yfeat","level","*",1,"Duser")=Duser
- ^gl("A01.000000.000000.000","Yfeat","level","*",1,"Mnn")=Mnn
- ^gl("A01.000000.000000.000","Yfeat","level","*",1,"Mspconb")=Mspconb
- ^gl("A01.000000.000000.000","Yfeat","qqf")=14
- ^gl("A01.000000.000000.000","Yfeat","qqnump")=qqnump;
Экраны; Индекс, Вид, Наименование;6,4,40
- ^gl("A01.000000.000000.000","Yfeat","qqnump",1)=1
- ^gl("A01.000000.000000.000","Yfeat","qqw")=qqw;
Понятия; Код,Ур.,Наименование,Размер, Синоним,Прз,Зависит от,Влияет на,Экр.опр,Пр.вывода,
Кл,Об; 8,3,30,3,20,3,12,10,7,10,3,3
- ^gl("A01.000000.000000.000","Yfeat","qqw","C")=C
- ^gl("A01.000000.000000.000","Yfeat","qqw","C",1)=*
- ^gl("A01.000000.000000.000","Yfeat","qqw","C",2)=%системный_код_ЭФ
- ^gl("A01.000000.000000.000","Yfeat","qqw","C",3)=15
- ^gl("A01.000000.000000.000","Yfeat","qqw","C",4)=Код_Записи
- ^gl("A01.000000.000000.000","Yfeat","qqw","CSerCli")=CSerCli
- ^gl("A01.000000.000000.000","Yfeat","qqw","CSerCli",1)=1
- ^gl("A01.000000.000000.000","Yfeat","qqw","CSerCli",2)=Флаг_выбора_данных(Клиент-Сервер)
- ^gl("A01.000000.000000.000","Yfeat","qqw","CSerCli",3)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","CSerCli",4)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","Cngd")=Cngd
- ^gl("A01.000000.000000.000","Yfeat","qqw","Cngd",1)=1
- ^gl("A01.000000.000000.000","Yfeat","qqw","Cngd",2)=Код_группы_документов
- ^gl("A01.000000.000000.000","Yfeat","qqw","Cngd",3)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","Cngd",4)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","Cqqfa")=Cqqfa
- ^gl("A01.000000.000000.000","Yfeat","qqw","Cqqfa",1)=1
- ^gl("A01.000000.000000.000","Yfeat","qqw","Cqqfa",2)=%системный_код_фрейма
- ^gl("A01.000000.000000.000","Yfeat","qqw","Cqqfa",3)=15
- ^gl("A01.000000.000000.000","Yfeat","qqw","Cqqfa",4)=Фрм
- ^gl("A01.000000.000000.000","Yfeat","qqw","Cqqfd")=Cqqfd
- ^gl("A01.000000.000000.000","Yfeat","qqw","Cqqfd",1)=1
- ^gl("A01.000000.000000.000","Yfeat","qqw","Cqqfd",2)=Код_фрейма_описания
- ^gl("A01.000000.000000.000","Yfeat","qqw","Cqqfd",3)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","Cqqfd",4)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","DcodeOD")=DcodeOD
- ^gl("A01.000000.000000.000","Yfeat","qqw","DcodeOD",1)=1
- ^gl("A01.000000.000000.000","Yfeat","qqw","DcodeOD",2)=Код_папки_ОД
- ^gl("A01.000000.000000.000","Yfeat","qqw","DcodeOD",3)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","DcodeOD",4)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","Dnmd")=Dnmd
- ^gl("A01.000000.000000.000","Yfeat","qqw","Dnmd",1)=1
- ^gl("A01.000000.000000.000","Yfeat","qqw","Dnmd",2)=Вид_документа
- ^gl("A01.000000.000000.000","Yfeat","qqw","Dnmd",3)=25
- ^gl("A01.000000.000000.000","Yfeat","qqw","Dnmd",4)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","Duser")=Duser
- ^gl("A01.000000.000000.000","Yfeat","qqw","Duser",1)=*
- ^gl("A01.000000.000000.000","Yfeat","qqw","Duser",2)=Код_пользователя
- ^gl("A01.000000.000000.000","Yfeat","qqw","Mnn")=Mnn
- ^gl("A01.000000.000000.000","Yfeat","qqw","Mnn",1)=*
- ^gl("A01.000000.000000.000","Yfeat","qqw","Mnn",2)=Число_записей_ОД
- ^gl("A01.000000.000000.000","Yfeat","qqw","Mspconb")=Mspconb
- ^gl("A01.000000.000000.000","Yfeat","qqw","Mspconb",1)=*
- ^gl("A01.000000.000000.000","Yfeat","qqw","Mspconb",2)=Домен_Пробел-Конкатенация
- ^gl("A01.000000.000000.000","Yfeat","qqw","SerCli")=SerCli
- ^gl("A01.000000.000000.000","Yfeat","qqw","SerCli",1)=1
- ^gl("A01.000000.000000.000","Yfeat","qqw","SerCli",2)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","SerCli",3)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","SerCli",4)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","Thlp25")=Thlp25
- ^gl("A01.000000.000000.000","Yfeat","qqw","Thlp25",1)=1
- ^gl("A01.000000.000000.000","Yfeat","qqw","Thlp25",2)=Пояснение_для_папки_(Обобщ)
- ^gl("A01.000000.000000.000","Yfeat","qqw","Thlp25",3)=255
- ^gl("A01.000000.000000.000","Yfeat","qqw","Thlp25",4)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","Yfeat")=Yfeat
- ^gl("A01.000000.000000.000","Yfeat","qqw","Yfeat",1)=1
- ^gl("A01.000000.000000.000","Yfeat","qqw","Yfeat",2)=Свойство_документа
- ^gl("A01.000000.000000.000","Yfeat","qqw","Yfeat",3)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","Yfeat",4)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","Ynn")=Ynn
- ^gl("A01.000000.000000.000","Yfeat","qqw","Ynn",1)=1
- ^gl("A01.000000.000000.000","Yfeat","qqw","Ynn",2)=Счетчик_записей
- ^gl("A01.000000.000000.000","Yfeat","qqw","Ynn",3)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","Ynn",4)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","YobjOD")=YobjOD
- ^gl("A01.000000.000000.000","Yfeat","qqw","YobjOD",1)=1
- ^gl("A01.000000.000000.000","Yfeat","qqw","YobjOD",2)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","YobjOD",3)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","YobjOD",4)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","ngd")=ngd
- ^gl("A01.000000.000000.000","Yfeat","qqw","ngd",1)=1
- ^gl("A01.000000.000000.000","Yfeat","qqw","ngd",2)=Наименование_группы_документов
- ^gl("A01.000000.000000.000","Yfeat","qqw","ngd",3)=40
- ^gl("A01.000000.000000.000","Yfeat","qqw","ngd",4)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","nmd")=nmd
- ^gl("A01.000000.000000.000","Yfeat","qqw","nmd",1)=1
- ^gl("A01.000000.000000.000","Yfeat","qqw","nmd",2)=Наименование_папки_документа
- ^gl("A01.000000.000000.000","Yfeat","qqw","nmd",3)=25
- ^gl("A01.000000.000000.000","Yfeat","qqw","nmd",4)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","qqfa")=qqfa
- ^gl("A01.000000.000000.000","Yfeat","qqw","qqfa",1)=1
- ^gl("A01.000000.000000.000","Yfeat","qqw","qqfa",2)=%имя_фрейма
- ^gl("A01.000000.000000.000","Yfeat","qqw","qqfa",3)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","qqfa",4)=Имя_Фрейма
- ^gl("A01.000000.000000.000","Yfeat","qqw","qqfd")=qqfd
- ^gl("A01.000000.000000.000","Yfeat","qqw","qqfd",1)=1
- ^gl("A01.000000.000000.000","Yfeat","qqw","qqfd",2)=Наименование_фрейма_описания
- ^gl("A01.000000.000000.000","Yfeat","qqw","qqfd",3)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","qqfd",4)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","qqnump")=qqnump
- ^gl("A01.000000.000000.000","Yfeat","qqw","qqnump",1)=1
- ^gl("A01.000000.000000.000","Yfeat","qqw","qqnump",2)=%номер_Экранной_Формы
- ^gl("A01.000000.000000.000","Yfeat","qqw","qqnump",3)=
- ^gl("A01.000000.000000.000","Yfeat","qqw","qqnump",4)=Э
- ^gl("A01.000000.000000.000","Yfeat","qqw","studF")=studF
- ^gl("A01.000000.000000.000","Yfeat","qqw","studF",1)=3
- ^gl("A01.000000.000000.000","Yfeat","qqw","studF",2)=Студ_Фамилия
- ^gl("A01.000000.000000.000","Yfeat","qqw","studGR")=studGR
- ^gl("A01.000000.000000.000","Yfeat","qqw","studGR",1)=2
- ^gl("A01.000000.000000.000","Yfeat","qqw","studGR",2)=Номер_группы
- ^gl("A01.000000.000000.000","Yfeat","qqw","studI")=studI
- ^gl("A01.000000.000000.000","Yfeat","qqw","studI",1)=3
- ^gl("A01.000000.000000.000","Yfeat","qqw","studI",2)=Студ_Имя
- ^gl("A01.000000.000000.000","Yfeat","qqw","studK")=studK
- ^gl("A01.000000.000000.000","Yfeat","qqw","studK",1)=2
- ^gl("A01.000000.000000.000","Yfeat","qqw","studK",2)=Куратор
- ^gl("A01.000000.000000.000","Yfeat","qqw","studO")=studO
- ^gl("A01.000000.000000.000","Yfeat","qqw","studO",1)=3
- ^gl("A01.000000.000000.000","Yfeat","qqw","studO",2)=Студ_Отчество
- ^gl("A01.000000.000000.000","Yfeat","qqwAdd","ZDw")=ZDw
- ^gl("A01.000000.000000.000","Yfeat","qqwAdd","ZDw",1)=*
- ^gl("A01.000000.000000.000","Yfeat","qqwAdd","ZDw",2)=%домен.Слово
Каждое свойство имеет код, название и значение. Кроме того, у свойства могут
быть подсвойства и система атрибутов, структура атрибутов для данного свойства
одинакова. Свойства документов могут быть базовыми, которые присущи всем документам
и специальными, которые описываются для определенного вида документа. Базовые
свойства формируются при описании структуры папки. Первоначально, вновь созданная
папка имеет структуру представленную на рис.3.3, где по умолчанию представлен
первый (системный) уровень. На нем хранятся базовые свойства, содержащие информацию
о папке (структура, название, ..) Свойства на уровне qqw.level* при необходимости
можно удалить.
Основное окно проектирования свойств представлено на рис.3.3.
Рис.3.3. Основное окно проектирования свойств
Здесь можем видеть распределение понятий по уровням. В данном окне возможен
только просмотр, редактирование записей невозможно.
Описание и структура базовых свойств приведена в табл.3.1:
Таблица 3.1
Код
Свойства
|
Наименование свойства
|
Значение свойства
|
Код подсвойства
|
Атрибуты
|
Qqw
|
Понятие
|
Список терминальных понятий в формате функции flt0
|
Код понятия БД
|
1
|
Код понятия
|
2
|
Уровень
|
3
|
Наименование
|
4
|
Размер
|
5
|
Синоним
|
6
|
Признак
|
7
|
Список зависимых понятий
|
8
|
Список влияющих понятий
|
9
|
Уровень определения правил вывода
|
10
|
Имя функции правила вывода
|
11
|
Признак ключевого понятия
|
12
|
Признак обязательного понятия
|
Level
|
Уровни
|
–
|
Номер уровня
|
1
|
Номер уровня
|
2
|
Список терминальных понятий
|
3
|
Список ключевых понятий
|
4
|
Список обязательных понятий
|
5
|
Список понятий для броузера
|
6
|
Список названий граф для броузера
|
7
|
Список размеров граф
|
8
|
Список сообщений
|
Qqnump
|
Экраны
|
Список экранных форм
|
Номер экрана
|
1
|
Номер экрана
|
2
|
Вид экрана
|
3
|
Наименование экрана
|
Пояснения атрибутов свойства Qqw приведены в табл. 3.2.
Таблица 3.2.
№ |
Название графы
|
Пояснение
|
1
|
Код понятия
|
Код понятия
|
2
|
Уровень
|
Уровень, на котором находится понятие (2,3,4,*) (* - на любом
уровне)
|
3
|
Наименование
|
Наименование понятия
|
4
|
Размер
|
Размер для браузера
|
5
|
Синоним
|
Краткое обозначение понятия, которое, в случае формирования
динамических таблиц, будет являться названием какого-либо элемента экрана
|
6
|
Признак
|
Признак понятия (порождаемое)
|
7
|
Список зависимых понятий
|
Указывается от чего зависит понятие (список понятий
через ",")
|
8
|
Список влияющих понятий
|
Указывается на что влияет понятие (список понятий через ",")
(формируется автоматически)
|
9
|
Уровень определения правил вывода
|
Экран определения для порождаемого понятия (где указано def0
для текущего понятия)
|
10
|
Имя функции правила вывода
|
Правило вывода порождаемого понятия (формируется автоматически)
|
11
|
Признак ключевого понятия
|
Ключевое
|
12
|
Признак обязательного понятия
|
Обязательное
|
Продолжение статьи будет опубликовано в течение недели
Дополнительную информацию Вы можете получить в компании Interface Ltd.
Отправить ссылку на страницу по e-mail
Обсудить на форуме Oracle