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

Неожиданно я столкнулся с проблемой при выводе книгообеспеченности для изданий по английскому языку. Выяснилось, что в связи с очень большим количеством студентов, которые изучают эту дисциплину(больше 5 тыс) следующая часть формата boko.pft даёт сбой:
      &unifor('+7W555#',(if p(v691) then 
                           if p(v691^9) then 
                              if p(v691^l) then else 
                                 &unifor('7RDR,!UPS='v691^9,'!,mfn/')/ 
                                 &unifor('7RDR,!?',v691^9,'!,mfn/')/ 
                                 &unifor('7RDR,!',&unifor('G2*'v691^9),'!,mfn/')/ 
                        fi fi fi/)),&uf('+7G555'),
      &uf('+7W5#'f(rsum((if p(g555) then '1;'fi/)),0,0))
Смысл этой конструкции прост – в ней собираются MFN записей, которые удаётся найти в базе RDR по термину v691^9 и подсчитываются. Тем не менее, поскольку существует ограничение на количество проходов в повторяющейся группе, код (if p(g555) then '1;'fi/) выполняется некорректно.

Я смог решить эту проблему конкретно для нашей библиотеки, поэтому хотел бы узнать мнение Светланы Михайловны и других библиотек относительно возможности универсального применения этого решения. Суть его проста – считать студентов не по записям, а по количеству постингов – т.е. ссылок в словаре(эта цифра отображается слева от термина в Каталогизаторе). Основанием для этого стало простое правило: если в поле нет повторяющихся значений и оно безусловно индексируется, количество постингов будет точно соответствовать количеству записей. У меня получился следующий код:
      &uf('+1W3#',f(rsum(
                           (if p(v691) then 
                           if p(v691^0) and a(v691^l) then 
                               &uf('JRDR,?',v691^0),';'           
                           fi fi/)
                         ),0,0
                    ),
                         
      ),

Несложно заметить, что я исключил обращение к словарю UPS= и безпрефиксному словарю. Первое просто не нужно при работе по технологии уникальной дисциплины, второе в нашем случае бессмысленно, так как изучаемый язык у нас не учитывается при расчетах. Если же требуется учитывать язык, то эту конструкцию нужно модифицировать в зависимости от правил создания безпрефиксного словаря. Поскольку я не смог найти соответствующий фрагмент RDR.FST, и времени на поиски у меня, к сожалению, нет, вынесу вопрос об исключении двойного счёта при подсчёте записей на обсуждение.
Двойной счёт может быть исключён если мы точно знаем об отношениях словаря А(назовём так словарь с префиксом «?») и словаря Б(безпрефиксный словарь) между собой. Т. е. может ли быть одна запись быть связана одновременно и со словарём А и со словарём Б или, или записи этих словарей не пересекаются.

Таким образом, мои предложения сводятся к следующему:
1. Подготовить для работы по технологии индивидуального плана отдельные форматы: это повысит скорость расформатирования и упростит алгоритм;
2. Подсчитывать количество записей по количеству постингов;
3. Исходя из того, пересекаются ли словари А и Б использовать два запроса к постингам [&uf('JRDR,?',v691^0)';' &uf('JRDR,',&uf(‘G2*’, v691^0))';'] или только один. [&uf('JRDR,?',&uf(‘G2*’, v691^0)),';']


PS
Параллельно хотел бы выяснить в каком случае могут быть полезны «архивные повторения» поля v90.



Редактировано 4 раз. Последний раз 28.04.2008 00:24 пользователем Кирилл Соколинский (СЗТУ).

Re: Оптимизация формата вычисления количества студентов, претендующих на книгу
Пользователь: Дунаевская (IP-адрес скрыт)
Дата: 30, April, 2008 07:51

Кирилл!
Именно такая логика (правда, несколько, уточненная,
.... &unifor('JRDR,','?',&unifor('Pv691^0'))'; '
&unifor('JRDR,',&unifor('G2*'&unifor('Pv691^0')))';' ...)
применялась в форматах вплоть до версии 2007.1
"Пересечение" словарей в БД RDR приводит к двойному счету, как в случае
когда разные 691^0 выходят на пересекающиеся списки студентов, так и
при повторяемости поля 90.
Решение проблемы - программные доработки Л.Н. Очаговой, которые будут введены в форматы.



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