Повторяющиеся группы
Повторяющаяся группа состоит из набора команд форматирования, заключенных в круглые скобки. Смысл этих команд обычный, за исключением того, что обработка повторяющихся полей производится особым образом.
Чтобы понять концепцию повторяющейся группы, надо, прежде всего, знать, каким образом система работает с повторяющимися полями. При отсутствии каких-либо дополнительных указаний система трактует все экземпляры (в том порядке, в котором они находятся в записи) как единую строку текста.
Повторяющаяся группа изменяет порядок обработки системой экземпляров повторяющихся полей таким образом, что происходит последовательная обработка отдельно каждого экземпляра повторяющегося поля.
Когда система обнаруживает скобку, открывающую повторяющуюся группу, происходит следующее:
1. Счетчик экземпляров устанавливается в единицу.
2. Заключенный в скобки формат обрабатывается таким образом, что команды вывода полей выводят только те экземпляры повторяющихся полей, которые соответствуют текущему значению счетчика экземпляров.
3. Если в процессе текущего просмотра всей повторяющейся группы ничего не выводится (то есть в пределах группы больше не оказалось экземпляров повторяющегося поля), то процесс обработки повторяющейся группы завершается. В противном случае значение счетчика экземпляров увеличивается на 1 и повторяется выполнение шагов 2 и 3.
Отметим еще раз, что все команды форматирования внутри повторяющейся группы обрабатываются последовательно экземпляр за экземпляром (как объяснялось выше), включая, таким образом, и поля, указываемые в команде IF, выражениях и функциях, а также строковых функциях, используемых как команды. Поэтому нежелательно использовать безусловные литералы в повторяющейся группе. И если все же безусловные литералы используются, то они будут выдаваться на один раз больше, чем это надо.
В подавляющем большинстве случаев для правильной обработки повторяющихся полей достаточно использование простых команд форматирования, таких, например, как команда режима вывода или повторяющихся литералов, как это показано ниже:
Формат Выходные данные
----------- -----------------------------
mpl,v70 Grieve, B.J.Went, F.W.
mdl,v70 Grieve, B.J. Went, F.W.
v70+|; | Grieve, B.J.; Went, F.W.
Однако, возможны случаи, когда появляется необходимость отформатировать повторяющиеся поля другим способом. Например, иногда необходимо форматировать каждый экземпляр поля с новой строки, чего можно достигнуть только с использованием повторяющейся группы, как это показано ниже:
Формат Выходные данные
----------- -----------------------------
v675/v200^a 623.746623.746(092) Сухой П.О.
Конструктор Сухой. Люди и самолеты
(v675/),v200^a 623.746
623.746(092) Сухой П.О.
Конструктор Сухой. Люди и самолеты
В первом случае команда перехода на новую строку (/) выполняется после форматирования всех экземпляров поля 675, а во втором случае она выполняется после каждого экземпляра поля.
Пример на рис. 14 иллюстрирует использование повторяющихся полей с подполями (предполагается, что запись содержит два экземпляра поля 20, как это показано на рис. 14). В первом формате использование повторяющейся группы дает возможность вывести различные подполя каждого экземпляра повторяющегося поля в виде таблицы. Второй формат аналогичен первому, но не содержит повторяющейся группы.
Если нужно вывести литерал перед данными, создаваемыми повторяющейся группой, то можно использовать безусловный или условный литерал. Отметим, однако, что условный литерал должен быть связан с командой вывода поля (повторяющаяся группа не является командой вывода поля). Для этой цели необходимо использовать команды фиктивного вывода поля.
Содержимое записи:
210 ^aNew York^сMcGraw Hill^d1988
210 ^aLondon^cAcademic Press^d1975
Формат 1: /(v210^a,c11,v210^c,c30,v210^d/)
Вывод: New York McGraw Hill 1988
London Academic Press 1975
Формат 2: /v210^a,c11,v210^c,c30,v210^d/
Вывод: New YorkLondon
McGraw HillAcademic Press
19881975
Рис. 14
Повторяющиеся группы не могут быть вложенными (т.е. повторяющаяся группа не может содержать другую повторяющуюся группу), за исключением случая, когда внутренняя группа содержится в аргументе формата функции REF. Так, например, допустимым является следующий формат:
(v10,ref(val(v20),v10,(v20,v30)))
но приведенный ниже формат является недопустимым, что вызовет сообщение об ошибке:
(v10,(v20,v30))
Использование повторяющейся группы является обязательным в следующих случаях:
1. Использование повторяющегося поля в качестве аргумента функции L.
2. Первый аргумент функции REF ссылается на повторяющееся поле.
Также нужно учитывать возможность употребления повторяющейся группы, когда повторяющееся поле используется в логическом выражении команды IF.