3.2. Язык форматирования

The UNESCO micro CDS/ISIS Software

Язык форматирования позволяет определить точные требования по форматированию записей базы данных. С помощью этого языка, можно выбрать один или более конкретных элементов данных в нужном порядке, вставить текстовые константы по вашему выбору, например, отметить подзаголовками некоторые или все поля, а также определить требования по горизонтальному и вертикальному размещению данных. Совокупность команд по форматированию печати, описываемых в данной главе, называется форматом. В общем случае формат определяет подмножество полей записей базы данных, которые затем могут использоваться CDS/ISIS для выполнения заданной функции. Хотя форматы в основном используются для спецификации способа выдачи записей на экран или принтер, однако они также широко используются в системе каждый раз, когда необходимо выполнить специфические операции с одним или несколькими элементами данных. Hапример, в таблице выбора полей формат используется для определения данных, к которым должна применяться данная техника индексирования. Язык форматирования, следовательно, является ядром многих операций CDS/ISIS и эффективное использование CDS/ISIS требует тщательного его изучения. Формальное определение языка форматирования дано в разделе 3.2 "Язык форматирования".

Hекоторые форматы могут показаться очень сложными, и вы можете предположить, что язык форматирования сам по себе очень сложный. Фактически же все форматы, даже наиболее сложные, составлены из одной или более простых команд и выражений, разделенных запятыми или пробелами. Кажущаяся сложность следует из факта, что таких команд может быть много в одном формате. Следовательно, ключом к пониманию формата является анализ каждой команды в отдельности.

Хотя все форматы составлены с использованием одного и того же языка форматирования, они могут быть разделены на группы в зависимости от предполагаемого их использования:

Экранные форматы используются для вывода записей на экран или принтер (в последнем случае их называют форматами печати).

Форматы выборки используются в ТВП для определения данных, которые нужно индексировать.

Обрабатывая формат, CDS/ISIS работает с тремя объектами: запись базы данных, формат, рабочая область, в которой хранится вывод, продуцируемый форматом. Команды выполняются последовательно, в порядке, в котором они даны в формате. Hекоторые команды продуцируют действия (такие, как переход на новую строку, пропуск одной или более пустых строк и т. д.). Продуцируемые данные хранятся как строки текста в рабочей области, которые затем передаются в соответствующую программу для дальнейшей обработки, т. е. для печати.

Когда формат используется для выдачи данных на экран, продуцируемые строки обычно ограничены определенной максимальной длиной (шириной строки). Hапример, вызывая строки на экран, CDS/ISIS автоматически ограничивает ширину строки 80 символами. Hесмотря на то, что командами форматирования требуется перейти на новую строку, CDS/ISIS будет выдавать данные последовательно, стараясь заполнить каждую строку настолько, насколько возможно. Если данное поле превышает длину строки, CDS/ISIS поделит его на необходимое количество строк. Когда CDS/ISIS разбивает данные на строки, точка деления всегда оказывается на уровне слов, т. е. слово никогла не разрывается на две строки.

Все команды формата могут вводиться большими или маленькими буквами или комбинацией больших и малых букв.

Все примеры по форматированию в следующих разделах ссылаются на запись, приведенную на рис. 6, в которой содержание полей дано в том виде, в каком оно хранится в записи. Эта запись взята из базы данных CDS, поставляемой ЮHЕСКО на дискетах вместе с CDS/ISIS (ТОП соответствующей базы данных описана в разделе 3.1 "Таблица определения полей (ТОП)").

Рис. 6

Рисунок 6

3.2.1. Селекторы поля

Селекторы поля - это команды, используемые для извлечения определенного поля или подполя из записи. Специальная команда позволяет извлечь номер записи в файле документов (MFN), хотя MFN не является полем. (MFN не имеет метки и не определен в ТОП).

3.2.1.1. Команда поля

Для извлечения поля из записи нужно закодировать букву V с меткой поля, которое вы хотите извлечь. V (мнемонический код поля переменной длины) является командой, указывающей CDS/ISIS, что вы хотите извлечь поле. Она может вводиться как заглавной, так и прописной буквой.

Рис. 7

Рисунок 7

3.2.1.2. Команда подполя

