Все знают, что в кларе аутоинкрементал работает плохо и в принципе не может корректно работать в сетевых приложениях.Сейчас я лабаю большой проект под 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 -единственное поле праймери-ключа таблицы УУУ.
При удалении записей из УУУ файлик ХХХ не трогается.Т.е. нумерация идет нарастающим итогои. На несколько миллиардов записей хватит. Коллеги, Хотелось бы услышать Ваше мнение про такой приемчик.
Еще раз про autoincremental
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- Ветеран
- Сообщения: 311
- Зарегистрирован: 08 Июль 2005, 22:04
- StillZero
- Ветеран
- Сообщения: 458
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Поблагодарили: 1 раз
- Контактная информация:
вообщем то старый приемчик 
я тоже использую, только не совсем так...мне кажется что в твоем случае незачем создавать файл - можно воспользоваться и 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

я тоже использую, только не совсем так...мне кажется что в твоем случае незачем создавать файл - можно воспользоваться и 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