Болотская Методическое пособие по исползованию кодов обработки 2010
.pdfDICT Студенты ‘День_рождения’… dictionary-code a attribute-count 5
…
input-conversion d
Рис. 6. Фрагмент записи описания атрибута «День_рождения» файла «Студенты»
Вводится в анкету студента |
Значение поля Item<5> |
10/06/93 |
9293 |
Рис. 7. Преобразование при вводе на примере даты
Декларируется, что в атрибуте «input conversion» могут использоваться многие коды. Их можно просмотреть при формировании записи описания атрибута средствами UPDATE-процессора, установив курсор на атрибут «input conversion» и нажав «F1».
При выполнении лабораторных работ реально используются только три кода: «d», «x» и «call».
Код обработки «x» показывает, что декларируемый атрибут вычисляемый, т.е. его приходится вычислять каждый раз при обращении к нему в процессорах UPDATE и ACCESS. При вызове вычисляемого атрибута в процессоре UPDATE просмотреть его можно, но изменить нельзя – курсор не устанавливается на соответствующее значение.
Очень часто на одном и том же поле приходится объявлять несколько атрибутов. Для примера рассмотрим поле № 3 записи файла «Группы». В этом поле хранятся номера зачеток студентов, входящих в группу, которые можно преобразовать с помощью вычисляемых атрибутов в другие характеристики студента. Все эти атрибуты в «input conversion» должны иметь код «x».
Код обработки «call» используется при определении атрибутов, требующих оригинального ввода или модификации данных средствами UPDATE-процессора. Нестандартное преобразование, представленное вызываемой подпрограммой, инициируется после ввода данных и нажатия клавиши <Enter>, когда подпрограмме передается введенное значение.
11
Заметим, что когда в ADI вызывается подпрограмма, то ей всегда в качестве параметра передается текущее значение поля, в то время как в FDI в качестве параметра передается вся запись в формате динамического массива.
2.2.Коды обработки в атрибутах «output conversion» и «correlative» ADI
Список кодов обработки для этих атрибутов абсолютно одинаков. Решение вопроса о том, в какой атрибут поместить код, зависит исключительноотпорядка выполнениясоответствующихпроцессов.
Атрибут «output conversion» записи описания атрибута отвечает за постпроцессорную обработку данных, а атрибут «correlative» – за предпроцессорную.
Для UPDATE-процессора это означает, что процессы, инициируемые кодами обработки в атрибуте «output conversion», идут после окончания процессов, инициируемых кодами обработки в атрибуте «correlative». Например, код, вычисляющий средний возраст студенческой группы (в днях), должен быть помещен в атрибут «correlative», а представление полученного числа – в «output conversion».
Для ACCESS-процессора ситуация более сложная, рассмотрим ее на примере атрибутов «Возраст» и «Dob» (День_рождения).
Рассмотрим сначала атрибут «Возраст». Этот атрибут определяется на поле № 5 файла «Студенты» с помощью следующего алгебраического выражения:
a;(d – 5)/”365”
где «a;» – код алгебраического выражения; «d» – текущая дата во внутреннем представлении; цифра 5 представляет не саму себя (это не литерал, это номер поля), а значение поля № 5. Литерал ”365” представляет число дней в году.
Рассмотрим команду для ACCESS-процессора, выполняющую сортировку файла «Студенты» по возрасту:
:sort Студенты by Возраст
12
Если алгебраический код будет помещен в атрибут «correlative», то файл будет отсортирован по возрастанию возраста студента. Преобразование даты рождения в возраст будет производиться до выполнения сортировки.
Если алгебраический код будет помещен в атрибут «output conversion», то файл будет отсортирован по убыванию возраста, так как фактическая сортировка будет производиться по дате рождения. Преобразование даты рождения в возраст будет производиться после сортировки.
Результаты представлены в прил. 1.
Рассмотрим теперь атрибут «Dob». Этот атрибут также определен на поле № 5 файла «Студенты», но в запись его определения включен атрибут «input conversion» со значением «d».
Рассмотрим команду для ACCESS-процессора, выполняющую сортировку файла «Студенты» по дням рождения:
:sort Студенты by Dob
Если код «d2/» (преобразование даты во внешний вид) будет помещен в атрибут «output conversion», то файл будет отсортирован по дате рождения. Если при этом усложнить задачу и ограничить студентов по возрасту:
:sort Студенты by Dob if Dob >= 01.01.90
то ACCESS-процессор обработает этот запрос абсолютно правильно, преобразовав константу «01.01.90» во внутреннее представление.
Если код «d2/» помещен в атрибут «correlative», то файл будет отсортирован в соответствии с лексикографическим порядком строк формата dd/mm/yy. Очевидно, что последний результат никакого отношения к упорядочению по датам рождения не имеет.
Результаты выполнения различных запросов можно посмотреть в прил. 1.
13
2.3.Особенности работы
с кодами в процессорах ACCESS и UPDATE
Обработка атрибутов, определенных над пустыми полями. В
СУБД D3 любое поле записи файла может иметь несколько значений. Соответственно, и атрибут, определенный на этом поле, должен иметь ровно такое же количество значений. Это не зависит от вида функционального преобразования, определенного в атрибуте с помощью кодов обработки. Это положение справедливо как для процессора ACCESS, так и для процессора UPDATE, кроме одного случая – пустого поля.
Для пустого поля процессор ACCESS всегда дает пустое значение атрибута, а процессор UPDATE – значение атрибута для однозначного поля, принимая пустоту за значение.
Отсюда вывод: никогда не определяйте атрибутов с кодами обработки над пустыми полями. Эту ошибку очень часто допускают студенты, раздавая номера полей для вычисляемых атрибутов.
Рассмотрим пример (рис. 8, 9, 10), определяя атрибут с кодом обработки «a;s(3 = 3)» в «correlative» над разными полями записи файла «Группы». Это функциональное преобразование подсчитывает количество значений в многозначном поле № 3.
Запись файла «Группы»
000 |
К06-221 |
// ключ записи (Item_ID) |
001 |
К06-221 |
// код группы |
002 |
22 |
// код кафедры |
003 |
121]123]125]127 |
// номера зачеток студентов |
Рис.8. Запись из области данных файла «Группы»
Номера полей: |
1 |
3 |
4 |
Значения атрибута: |
4 |
4 |
4 |
|
|
3 |
|
|
|
2 |
|
|
|
1 |
|
Рис. 9. Значения атрибута с кодом обработки «a;s(3 = 3)» в «correlative», определенного над разными полями записи файла «Группы»,
вычисленные в процессоре UPDATE
14
Номера полей: |
1 |
3 |
4 |
Значения атрибута: |
4 |
4 |
|
|
|
3 |
|
|
|
2 |
|
|
|
1 |
|
Рис. 10. Значения атрибута с кодом обработки «a;s(3 = 3)»
в «correlative», определенного над разными полями записи файла «Группы», вычисленные в процессоре ACCESS
Вычисленные значения (см. рис. 9, 10) полностью совпадают, кроме поля № 4, которого нет в записи (см. рис. 8). Из рисунков также видно, что принципиально однозначный атрибут «Количество студентов в группе» нельзя определять на многозначном поле. В данном случае поле № 1 – код группы – однозначное; именно на нем получается правильное значение вычисляемого атрибута.
Обработка ассоциаций с вычисляемыми атрибутами. На рис. 11 показан экран процессора UPDATE,отрабатывающего команду
:u Группы ‘K06-221’ Ngr Dep QtySt Nz Fio Ph Home
Группы |
'К06-221' size = 176 |
|
|
|
|
Группа |
К06-221 |
|
|
|
|
Кафедра |
22 |
|
|
|
|
В группе |
4 студентов: |
Телефон |
Место_жител |
||
Зачетка Фамилия_Имя |
|||||
121 |
Щукина Анна |
8 |
916 |
235-34-56 |
Москва |
123 |
Черняева Александра |
8 |
916 |
333-45-67 |
Москва |
125 |
Буздавина Мария |
8 |
916 |
375-23-92 |
Общежитие |
127 |
Миненок Александр |
8 |
903 |
234-12-34 |
Общежитие |
Рис. 11. Запись файла «Группы» с ассоциацией вычисляемых атрибутов в процессоре UPDATE
Атрибуты |
// control |
|
• |
Nz – Зачетка |
|
• |
Fio – Фамилия_Имя |
// dependent |
• |
Ph - Телефон |
// dependent |
• |
Home – Место_жительства |
// dependent |
|
15 |
|
определенные на поле № 3, образуют ассоциацию, которая кодируется так, как показано на рис. 12.
attribute-name: |
Nz |
Fio |
Ph |
Home |
attribute-count: |
3 |
3 |
3 |
3 |
structure: |
c; |
d;3 |
d;3 |
d;3 |
Рис. 12. Кодировка ассоциации для атрибутов, определяемых на одном и том же поле
Такая кодировка, поддерживаемая процессором UPDATE (см. рис. 11), не поддерживается процессором ACCESS (рис. 13):
:list Группы ‘K06-221’ Ngr Dep QtySt Nz Fio Ph Home
Группа |
|
К06-221 |
|
|
|
Кафедра |
|
22 |
|
|
|
В группе |
4 студентов: |
127 |
|||
Зачетка |
|
121 |
123 |
125 |
|
[405] 1 |
items listed out of 1 |
items. |
|
Рис. 13. Запись файла «Группы» с ассоциацией вычисляемых атрибутов в процессоре ACCESS
Для процессора ACCESS в подобном случае надо определить дополнительные вычисляемые атрибуты, не связывая их в ассоциацию. В прил. 1 приведены все описания и примеры работы в про-
цессорах ACCESS и UPDATE.
Список рекомендуемой литературы
1.СУБД D3 для пользователей, http://www.infologic.com
2.Roberts J. Calling BASIC from AP Dictionaries. PICKWORD, July/August, 1993.
3.Vaskevitch D., Two Steps Forward, One Step Back, BYTE, May
1992.
16
Приложение 1
Демонстрационная база данных, работающая под управлением СУБД D3, представлена двумя файлами «Студенты» и «Группы».
Файл «Студенты» создан командой:
:create-file Студенты 1 1
Запись описания файла (FDI) «Студенты» находится в словаре файла «dict Студенты», она определяется командой
:ud Студенты
DICT Студенты 'Студенты' size = 145
dictionary-code |
d |
base |
1583 |
modulo |
1 |
structure |
|
retrieval-lock |
|
update-lock |
|
output-conversion |
call Проверка |
correlative |
|
|
ida1 |
attribute-type |
bГруппы;6;3 |
L |
|
column-width |
10 |
input-conversion |
call Home |
macro |
Nz Fa Im Ot Dob Ngr Home Ph |
output-macro |
Nz ФИО Dob Ngr Home Ph |
Записи описания атрибутов (FDI) файла «Студенты» также находятся в словаре файла. Их можно последовательно определять, задав одну команду:
:ud Студенты Nz Fa Im Ot Dob Ngr Home Ph
В этой последовательности эти атрибуты перечислены в «macro» FDI, т.е. это атрибуты «по умолчанию» для UPDATE процессора
macro |
Nz Fa Im Ot Dob Ngr Home Ph |
17
Запись описания атрибута «Nz» (номер зачетки):
DICT Студенты 'Nz' size = 48 dictionary-code a attribute-count 1 substitute-header Зач structure
output-conversion correlative attribute-type r column-width 3 input-conversion
Запись описания атрибута «Fa» (фамилия студента):
DICT Студенты 'Fa' size = 49 dictionary-code a attribute-count 2 substitute-header Фамилия structure
output-conversion correlative attribute-type l column-width 10 input-conversion
Запись описания атрибута «Im» (имя студента):
DICT Студенты 'Im' size = 44 dictionary-code a attribute-count 3 substitute-header Имя structure
output-conversion correlative attribute-type l column-width 7 input-conversion
Запись описания атрибута «Ot» (отчество студента):
DICT Студенты 'Ot' size = 50 dictionary-code a attribute-count 4 substitute-header Отчество
18
structure output-conversion correlative attribute-type l column-width 10 input-conversion
Запись описания атрибута «Dob» (день рождения студента):
DICT Студенты 'Dob' size = 55 dictionary-code a attribute-count 5 substitute-header ДеньРо structure
output-conversion d0 correlative attribute-type l column-width 7 input-conversion d
Запись описания атрибута «Ngr» (группа студента):
DICT Студенты 'Ngr' size = 48 dictionary-code a attribute-count 6 substitute-header Группа structure
output-conversion correlative attribute-type l column-width 7 input-conversion
Запись описания атрибута «Home» (место жительства студента):
DICT Студенты 'Home' size = 47 dictionary-code a attribute-count 7 substitute-header Живет structure
output-conversion correlative attribute-type l column-width 10 input-conversion
19
Запись описания атрибута «Ph» (телефон студента):
DICT Студенты 'Ph' size = 68 dictionary-code a attribute-count 8 substitute-header Телефон structure
output-conversion ml(# ### ###-##-##) correlative
attribute-type l column-width 15 input-conversion
Для ACCESS процессора атрибуты «по умолчанию» задаются в
«output-macro» FDI:
output-macro |
Nz ФИО Dob Ngr Home Ph |
Здесь только один новый атрибут «ФИО» (фамилия, имя, отчество студента):
DICT Студенты 'ФИО' size = 88 dictionary-code a attribute-count 2 substitute-header Фамилия_ИО structure
output-conversion a;2:" ":3(t1,1):".":4(t1,1):"." correlative
attribute-type l column-width 15 input-conversion x
Файл «Группы» создан командой:
:create-file Группы 1 1
Запись описания файла (FDI) «Группы» находится в словаре файла «dict Группы», она определяется командой
:ud Группы
DICT Группы 'Группы' size = 116 dictionary-code D attribute-count 6710 substitute-header 1
20