3.3. Функции

The UNESCO micro CDS/ISIS Software

Функция вычисляет значение (называемое значением функции или возращаемым значением), которое затем подставляется вместо функции при вычислении выражения.

Функции могут иметь один или более аргументов, которые должен определить пользователь; значения аргументов используются в вычислении значения функции. Так, значение функции зависит от значения определенных аргументов. Аргументы заключаются в скобки и разделяются запятыми.

Аргументы могут быть трех типов:

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

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

3.3.1.Числовые функции.
3.3.1.1. VAL (формат)

Функция VAL возвращает числовое значение своего аргумента. Аргумент формат - это формат CDS/ISIS, который может содержать любую возможную команду форматирования. CDS/ISIS обрабатывает аргумент, чтобы получить строку текста. Затем эта строка сканируется слева направо до тех пор, пока не найдется числовое значение (которое может быть в экспоненциальном представлении). Функция VAL возвращает это числовое значение, переведенное во внутреннее машинное представление, удобное для выполнения вычислений. Если не найдено никаких числовых значений, возвращается значение ноль. Если текст содержит более, чем одно числовое значение, возвращается только первое. Например (предполагая, что v1^a=10, v1^b=20, v2=30):

Функция VAL

В последнем примере значение 0 (а не 1985), так как CDS/ISIS рассматривает минус между Июль и Август как начало отрицательного числового значения, а А от Август как его конец, поэтому выбранное значение получается просто '-` и результатом является 0. Поэтому важно более четко определить правила ввода данных для тех полей или подполей, которые будут использоваться для численных вычислений.

3.3.1.2. RSUM (формат)

Функция RSUM возвращает сумму одного или более числовых значений. Текст, продуцированный аргументом, сканируется слева направо, как в функции VAL, и все выбранные числовые значения складываются. Полученная сумма является значением функции. Отдельные значения должны быть разделены одним или более нечисловыми символами, и это забота пользователя внести эти разделители через формат, являющийся аргументом. RSUM может ипользоваться для вычисления суммы всех числовых значений, содержащихся во всех повторениях данного повторяющегося поля. Например (предполагая, что поле 1 имеет четыре повторения, содержащих 1, 2, 3, и 4):

Функция RSUM

3.3.1.3. RMIN (формат)

Функция RMIN возвращает минимальное значение из одного или нескольких числовых значений. Текст, продуцированный аргументом, сканируется слева направо, как для VAL функции, и извлекаются все числовые значения. Алгебраически самое малое из этих значений - значение функции. Отдельные значения должны быть разделены одним или более нечисловыми символами, и это забота пользователя внести эти символы через формат, данный в аргументе. RMIN может использоваться для вычисления минимального из числовых значений, содержащихся во всех повторениях повторяющегося поля. Например (предполагая, что поле 1 имеет четыре повторения, содержащих 10, 20, 30 и 40):


Функция RMIN

3.3.1.4. RMAX (format)

Функция RMAX возвращает максимальное значение из одного или нескольких числовых значений. Текст, продуцируемый аргументом, сканируется слева направо, как для VAL функции, и все числовые  значения  извлекаются.  Алгебраически наибольшее из этих значений - значение функции. Отдельные значения должны быть разделены  одним  или более нечисловыми символами, и это забота пользователя внести эти символы через формат, данный в аргументе. RMAX может использоваться для вычисления  максимального из числовых значений, содержащихся во всех повторениях повторяющегося поля. Например, поле 1 имеет четыре повторения, содержащих 10, 20, 30 и 40:

Функция RMAX

3.3.1.5. RAVR (формат)

Функция RAVR возвращает среднее значение (в арифметическом смысле) из одного или нескольких числовых значений. Текст, продуцируемый аргументом, сканируется слева направо, как для функции VAL, и извлекаются все числовые значения. Затем вычисляется среднее значение - значение функции. Отдельные значения должны быть разделены одним или несколькими нечисловыми символами, и это забота пользователя - внести эти символы через формат, данный в аргументе. RAVR может использоваться для вычисления среднего из числовых значений, содержащихся во всех повторениях данного повторяющегося поля. Например, поле 1 имеет четыре повторения, содержащих 10, 20, 30 и 40:

Функция RAVR

3.3.1.6. L (формат)

Функция L использует текст, продуцируемый форматом, как поисковый термин для инвертированного файла и возвращает MFN первой ссылки (если она есть). Перед поиском в инвертированном файле термин автоматически переводится в большие буквы. Если термин не найден, значением функции является ноль. Функция L обычно используется вместе с REF функцией (см. раздел 3.3.2.2 "REF (выражение, формат)", где приведены примеры использования функции L).

