|
|
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
Нужно генери-ть ключевое поле в случайной последовательности при добавлении в таблицу списка. Если поставить счетчик на случайную последовательность, то начинает с минусов. Ключевое поле в виде отрицательного числа - это уж слишком. Если писать свою rand-функцию, то процесс добавления большого кол-ва строк станет вечным, пока функция там проверяет уникальность новопридуманного числа. Может можно определить начальное значение для счетчика? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2004, 19:07 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
а если взять модуль или + 2*16 степени ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2004, 19:12 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
кстати случайная последовательность не уникальна значения в ней могут повторяться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2004, 19:13 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
Так ведь если говорить о счетчике, то разве можно на него наложить условия в таблице. Он генерится самостоятельно, а через процедуры - конечно, можно сделать но... загнется, бедолага, от проверки предыдущих ключей уже на 100000. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2004, 19:17 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
Вероятно можно поставить начальное значение для счетчика? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2004, 21:09 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
:Invisible Вам чего нужно то? уникальное значение или случайное уникальное значение? Если первое - то поищите на форуме.про самодельные счетчики тут много написано... Если второе - то может для начала объясните для чего? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2004, 21:14 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
Из первых двух советов Shuhard'а: про модуль - не надо, потому что может получиться не уникально; а про добавление константы - почему бы и нет? Можно вообще оставить аксессовский счетчик со случайными значениями, а для показа на экране (или где надо) добавлять константу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2004, 22:13 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
Нужно второе - случайные уникальные значения. Поскольку таблицы в Акцессе толком защитить нельзя, хочу сделать так, чтобы инормация, предоставляемая в них не была бы актуальной. В таблице детали есть коды деталей с наименованиями. В другой таблице всяческая инфа оных и те же самые коды, но только чуть преобразованные по формуле. Программа преобразует эти коды и увязывает наименования с остальной инфой. Ведь сами модули при конвертировании в MDE прочитать нельзя! Для человека, который не может увязать наименования с характкристиками деталей, эти таблицы будут бесполезны. ПЛЮС есть возожность время от времени менять эти коды, ну может еще и саму формулу в исходниках. Измененные коды запоминаются вместе со старыми в таблице соответствия и после внесения изменений на рабочем компьютере по этой таблице, она удаляется. Дык вот нужно просто создать таблицу с наименованиями и новыми кодами, которые должны быть уникальными и случайными. Вот... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2004, 22:17 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
Тогда не надо бояться минусов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2004, 22:19 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
Ну да, в принципе они не помешают. Хотя, возможно, в формуле они дадут глюк... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2004, 22:23 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
А формула пусть начинается с добавления константы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2004, 22:26 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
Последний id имеет почти максимальный размер Long-а, так что не получится прибавлять константу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2004, 22:30 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
И правда... Тогда придется генерить самостоятельно. Можно так: 1. За основу взять самопальные счетчики из фака: http://www.sql.ru/faq/faq_topic.aspx?fid=214 2. Вместо увеличения на 1 брать случайные числа (при помощи функции rnd). 3. Поставить обработчик ошибок на добавление новой записи и отлавливать попытки добавить повторяющиеся значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2004, 22:39 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
A чем GUID не устраивает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2004, 23:07 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
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, ну и массив лопается. Недоумеваю - ведь записей всего на сорок тысяч! Он что, на каждую строчку функцию по нескольку раз запускает. Как этого избежать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2004, 11:38 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
А зачем так??? Я имел в виду гораздо более простой вариант: генерим число, пытаемся создать запись с этим числом в качестве ключа, ловим ошибку. Если повторяется, то по ошибке знаем, что надо заново. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2004, 11:42 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
Если поставить счетчик на случайную последовательность, то начинает с минусов. Ключевое поле в виде отрицательного числа - это уж слишком. А какая тебе разница? Счетчик сугубо внутренняя констуркция, и ее структура, акромя ядра бд, никого интересовать не должна. И это не ИМХО или это не счетчик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2004, 11:57 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
А где ставить обработчик ошибок? Так же в какой-нить функции, или на это есть специальное место в конструкторе запроса? Обработчик должен выглядеть как on error goto? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2004, 12:41 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
Да, on error goto. В программе с рекордсетом или с инсертом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2004, 12:44 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
:) И это будет проще, чем функция, которая генерит уже уникальные числа для запроса? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2004, 12:51 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
По крайней мере быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2004, 13:04 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
И надежнее! Потому что умеет правильно реагировать, когда два юзера пытаются вставить одинаковую величину. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2004, 13:05 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
Написал: 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 А он часть (малую, но все же) записей пропускает!!! Почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 18:06 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
Во-первых, ошибка может произойти на Update, и в этом случае обработчик ничего не делает. Во-вторых, нехорошо то, что после ошибки происходит возврат на Edit: получается, что Edit исполняется несколько раз подряд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 18:12 |
|
||
|
Как сгенерить??
|
|||
|---|---|---|---|
|
#18+
Таким макаром? 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 уже нужно опустить ниже? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2004, 18:24 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32521213&tid=1674379]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
141ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 428ms |

| 0 / 0 |
