Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Общие вопросы АБИС :  ИРБИС Irbis
 
Назначение каждой записи уникального номера
Пользователь: Мотов Юрий (IP-адрес скрыт)
Дата: 20, July, 2009 18:01

Здравствуйте!
У меня такая проблема: необходимо каким-либо образом каждой записи в БД сопоставить уникальный номер. MFN не подходит по причине того, что после экспорта\импорта они сдвигаются, если были удалённые записи.

Пытался разобраться со счетчиком &unifor('SA'), никак не получилось. И у него похоже нет возможности инициализации произвольным числом.

Больше не вижу вариантов пока. Возможно ли такое реализовать? Или придётся писать внешние скрипты и делать экспорт\импорт, что не удобно и долго..

Результат тут



Редактировано 3 раз. Последний раз 24.07.2009 14:45 пользователем Мотов Юрий.

Re: Назначение каждой записи уникального номера
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 20, July, 2009 19:46

Вам для своих каких-то задач?

Ибо если это вам для каталога нужно, то все уже давно сделано. Поле называется "Шифр документа в БД" имеет метку 903. Формируется механизмом автоввода на основе глобальной корректировки. Подробнее смотрите файл autoin.gbl в директории базы данных.

Re: Назначение каждой записи уникального номера
Пользователь: Куделя (IP-адрес скрыт)
Дата: 21, July, 2009 04:39

Если вам необходима сквозная нумерация, то без хранения максимального значения в БД Вам не обойтись. Этот вопрос детально разбирался в какой-то из тем про нумерацию читательских билетов кажется.
Если же требуется только уникальность, то чем не устраивает &uf('R') - генератор случайного числа.

Иркутская ОГУНБ
ИРБИС64.21Турбо
WebИРБИС-PHP

Re: Назначение каждой записи уникального номера
Пользователь: Мотов Юрий (IP-адрес скрыт)
Дата: 21, July, 2009 09:51

Спасибо за ответы, но варианты "Шифр документа в БД" и просто генератор случайного числа не подходят. Оба они основаны на использовании генератора случайных чисел, а это не даёт гарантии уникальности. Мне же нужна именно она.
Мне необходимо чтобы каждой записи, добавленной в БД, присваивался уникальный id, который более никогда не будет присвоен уже другой записи, даже если эта запись будет удалена из базы.

Цитата:
Куделя
.. без хранения максимального значения в БД Вам не обойтись. Этот вопрос детально разбирался в какой-то из тем...
Не поможете найти эту тему? Я попытался, ничего не нашёл похожего.

Re: Назначение каждой записи уникального номера
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 21, July, 2009 10:10

Смысл идеи в том, что в первой записи каталога всегда хранится системная информация. Или можно этой записи 907 какое-нить уникальное установить. Что-то типа SETT. В этой записи будет храниться последний присвоенный номер. Когда какая-то запись сохраняется, то ей присваивается номер на единицу больше, и в настроечной записи этот номер на единицу увеличивается.

Re: Назначение каждой записи уникального номера
Пользователь: PRM (IP-адрес скрыт)
Дата: 21, July, 2009 12:42

Мне кажется, что может подойти тема "Опыт и разработки пользователей ИРБИС - Автосчетчик для поля в каталогизаторе", [irbis.gpntb.ru]

Re: Назначение каждой записи уникального номера
Пользователь: Куделя (IP-адрес скрыт)
Дата: 21, July, 2009 12:53

Да, именно ее я имел в виду. Правда не ожидал что это было так давно :) Спасибо, Роман.

Иркутская ОГУНБ
ИРБИС64.21Турбо
WebИРБИС-PHP

Re: Назначение каждой записи уникального номера
Пользователь: PRM (IP-адрес скрыт)
Дата: 22, July, 2009 10:53

Куделя написал(а):
-------------------------------------------------------
> Да, именно ее я имел в виду. Правда не ожидал что
> это было так давно :) Спасибо, Роман.

Cпасибо!

Re: Назначение каждой записи уникального номера
Пользователь: Мотов Юрий (IP-адрес скрыт)
Дата: 23, July, 2009 14:57

Снова Здравствуйте!
Спасибо огромное за помощь в поиске статьи. Там действительно очень похожий случай. Но задачу мне решить так и не удалось.

Создал новую БД 'SETS' в ней рабочий лист тоже 'SETS'. В SETS.FST прописал строку
920 0 "VD="v920