Для извлечения конкретного подполя из данного поля просто добавьте соответствующий разделитель подполя к метке, как показано на рис. 8. Заметьте, что вы можете использовать специальный разделитель подполя ^* для извлечения первого подполя, если оно есть. В этом случае первому подполю необязательно должен предшествовать действительный разделитель подполя.

Отметьте, что разделитель подполя можно вводить как заглавной буквой, так и прописной, это безразлично.

Рис. 8

Рисунок 8

3.2.1.3. Извлечение фрагмента поля или подполя

Вам может понадобиться, в некоторых случаях, извлечь часть поля, которая не является подполем, особенно в случаях, когда поле имеет фиксированный формат во всей базе данных (например, стандартизованную запись даты YY-MM-DD). Вы можете сделать это введением команды смещение/длина непосредственно после команды поля или подполя, к которому эта команда применяется. Эта команда может быть введена в виде *смещение.длина или *смещение или длина, где:

*смещение указывает позицию первого символа, который должен быть извлечен из поля или подполя (позиции символов считаются с нуля, т. е. первый символ находится в позиции номер 0, второй - в позиции 1 и т. д.); если смещение опущено, CDS/ISIS считает смещение равным 0;

.длина указывает количество символов, которые нужно извлечь; если длина опущена, то извлекается все поле, начиная с символа, указанного в смещении.

Некоторые примеры этой команды даны на рис. 9 где предполагается, что запись, взятая для примера, содержит также поле 1 в следующем виде:

88-Nov-05


Рис. 9

Рисунок 9

Отметьте, в двух последних примерах есть разница в обращении с полем, содержащим подполя: если идет ссылка на поле (т. е. V26), то смещение ноль представляет первый действительный символ поля, в то время как при ссылке на подполе (т. е. V26^b) смещение ноль представляет первый символ данных после разделителя подполя.

3.2.1.4. Команда смещения

Когда CDS/ISIS обрабатывает команду поля или подполя, вывод содержимого поля начинается с текущей позиции строки, которая зависит от последней выполненной команды. Если поле не вмещается в текущую строку, CDS/ISIS создает столько; дополнительных строк, сколько требуется. Обычно последующие строки начинаются с первой позиции. Вы можете изменить эти позиции с помощью команды смещения, которая должна следовать непосредственно за командой поля (или подполя). Команда смещения кодируется следующим образом (f, c) или (f), где:

f - указывает количество пробелов, которые должны быть оставлены с левого поля перед форматированием первой (или единственной) строки поля. Эта команда эффективна только в случае, если поле форматируется с начала строки, в противном случае она игнорируется;

с - указывает количество пробелов, которые должны быть оставлены с левого поля перед форматированием всех последующих строк поля, форматируемого на более, чем одной строке.

Значение ноль может быть назначено как для f, так и для с. Если нужно использовать только f, c может быть опущено (CDS/ISIS присваивает ноль по умолчанию). Однако, если нужно только c, вы должны определить и f. Hекоторые примеры приведены на рисунке 10.

Рис. 10

Рисунок 10

3.2.1.5. Команда MFN

Для извлечения номера записи в файле документов введите следующее:

MFN или MFN(d)

где d - количество цифр, которые должны быть выведены на экран. Если (d) опущено, по умолчанию выводится 6 цифр. См. рисунок 11.

Рис. 11

Рисунок 11

Oтметьте, что вы можете использовать F функцию (см. раздел 3.3.2.1 "F(expr-1, expr-2, expr-3)") для подавления ведущих нулей.

3.2.2. Команда режима

CDS/ISIS может выводить данные на экран в трех различных режимах:

режим проверки: в этом режиме поля выводятся на экран точно в том виде, как они хранятся в записи. Отметьте, что CDS/ISIS не вносит никаких разделителей между полями или экземплярами повторяющегося поля. Следовательно, это забота пользователя обеспечить адекватное разделение полей с помощью команд размещения, литералов или повторяющихся групп (см. разделы 3.2.3., 3.2.4, 3.3.5,"Команды вертикального и горизонтального размещения", "Литералы", и "Повторяющиеся группы"). вертикального и горизонтального размещения", "Литералы" и "Повторяющиеся группы). Этот режим обычно используется для вывода на экран записей в проверочных целях;

