Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Web Ирбис и Z-Ирбис :  ИРБИС Irbis
 
В погоне за невозможным Ч.1: Структурированные списки в WEB ИРБИС
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 05, November, 2007 20:36

ВВЕДЕНИЕ
Большинство нормальных людей считает, что укусить свой локоть невозможно. Тем не менее, авторы фильма «Пила», например, думают иначе. Главное – творческий подход, и очень сильная потребность. ;)))
Именно сильная потребность побудила меня заняться созданием режима печати структурированных списков через WEB ИРБИС. Незнакомый с проблемой человек удивится: «Разве сложно вывести в списке заголовок?» Но реальная сложность этой задачи заключается не в выводе заголовка, а в повторном выводе одного библиографического описания под разными заголовками. Ведь как известно в WEB ИРБИС каждая запись может быть выведена только один раз.
Настоящий материал преследует цель проанализировать общую методику создания структурированных списков и определить эффективность технических решений, при помощи которых они могут создаваться. Он не будет интересен человеку, жаждущему быстрых и простых решений отдельных прикладных задач.


ОБЩАЯ МЕТОДИКА ПОСТРОЕНИЯ СТРУКТУРИРОВАННЫХ СПИСКОВ
Позиция библиографического описания в списке без заголовков определяется текстовой строкой, которую генерирует формат в секции [ KeyOptions ] файла SRW. При сортировке по Году издания, если формат сгенерировал для одного описания строку «2000», а для другого «1999», описание с более ранним годом будет в списке первым, а описание с более поздним – вторым. В случае с алфавитной сортировкой вместо года используются автор и заглавие. Обобзённо строка участвующая в сортировке называется «Ключом». Т. о Ключ - это текстовая строка, которая связана с записью и определяет её место в библиографическом списке.
Но структурированный список предполагает не только сортировку записей, но и сортировку заголовков. Т. е. с одной стороны все заголовки списка должны быть отсортированы по алфавиту, а с другой стороны внутри каждого заголовка должна быть выполнена алфавитная сортировка записей.
Поэтому ключ многоуровневых списков должен состоять из трёх частей:
1. Заголовка;
2. Автора, Заглавия;
3. Номера записи.

Есть и другая важная деталь. В случае если запись должна выводиться несколько раз под разными заголовками, на её основе должно быть создано несколько ключей. Допустим, мы строим список, где заголовками являются места хранения. Тогда ключи одной записи могут выглядеть так:

^aЧитальный зал^bИвановИстория^c333
^aАбонемент^bИвановИстория^c333
^aНаучный фонд^bИвановИстория^c333

Каждый ключ выведет запись под одним из заголовков с названием отдела.

