В скриптовых языках обычно действует правило: чем меньше операций осуществляется самим кодом программы и чем больше встроенными функциями, тем быстрее работает программа. Думаю, оно справедливо и для ИРБИС. Впрочем для случая с глобальными корректировками в ИРБИС 32 можно указать и гораздо более веский аргумент в пользу сокращения скриптового кода – слишком большое количество временных(«перевалочных») полей приводит к переполнению записи.
В задачах связанных с книгообеспеченностью достаточно часто возникает задача сравнения двух повторяющихся полей, в которых различный порядок повторений и подполей. Обычно это делается при помощи того, что можно назвать «вложенными циклами». Первый цикл – цикл глобальной корректировки, второй - «цикл» повторяющейся группы. Именно так работает, например, скрипт удаления данных из записи.
ADD
992
(v991/)
IF
if p(v691) then '1' fi
DEL
111
*
ADD
111
(v691/)
REPEAT
DEL
691
F
(if p(v691) then if v691^A=&unifor('Av991^A#1') and v691^V=&unifor('Av991^V#1') and v691^O=&unifor('Av991^O#1') and v691^F=&unifor('Av991^F#1') and v691^S=&unifor('Av991^S#1') and v691^G=&unifor('Av991^G#1') then '1' else '0' fi fi/)
DEL
991
1
UNTIL
if p(v991) then '1' fi
IF
DEL
111
*
FI
Но задачу можно решить значительно проще. Если представить одну группу повторяющихся полей как строку, а каждое повторение второй сопоставлять с этой строкой, то можно будет получить аналогичный результат гораздо более простыми средствами. Нижеприведённый скрипт полностью аналогичен по своему действию тому, который была дан выше, но гораздо проще и быстрее!
IF
if p(v691) then '1' fi
DEL
691
F
&uf('+1W991#*',(v991^a,v991^v,v991^o,v991^f,v991^s,v991^g'*')),(if p(v691) then if &uf('+1R991'):s('*'v691^a,v691^v,v691^o,v691^f,v691^s,v691^g'*') then '1' else '0' fi fi#),&uf('+1W991#'),
FI
DEL
991
*
Почему это действует? Попробую проиллюстрировать простой аналогией. Будем ли мы сравнивать две группы вагонов по одиночке или после того, как и они сформируют два поезда – это не имеет никакого значения, если мы точно знаем, что в обоих поездах зелёные будут идти первыми, желтые – вторыми, красные – третьими.
PS
Думаю, нужно указать и тот случай, когда описанный выше подход неприемлем. Это та ситуация когда сравнение подполей должно осуществляться только при их наличии. Т. е. если в одном из повторяющихся полей подполе отсутствует оно не должно участвовать в сравнении. Для получения корректного результата при таких условиях придётся сравнивать все подполя поодиночке.