powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Уникальное значение по умолчанию в индексированном поле таблицы
25 сообщений из 26, страница 1 из 2
Уникальное значение по умолчанию в индексированном поле таблицы
    #39897613
resol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго дня!

Подскажите, как задать уникальное значение по умолчанию в индексированном поле таблицы в виде:
Zxxxxxxxxxxxxxx, где Z - буква "зет", ххх...х - 14 случайных цифр.
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39897632
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
resol,
а слабо задать индекс "уникальные значения" и набрать в поисковике "маска ввода в access"
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39897647
resol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,

Не слабо. Но такой вариант мне не подходит, т.к. поле типа "счетчик" с уникальными значениями не позволяет вносить в это поле изменения. А мне надо иногда добавлять строки из внешней таблицы с уже имеющимся значением в этом поле, а иногда - добавлять записи внутри БД. При этом поле в любом случае должно быть с уникальным значением. Для этого я и сделал его индексированным.
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39897656
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
resol,
ну тогда почитайте про счетчик и уясните что если это ключ, то изменять его это нонсенс(да и вряд ли Вы это сможете сделать),а если это не ключ то как в числовое поле всунуть текст типа "Z1234..."?
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39897707
resol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,

Возможно, вам просто не попадалась такая задача.


Откликнитесь, гуру ACCESS!
Уточню задачу. Есть таблица tИНВ в БД MS ACCESS. В ней есть текстовое поле strInv такого вида: первый символ - буква, остальные 14 - цифры. Это инвентарные номера. В эту таблицу иногда надо вносить "пачки" извне БД (файлы Excel) - запросом на обновление, а иногда - вводить вручную информацию через соответствующую форму, при этом поле strInv тоже должно заполняться какими-нибудь номерами. Чтобы не появлялось строк с одинаковыми инвентарными номерами, я сделал это поле индексированным (Совпадения не допускаются). Для отличия введенных вручную данных я решил в виде первой буквы инвентарного номера задать букву Z. Такой буквы нет среди данных извне БД. Для простоты решил задать значение по умолчанию
для поля strInv - "Z" & CStr(Int(Rnd(Now())*99999999999999)).
Этот вариант меня очень устроил, но все чаще выходит сообщение о нарушении уникальности поля strInv при "ручном" вводе. Может кто подскажет, как бы сформировать уникальное значение в данном случае?
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39897708
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
resol, почему именно такой формат? Возможно подойдёт GUID ? Иначе придётся самому писать функцию для генерирования. ИМХО
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39897735
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
resol
Не слабо. Но такой вариант мне не подходит, т.к. поле типа "счетчик" с уникальными значениями не позволяет вносить в это поле изменения. А мне надо иногда добавлять строки из внешней таблицы с уже имеющимся значением в этом поле, а иногда - добавлять записи внутри БД. При этом поле в любом случае должно быть с уникальным значением. Для этого я и сделал его индексированным.


это набор противоречий - если значение Zxxxxxxxxxxxxxx уникально и уже занято, то ни руками, ни ногами, ни из внешней таблицы его второй раз не добавить... Вот какие твои действия если вчера внес руками Zxxxxxxxxxxxxxx, а сегодня этот же ключ прилетел из внешней таблицы ?
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39897815
Дмитрий П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag

это набор противоречий - если значение Zxxxxxxxxxxxxxx уникально и уже занято, то ни руками, ни ногами, ни из внешней таблицы его второй раз не добавить... Вот какие твои действия если вчера внес руками Zxxxxxxxxxxxxxx, а сегодня этот же ключ прилетел из внешней таблицы ?

Не прилетит:
resol
sdku, .... Для отличия введенных вручную данных я решил в виде первой буквы инвентарного номера задать букву Z. Такой буквы нет среди данных извне БД.

Тут важно чтобы каждый независимый внешний источник записей имел свою начальную букву и поддерживал уникальность в пределах этого источника - тогда противоречий не будет
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39897829
Дмитрий П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
resol
... Для простоты решил задать значение по умолчанию
для поля strInv - "Z" & CStr(Int(Rnd(Now())*99999999999999)).
Этот вариант меня очень устроил, но все чаще выходит сообщение о нарушении уникальности поля strInv при "ручном" вводе...

