Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Общие вопросы Ирбис64 :  ИРБИС Irbis
 
логика работы операторов p() и a() в повторяющихся полях
Пользователь: lybs (IP-адрес скрыт)
Дата: 20, January, 2021 17:55

Вопрос разработчикам Ирбис.
Согласно документации, функция p() (дословно цитирую).

"Функция Р возвращает значение истина, если форматируемая запись содержит по крайней мере один экземпляр поля или подполя, указанного в аргументе. В противном случае функция P возвращает значение ложь."

Но это процитированное утверждение оказывается ложью, если поле повторяющееся и повторяющийся экземпляр подполя есть в повторении N>1 при отсутствии в первом. Это демонстрирует пример во вложении.
Как я проверил, p(v982) (поле 982 повторяющееся) эквивалентно &uf('Av982^7#1')<>'', а я ожидал, что эта конструкция, согласно процитированному тексту, будет работать как v982^7<>''.
Аналогично с функцией a().

"Функция A возвращает значение истина, если форматируемая запись не содержит ни одного экземпляра поля или подполя, указанного в аргументе.
"
Но если есть хотя бы один экземпляр подполя в повторении >1 есть, но нет в повторении 1, функция a() вопреки процитированному тексту выдаёт истину.

Получается, что
p(v982^7) эквивалентно &uf('Av982^7#1')<>'', а
a(v982^7) эквивалентно &uf('Av982^7#1')=''

Что мешает реализовать такую логику?
p(v982^7) эквивалентно v982^7<>''
a(v982^7) эквивалентно v982^7=''.

По моему это будет логично и согласно документации.

Если при отсутствии символа | в "свободном поиске" поисковое условие применяется к конкатенации повторений, то конкатенация повторений содержит метку подполя и нужное условие выполняется.



Редактировано 3 раз. Последний раз 20.01.2021 18:00 пользователем lybs.

Вложения: Баг Ирбис p() a().pft (619 bytes)  
Re: логика работы операторов p() и a() в повторяющихся полях
Пользователь: ochagova (IP-адрес скрыт)
Дата: 20, January, 2021 18:24

Проще изменить текст документации.
А может в каком-то формате это свойство используется, тогда изменение форматера приведет к непредсказуемым последствиям.

Re: логика работы операторов p() и a() в повторяющихся полях
Пользователь: lybs (IP-адрес скрыт)
Дата: 20, January, 2021 19:20

Как оно может использоваться и какой смысл его? По-моему это абсолютно нелогично.



Редактировано 1 раз. Последний раз 20.01.2021 19:29 пользователем lybs.

Re: логика работы операторов p() и a() в повторяющихся полях
Пользователь: AntonM (IP-адрес скрыт)
Дата: 25, January, 2021 15:55

lybs написал(а):
-------------------------------------------------------
> Как оно может использоваться и какой смысл его?
> По-моему это абсолютно нелогично.

Дело в том, что поведение функций p() и a() зависит от контекста повторяющейся группы и привязано к текущему повторению. Вне повторяющейся группы номер повторения всегда считается равным 1.

Смысл тут в оптимизации: хотя результат p(v982^7) эквивалентен &uf('Av982^7#1')<>'' , они имеют разную реализацию и соответственно разное время выполнения:
Логическое выражение &uf('Av982^7#1')<>'' извлечет значение подполя ^7 из первого повторения поля 982 и сравнит его с пустой строкой. Тогда как логическая функция p(v982^7)
просто проверит существование разделителя ^7 в первом повторении поля 982 (или текущем повторении, в контексте повторяющейся группы), что несколько быстрее чтения. Было время, когда такие мелочи имели значение. В медленном интерпретаторе они важны и сейчас.
Так что в данном случае, ошибка действительно в документации, а не в коде.



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