Отметьте, что при обработке аргумента - формата используется текущий режим вывода данных (см. раздел 3.2.2. "Командный режим "). Это важно, поскольку в результате использования неверного режима можно не найти термин в инвертированном файле. Как правило, следует использовать тот же режим, который применяется в ТВП инвертированного файла.

3.3.2. Строковые функции.

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

3.3.2.1. F (выраж-1, выраж-2, выраж-3)

Функция F преобразует числовое значение из его внутреннего представления с плавающей точкой в символьную строку. Все три аргумента - числовые выражения. Первый аргумент, выраж-1, число, которое должно конвертироваться. Второй аргумент, выраж-2, - минимальная ширина выходной строки; и третий аргумент, выраж-3 - количество десятичных позиций. Второй и третий аргументы необязательны. Отметим, однако, что если присутствует выраж-3, то выраж-2 не может быть опущено. Выраж-2 определяет минимальную ширину, т. е. значением функции будет символьная строка длиной как минимум выраж-2 символов, и если конвертируемое числовое значение требует выраж-2 символов или меньше, оно будет выровнено по правой границе внутри этой ширины. Если количество символов, требуемое для представления значения выраж-1, больше данной ширины, CDS/ISIS использует добавочные позиции. В этом случае выходная строка будет длиннее, чем выраж-2 символов.

Выраж-3 определяет количество десятичных позиций, если оно опущено, результат будет в научном экспоненциальном представлении, и, если также опущено выраж-2, то по умолчанию используется 16 символов. Если аргументы присутствуют, результатом будет округленное представление с фиксированной точкой выраж-1 с выраж-3 цифрами после запятой. Если выраж-3 равно нулю, то выраж-1 округляется до ближайшего целого числа и на выходе будет целое число без десятичных знаков.

При преобразовании целых чисел и чисел с десятичными знаками, в том случае, когда целая часть числа слишком длинная чтобы быть представленной, выходная строка заменяется серией звездочек (*).

Функция F может быть использована для выравнивания колонки чисел по десятичной запятой путем выбора подходящей ширины.

Ниже приведены примеры функции F:

Примеры функции F

3.3.2.2. REF (выражение, формат)

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

Рис. 18

Рисунок 18

Как  видно из рисунка, функция REF - очень мощное средство,поскольку позволяет объединить данные, которые хранятся в различных записях базы данных и заставляет их появиться перед пользователем как будто хранящиеся в одной записи. В этом первом примере записи 1 и 98 связываются спецификацией в поле 4 связанной записи 1 MFN, которая содержит названия страны на английском и французском языках, через формат можно извлечь любой из языков, определением релевантной метки связанной записи.

В некоторых случаях связывание записей через MFN может быть неудобным с точки зрения ввода данных. Кроме того, что любая  ошибка в MFN связанной записи даст вывод неверных данных, может потребоваться много времени для определения  правильного MFN, который надо использовать. В случае, изображенном на рис. 18, например, может оказаться, что исходный документ, с которого вводятся данные, уже содержит нормализованный код страны ("UK" в нашем случае). Для использования MFN, как связки с записью страны может потребоваться разьяснительный список или выяснение в базе данных, что MFN записи, соответствующей 'UK` - 98: было бы значительно проще ввести сразу "UK", а не 98. Это возможно, и можно получить такой же вывод, какой приведен на рис. 18, организацией базы данных таким образом, чтобы было удобно использовать функцию L (см. раздел 3.3.1.6 "L(формат)").

Функция L находит MFN соответствующий поисковому термину. Т. е. эту функцию можно использовать для преобразования символьной строки (такой как "UK" ) в MFN. Чтобы можно было использовать функцию L, нужно установить уникальное соответствие между символьной строкой и соответствующим ей MFN. Инвертированный файл обеспечивает такой механизм (см. раздел 1.3.3 "Инвертированный файл"). В нашем примере, было бы удобно инвертировать поле 10 записей 'страна` для установления уникального соответствия между кодом страны и соответствующим MFN (отметим, что понятие уникальности важно, т. к. функция L предполагает, что ключ, который она ищет, имеет одну и только одну ссылку. И это забота пользователя обеспечить уникальность этого соответствия использованием, если необходимо, префикса поисковоготермина, как указано в разделе 3.4.2 "ТВП для инвертированного файла". Рисунок 19 иллюстрирует этот метод.

CDS/ISIS не рассматривает природу соответствия между двумя записями. Она просто обеспечивает механизм связывания записей. При практическом применении пользователь обычно определяет смысл отношения через соответствующее применение языка форматирования и специальное физическое проектирование базы данных. Например, библиографическая запись должна быть связана с исходной и последующей записями, чтобы отразить различную природу этих сообщений. Отметим, что поскольку вторым аргументом; функции; REF является формат, эту функцию можно использовать рекурсивно для установления иерархических соотношений более высокого порядка, таких, например, какие требуются в тезаурусах.