1. Нарушение происходит из-за того, что выражение для значения по умолчанию дало неуникальное значение или потому что оператор неудачно скорректировал поле strInv ?

2. Ваше выражение для значения по умолчанию дает 7 первых случайных цифр остальные - девятки.
Какая степень случайности цифр важна? Может для инвентарного номера подойдут 14 разрадные инкрементные значения ? А если разряды еще перемешать ?
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39897849
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если инвентарный номер повторяется (а это надо проверять/запрещать ещё на этапе присвоения) внутри одной организации это противоречит его сути.
Если же это инв.разных организаций
Дмитрий П.

...Тут важно чтобы каждый независимый внешний источник записей имел свою начальную букву и поддерживал уникальность в пределах этого источника - тогда противоречий не будет
Это надо делать еще на этапе импорта добавляя префикс
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39897854
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий П.,

Ну да, про букву Z, как признак руками я не углядел...
Но это лишь усугубляет положение:
- Собственно сам инвентарный номер , я так понимаю - должен быть уникальным, и это то, что стоит после буквы Z...
- И если есть в БД такое же без буквы Z или такое же с любой другой буквой, то это значит, что всё-таки умудрились впихнуть в БД несколько книг под одним инвентарным номером (за что боролись - на то и напоролись)
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39897871
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
resol
sdku,

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


Создайте составной ключ. Посмотрите что это такое, вы можете при помощи него автоматически создавать комбинации индексов с использованием текста, числа, чего угодно.
1) Создайте уникальное поле в конструкторе (уникальное,значения повторяются) ,который по умолчанию всегда начинается на Z (значение поля по умолчанию равно Z)
2) Создайте второе поле у которого свойство значение по умолчанию ссылается на функцию в модуле (которая генерирует 14 случайных цифр).
Помимо генерации случайных цифр, она должна пробежаться по уже существующим индексам и если есть такая комбинация, сгенерировать комбинацию еще раз (точка выхода из цикла - когда сгенеренное значение не будет совпадать с существующим уже в таблице и только потом вставить значение) Тип индекса - индексированное,значение не допускаются.
Выделите шифтом в конструкторе эти два поля и сделайте ключевыми.
3) Функцию которая рандомно выставляет 14 цифр написать, или сами сможете?

PS Можно такой же трюк повторить и с одним индексированным полем (который будет primary key в вашей таблице), куда будет добавляться Z+ ваши 14 рандомных чисел
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39897879
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
генерация уникального ключа:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
...
intStringBody = ""
For i = 1 To 14
rndS = Int(Rnd * 9) + 1
intStringBody = rndS & intStringBody
Next i
resultKey = "Z" & intStringBody
...



проверку и вставку допишите сами?)
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39897881
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
перед тем как создавать БД надо ознакомится с предметом и многие вопросы отпадают тынц + составной ключ(индекс)-решение всех Ваших проблем (только помните что NULL<>NULL-оба поля индекса должны заполняться, а поле составного ключа оставить пустым вообще невозможно)
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39897884
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag
Дмитрий П.,
- Собственно сам инвентарный номер , я так понимаю - должен быть уникальным, и это то, что стоит после буквы Z...
Нет! "Z"-это часть номера
001 и Z001 это разные номера
А как будет отображаться 001 в числовом/счетчике поле?
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39898037
resol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Лалов

Создайте составной ключ. Посмотрите что это такое, вы можете при помощи него автоматически создавать комбинации индексов с использованием текста, числа, чего угодно.
1) Создайте уникальное поле в конструкторе (уникальное,значения повторяются) ,который по умолчанию всегда начинается на Z (значение поля по умолчанию равно Z)
2) Создайте второе поле у которого свойство значение по умолчанию ссылается на функцию в модуле (которая генерирует 14 случайных цифр).
Помимо генерации случайных цифр, она должна пробежаться по уже существующим индексам и если есть такая комбинация, сгенерировать комбинацию еще раз (точка выхода из цикла - когда сгенеренное значение не будет совпадать с существующим уже в таблице и только потом вставить значение) Тип индекса - индексированное,значение не допускаются.
Выделите шифтом в конструкторе эти два поля и сделайте ключевыми.
3) Функцию которая рандомно выставляет 14 цифр написать, или сами сможете?

PS Можно такой же трюк повторить и с одним индексированным полем (который будет primary key в вашей таблице), куда будет добавляться Z+ ваши 14 рандомных чисел

