Еще раз про autoincremental

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
lsgsoftware
Ветеран
Сообщения: 311
Зарегистрирован: 08 Июль 2005, 22:04

Еще раз про autoincremental

Сообщение lsgsoftware »

Все знают, что в кларе аутоинкрементал работает плохо и в принципе не может корректно работать в сетевых приложениях.Сейчас я лабаю большой проект под MYSQL и использую его родной аутоинкремент.В принципе все работает нормально, но при попытке получить идентификатор последней добавленной записи в кларе в среднем один раз из пяти возвращается 0 (хотя в родном мониторе MYSQL все работает нормально). По-видимому велосипедисты неспроста не включили MYSQL в число поддерживаемых СУБД(т.е. скорее всего не тестировали его ОДБС-драйвер).Мне все это надоело и я решил обойти эту проблему своими силами, взяв за основу идею MYSQL.
Вот решение: создаем файлик XXX без ключей из одной записи с одним полем N-ulong(файлик может быть clarion,tps и вообще любой).Далее примернр такой кусочек кода:
set(xxx);next(xxx)
if error()
xxx:n=1;add(xxx)
.
if ~error()
xxx:n=xxx:n+1;put(xxx)
.
yyy:id=xxx:n;add(yyy)
loop while errorcode()
set(xxx);next(xxx)
xxx:n=xxx:n+1;put(xxx)
yyy:id=xxx:n;add(yyy)
.
При этом ID -единственное поле праймери-ключа таблицы УУУ.
При удалении записей из УУУ файлик ХХХ не трогается.Т.е. нумерация идет нарастающим итогои. На несколько миллиардов записей хватит. Коллеги, Хотелось бы услышать Ваше мнение про такой приемчик.
Аватара пользователя
StillZero
Ветеран
Сообщения: 458
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Поблагодарили: 1 раз
Контактная информация:

Сообщение StillZero »

вообщем то старый приемчик :)

я тоже использую, только не совсем так...мне кажется что в твоем случае незачем создавать файл - можно воспользоваться и ini-файлом

я делаю так:
- создаю таблицу из трех полей:
ID LONG ! id записи
AutoNumParams STRING(100) ! параметры автонумерации
LastNo LONG ! собственно номер автоинкремента

таким образом можно нумеровать разные таблицы, задавая для них разные параметры, также можно нумеровать одно и тоже поле по некоторому условию

пример: нумерация разных таблиц
NextNo1# = GetNextNo('MyTableName1')
NextNo2# = GetNextNo('MyTableName2')

пример: нумерация в одной таблице по разным критериям (в каждом складе своя нумерация например)
NextNo1# = GetNextNo('MyTableName1:Склад1')
NextNo2# = GetNextNo('MyTableName2:Склад2')

где GetNextNo это функция для получения номера (я думаю, что понятно как работает)

есть еще моменты - когда необходимо отменить увеличение номера, т.е. юзер зашел в форму - автонумерация отработала, юзер нажал "отмена" - надо отнять номер, если он не изменился. Также, если есть возможность изменения номера, надо предусмотреть чтобы при вводе большего числа, чем хранится в таблице автонумерации, происходило его обновление. Естественно, что надо помнить, что юзеров много, т.е. вносить изменения в таблицу в рамках транзакции.

Подобная схема описана у А. Мялина на mavcla.arsis.ru
Ответить