Функция REF может использоваться в формате сколько угодно раз, не; превышая, однако, выходные ограничения (т. е. размеры рабочей области). Она ограничена 8000 символами. Отметим, что это ограничение выполнения,а не языка форматирования.

Рис. 19

Рисунок 19

3.3.2.3. S (формат)

Функция S возвращает текст, полученный из аргумента. Как упоминалось ранее, CDS/ISIS не обеспечивает явных операций для строковых выражений. Функция S может быть использована для выполнения строковой конкатенации. Это особенно удобно в булевых выражениях, где гораздо эффективнее использовать такое имплицитное OR по сравнению с эксплицитным оператором OR. Например, следующие булевы выражения:

S(mdl,v10,v20,v30):'water`
v10: 'water` OR v20: 'water` OR v30: 'water`

эквивалентны (они оба истинны, если хоть одно из полей 10, 20 или 30 содержит строку 'water`), но первое будет выполнено гораздо быстрее второго.

3.3.2.4. Пользовательские точки подключения в формате

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

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

С точки зрения Паскаля, CDS/ISIS является пользовательской точкой подключения, объявленной с атрибутом [FORMAT] (см. руководство по Паскалю CDS/ISIS для уточнения подробностей интерфейса).

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

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

& имя (формат)

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

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

Рис. 20

Рисунок 20

3.3.3. Булевы функции.
3.3.3.1. Р (селектор поля)

Функция Р возвращает значение Истина, если форматируемая запись содержит по крайней мере одно повторение поля или подполя, указанного в аргументе. Например:

Функция Р

3.3.3.2. А (селектор поля)

Функция А возвращает значение Истина, если форматируемая запись не содержит ни одного повторения поля или подполя, данного в аргументе.

Отметьте, что из-за отсутствия поля следует отсутствие всех подполей. Таким образом, если селектор поля специфицирует подполе, функция А возвращает значение Истина, если поле присутствует, а отсутствует только указанное подполе или отсутствует все поле. Например:


Функция А

3.3.4. Команда IF

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

Команда IF кодируется следующим образом:

IF условие THEN формат-1 ELSE формат-2 FI

где:

условие - булево выражение, определенное в разделе 3.2.6.3 "Булевы выражения":

формат-1 формат CDS/ISIS, который обрабатывается только и только в том случае, если значением булева выражения является Истина;
формат-2 формат CDS/ISIS, который обрабатывается только и только в том случае, если значением булевого выражения является ложь.

Предложение яELSE формат-2я необязятельно, и может быть опущено. Ключевые слова IF, THEN и FI обязательны всегда, хотя формат-1 может быть опущен, если присутствует предложение ELSE (т. е. если условие истинно, то ничего не будет выведено). Следовательно команда IF может принимать одну из следующих альтернативных форм:

IF условие THEN формат-1 FI
IF условие THEN ELSE формат-2 FI

Поскольку нет никаких ограничений на команды, которые можно употреблять в формате-1 и формате-2, IF команды могут быть вложены на любую желаемую глубину. Ключевое слово FI, в таком случае, должно закрывать каждую IF команду (можно рассматривать IF и FI как пару скобок). Например:


Команда IF. IF и FI

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


Рис. 21

Рисунок 21

3.3.5. Повторяющиеся группы.

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

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

Повторяющаяся группа изменяет порядок обращения CDS/ISIS с повторениями повторяющегося поля путем обработки одного повторения, а не всех повторений вместе. Этот процесс наглядно представлен на рисунке 22.

Когда CDS/ISIS обнаруживает скобку, открывающую повторяющуюся группу, происходит следующее:

  1. Счетчик повторений устанавливается в 1.
  2. Обрабатывается формат, заключенный в скобки, таким образом, что все селекторы полей внутри группы выдают только повторения полей, соответствующие текущему счетчику повторений.
  3. Если никакого вывода не было произведено (т. е. больше нет повторений ни в одном из повторяющихся полей группы), обработка повторяющейся группы прекращается. В противном случае счетчик повторений увеличивается на 1 и шаги 2 и 3 повторяются.


Рис. 22

Рисунок 22

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

Из приведенных выше объяснений следует, что безусловные литералы нельзя использовать в повторяющейся группе (если вы все же будете их использовать, то эти литералы будут распечатаны на один раз больше, чем нужно).

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


Использование простых команд форматирования

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


Помощь повторяющейся группы

В первом случае команда перехода на новую строку (/) выполнена япосле форматирования явсехя повторений поля 70, а во втором случае она выполнена после якаждогояповторения поля.

Пример на рис. 23 иллюстрирует обращение с повторяющимися полями, содержащими подполя (предполагается, что запись содержит два повторения поля 20, как указано). Здесь употребление повторяющейся группы помогает правильно вывести различные подполя якаждого яповторения повторяющегося поля в виде таблицы.


Рис. 23

Рисунок 23

Если нужно вывести литерал перед данными, продуцируемыми повторяющейся группой, можно использовать безусловный или условный литерал. Отметим, однако, что условный литерал должен ассоциироваться с селектором поля (повторяющаяся группа не является селектором поля); для этой цели удобно использовать мнимый селектор поля (см. рисунок 24).

Для следующего примера повторяющегося поля предположим, что в записи личного дела поле 10 содержит предыдущие места работы человека, а поле 20 содержиит должности, которые он ранее занимал. В такой записи оба поля 10 и 20 будут повторяющимися, поскольку человек может сменить не одно место работы. Это тот случай, когда существует логическая взаимосвязь между двумя повторяющимися полями. Рисунок 24 показывает использование повторяющейся группы для вывода этих двух полей (а также иллюстрирует употребление мнимого селектора поля).


Рис. 24

Рисунок 24

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

(v10,ref(val(v20),v10,(v20,v30)))

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

(v10(v20,v30))

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

  1. вы используете повторяющееся поле, как аргумент функции L;
  2. первый аргумент функции REF ссылается на повторяющееся поле.

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

3.3.6.ESCAPE команда

В формат, используемый для печати, можно вносить escape последовательности для активации или дезактивации определенных функций принтера (такие как: жирный шрифт или итальянская печать), конечно, если ваш принтер обеспечивает поддержку таких escape последовательностей. Специфические escape последовательности, поддержку которых обеспечивает ваш принтер, описаны в Руководстве пользователя принтера, поставляемом вместе с принтером его производителем.

Escape команда кодируется следующим образом:

! /еее/

где:
! - идентификатор escape последовательности;
/ - разделитель escape последовательности. Им может быть любой символ, не встречающийся в еее;
еее - escape последовательность, которая должна быть передана на принтер. (CDS/ISIS обычно передает ESC eee).

Например, на большинстве принтеров следующий формат приведет к печати поля 24 жирным шрифтом и поля 44 - итальянским (показано использование различных разделителей escape последовательностей):

!!Е!,v24,!;F;,v70+|; |,!{4},v44,![5]

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

Замечания для версии VAX и WANG PC: Если вы используете VAX или WANG PC версии, вы можете использовать escape команды в форматах вывода на экран для выделения полей специальным изображением, таким как подсвечивание, подчеркивание, обратная раскраска и т. д. Версия IBM PC не поддерживает escape команды для вывода на экран.

3.3.7. Ошибки формата.

Во время интерпретации и обработки формата CDS/ISIS выполняет синтаксический анализ формата для установления его соответствия правилам языка форматирования. Если CDS/ISIS обнаруживает ошибку, он прекращает форматирование и выдает сообщение *** Ошибка в формате n *** (где n - код ошибки). При выводе данных на экран или принтер, все данные, сформатированные при обнаружении ошибки, выводятся перед сообщением об ошибке. Этот вывод данных вместе с сообщением об ошибке поможет вам отыскать ошибку в формате.

Возможные коды ошибок

1. Обнаружен конец формата в конце обработки повторяющейся группы. Возможно пропущена закрывающая скобка повторяющейся группы.
2. Вложенность повторяющейся группы (т. е. одна повторяющаяся группа внутри другой повторяющейся группы).
8. Команда IF без THEN.
19. Непарная (
20. Непарная ). Также может быть неразрешенный операнд в выражении.
26. Два операнда одной операции различных типов (т. е. попытка сложить строковый операнд с числом).
28. Первый аргумент функции REF - нечисловое выражение.
51. Слишком много литералов и/или условных команд, ассоциированных с селектором поля.
53. IF команда не завершена с помощью FI.
54. Знак + вне контекста: CDS/ISIS ожидает повторяющийся литерал за знаком +.
55. Непарная FI.
56. Переполнение рабочей области: ваш формат производит слишком большую выдачу, с которой CDS/ISIS не может справиться. Рабочая область ограничена 8000 символами.
58. Один или более аргументов функции F - нечисловые выражения.
60. Нестроковая функция используется как команда (только строковые функции могут быть использованы как команды).
61. Аргумент функции А или Р - не селектор поля.
99. Неизвестная команда (т. е. арифметические ошибки в имени функции или команды); может также быть пропуск закрывающего разделителя литерала.
101. Переполнение стека (возможно из-за слишком длинного выражения).
102. Недогрузка стека (может быть из-за непарной ). Если формат верен, эта ошибка указывает на проблемы программного обеспечения CDS/ISIS).