ЛИСТИНГ ФОРМАТА ПЕЧАТИ СПИСКА СТРУКТУРИРОВАННОГО ПО ДИСЦИПЛИНАМ
Пример работы: [
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 пользователем Кирилл Соколинский (СЗТУ).