СВОБОДНЫЙ ПОИСК

Navigation:  АРМы > АРМ Читатель > ПОИСК  режимы > ПОСЛЕДОВАТЕЛЬНЫЙ ПОИСК Режим >

СВОБОДНЫЙ ПОИСК

Previous pageReturn to chapter overviewNext page

В режиме ПОСЛЕДОВАТЕЛЬНЫЙ ПОИСК (то же самое и в Арме "Каталогизатор) для СВОБОДНОГО ПОИСКА в случае применения конструкции "|" (определяющей требование запроса к ОДНОМУ повторению поля) предлагается НОВАЯ структура запроса.

Прежняя структура запроса:

| <логическое выражение на языке форматирования ИРБИС>

 

Новая структура запроса:

 

|МММ <логическое выражение на языке форматирования ИРБИС>

 

где МММ - метка поля, к повторениям которого предъявляются требования запроса.

 

Причина этого нововведения:

Механизм свободного последовательного поиска состоит в следующем. Введенное <логическое выражение на языке форматирования ИРБИС> (далее просто <логическое_выражение>) превращается в формат следующего вида:

if <логическое_выражение> then '1' else '0' fi

Все документы, участвующие в поиске, последовательно форматируются с помощью этого формата: если результат форматирования 1, документ соответствует запросу, если 0 - не соответствует.

Если запрос свободного поиска задается в виде:

| <логическое_выражение>

то он превращается в формат

(if <логическое_выражение> then '1' else '0' fi)

т.е. создается формат с ПОВТОРЯЮЩЕЙСЯ группой. И вот тут таится "бомба".

 

 Внимание:

Логическое выражение может быть составлено так, что это приведет к ЗАЦИКЛИВАНИЮ повторяющейся группы. Это в свою очередь приведет к тому, что последовательный поиск даст ВЕРНЫЙ результат, но будет продолжаться ЧРЕЗВЫЧАЙНО долго (в десятки или даже сотни раз медленнее положенного времени).

 

Пример:

В БД Читателей необходимо найти ДОЛЖНИКОВ на сегодняшний день (не ДЕРЖАТЕЛЕЙ, а ДОЛЖНИКОВ). Для этого выполняем свободный последовательный поиск ("забыв", что в АРМе Книговыдача есть соответствующий режим: СПИСОК ДОЛЖНИКОВ/ЗАДОЛЖЕННОЙ ЛИТЕРАТУРЫ):

| (v40^F : '*') and (v40^E<&uf('3'))

В результате создается формат:

(if (v40^F : '*') and (v40^E<&uf('3')) then '1' else '0' fi)

в котором конструкция, возвращающая текущую дату - &uf('3') - приводит к зацикливанию повторяющейся группы (почему - объяснять здесь не имеет смысла, это самый "тонкий" вопрос языка форматирования). Такой последовательный поиск (на большой БД RDR) будет продолжаться непомерно долго.

 

Предлагаемая новая структура запроса

|MMM <логическое_выражение>

позволяет создавать формат, в котором исключается зацикливание:

 

(if p(vMMM) then if <логическое_выражение> then '1' else '0' fi fi)

 

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

|40 (v40^F : '*') and (v40^E<&uf('3'))

(if p(v40) then if (v40^F : '*') and (v40^E<&uf('3')) then '1' else '0' fi fi)

 


Вернуться:Последовательный поиск Арма "Каталогизатор"

См. также:

Рабочая область ИСХОДНЫЕ ДОКУМЕНТЫ

Рабочая область ШАБЛОН-ПОИСК

Приложение 17. Язык запросов