Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Система ИРБИС в целом :  ИРБИС Irbis
 
Некорректная работа функции &UNIFOR
Пользователь: Соколинский К.Е.(СЗТУ) (IP-адрес скрыт)
Дата: 17, November, 2004 17:45

Уважаемый Александр Иосифович!
Должен ещё раз обратить внимание на проблемы, возникающие при работе с UNIFOR.
1. Эта конструкция предназначена для преобразования инициалов из формы [Инициал-Точка-Пробел-Инициал-Точка] в форму [Инициал-Инициал]
(&unifor('1*R.?v701^b'),if v701^b:' ' then &unifor('1*D .?v701^b') else &unifor('1*D..?v701^b') fi/). Она нормально работает при обработке первого повторения, но перестаёт функционировать при работе с другими. Кроме того, обнаружено странное влияние на работу этой функции &unifor(‘G0 …). Видимо, это связано с тем, что используются одни и те же переменные и они не обнуляются.
2. По поводу некорректной работы &unifor('S1A') Вы писали:
> Да, это так - никак не доходят руки исправить...
> Но надо помнить - &unifor('S... изжил себя, сейчас лучше
> пользоваться &unifor('+1... - глобальные переменными
Однако не уточнили, каким образом следует использовать &unifor('+1 в качестве счётчика. Я нашел только один способ: &unifor('+1W310#',f(rsum(&unifor('+1R310'),'+1'),0,0)).
Было бы замечательно, если бы Вы или исправили работу &unifor('S1A') или указали, на новый способ использования переменных, а лучше, и то и другое.


Re: Некорректная работа функции &UNIFOR
Пользователь: Соколинский К.Е.(СЗТУ) (IP-адрес скрыт)
Дата: 22, November, 2004 17:41

Выявлена ещё одна ошибка. Unifor('G....) так же некорректно обрабатывает данные в повторяющихся полях. НАпример, неверно работает этот алгоритм, проставляющий пробелы между инициалами: (if v701^b*1.1='.' and v701^b*3.3='.' then &uf('G0.',v701^b),'. ',&uf('G2.',v701^b) else v701^b fi/).
Ошибку удалось исправить только за счёт использования глобальных переменных: (if v702^b*1.1='.' and v702^b*3.3='.' then &uf('+1W330#',v702^b), &uf('G0.',&uf('+1R330')),'. ',&uf('G2.',&uf('+1R330')) else v702^b fi/).


Re: Некорректная работа функции &UNIFOR
Пользователь: Бродовский (IP-адрес скрыт)
Дата: 22, November, 2004 18:59

1. По поводу конструкции
(&unifor('1*R.?v701^b'),if v701^b' ' then &unifor('1*D .?v701^b') else &unifor('1*D..?v701^b') fi/)
Вы неправильно поняли смысл unifor('1 - он не предназначен для работы с повторяющимися полями. Под повторением здесь понимается повторение определенной конструкции внутри ОПРЕДЕЛЕННОГО (по умолчанию - ПЕРВОГО) повторения поля - т.е. применение этого UNIFOR сугубо специальное. Совместить повторение полей и повторение конструкции внутри поля НЕЛЬЗЯ. Можно написать так
&unifor('1*R.?v701^b#1'),....
&unifor('1*R.?v701^b#2'),....
&unifor('1*R.?v701^b#3'),....
и т.д.

2. По поводу счетчика на глобальных переменных -
можно так как у Вас
&unifor('+1W310#',f(rsum(&unifor('+1R310'),'+1'),0,0)).
а можно и так
&unifor('+1W310#',f(val(&unifor('+1R310'))+1,0,0)).

3. По поводу конструкции
(if v701^b*1.1='.' and v701^b*3.3='.' then &uf('G0.',v701^b),'. ',&uf('G2.',v701^b) else v701^b fi/)
Вы не правы - она абсолютно корректно работает с повторяющимися полями.

Re: Некорректная работа функции &UNIFOR
Пользователь: Соколинский К.Е. (СЗТУ) (IP-адрес скрыт)
Дата: 04, April, 2005 00:28

С точки зрения логики очевидно, что функция &UNFOR('I не должна быть связана с повторяющимися полями. Как бы не изменялись значения в повторяющихся полях, параметр INI файла всегда остаётся константой, поэтому функция должна возвращать такое же постоянное значение, как и безусловный литерал.

Тем не менее, она работает иначе.
Предположим, поле 907: ^CАДМ^A20050131^BСКЕ, а в INI файле параметр FIO=СКЕ.

1. (if v907^b='СКЕ' then 'Соколинский Кирилл Евгеньевич' fi/) - работает.

2. (if v907^b=&uf('IPRIVATE,FIO,') then 'Соколинский Кирилл Евгеньевич' fi/) выдаёт ошибку ***Format error 57, однако, один раз срабатывает(возвращает True) если значение FIO не задано.

3. (if p(v907^b) then if v907^b=&uf('IPRIVATE,FIO,') then 'Соколинский Кирилл Евгеньевич' fi fi/) - работает

4. (&uf('+1W55#',v907^b),if &uf('+1R55')=&uf('IPRIVATE,FIO,') then 'Соколинский Кирилл Евгеньевич' fi/) - работает

Не могу дать этому ни одного разумного объяснения, не могу понять логики работы(или условий возникновения ошибки) этой функции. При её использовании произошел первый случай, когда я дважды, по просьбе каталогизаторов исправлял одну ошибку...


Re: Некорректная работа функции &UNIFOR
Пользователь: Alio (IP-адрес скрыт)
Дата: 04, April, 2005 10:27

Для понимания того, что происходит в этих форматах, надо ОЧЕНЬ хорошо знать принцип работы ПОВТОРЯЩИХСЯ ГРУПП, а вернее - знать условия ВЫХОДА ИЗ ПОВТОРЯЮЩЕЙСЯ ГРУППЫ (57 - это зацикливание повторяющейся группы.) Кстати, Вы неправы - 4 формат тоже возвращает ошибку 57.
ВЫХОД ИЗ ПОВТОРЯЮЩЕЙСЯ ГРУППЫ ПРОИСХОДИТ ПОСЛЕ ОЧЕРЕДНОГО ПРОХОДА, КОГДА ВСЕ ОТРАБАТЫВАЕМЫЕ КОНСТРУКЦИИ ВЫБОРА ПОЛЯ И СТРОКОВЫЕ ФУНКЦИИ (в т.ч. unifor...) ВОЗВРАЩАЮТ ПУСТОТУ.

2 и 4 форматы зацикливаются, потому что конструкция
...&uf('IPRIVATE,FIO,')...
безусловно выполняется при каждом проходе и всегда возвращает не пустоту...



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