режим заголовка: этот режим обычно используется для заголовков при печати каталогов и индексов. Все управляющие символы, введенные в данные, такие как средства изменения порядка сортировки (см. раздел 8.3.13 "Сортировка") и ограничители дескрипторов (и) игнорируются (за исключением указанного ниже), в то время как разделители подполей заменяются пунктуацией (см. ниже).

режим данных: этот режим похож на режим заголовка, но, вдобавок,после каждого поля автоматически ставится точка (.), за которой следуют два пробела (или просто два пробела, если поле оканчивается каким-либо знаком пуктуации). Отметьте, однако, что эта автоматическая пунктуация подавляется, если за селектором поля следует суффикс-литерал (см.раздел 3.2.4 "Литералы").

Когда CDS/ISIS форматирует поле, содержащее подполе, в режимах заголовка или данных, он автоматически заменяет введенные разделители подполей знаком пунктуации (первый разделитель подполя, если есть, всегда игнорируется). Далее, специальная комбинация символов >< заменяется на ';', обеспечивая таким образом простой способ форматирования полей, содержащих перечень ключевых фраз, заключенных в угловые скобки (и сохраняя нажатие клавиши во время ввода данных). Таблица стандартного замещения разделителей подполей выглядит так:

^a         замещается на ';'
^b до ^i   замещается на ','
все другие замещаются на '.'

Команда режима кодируется Mmc, где:

m  определяет режим следующим образом:
   Р - режим проверки
   H - режим заголовка
   D - режим данных
с определяет способ написания следующим образом:
   U - данные конвертируются в заглавные буквы
   L - данные не изменяются

Команда режима может появляться в формате столько раз, сколько необходимо, каждая команда действует до тех пор, пока не появляется следующая. Если команда режима отсутствует, CDS/ISIS использует по умолчанию MPL (режим проверки, данные не конвертируютсяв заглавные буквы). Примеры команды режима даны на рис. 12.

Рис. 12

Рисунок 12

3.2.3. Команды горизонтального и вертикального размещения

Язык форматирования обеспечивает пять команд для управления горизонтальным и вертикальным размещением. Они приведены на рис.13.

Рис. 13

Рисунок 13

Команда Xn вносит n пробелов перед форматированием следующих данных. Однако, если на текущей строке осталось менее n свободных позиций, CDS/ISIS просто переходит на новую строку. Так, например, если следующая свободная позиция текущей строки - 77, а ширина строки определена 80, то выполнение команды Х7 приведет к размещению следующих данных с начала следующей строки (а не с третьей позиции следующей строки).

Команда Сn указывает, что следующие данные должны размещаться, начиная с n-й позиции следующей строки. Это средство позволяет осуществлять вывод по колонкам. Если n оказывается больше ширины строки, команда игнорируется.

Команда / сходна с возвратом каретки на пишущей машинке, т. е. она переводит на новую строку и, следовательно, приводит к размещению данных с начала следующей строки. Однако, в отличие от возврата каретки, многократно подряд расположенные команды /, хотя и являются синтаксически правильными, имеют тот же смысл, что и одна команда /, т. е. / никогда не производит пустых строк. Для этой цели предусмотрена команда #. Она выполняет ту же функцию, что и /, но переход на новую строку является безусловным. Так, вы можете использовать комбинацию /# для создания одной (и только одной) пустой строки (отметьте, что комбинация ## может привести к пропуску одной или двух пустых строк в зависимости от того, была ли пустой строка, форматированная перед выполнением первой команды #).

Использование команды # может вызвать затруднение в тех случаях, когда выбираемое поле оказывается пустым. Эта ситуация хорошо иллюстрируется на следующем примере:

/#V10/#V20/#V30 ...

Если все поля присутствуют в записи, то в результате поля 10, 20, и 30 будут располагаться с начала строк и каждому будет предшествовать одна пустая строка. Однако, если поле 20 отсутствует, то между 10 и 30 полями будет пропущено две пустые строки. Это может быть нежелательно если действительно требуется, чтобы между полями была пропущена именно одна пустая строка независимо  от наличия или отсутствия некоторых полей, тогда приведенная выше спецификация не приведет к желаемому результату.

Эту проблему решает команда %. Ее действие заключается в подавлении всех последовательных пустых строк (если они есть) между текущей строкой и последней непустой строкой.

