powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как сгенерить??
25 сообщений из 26, страница 1 из 2
Как сгенерить??
    #32521092
Invisible
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно генери-ть ключевое поле в случайной последовательности при добавлении в таблицу списка. Если поставить счетчик на случайную последовательность, то начинает с минусов. Ключевое поле в виде отрицательного числа - это уж слишком. Если писать свою rand-функцию, то процесс добавления большого кол-ва строк станет вечным, пока функция там проверяет уникальность новопридуманного числа.

Может можно определить начальное значение для счетчика?
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521099
Фотография Shuhard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если взять модуль или + 2*16 степени ?
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521105
Фотография Shuhard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати случайная последовательность не уникальна значения в ней могут повторяться
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521112
Invisible
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так ведь если говорить о счетчике, то разве можно на него наложить условия в таблице. Он генерится самостоятельно, а через процедуры - конечно, можно сделать но... загнется, бедолага, от проверки предыдущих ключей уже на 100000.
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521186
Invisible
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вероятно можно поставить начальное значение для счетчика?
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521188
Героиныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
:Invisible
Вам чего нужно то? уникальное значение или случайное уникальное значение?

Если первое - то поищите на форуме.про самодельные счетчики тут много написано...
Если второе - то может для начала объясните для чего?
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521210
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Из первых двух советов Shuhard'а:
про модуль - не надо, потому что может получиться не уникально;
а про добавление константы - почему бы и нет?

Можно вообще оставить аксессовский счетчик со случайными значениями, а для показа на экране (или где надо) добавлять константу.
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521212
Invisible
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно второе - случайные уникальные значения.

Поскольку таблицы в Акцессе толком защитить нельзя, хочу сделать так, чтобы инормация, предоставляемая в них не была бы актуальной. В таблице детали есть коды деталей с наименованиями. В другой таблице всяческая инфа оных и те же самые коды, но только чуть преобразованные по формуле. Программа преобразует эти коды и увязывает наименования с остальной инфой. Ведь сами модули при конвертировании в MDE прочитать нельзя! Для человека, который не может увязать наименования с характкристиками деталей, эти таблицы будут бесполезны. ПЛЮС есть возожность время от времени менять эти коды, ну может еще и саму формулу в исходниках. Измененные коды запоминаются вместе со старыми в таблице соответствия и после внесения изменений на рабочем компьютере по этой таблице, она удаляется.

Дык вот нужно просто создать таблицу с наименованиями и новыми кодами, которые должны быть уникальными и случайными. Вот...
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521213
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Тогда не надо бояться минусов.
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521214
Invisible
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, в принципе они не помешают. Хотя, возможно, в формуле они дадут глюк...
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521215
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
А формула пусть начинается с добавления константы.
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521219
Invisible
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Последний id имеет почти максимальный размер Long-а, так что не получится прибавлять константу.
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521225
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
И правда... Тогда придется генерить самостоятельно. Можно так:

1. За основу взять самопальные счетчики из фака:
http://www.sql.ru/faq/faq_topic.aspx?fid=214
2. Вместо увеличения на 1 брать случайные числа (при помощи функции rnd).
3. Поставить обработчик ошибок на добавление новой записи и отлавливать попытки добавить повторяющиеся значения.
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521231
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A чем GUID не устраивает?
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521745
Invisible
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 VIG: С Guid-ами никогда не работал и не знаю как они помогут разрешить вопрос. Да еще к тому же они размером 16 байт, что-то как-то...

2 Владимиир Саныч: При замене кодов можно и подождать пол часика. Могу объяснить, что идут мудреные процессы супер-защиты :) Но вот трабла. НАписал следующее:

INSERT INTO Детали2( Код, Деталь)
SELECT rand_kod([Код]) AS Выражение1, Детали.Деталь
FROM Детали;

Function rand_kode(kod As String) As Long
Static q As Long, w As Long, e As Long, mas() As Long
q = q + 1
If q = 1 Then Randomize (Timer): ReDim mas(60000)
''''Stop
repe:
w = 1 + Int(999998 * Rnd)
For e = 1 To q - 1
If w = mas(e) Then GoTo repe
Next e
mas(q) = w
rand_kode = w
End Function

mas 60000 в полне хватает (там записей на 45000 слишним.
Долго, конечно, тормозит, но потом выдает Subscript out of Range. q на этот момент уже 60000, ну и массив лопается.

Недоумеваю - ведь записей всего на сорок тысяч! Он что, на каждую строчку функцию по нескольку раз запускает. Как этого избежать?
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521758
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
А зачем так??? Я имел в виду гораздо более простой вариант: генерим число, пытаемся создать запись с этим числом в качестве ключа, ловим ошибку. Если повторяется, то по ошибке знаем, что надо заново.
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521798
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если поставить счетчик на случайную последовательность, то начинает с минусов. Ключевое поле в виде отрицательного числа - это уж слишком.

А какая тебе разница? Счетчик сугубо внутренняя констуркция, и ее структура, акромя ядра бд, никого интересовать не должна.
И это не ИМХО или это не счетчик.
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521936
Invisible
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где ставить обработчик ошибок? Так же в какой-нить функции, или на это есть специальное место в конструкторе запроса?

Обработчик должен выглядеть как on error goto?
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521946
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Да, on error goto. В программе с рекордсетом или с инсертом.
...
Рейтинг: 0 / 0
Как сгенерить??
    #32521974
Invisible
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:) И это будет проще, чем функция, которая генерит уже уникальные числа для запроса? :)
...
Рейтинг: 0 / 0
Как сгенерить??
    #32522010
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
По крайней мере быстрее.
...
Рейтинг: 0 / 0
Как сгенерить??
    #32522012
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
И надежнее! Потому что умеет правильно реагировать, когда два юзера пытаются вставить одинаковую величину.
...
Рейтинг: 0 / 0
Как сгенерить??
    #32533223
Invisible
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написал:

Sub codes()
Dim rec As DAO.Recordset
Set rec = CurrentDb.OpenRecordset("Соответст")
On Error Resume Next
rec.MoveFirst
Randomize Timer
Do
ifer:
rec.Edit
rec![Текущие коды] = 1 + Int(Rnd * 999999)
If Err.number Then Err.Clear: GoTo ifer
rec.Update
rec.MoveNext
Loop Until rec.EOF
On Error GoTo 0
Set rec = Nothing
End Sub

А он часть (малую, но все же) записей пропускает!!! Почему?
...
Рейтинг: 0 / 0
Как сгенерить??
    #32533236
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Во-первых, ошибка может произойти на Update, и в этом случае обработчик ничего не делает.

Во-вторых, нехорошо то, что после ошибки происходит возврат на Edit: получается, что Edit исполняется несколько раз подряд.
...
Рейтинг: 0 / 0
Как сгенерить??
    #32533283
Invisible
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таким макаром?

Sub codes()
Dim rec As DAO.Recordset
Set rec = CurrentDb.OpenRecordset("Соответст")
On Error Resume Next
rec.MoveFirst
Randomize Timer
Do
rec.Edit
ifer:
rec![Текущие коды] = 1 + Int(Rnd * 999999)
rec.Update
If Err.number Then Err.Clear: GoTo ifer
rec.MoveNext
Loop Until rec.EOF
On Error GoTo 0
Set rec = Nothing
End Sub

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


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