Спасибо за дельный совет!
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39898042
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pesol
Панург
resol, почему именно такой формат? Возможно подойдёт GUID ? Иначе придётся самому писать функцию для генерирования. ИМХО

вам Панург дело говорит
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39898052
resol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за участие!

Сергей Лалов - ваш вариант идеально подошел в моей ситуации.
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39898070
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
resol
Сергей Лалов - ваш вариант идеально подошел в моей ситуации.


Только нужно иметь ввиду, что пункт 2 там слабое место, и чем дальше - тем будет слабее...
Со временем функция рандома все чаше будет генерировать новое значение не за один и не за два захода ибо будет натыкаться на уже занятые...
Я как-то делал карточную игру "Очко" для синклера, там нужно было случайным образом перемешивать карты, - по такой методике (генерить-проверять-и если уже выбрано, опять генерить) перетасовка колоды проходила от 10 сек до 1 минуты - оставалось выбрать последние несколько карт, а рандом все долбил и долбил в уже выбранные...
Пришлось существенно изменить алгоритм...
Я бы рандом заменил на возрастающий счетчик и тогда значения были бы за один заход типа:
z00000000000001
z00000000000002
z00000000000003
Да и сразу по первым нулям видно откуда прилетело...
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39898165
resol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vmag,

Очень хорошая мысль. Спасибо. Я подумаю насчет такого варианта.
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39898187
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ради спортивного интереса собрал тестовый пример, который рандомно заполняет ключевое текстовое поле в таблице , в формате Z+14 значений. С выводом количества проходов в отдельное поле. Чтобы не мелочится, сразу добавляется по 1000 ключей. Добавление идет с проверкой значений существующих ключей. Можно сказать что ждать совпадения при 14 знаках надо очень долго.
Если в моем примере не по 1000 ключей добавлять, а по одному, то задержки вообще никакой не будет) Собрал по 1000, ради интереса посмотреть вероятность генерации повторного значения (на цикле 1000 естественно подтупливает, так как одновременно идет проверка и вычисление). Функцию можно использовать в общем то и при одиночном добавлении новой строки.
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39898200
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag,

В таможне такой же способ учета присвоения номеров ДТ (по старому ГТД) как вы подсказали ТС. В ФТС долго боролись с автоматизацией процессов, чтобы оставить нули при формировании счетчика (элемент 3 в примере ниже)

Формат номера ГТД: 23562389/04122019/0000125

Номер ГТД расшифровывается следующим образом:
элемент 1 - код таможенного органа, зарегистрировавшего ДТ [ ГТД ].
элемент 2 - дата регистрации ДТ [ ГТД ] (день, месяц, две последние цифры года);
элемент 3 - порядковый номер ДТ [ ГТД ], присваиваемый по журналу регистрации ДТ [ ГТД ] таможенным органом, зарегистрировавшим ДТ [ ГТД ] (начинается с единицы с каждого календарного года).
Все элементы указываются через знак разделителя "/", пробелы между элементами не допускаются.
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39898202
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
resol
sdku,
Возможно, вам просто не попадалась такая задача...
Точно такая-нет, а подобных много и решение оных должно начинаться с изучения руководящих документов, в данном случае:
"Общие подходы к присвоению инвентарных номеров основным средствам указаны в Методических указаниях по бухгалтерскому учету основных средств (Приказ Минфина РФ № 91н от 13.10.2003 (ред. от 24.12.2010)) и Инструкции № 157н (Приказ Минфина РФ от 01.12.2010)."
Иначе Вы рискуете "изобрести" продукт который не будет соответствовать руководящим документам и никому не будет нужен даже даром
Сейчас Вы и занимаетесь этим "изобретательством"
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39898212
ИВП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Лалов
Формат номера ГТД: 23562389/04122019/0000125
... две последние цифры года)...

или четыре?
...
Рейтинг: 0 / 0
Уникальное значение по умолчанию в индексированном поле таблицы
    #39898213
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИВП
Сергей Лалов
Формат номера ГТД: 23562389/04122019/0000125
... две последние цифры года)...

или четыре?


две две, это на автомате вывелось, вот так верно 23562389/041219/0000125
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Уникальное значение по умолчанию в индексированном поле таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]