Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Система ИРБИС в целом :  ИРБИС Irbis
 
Универсальный счетчик
Пользователь: artgonch (IP-адрес скрыт)
Дата: 08, December, 2005 13:10

Еще раз добрый день.
Вот есть фрагмент формата:
&unifor('S0'), (&unifor('S1A'), ' ' v961^a, ' ' &unifor('Av961^q#'F(val(&unifor('SA')) - 1,5,0)'')/)

Здесь счетчик обнуляется, затем происходит его инкрементация и отображение и затем - вывод содержимого подполя предыдущего повторения поля.
Вот содержимое поля (3 повторения):
^AЧестертон^QA
^AHoffman^QB
^AHolst^QC


Вот, что выводит программа:
1 Честертон C
2 Hoffman C
3 Holst C
4 C
5 C
6 C
...
1001 C
** Format Error 57 **

Тут видны 2 проблмы:
1. Как остановить счетчик, чтобы он считал только до числа повторений поля и не больше.
2. Как сделать так, чтобы вывод был таким:
1 Честертон
2 Hoffman A
3 Holst B

Заранее спасибо.

Re: Универсальный счетчик
Пользователь: А. Роман (IP-адрес скрыт)
Дата: 08, December, 2005 13:16

> 1. Как остановить счетчик, чтобы он считал только до числа
> повторений поля и не больше.

Надо ввести условие (if p(v961) then ... fi)

> 2. Как сделать так, чтобы вывод был таким:
> 1 Честертон
> 2 Hoffman A
> 3 Holst B

Подумайте, это не сложно...

Re: Универсальный счетчик
Пользователь: artgonch (IP-адрес скрыт)
Дата: 08, December, 2005 13:22

Я уже подумал и сделал, но это не заработало. Я ж привел свой вариант.
Про первый пункт вы правы

Re: Универсальный счетчик
Пользователь: artgonch (IP-адрес скрыт)
Дата: 08, December, 2005 13:30

Заметил ошибку, подправил, но теперь интепретатор ругается. Вот новый фрагмент:
&unifor('S0'), (if p(v961^a) then &unifor('S1A'), ' ' v961^a, ' ' &unifor('Av961^q#'F(val(&unifor('SA') - 1),1,5,0)'') fi/)

Вот, что выдает интепретатор:
1 Честертон Av961^q#
** Format Error 99 - Неизвестная команда (например, ошибка в правильности написания имени функции или команды), возможен также пропуск закрывающего ограничителя литерала. **

Но что ему не нравится, ума не приложу. Кажется все верно...

Re: Универсальный счетчик
Пользователь: artgonch (IP-адрес скрыт)
Дата: 08, December, 2005 13:36

Извините, там была еще одна ошибка. Ее я исправил, но теперь не нравится непарная открывающая скобка, хотя их баланс соблюден:
&unifor('S0'), (if p(v961^a) then &unifor('S1A'), ' ' v961^a, ' ' &unifor('Av961^q#'F(val(&unifor('SA')) - 1,1,5,0)'') fi/)

1 Честертон Av961^q#-1.00000
** Format Error 19 - Непарная открывающаяся скобка (. **

К тому же, видно, что значение, котрое вычислила программа, отрицательное. Как это может быть, если знвчение счетчика на момент вычисления выражения равно 1?

Re: Универсальный счетчик
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 08, December, 2005 14:56

&unifor('S0'),
(if p(v961^a) then
&unifor('S1A'),
' 'v961^a,
if &unifor('SA')<>'1' then ' '&unifor('Av961^q#'f(val(&unifor('SA'))-1,5,0)) fi,
fi/)
а вот так

Re: Универсальный счетчик
Пользователь: artgonch (IP-адрес скрыт)
Дата: 12, December, 2005 13:42

А зачем вы проверяете значение счетчика на неравенство единице? Ведь все итерации цикла должны выполняться единообразно.

Re: Универсальный счетчик
Пользователь: artgonch (IP-адрес скрыт)
Дата: 12, December, 2005 14:48

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

К примеру, это должно выглядеть так:
&unifor('S0'),
(if p(v961^a) then
&unifor('S1A'),
' 'v961^a,
if &unifor('Av961^q#'f(val(&unifor('SA'))-1,5,0))<>'' then ' OK' fi,
fi/)

Есть 3 повторения поля 961:
^AФамилия 1
^AФамилия 2^QA
^AФамилия 3

Но при выполнении этого формата выдается только:
1 Фамилия 1
2 Фамилия 2
3 Фамилия 3

А должно:
1 Фамилия 1
2 Фамилия 2
3 Фамилия 3 OK

Re: Универсальный счетчик
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 12, December, 2005 15:56

Как подумал, так и сделал. Конкретной задачи вы не ставили. Но если задача такая, то тот формат, что вы написали, более чем работает.
А можно пример, когда сможет пригодиться такой формат?

Re: Универсальный счетчик
Пользователь: artgonch (IP-адрес скрыт)
Дата: 13, December, 2005 11:25

У меня не заработал... Я привел пример того, что должно получиться и то, что реально получилось. Я поэтому я и обратился за помощью.
А конкретная задача такая:
Нужно организовать настраиваемое формирование сведений об ответственности (461^f) из полей 961 и 082, т.е. сделать так, чтобы для каждого повторения этих полей можно было индивидуально задать, учавствует ли это поле в формировании 461^f. Об участии повторения в формировании содержимого поля сигнализирует полдполе Q.
Это уде почти сделано, но возникает проблема, когда в настройки в повторениях полей менются попеременно: 1-ое не учавствует, 2-е учавствует, ... В результате перед формируемым текстом ставится запятая, которая там не нужна. Вот фрагмент фоормата, котороый необходимо исправить:
...if p(v961^a) and a(v961^4) then|, |+d961^a...
Вот эта запятая (|, |) и вылазит, если отключен вывод первого повторения поля. И это правильно: |, |+ выводится перед каждым повторением поля, кроме первого.
Поэтому мне и нужно получать значение предыдущего повторения поля, чтобы определять, нужна или не нужна здесь запятая.
Но что-то моя конструкция покаа не работает.

Re: Универсальный счетчик
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 13, December, 2005 12:36

Повторю еще раз: у меня эта конструкция прекрасно работает как надо. Версия у вас какая?

Re: Универсальный счетчик
Пользователь: artgonch (IP-адрес скрыт)
Дата: 13, December, 2005 13:49

2004-2 (ИРБИС 32)

Re: Универсальный счетчик
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 13, December, 2005 14:17

Конструкция абсолютно верна. Или приведите пример реальной записи, на которой этот формат не работает.



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