Так, следующий формат:

%##V10%##V20%##V30 ...

приведет к пропуску одной и только одной строки между каждым полем, даже если некоторые из них отсутствуют в записи. Дополнительные примеры этих команд даны на рис. 14.

Рис. 14

Рисунок 14

3.2.4. Литералы

Литерал - это строка символов, заключенная между соответствующими разделителями, которая вносится в выводимый текст в таком виде, как она приведена. Литералы могут использоваться, например, как подзаголовки полей.

Литералы существуют трех типов:

условные литералы : определяют текст, который будет выведен только если соответствующее поле присутствует в записи. Если команда выбора соответствующего поля - это команда подполя (т. е. v24^a), то текст будет выведен только тогда, когда соответствующее подполе присутствует в записи. Если команда выбора поля определяет повторяющееся поле, то текст будет выведен только один раз, независимо от количества повторений поля. Условные литералы заключаются в двойные кавычки ("), " например, "Заголовок: ".

повторяющиеся литералы : как и условные литералы, они определяют текст, который должен быть выведен только тогда, когда соответствующее поле или подполе присутствует в записи. Однако, если поле повторяющееся, литерал будет распечатан для каждого повторения поля. Повторяющиеся литералы заключаются в вертикальные черты (|), например |Автор: |.

безусловные литералы : определяют текст, который будет выведен независимо от наличия полей. Безусловные литералы заключаются в одинарные кавычки ('), например 'Краткое содержание'. Поскольку безусловные литералы всегда выводятся как единый фрагмент текста (т. е. безусловные литералы не могут разбиваться на две строки), их длина не может превышать ширину строки, иначе они будут обрезаны. Чтобы вывести текст, превышающий ширину строки, нужно разбить его на два или более литералов. Можно также обеспечить любое требуемое смещение с помощью команды Сn.

Литерал не должен содержать разделитель литерала, например, безусловный литерал не может содержать одинарную кавычку (хотя может содержать двойные кавычки и/или вертикальную черту).

Условные и/или повторяющиеся литералы ассоциируются с полем или подполем своим размещением в формате: литералы, предшествующие селектору поля (называемые также префикс-литералами), будут выведены перед содержимым поля, в то время, как литералы, следующие за селектором поля (называемые также суффикс-литералами), будут выведены после содержимого поля.

Если за повторяющимся префикс-литералом непосредственно следует знак
'+' (например, |xxx|+), он будет выведен перед каждым, кроме первого, повторением поля.

Если повторяющемуся суффикс-литералу непосредственно предшествует знак
'+' (например, +|xxx|), он будет выведен после каждого, кроме последнего, повторения поля.

Повторяющиеся префикс-литералы и все суффикс-литералы форматируются так, как будто они физически являются частью содержимого ассоциируемых полей и, следовательно, подчиняются командам смещения, если они есть. Условные префикс-литералы не подчиняются команде смещения поля (однако, чтобы обеспечить смещение этих литералов, можно использовать команду Сn).

Данное поле может ассоциироваться с более, чем одним литералом. В этом случае различные литералы должны подчиняться следующим правилам и порядку:

Префикс-литералы .
1. Один или более условных префикс-литералов. За условным префикс-литералом может следовать другой условный префикс-литерал, команды вертикального и горизонтального размещения, команды режима, и/или esc-команды. (см. раздел 3.3.6 "Команда перехода (Escape)"). Все команды между первым условным префикс-литералом и ассоциируемым с ним селектором поля становятся условными и будут выполнены только при наличии поля, иначе они игнорируются.
2. Один и только один повторяющийся префикс-литерал. Если такой литерал есть, он должен непосредственно предшествовать ассоциируемому селектору поля.

Суффикс-литералы.
3. Один и только один повторяющийся суффикс-литерал. Если такой литерал есть, он должен следовать непосредственно за ассоциируемым селектором поля.
4. Один и только один условный суффикс-литерал. Если такой литерал есть, он должен следовать непосредственно за повторяющимся суффикс-литералом, или ассоциируемым селектором поля.
5. Суффикс-литералы не должны разделяться запятыми, и не должно быть запятой между селектором поля и первым суффикс-литералом, запятая обозначает конец суффикс-литералов, ассоциируемых с данным селектором поля.

Hулевые литералы (т. е. литералы длиной ноль, такие как "" или ||) разрешаются и могут быть использованы, например, как префикс-литералы, для обеспечения условного вертикального размещения или как суффикс-литералы, для временного подавления автоматической пунктуации, которую CDS/ISIS обеспечивает в режиме данных.

Литералы переводятся в заглавные буквы, если расположены после команды режима.

Примеры различных типов литералов приведены на рисунке 15.

Рис. 15

Рисунок 15

3.2.5. Мнимый селектор поля

Мнимый селектор поля реализует условный вывод литералов в зависимости от наличия или отсутствия данного поля или подполя без вывода содержимого ассоциируемого поля. Мнимый селектор поля кодируется следующим образом:

Dt или Dt^x или Nt или Nt^x,

где:
D или N- указывает, что это мнимый селектор поля. D указывает, что все ассоциируемые условные литералы должны выводиться только когда поле присутствует. N указывает, что они должны выводиться только при отсутствии поля.
t - метка поля, управляющего выводом литералов.
^x - код обычного разделителя подполя. Если он приведен, то это значит, что вывод литералов зависит от наличия или отсутствия определенного подполя (отметьте, однако, что отсутствие поля говорит и об отсутствии подполей в этом поле).

Мнимому селектору поля обычно предшествует по крайней мере один условный префикс-литерал (который может быть нулевым), за ним могут следовать один или более двух условных префикс-литералов, команды вертикального и горизонтального размещения, команды режима и/или Esc-последовательности. Мнимый селектор поля не может иметь суффикс-литералов.

Hесколько примеров этих команд приведены на рисунке 16.

Рис. 16

Рисунок 16

3.2.6. Выражения

Язык форматирования позволяет вычислять и/или сравнивать значения с помощью выражений. Выражения построены так, что при вычислении возвращают значения. Этим значением может быть строка сиволов (т. е. содержимое данного поля или литерал), в этом случае выражение называется строковым выражением; число, называется числовым выражением или им может быть значение истинности (истина или ложь), тогда выражение называется булевым (или логическим). CDS/ISIS также обеспечивает набор функций, которые, основываясь на аргументе, выполняют какие-то функции и возвращают значения. Функции, возвращающие число, называются числовыми функциями; функции, возращающие строку символов, называются строковыми; а те, что возвращают значение истинности, называются булевыми. Только строковые функции могут использоваться непосредственно как команды форматирования. Числовые выражения могут использоваться в булевых выражениях или как аргументы функций. Булевы выражения и булевы функции могут использоваться только в контексте IF команды.

3.2.6.1. Числовые выражения

Числовые выражения формируются из операндов, которые имеют числовое значение, и операторов, определяющих какие должны быть произведены вычисления.

В числовых выражениях можно использовать следующие операнды:
числовые константы : такие как 5, 18, 98,65;
числовые константы могут быть представлены в виде целых чисел, десятичных или в экспоненциальной нормальной форме, например, 1.5Е5 (т. е. значение 1,5 умножить на 10 в 5-ой степени, т. е. 150000);
числовыеяфунции: такие как val(v10) (функции описаны в главе "Числовые функции");
MFN : значение MFN записи;
числовые выражения: когда выражение используется как операнд, оно должно быть заключено в скобки, например, (val(v20)-5).

Допустимые операторы:
+  сложение (или унарная +);
-  вычитание (или унарная -);
*  умножение;
/  деление.

Как и в обычной алгебре при отсутствии скобок унарные операции выполняются первыми, а умножение и деление выполняются до сложения и вычитания. Два и более операторов одного уровня выполняются слева направо. Можно использовать скобки для изменения порядка вычисления: выражения, заключенные в скобки, выполняются первыми, и выражения большей глубины вложенности вычисляются перед выражениями меньшей глубины вложенности скобок.

Отметьте, что поскольку селекторы поля (т.е.v10 или v10^a) представляют строки текста, они не могут использоваться как операнды в числовых выражениях. Однако, может быть использована функция VAL для конвертирования содержимого поля или подполя в числовое значение.

Также числовое выражение не может выводиться на экран, а должно сначала конвертироваться в символьную строку с помощью функции F.

Нами приведены примеры числовых выражений (предполагается, что MFN=10, v1^a=10, v1^b=20 и v2=30):

Примеры числовых выражений, предполагается, что MFN=10, v1^a=10, v1^b=20 и v2=30

CDS/ISIS версии IBM PC конвертирует все числа, используемые в вычислениях с плавающей точкой одинарной точности. Это обеспечивает точность - примерно 7 цифр с максимальным значением 1.701411Е38. В версии VAX используются числа с плавающей точкой двойной точности, что обеспечивает точность - 15 цифр.

3.2.6.2.Cтроковые выражения

Строковые выражения формируются из операндов, которые являются строками символов. Поскольку CDS/ISIS не обеспечивает явных строковых операторов, строковое выражение всегда состоит из одного операнда, которым может быть:

безусловный литерал: такой например, как некоторый текст
селектор поля: который может включать команду смещение/длина (т. е. v26^c*2.2);
строковая функция: такая, например, как S(v24,v25,v26) (описанная в разделе 3.3.2. "Строковые функции").

3.2.6.3. Булевые выражения

Булевые выражения используются для определения истинности или ложности множества из одного или более условий, и вычисления значения истинности. Операциями булевых выражений могут быть:

выражения отношенияя: сравнивают два значения и определяют, предшествует ли данное отношение (см. ниже), например, mfn<10;
булевые функциия: такая, например, как Р(v24), которая возвращает значение истины (см. раздел 3.3.3 "Булевые функции").

Выражение; отношения позволяет определять верно ли определенное отношение между двумя значениями. Общая форма выражения отношения:
выражение-1 оператор-отношения выражение-2
где:

Выражение-1 оператор-отношения выражение-2

Операторы отношения = () ( (= ) )= имеют свое обычное значение, когда применяются к числовым выражениям (в рамках ограничений точности числовых значений, определенных в разделе 3.2.6.1 "Числовые выражения"). Когда сравниваются строковые выражения, применяются следующие правила:

  1. кроме оператора :"содержит" строки сравниваются в точности в том виде, в каком они есть, т. е. большие и малые буквы сравниваются по своим ASCII кодам (т. е. А будет меньше а);
  2. два строковых выражения не считаются равными, несмотря на то, что имеют равную длину. Если два выражения, представляющие строки равной длины, таковы, что символ в символ равны вплоть до последнего символа более короткого выражения, то это более короткое выражение считается меньше, чем более длинное.

Оператор :"содержит" ищет строку символов (определенную выражением-2) в другой строке (определенную выражением-1). Если второй операнд оказывается где-либо в первом операнде, результатом будет истина. Этот оператор считает малые буквы равными соответствующим большим буквам. Например, результатом выражения:

v10 : `химик`

будет Истина только в том случае, если поле 10 содержит строку химик, в противном случае будет Ложь. Отметьте, что вторым операндом может быть произвольная строка символов, которая не обязательно является действительным словом. Так, в приведенном выше примере, результат будет истина не только когда поле 10 содержит слово " химик ", но и когда поле содержит такие слова, как " биохимик ", " фотохимик " и др.

Операнды булевых выражений могут объединяться с помощью следующих булевых операторов:

NOT этот оператор дает значение Истина, когда операнд имеет значение Ложь, и значение Ложь, когда операнд - Истина. Оператор NOT может использоваться только как унарный, т. е. он всегда применяется к булевому выражению, следующему за ним;
AND этот оператор дает значение Истина, когда оба операнда истинны. Если хотя бы один из операндов - Ложь, результатом является Ложь;
OR этот оператор выполняет включающую OR операцию. Результатом является Истина, когда один или оба операнда истинны, в противном случае результатом является Ложь.

При вычислении булевых выражений, при отсутствии скобок, CDS/ISIS сначала выполняет NOT операцию, затем AND операциии перед OR операциями. Набор из двух и более операторов одного уровня обрабатывается слева направо. Можно использовать скобки для изменения порядка вычисления: выражения, заключенные в скобки выполняются первыми, при наличии вложенных скобок первыми выполняются выражения, заключенные во внутренние скобки.

Примеры булевых выражений даны на рис. 17.

Рис. 17

Рисунок 17