Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
АРМ Администратор :  ИРБИС Irbis
 
Создание словаря. Учет номеров повторений поля
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 23, October, 2008 19:27

Есть база договоров. В поле 300 хранятся данные о договорах. Оно повторяющееся.

Префиксов для этого поля несколько, поскольку данные в нем нужно индексировать отдельно.
Вот такими строками инвертируется поле 300
300 0 (if p(v300) then |NDOG=|v300^a fi,|%|d300/)/
300 0 (if p(v300) then |DDOG=|v300^b fi,|%|d300/)/
300 0 (if p(v300) then |ENDDOG=|v300^i fi,|%|d300/)/
300 0 (if p(v300) then if p(v300^j) then |PAY=|v300^j fi fi,|%|d300/)/
300 0 (if p(v300) then |DPOST=|d300 if v300^m:'пост' or a(v300^m) then v300^a|-|v300^b fi fi,|%|d300/)/
300 0 (if p(v300) then |DSOPR=|d300 if v300^m:'сопр' then v300^a|-|v300^b fi fi,|%|d300/)/
300 0 &uf('+1W1#'v300^e),(if &uf('+5Tarms.mnu')<>'' then if &uf('+1R1'):&uf('+5Tarms.mnu') then 'ARMS=',&uf('+5Farms.mnu')/ fi fi)
Проблема в том, что при ссылке на какой-либо термин, который был составлен из 300-го поля, система не правильно определяет повторение.

Не могу понять в чем проблема.
перечитал эту ветку [irbis.gpntb.ru]. Все равно причину понять не смог. Подскажите, пожалуйста, кто чем может...

Re: Создание словаря. Учет номеров повторений поля
Пользователь: Дунаевская (IP-адрес скрыт)
Дата: 24, October, 2008 19:36

Посмотрите в IBIS.FST (например, инверсию авторов - ibis_aut.fst в 7.2) - строки с разными префиксами из одного поля вводятся с разными квалификаторами, на которые затем опираются форматы переноса данных.

Re: Создание словаря. Учет номеров повторений поля
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 24, October, 2008 21:19

Дело в том, что я достаю данные из записи, используя &uf('D'). Как быть в таком случае?

Re: Создание словаря. Учет номеров повторений поля
Пользователь: Дунаевская (IP-адрес скрыт)
Дата: 27, October, 2008 11:29

Не знаю Вашего формата, но попробуйте при расформатировании вставить пробел при отсутствии подполя (| |n330^X)

Re: Создание словаря. Учет номеров повторений поля
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 31, October, 2008 12:07

Постараюсь объяснить ситуацию.
Дорабатываю базу данных клиентов. В поле 300 хранятся сведения о договорах. Составляю форму печати договора. В поле 300 есть подполе ^o, которое, в случае, если договор является договором сопровождения, является ссылкой на договор поставки (там содержится термин словаря DPOST=).

Задача: при печати договора в фразу "...на основании договора поставки..." вставить номер договора поставки и его дату.
Для этого я использую такой формат
,&uf('D,$DPOST='v300^o'$,&uf(',|'|d300'Av300^a#',&uf('+90'),|'|d300')'),' от ',
f(val(&uf('D,$DPOST='v300^o'$,&uf(',|'|d300,'Av300^b*6.2#'&uf('+90'),|'|d300')')),0,0),' ',
&uf('Kmonth_rp.mnu\'&uf('D,$DPOST='v300^o'$,&uf(',|'|d300,'Av300^b*4.2#'&uf('+90'),|'|d300')')),' ',
&uf('D,$DPOST='v300^o'$,&uf(',|'|d300,'Av300^b.4#'&uf('+90'),|'|d300')'),' г.'

Пояснения: v300^a - номер договора, v300^b - дата подписания договора, v300^o - ссылка на номер договора поставки (термин словаря с префиксом DPOST=).
Проблема в том, что словарь не содержит корректных сведений о повторении поля. Если бы вы объяснили по подробнее алгоритм формирования OCC в словаре, то стало бы немного понятнее.

В результате мне нужно получить

Re: Создание словаря. Учет номеров повторений поля
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 01, December, 2008 14:31

Ну не могу я что-то сообразить ничего вообще.
// создаем словарь номеров договоров
300 0 (if p(v300) then |NDOG=|v300^a fi,|%|d300/)/
// создаем словарь, где будут только договора поставки
300 0 (if p(v300) then |DPOST=|d300 if v300^m:'пост' or a(v300^m) then v300^a|-|v300^b fi fi,|%|d300/)/
// создаем договор, где будут только договора сопровождения
300 0 (if p(v300) then |DSOPR=|d300 if v300^m:'сопр' then v300^a|-|v300^b fi fi,|%|d300/)/

Какой сбой произойдет в системе, что она не сможет корректно обрабатывать повторения поля 300 для каждого из 3-х созданных префиксов?
Если я создам словари по другому сценарию, где укажу различные квалификаторы полей
3001 0 (if p(v300) then |NDOG=|v300^a fi,|%|d300/)/
3002 0 (if p(v300) then |DPOST=|d300 if v300^m:'пост' or a(v300^m) then v300^a|-|v300^b fi fi,|%|d300/)/
3003 0 (if p(v300) then |DSOPR=|d300 if v300^m:'сопр' then v300^a|-|v300^b fi fi,|%|d300/)/
Я так понял, словарь создаться правильно, повторения учитываться будут правильно, но формат
&uf('D,$DPOST='v300^o'$,&uf(',|'|d300'Av300^a#',&uf('+90'),|'|d300')')
мне вернет правильное значение в &uf('+90')?

Re: Создание словаря. Учет номеров повторений поля
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 01, December, 2008 14:49

Простой пример сделал

(if p(v300^o) then &uf('D,$DPOST='v300^o'$,v300^a') fi)

Этот пример находит то повторение поля 300, где указана ссылка на договор поставки и выводит номер договора поставки (по идее). Реально конечно же выведутся все номера договоров, которые зарегистрированы в поле 300.
Чтобы решить эту проблему, мне нужно расформатировать запись, на которую ссылается термин, используя &uf('A'). Однако для этого юнифора нужно указать номер повторения поля, от куда брать данные. Я использовал для этого &uf('+90'). Но и то не правильно, поскольку &uf('+90') возвращает номер повторения из текущей повторяющейся группы по полю 300 и этот номер повторения указывает как раз на договор сопровождения. А он-то мне и не нужен. Мне нужно вставить номер повторения, на который ссылается требуемый термин словаря.

Re: Создание словаря. Учет номеров повторений поля
Пользователь: Alio (IP-адрес скрыт)
Дата: 01, December, 2008 16:01

Не могу вникнуть в детали, но думаю здесь поможет форматный выход

&uf('+PNdbn,<termin> - вернуть первую ссылку для указанного термина.
где N принимает значение: 0 - вернуть mfn; 1 - вернуть метку; 2 - вернуть номер повторения.



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