Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
АРМ Книгообеспеченность :  ИРБИС Irbis
 
Оптимизация глобальных корректировок
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 18, March, 2008 02:46

В скриптовых языках обычно действует правило: чем меньше операций осуществляется самим кодом программы и чем больше встроенными функциями, тем быстрее работает программа. Думаю, оно справедливо и для ИРБИС. Впрочем для случая с глобальными корректировками в ИРБИС 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
Думаю, нужно указать и тот случай, когда описанный выше подход неприемлем. Это та ситуация когда сравнение подполей должно осуществляться только при их наличии. Т. е. если в одном из повторяющихся полей подполе отсутствует оно не должно участвовать в сравнении. Для получения корректного результата при таких условиях придётся сравнивать все подполя поодиночке.

Вложения: VDEL691.gbl (561 bytes)   Move691.gbl (702 bytes)  
Re: Оптимизация глобальных корректировок
Пользователь: ochagova (IP-адрес скрыт)
Дата: 18, March, 2008 13:49

Кирилл,ваш пример работает, если поле 991 неповторяющееся, т.е. отметили только один контингент на удаление. Но нельзя не согласиться, что глобальные переменные не всегда используются, где они могли бы упростить задание.

Re: Оптимизация глобальных корректировок
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 18, March, 2008 15:44

Решительно не могу с Вами согласиться. Здесь предполагается, что поле 991 является повторяющимся и каждое его повторение превращается в фрагмент строки со звёздочкой-разделителем в начале и в конце.
&uf('+1W991#*',(v991^a,v991^v,v991^o,v991^f,v991^s,v991^g'*'))

Подобныую "фрагментам" строку формат порождает и из повторения 691:
s('*'v691^a,v691^v,v691^o,v691^f,v691^s,v691^g'*')

Если строка для текущего повторения соответствует одному из фрагментов 991, это трактуется как признак необходимости удаления текущего повторения.

Прилагаю скриншот, который должен полностью прояснить данный вопрос.

Очень хорошо, что мы обратились к этой теме, так как я обратил внимание на одну проблему: при удалении не учитывается специальность. Это было в оригинальной корректировке, и я без изменений перенёс всё в свой скрипт. Думаю, подполе было пропущено случайно.



Редактировано 2 раз. Последний раз 18.03.2008 15:55 пользователем Кирилл Соколинский (СЗТУ).

Вложения: kn_globals.gif (120.2KB)  
Re: Оптимизация глобальных корректировок
Пользователь: ochagova (IP-адрес скрыт)
Дата: 18, March, 2008 16:50

Да, Кирилл, вы правы, звездочки я не оценила. Хотя этим приемом мы тоже пользуемся.На счет специальности - посмотрю.



Извините, только зарегистрированные пользователи могут писать в этом форуме.
This forum powered by Phorum.