Создаю сценарий корректировки такой:
0
ADD
9955
XXXXXXXXXXXXXXXXXXX
&uf('+1W22#',&uf('DSETS,',"/VD=SETS/,","v1")), &uf('+1W22#',f(val(&uf('+1R22'))+1,0,0)), &uf('+1R22')
XXXXXXXXXXXXXXXXXXX
CORREC
'SETS'
&uf('+1R22')
'VD=SETS'
XXXXXXXXXXXXXXXXXXX
REP
1
F
v1001
XXXXXXXXXXXXXXXXXXX
DEL
1001
*
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
END
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
Первой командой считываю значение счётчика в переменную, увеличиваю значение переменной.
Затем в операторе CORREC записываю значение из переменной в поле v1.

В результате в записи поле 9955 добавляется, но всегда = 1. И в настройках счётчик так же не меняется.

Подскажите пожалуйста как правильно, уже 2 дня бьюсь с этим сценарием..

Re: Назначение каждой записи уникального номера
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 23, July, 2009 15:58

В вашем случае проще использовать запись в рабочей базе с типом SETT, а не создавать отдельную базу. Отдельная база - это было глобальное предложение и оно в вашем случае не оправдано. Хотя вам виднее.

Re: Назначение каждой записи уникального номера
Пользователь: Мотов Юрий (IP-адрес скрыт)
Дата: 23, July, 2009 17:09

Понимаю, что база с одной единственной записью из 2 полей смотрится смешно, но со временем, возможно, эта база и еще для чего-нибудь пригодится. А захламлять рабочую базу - мне кажется не красиво.

Re: Назначение каждой записи уникального номера
Пользователь: Куделя (IP-адрес скрыт)
Дата: 24, July, 2009 08:34

Попробуйте вместо переменной передавать в CORREC результат записи в 9955 поле

CORREC
'SETS'
v9955
'VD=SETS'

Иркутская ОГУНБ
ИРБИС64.21Турбо
WebИРБИС-PHP

Re: Назначение каждой записи уникального номера
Пользователь: Мотов Юрий (IP-адрес скрыт)
Дата: 24, July, 2009 09:54

Опытным путём удалось установить, что не срабатывает выражение:
&uf('+1W22#',&uf('DSETS,',"/VD=SETS/,","v1"))
в переменной всегда получается значение "0".

Что необходимо, чтобы эта строка сработала?

Я делал следующее:
Создал новую БД 'SETS' в ней рабочий лист тоже 'SETS'. В SETS.FST прописал строку:
920 0 "VD="v920
Может быть надо сделать ещё что-нибудь, чего я не знаю?

Re: Назначение каждой записи уникального номера
Пользователь: Куделя (IP-адрес скрыт)
Дата: 24, July, 2009 10:18

действительно. Вы неправильно использовали литералы.
&uf('DSETS,',"/VD=SETS/,","v1") ничего не может вернуть потому что вы передаете в формат-программу строчку "DSETS," и больше ничего. Литерал " - условный. Напишите &uf('DSETS,/VD=SETS/,v1')

Иркутская ОГУНБ
ИРБИС64.21Турбо
WebИРБИС-PHP



Редактировано 1 раз. Последний раз 24.07.2009 10:53 пользователем Куделя.

Re: Назначение каждой записи уникального номера
Пользователь: Мотов Юрий (IP-адрес скрыт)
Дата: 24, July, 2009 10:50

Спасибо огромное!

Всё работает. Выложу результат, вдруг кому пригодится.

Резюме:
В прикрепленном файле задание для пакетной корректировки, добавляющей каждой записи поле 9955, в подполе ^1 которого записывается уникальный номер. Если поле уже присутствует в записи - запись пропускается.

Для работы необходимо создать произвольную БД с именем 'SETS', в ней создать рабочий лист с именем 'SETS' и полями #1 и #920.
В каталоге БД SETS в файл SETS.fst вписать строку:
920 0 "VD="v920
И создать в этой БД запись, указав имя рабочего листа - SETS и начальное значение счетчика.

Еще можно в файлик autoin.gbl дописать в конец содержимое файла add_ids.gbl кроме первой строки (которая 0), тогда номера будут добаляться сразу при вводе новой записи.

Еще раз спасибо всем, кто помогал!



Редактировано 4 раз. Последний раз 24.07.2009 15:02 пользователем Мотов Юрий.

Вложения: add_ids.gbl (575 bytes)  
Re: Назначение каждой записи уникального номера
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 24, July, 2009 13:25

Ну так оформите, пожалуйста, в архиве базу SETS и все необходимые файлы. И прикрепить не забудьте :)



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