Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
АРМ Администратор :  ИРБИС Irbis
 
Самое"тонкое" место в ЯЗЫКЕ ФОРМАТИРОВАНИЯ
Пользователь: Alio (IP-адрес скрыт)
Дата: 31, January, 2007 13:38

В связи с тем, что все большее число пользователей (администраторов) начинает пользоваться ЯЗЫКОМ ФОРМАТИРОВАНИЯ, хотелось бы подробнее осветить наиболее «тонкий» и сложный для понимания механизм ЯЗЫКА ФОРМАТИРОВАНИЯ – а именно:
УСЛОВИЕ ВЫХОДА ИЗ (ЗАВЕРШЕНИЯ) ПОВТОРЯЮЩЕЙСЯ ГРУППЫ.

Непонимание этого механизма приводит к написанию форматов, в которых содержатся «мертвые» (не имеющие выхода) повторяющиеся группы, и как следствие - к резкому увеличению времени выполнения соответствующих операций или их аварийному завершению. Особенно это опасно, если такие форматы содержатся в FST или GBL, – поскольку в этом случае явно не выдаются никакие ошибки (в форматах показа в этом случае выдается сообщение ** Format Error 57 **). В связи с этим хочется сразу дать совет: во всех случаях писать форматы ТОЛЬКО в Редакторе форматов – даже если это FST или GBL – в случае ошибки ВЫ увидите сообщение об ошибке.

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

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

Здесь требуется уточнение. Выход из повторяющейся группы происходит, если при очередном проходе НИ ОДНА из ИСПОЛНЯЕМЫХ (в процессе данного прохода) конструкций выбора ПОЛЯ (именно поля, а не подполя, т.е если исполняется конструкция вида V100^A, то в расчет данного условия берется только V100) и НИ ОДИН из ИСПОЛНЯЕМЫХ форматных выходов (&uf) не возвращают НЕПУСТОЕ значение (можно сформулировать это условие иначе - …если ВСЕ ИСПОЛНЯЕМЫЕ конструкции выбора ПОЛЯ и форматные выходы возвращают ПУСТОТУ)

Типичный пример «мертвой» повторяющейся группы:

(if &uf(‘Av100#1’)>v200 then … else …. fi/)

При наличии поля 100 данная повторяющаяся группа не имеет выхода, поскольку при любом проходе форматный выход будет возвращать непустое значение.
Вообще непродуманное употребление форматного выхода для получения заданного повторения поля (&uf(‘AvMM#N’) чаще всего приводит к зацикливанию повторяющихся групп.

(if p(v100^A) then … fi/)

Если поле 100 имеет пять повторений и в третьем повторении этого поля нет подполя А, данная повторяющаяся группа будет проходиться пять раз, а не три.

Рекомендации:
1. Определять количество проходов повторяющейся группы на основе проверки присутствия какого-либо ПОЛЯ или ПОЛЕЙ:

(if p(vMM) then ……fi/)
или
(if p(vMM1) and p(VMM2) and …. then …. fi/)

2. Использовать команду явного выхода из повторяющейся группы – BREAK (введена начиная с версии 2005.1)

( if …. then break else …..fi/)
или
(…….if …. then break fi/)
но не так
(if …. then break fi ……) – данная конструкция не гарантирует выход из повторяющейся группы. Если после FI будет стоять зацикливающая конструкция, выхода из повторяющейся группы не будет.

В форматере системы имеется программная защита от зацикливания повторяющихся групп, которая основана на жестком ограничении максимального количества проходов: в ИРБИС32 это 500, в ИРБИС64 – 5000 (разумеется, эти величины условные и при необходимости их можно будет изменить)

Re: Самое"тонкое" место в ЯЗЫКЕ ФОРМАТИРОВАНИЯ
Пользователь: Карауш (IP-адрес скрыт)
Дата: 31, January, 2007 20:19

Соглашаясь с Александром Иосифовичем, что 90% ошибок в форматах происходят из-за неправильного понимания и написания повторяющихся конструкций, лишь спрошу.

Если рассматривать конструкции языков, то если есть команда выхода "насильная", то где команда "невыхода" "насильная"?
Вот наблюдаю за развитием "ISIS от ГПНТБ" и постоянно сравниваю с развитием параллельного "ISIS от Bireme" (CISIS). Там есть команда continue, которая как раз решает некоторые вопросы, чтобы не оставлять пустую строку "для домысливания" программистом, типа:

На языке CISIS такая конструкция смотрится вот так:

(if iocc = 1 then continue else v10/ fi),
(f(iocc,1,0),'=',v70,continue/),

где iocc - возвращает номер текущего повторения поля (аналог есть в &uf, писать его не стал).

Про ограничение форматеров.
Эти значения (500 и 5000) работают для всех полей, независимо от наличия данных в повторениях, или только "считают" повторения, которые ничего в виде данных не возвращают?
Если ограничение жесткие, то можно ли предусмотреть команду менять "на ходу" эти ограничения? Или это сильно усложнит "прекомпилятор" языка, что используется в ИРБИС64?

В принципе, пока 5000 повторений я не встречал и не использовал, но все еще помню ИРБИС, когда в каталоге IBIS было в сумме 200 файлов :)

Re: Самое"тонкое" место в ЯЗЫКЕ ФОРМАТИРОВАНИЯ
Пользователь: Alio (IP-адрес скрыт)
Дата: 01, February, 2007 10:46

Карауш написал(а):
-------------------------------------------------------
> Соглашаясь с Александром Иосифовичем, что 90%
> ошибок в форматах происходят из-за неправильного
> понимания и написания повторяющихся конструкций,
> лишь спрошу.
>
> Если рассматривать конструкции языков, то если
> есть команда выхода "насильная", то где команда
> "невыхода" "насильная"?
> Вот наблюдаю за развитием "ISIS от ГПНТБ" и
> постоянно сравниваю с развитием параллельного
> "ISIS от Bireme" (CISIS). Там есть команда
> continue, которая как раз решает некоторые
> вопросы, чтобы не оставлять пустую строку "для
> домысливания" программистом, типа:
>
> На языке CISIS такая конструкция смотрится вот
> так:
>
> (if iocc = 1 then continue else v10/ fi),
> (f(iocc,1,0),'=',v70,continue/),
>
> где iocc - возвращает номер текущего повторения
> поля (аналог есть в &uf, писать его не стал).
Команда continue избыточная - нет такой ситуации, когда бы без нее нельзя было бы обойтись. В приведенных Вами примерах надо просто выбросить слово continue и все будет правильно работать в ИРБИСе (разумеется, с поправкой на iocc).


>
> Про ограничение форматеров.
> Эти значения (500 и 5000) работают для всех полей,
> независимо от наличия данных в повторениях, или
> только "считают" повторения, которые ничего в виде
> данных не возвращают?
Независимо ни от чего считаются ТОЛЬКО проходы повторяющейся группы. Если кому-то не будет хватать 500 (5000), введем соответствующие параметры в INI-файлы

Re: Самое"тонкое" место в ЯЗЫКЕ ФОРМАТИРОВАНИЯ
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 09, February, 2007 01:57

Alio написал(а):
-------------------------------------------------------

> В форматере системы имеется программная защита от
> зацикливания повторяющихся групп, которая основана
> на жестком ограничении максимального количества
> проходов: в ИРБИС32 это 500, в ИРБИС64 – 5000

Полагаю, что ограничение на количество проходов необходимо вообще снять.
Ошибки должны не скрываться, а исправляться. Вы сами отмечали, в системных форматах и глобальной корректировке зацикливание никак не проявляется и не может быть выявлено. Какой же смысл допускать, чтобы в ИРБИСе работали некорректные форматы?
Кроме того, в некоторых случаях может возникнуть необходимость в выполнении большего количества проходов, чем предусмотрено у Вас. Приведу конкретный пример. Я написал процедуру унификации издательств, которая выполняется при каталогизации заимствованием. Справочник MNU, включающий как правильные так и неправильные(подлежащие замене) названия издательств содержит 20788 значений. Каким образом при наличии существующих ограничений можно обеспечить корректный перебор издательств?

Re: Самое"тонкое" место в ЯЗЫКЕ ФОРМАТИРОВАНИЯ
Пользователь: Alio (IP-адрес скрыт)
Дата: 19, February, 2007 15:13

Кирилл Соколинский (СЗТУ) написал(а):
-------------------------------------------------------
> Alio написал(а):
> --------------------------------------------------
> -----
>
> > В форматере системы имеется программная защита
> от
> > зацикливания повторяющихся групп, которая
> основана
> > на жестком ограничении максимального количества
> > проходов: в ИРБИС32 это 500, в ИРБИС64 – 5000
>
> Полагаю, что ограничение на количество проходов
> необходимо вообще снять.
> Ошибки должны не скрываться, а исправляться. Вы
> сами отмечали, в системных форматах и глобальной
> корректировке зацикливание никак не проявляется и
> не может быть выявлено. Какой же смысл допускать,
> чтобы в ИРБИСе работали некорректные форматы?
Ошибка не скрывается - выдается сообщение (в текст расформатирования) Format error 57


> Кроме того, в некоторых случаях может возникнуть
> необходимость в выполнении большего количества
> проходов, чем предусмотрено у Вас. Приведу
> конкретный пример. Я написал процедуру унификации
> издательств, которая выполняется при каталогизации
> заимствованием. Справочник MNU, включающий как
> правильные так и неправильные(подлежащие замене)
> названия издательств содержит 20788 значений.
> Каким образом при наличии существующих ограничений
> можно обеспечить корректный перебор издательств?

Я же сказал
"Если кому-то не будет хватать 500 (5000), введем соответствующие параметры в INI-файлы"

Re: Самое"тонкое" место в ЯЗЫКЕ ФОРМАТИРОВАНИЯ
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 25, February, 2007 18:44

Alio написал(а):
-------------------------------------------------------
> Ошибка не скрывается - выдается сообщение (в текст
> расформатирования) Format error 57

При зацикливании в ТВП это сообщение не выдаётся. Я оставил в файле <имя базы>.fst только одну строку:
1903 0 ('T='&uf('Av200#1')/)
Сохранение записей и актуализация в Администраторе не вызвали никаких проблем, правда ощущались небольшие задержки. При создании словаря заново после выполнения отбора возникла ошибка "Invalid pointer operation" и модуль удалось закрыть только через снятие задачи. Полагаю, что такой реакции на ошибку совершенно недостаточно для её выявления.
Я не вижу смысла в ограничении количества проходов. Зачем создавать условия, при которых некорректные скрипты будут нормально запускаться?

Re: Самое"тонкое" место в ЯЗЫКЕ ФОРМАТИРОВАНИЯ
Пользователь: PRM (IP-адрес скрыт)
Дата: 11, February, 2014 09:25

Alio написал(а):
-------------------------------------------------------
> Если кому-то не будет хватать 500 (5000), введем
> соответствующие параметры в INI-файлы

Александр Иосифович, здравствуйте.
Скажите, пожалуйста, есть ли в версии 2013.1 ИРБИС64 соответствующие параметры?
Если нет, то можно ли их добавить?



Редактировано 1 раз. Последний раз 11.02.2014 09:25 пользователем PRM.

Re: Самое"тонкое" место в ЯЗЫКЕ ФОРМАТИРОВАНИЯ
Пользователь: ochagova (IP-адрес скрыт)
Дата: 17, February, 2014 08:26

Параметра на 5000 нет. Это число зашито в программе как константа.

Re: Самое"тонкое" место в ЯЗЫКЕ ФОРМАТИРОВАНИЯ
Пользователь: Chaser (IP-адрес скрыт)
Дата: 29, March, 2017 12:04

Рыжий ап.

Оказывается вот почему выпадает 57 ошибка. У меня больше 5000 повторений.

Странно, что разработчики до сих пор не добавили настраиваемый параметр с дефолтным значением 5000, ведь были ж пожелания выше.



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