Традиционно, в модулях ИРБИС такие списки строятся форматом секции [HeaderFormat] файла SRW. При помощи него выводится не только заголовки, но и все библиографические описания. Последнее делается ссылочной функцией &unofor(‘D), которая находит запись по MFN и расформатирует её вложенным форматом. (напр. &unifor('D,@',v1^c,',@format_name'). При этом обычный формат <имя формы>.pft является пустым и никак не используется.
Но этот способ нельзя использовать в WEB ИРБИС потому, что в WEB ИРБИС не поддерживается секция [HeaderFormat]. 10 дней назад Константин Олегович добавил возможность её использования, но пока ещё мы не можем применять в ней повторяющиеся ключи, столь значимые для повторного вывода записей. Поэтому решения, рассмотренные ниже, всё ещё не стали достоянием истории. Хотя я очень надеюсь, что скоро станут...



Редактировано 1 раз. Последний раз 06.11.2008 20:35 пользователем Кирилл Соколинский (СЗТУ).

Re: В погоне за невозможным Ч.1: Структурированные списки в WEB ИРБИС
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 05, November, 2007 20:37

ПОДХОДЫ К ПОСТРОЕНИЮ СТРУКТУРИРОВАННЫХ СПИСКОВ C ПОМОЩЬЮ WEB ИРБИС
1. Очень мощным инструментом является функция &uf(‘+3S. Она позволяют вывести библиографические описания найденные по запросу в любом месте формата. Если предположить, что основной формат(S21FMT) будет выводить заголовок, с её помощью можно было бы добавлять к заголовку нужные записи. Тем не менее, при выводе больше 10 записей возникнет переполнение формата переполнению формата и, кроме того, окажется невозможной сортировка.
2. Вывод записей и ключей при помощи ИРБИС, а затем их постобработка PHP представляется достаточно эффективным способом решения проблемы. В этом случае описания и ключи должны были бы выводиться основным форматом (S21FMT), а затем, уже при помощи PHP строиться список.
WEB ИРБИС выдавал бы данные в таком виде:
Запись1*ключ1*ключ2*ключ3*@
Запись2*ключ1*ключ2*@
Здесь * и @ – любые уникальные символы-разделители.
После этого ключи помещались бы в один массив, записи в другой и PHP передавалась бы роль которую обычно выполняет формат секции HEADER.
Недостаток этого решения в его громосткости. Т. е. необходимости использовать различные средства программирования и выполнять дополнительную работу по преобразованию данных из текста в массивы.
(Может быть кто-то предложит более эффективную модель передачи данных из ИРБИС в PHP скрипт. Но мне ничего лучшего в голову не приходит. )

3. И, наконец, тот вариант, когда вся работа выполняется основным форматом и форматом сортировки с обменом данными через глобальные переменные.

Как я уже говорил, в формате сортировки(секция [KeyOptions] файла SRW) WEB ИРБИС может генерироваться и использоваться только один ключ. Формат вывода WEB ИРБИС(S21FMT) может быть только один раз расформатировать каждую запись. Тем не менее, наряду с текущей записью этот же формат может вывести ещё несколько записей при помощи ссылочной функции &uf(‘D. Главное знать какие записи должны выводиться вместе с основной, чтобы обеспечить алфавитный порядок их следования. Это достигается созданием дополнительного ряда ключей, хранимых в глобальной переменной и сортируемых функцией &uf('+1T.

Таким образом, используется два ряда ключей – один короткий, где каждый ключ соотносится с уникальной записью, другой – длинный, где количество ключей зависит от того, сколько раз требуется вывести запись. Первый ряд отвечает за первичный вывод записей, второй – за повторный. Часть значений у них одинакова, но второй полнее первого.

Приведу пример того, как выглядели бы эти ряды ключей при слиянии. Для наглядности я пометил дополнительные ключи знаком +:
^aЗаголок1^bАнтоновФизика^c10
^aЗаголок1^bИвановИстория^c20
^aЗаголок1^bПетровМеханика^c333 +
^aЗаголок1^bФедоровМатематика^c30
^aЗаголок1^bЯковлевМедицина^c444 +
^aЗаголок2^bАнтоновФизика^c10 +
^aЗаголок2^bАнютинКратология^c222
^aЗаголок2^bПетровМеханика^c333
^aЗаголок2^bЯковлевМедицина^c444

Принцип работы формата, выводящего записи на основе этих ключей и организованного в повторяющейся группе должен быть следующим:

(

if (старое_значение_заголовка<> новое_значение_заголовка_из_длинного_ряда_ключей)
[вывод заголовка длинного ряда ключей]
fi,

if (МFN_текущей_записи=MFN_ключа_длинного_ряда)
[вывод текущей записи]
else
[вывод записи с MFN длинного ряда ключей]
fi,

)

Задачей же формата [KeyOptions] файла SRW становится сохранение в глобальной переменной длинного ряда ключей и непосредственный возврат ключей короткого ряда.

Re: В погоне за невозможным Ч.1: Структурированные списки в WEB ИРБИС
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 05, November, 2007 20:37

ЛИСТИНГ ФОРМАТА ПЕЧАТИ СПИСКА СТРУКТУРИРОВАННОГО ПО ДИСЦИПЛИНАМ
Пример работы: [elib.nwpi.ru]
Отбор записи осуществляется по читающей кафедре и, если необходимо, по конкретным дисциплинам
В файле CGI_FLK.PFT в глобальную переменную &uf('+1R308') был передан текущий запрос(в SRW файле модельные поля недоступны)
DB= префикс свёртки дисциплины
КАF= префикс кафедры в словаре
Строка запроса может выглядеть так: cgi.exe?I21DBN=PRINTDS&S21FMT=pds_fullwebr&S21CNR=10000&C21COM=S&S21SRW=pds_sort&S21ALL=(<.>KAF=ЭТиЭМ<.>)*(<.>DB=238976<.>)

Формат [KeyOptions] файла pds_sort.srw:


/* Удаление неоригинальных связок дисциплина-специальность
&uf('+1W691#'&uf('+1I',(|^D|v691^d,|^B|v691^B/))),
&uf('+1W401#'),

&uf('+1W400#',
        (if p(g691) then if &uf('+1R308'):g691^b  and (&uf('+1R308'):s('='&uf('+B'g691^d)'<') or (not &uf('+1R308'):'DB'))  then, 
                &uf('+1W401#',
                    &uf('G0[','^A'g691^d,'  ','^B',&uf('av461^x#1'),&uf('av461^c.6#1'),&uf('av700^a#1'),&uf('av200^a.6#1'),'^C',f(mfn,0,0))
                 ),
                 &uf('+1R401'),/
        fi,fi,),

        if &uf('+1R401')='' then &uf('+1W401#^A!') &uf('+1R401'),/ fi,
        
        &uf('+1R400'),

),

&uf('+1R401')

КОММЕНТАРИЙ
1. Предварительное удаление неоригинальных связок специальность-дисциплина увеличивает скорость и, как ни странно, работает надёжней, чем исключение в формате повторяющейся группы.
2. Странная на первый взгляд конструкция &uf('G0[ предназначена обрезания строки до угловой скобки, если таковая имеется. Дело в том, что сортировка SRW и функция &uf('+1T совершенно по-разному трактуют символ угловой скобки и отсюда возникает ошибка при выводе.
3. Создание карликовых ключей ^A! было вынужденной мерой для предыдущих версий WEB ИРБИС, где формат [KeyOptions] не позволял исключить часть найденных записей. Даже если ключ не был сформирован, запись всё-равно выводилась. Это позволяло проигнорировать записи при выводе.




Формат pds_fullwebr.pft:


if &uf('+1R500')='' then 
&uf('+1W400#',&uf('+1T400')),
&uf('+1W500#1'),
&uf('+1W601#1'),
fi,

&uf('+1W700#'),

if &uf('Ag400^A#'&uf('+1R500'))='!' then
&uf('+1W500#',f(val(&uf('+1R500'))+1,0,0)),
 else 
(
if &uf('Ag400^A#'&uf('+1R500'))<>&uf('+1R505') or &uf('+1R505')='' then 
'<tr width=100%><td colspan=2>',
'<h2>'&uf('Ag400^A#'&uf('+1R500'))'</h2>'
'</td></tr>', 
&uf('+1W505#',&uf('Ag400^A#'&uf('+1R500')))
&uf('+1W601#1'),
fi,

if val(&uf('Ag400^C#'&uf('+1R500')))>0 then 

'<tr width=100%><td with=5% valign="top"><b>',&uf('+1R601'),&uf('+1W601#',f(val(&uf('+1R601'))+1,0,0)),'.</b></td><td>', 


if &uf('Ag400^C#'&uf('+1R500'))=f(mfn,0,0) then,

 &uf('6book_bo_easy'),
 '<br><b>Экземпляры: </b>',ref(mfn,&uf('O')),'<br>'
 &uf('+1W500#',f(val(&uf('+1R500'))+1,0,0)),
'<br></td></tr>', 
 break,
else 
 &uf('D,@'&uf('Ag400^C#'&uf('+1R500'))',@book_bo_easy'),'<br><b>Экземпляры: </b>'
 &uf('D,@'&uf('Ag400^C#'&uf('+1R500'))',&uf("O"d910)'),'<br>'
 &uf('+1W500#',f(val(&uf('+1R500'))+1,0,0)),
'<br></td></tr>', 
fi,

fi,

if val(&uf('+1R700'))>7 then break else &uf('+1W700#',f(val(&uf('+1R700'))+1,0,0)), fi,
)

fi,

КОММЕНТАРИИ
1. Поскольку фреймы сортируются до того как выполняется данный формат, операцию сортировки и обнуления переменных приходится реализовывать здесь же, хотя нужды в её многократном повторении нет . . . (if &uf('+1R500')='' then . . . )

2. Чтобы застраховаться от переполнения формата, разрешается выводить в нём не больше 7 описаний. (if val(&uf('+1R700'))>7. . . . .) Этот лимит оказывается вполне достаточным для вывода 99.9% списков.

3. Необычная конструкция ref(mfn,&uf('O')) используется для того, чтобы заставить &uf('O') работать в повторяющейся группе.


ПРОБЛЕМЫ РЕШЕНИЯ
1. Переполнение переменной содержащей длинный список ключей;
2. Ограничение на количество сортируемых ключей, налагаемое функцией &uf('+1T;
3. Ограничение на количество записей, которые могут быть выведены в одном формате.
Всё это делает рискованным вывод списка больше чем из 200 записей...

PS
Тому кто, посмотрев на этот код, пришел к выводу о его избыточности я обещаю на Либкоме хорошую бутылку, если он сможет сколько-нибудь значительно упростить его или изменить алгоритм с получением лучших результатов. ;)



Редактировано 1 раз. Последний раз 05.11.2007 20:44 пользователем Кирилл Соколинский (СЗТУ).

Вложения: pds.rar (852 bytes)  
Re: В погоне за невозможным Ч.1: Структурированные списки в WEB ИРБИС
Пользователь: Куделя (IP-адрес скрыт)
Дата: 27, October, 2008 18:10

Кирилл Соколинский (СЗТУ) написал(а):

> потому, что в WEB ИРБИС не поддерживается секция
> HEADER. 10 дней назад Константин Олегович добавил
> возможность её использования

А вот с этого места можно поподробнее... Про повторяющиеся ключи не надо - просто про вывод заголовков ключей в результаты поиска. Это можно сделать просто через srw? Как в "обычной" табличной форме "обычного" Ирбиса? Что кроме [HeaderFormat] и трех строк в [KeyOptions] нужно добавить и куда?

Иркутская ОГУНБ
ИРБИС64.21Турбо
WebИРБИС-PHP

Re: В погоне за невозможным Ч.1: Структурированные списки в WEB ИРБИС
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 06, November, 2008 20:38

Прошу прощения за опоздание с ответом. Я очень давно не заглядывал в эту ветку и был уверен, что все мои старые темы уже давно утонули в волнах времени. Во всяком случае, этой теме было бы лучше давно утонуть. :) Сейчас она представляет лишь теоретический интерес. Я очень надеюсь в ближайшее время заменить описанный здесь сложный и несовершенный механизм простым и понятным PHP скриптом.
Причиной появления этой темы как раз было то, что WEB ИРБИС работает с SRW файлами не совсем так, как это делает АРМ Каталогизатор. Он не позволяет использовать в [HeaderFormat] традиционную конструкцию, ориентированную на повторяемость ключей:
(if p(v1) then if a(v1^b) then |Заголовок|v1^a else ‘Библиографическая запись’ &uf(‘D,@’v1^b’, @fullwebr’) fi fi /)

Константин Олегович справедливо указывает, что традиционный принцип работы SRW файлов несовместим с порционной выдачей записей.



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