powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Полуение уникального ID
25 сообщений из 77, страница 3 из 4
Полуение уникального ID
    #36752787
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,
спасибо
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36754889
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05adm,

Моя рекомендация, когда заканчиваешь работу с рекордсетом - всегда делать
Код: plaintext
1.
rs.close
set rs=nothing
даже если должно уничтожится само.
Не делая так, наблюдал странные глюки АДО, став делать всегда так - этих глюков более не наблюдаю.
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36755387
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
а если я делаю так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Public Function get_rs(get_conn As ADODB.Connection, strquery As String) As ADODB.Recordset
On Error GoTo My_Err
If Not IsObject(get_conn) Then: Exit Function
If strquery = "" Then: Exit Function
If Not bIsOpen Then
    Exit Function
End If
Set rs = New ADODB.Recordset
rs.Open strquery, get_conn, adOpenDynamic
Set get_rs = rs
Set rs = Nothing
Exit Function
My_Err:
sErrDesc = ""
err_num =  0 
sErrDesc = Err.Description
err_num = Err.Number
err_time = Format(Time, "HH:MM:SS")
err_date = Format(Date, "YYYY-MM-DD")
If get_conn.Errors.Count >  0  Then
    For Each erCur In get_conn.Errors
        sErrDesc = erCur.Description
        err_num = erCur.Number
        OutputErrorMessage sErrDesc, "recordset", err_num, err_date, err_time
    Next erCur
Else
OutputErrorMessage sErrDesc, "recordset", err_num, err_date, err_time
End If
If Not rs Is Nothing Then
    If rs.State = adStateOpen Then
       rs.Close
    End If
End If
Set rs = Nothing
мне в конце надо так делать?
Код: plaintext
1.
Set get_rs = Nothing
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36755677
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admа если я делаю так
тебе тут не нужен rs
работай сразу с переменной get_rs и ничего никому не переприсваивай
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36755682
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
спасибо
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36764259
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть вопрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
On Error GoTo MY_err
'''''''''''''''''''''
strsql = "CALL get_newid_doc()"
Set cn = get_conn
'начинаем транзакцию
cn.BeginTrans
    Set rs = get_rs(cn, strsql) ' получаем id с таблицы документов (только для нашего соединения)
    naklnum = rs.Fields( 0 ).Value
    CloseRs rs
    strsql = ""
    Set comm = get_comm(cn, "add_to_registrusl")
    Set prm = comm.Parameters
    prm.Append comm.CreateParameter("d_id", adBigInt, adParamInput,  20 , naklnum) ' заносим id получ
  For i = MSFlexGrid3.FixedRows To MSFlexGrid3.Rows -  1 
       ....................
        comm.Execute 
    Next i
cn.CommitTrans
' заканчиваем транзакцию
'''''''''''''''''''''''''''''
MY_err:
 If cn.State <> adStateClosed Then: cn.RollbackTrans ' в случае ошибки делаем откат
    CloseRs rs
так вот использую mysql и в случае ошибки удаляются данные из двух таблиц
но вот id начинают идти не по порядку
было допустим так
id name1 name2 name
начинаем опять заносить товар
id name1 name2 name3name
допустим получилась ошибка делаем откат , записи удаляются
но при следующей удачной операции становится так
id name1 name2 name4 name
так вот хотелось бы узнать это на всех sql серверах так ?
если да то как решаете данную проблему?
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36764267
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admтак вот хотелось бы узнать это на всех sql серверах так ?
если да то как решаете данную проблему?

Да, разумеется.
Но это не является проблемой, поэтому никто ее не решает
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36764298
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для IDENTITY полей в MS SQL можно сделать RESEED:

Код: plaintext
DBCC CHECKIDENT ("HumanResources.Employee", RESEED,  30 );

возможно есть аналогичная возможность и для MySQL.

а от дырок в унпикальном поле , если удалили промежуточное значение, вы никак не избавитесь. если вам нужна сквозная нумерация, то делайте это вычисляемым/синтетическим полем.
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36764515
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,
только до такого допер
Код: plaintext
1.
2.
set @new_id=(select max(id) from documents);
alter table documents AUTO_INCREMENT=@new_id;
Shocker.Pro Да, разумеется.
Но это не является проблемой, поэтому никто ее не решает
я просто нумерацию документам даю по полю id , он у меня AUTO_INCREMENT
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36764523
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admKonst_One,
только до такого допер
Код: plaintext
1.
2.
set @new_id=(select max(id) from documents);
alter table documents AUTO_INCREMENT=@new_id;
Shocker.Pro Да, разумеется.
Но это не является проблемой, поэтому никто ее не решает
я просто нумерацию документам даю по полю id , он у меня AUTO_INCREMENT

это плохое решение. делайте нумерацию отдельным вычисляемым полем или на клиенте. можете делать через промежуточную таблицу с дополнительным столбцом идентити, которую заполняте запросом и отдаёте клиенту уже с нужной нумерацией.
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36764688
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admя просто нумерацию документам даю по полю id , он у меня AUTO_INCREMENT
Это категорически неверное решение!
Нумерация документов неуникальна для разных юрлиц и, зачастую, внутри одного года.
Кроме того, ты сталкиваешься с вышеуказанными проблемами.
Кроме того, у тебя могут возникнуть подтипы одного и того же документа с разной нумерацией.

В общем - ID - это ни в коем случае не пользовательское поле.
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36764968
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо всем будет думать)
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36770185
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в общем открыл тему здесь
но че то молчание
в общем разобрался
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`()
sp:BEGIN
declare last_id int;
declare new_id int;
  -- code
set @last_id=(select max(id)from documents);
if (isnull(@last_id)) then
        set @last_id= 1 ;
        insert into documents (id,name)values(@last_id,'temp');
        select @last_id;
        leave sp;
end if;
set @last_id=@last_id+ 1 ;
insert into documents (id,name)values(@last_id,'temp');
select @last_id;
  -- code
END sp

, только вопрос
если я на клиенте делаю транзакцию
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
'''''''''''''''''''''
strsql = "CALL get_newid_doc()"
Set cn = get_conn
'начинаем транзакцию
cn.BeginTrans
Set rs = get_rs(cn, strsql)
naklnum = rs.Fields( 0 ).Value
CloseRs rs
strsql = ""
Set comm = get_comm(cn, "add_to_registrusl")
Set prm = comm.Parameters
prm.Append comm.CreateParameter("d_id", adBigInt, adParamInput,  20 , naklnum)
..................
cn.CommitTrans
' заканчиваем транзакцию
'''''''''''''''''''''''''''''

будут ли блокироваться таблицы к которым я обращаюсь?
и не сможет ли второй пользователь выполнить данную операцию с этими таблицами
пока первый не закончил?
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36770296
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05adm
будут ли блокироваться таблицы к которым я обращаюсь?
и не сможет ли второй пользователь выполнить данную операцию с этими таблицами
пока первый не закончил?
Будут, но....
изучай транзакции (типы, изоляцию и т.п.), применительно к MySQL. В MSSQL эта тема на хороший томик тянет...
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36770308
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Shocker.ProВ MSSQL эта тема на хороший томик тянет..
спасибо , ну томик это долго, надо будет через лист читать)
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36770312
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admспасибо , ну томик это долго, надо будет через лист читать)
если у тебя простая и быстрая операция выполняется в транзакции и три пользователя в системе, можешь не думать о том, как будут блокироваться таблицы, ибо все это все равно произойдет быстро, а ситуация возникнет редко.
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36770315
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
ну да я тоже так думаю,
по большому счету я вообще думаю что извлечение max(id)
потом прибавления +1 и вставки этого значение не займет больше чем 1 сек и вряд ли проблемы будут
но для уверенности лучше транзакцию)
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36770683
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: aduka05adm
> по большому счету я вообще думаю ... и вряд ли проблемы будут

Зря так думаешь, воспользуйся стандартными средствами получения уникального идентификатора, дабы в будущем не разгребать
проблемы конфликтов

> но для уверенности лучше транзакцию)

И транзакция тебе здесь никак не помошница, потому, что она обеспечивает "согласованность" данных, а не уникальность :)

P.S. Например

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36770717
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
Зря так думаешь, воспользуйся стандартными средствами получения уникального идентификатора, дабы в будущем не разгребать
проблемы конфликтов

Это он получает номер следующего документа. Мы его как раз с Костей отговорили пользоваться identity для этих целей. Да и номер может быть не уникальным, скажем, в пределах года.

Лично я в таком случае блокирую таблицу вообще на доступ для получения следующего номера. Ибо вероятность того, что два юзера одновременно в одну секунду введут документ достаточно низкая, ну ничего, один секундочку и подождет....
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36770772
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shocker.Pro
> Это он получает номер следующего документа.

О! Кемська волость! (с)
Сори, Адука, не читай меня! Я был не прав! В искупление могу привести свой алгоритм получения такого номера:
собственно говоря тот-же max(number), но у меня "двухфазный" способ получения номера :) При формировании "нового"
документа ему присваивается max(number)+1, после рассмотрения и утверждения руководством ему присваивается тот-же
max(number)+1, но с дополнительными условиями уже одобренных руководителем. Получается как-бы двойная нумерация, хотя
она и не является "бездырочной", но наших пользователей устраивает.

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

На мой взгляд вариантом с отдельной таблицей проще обеспечить "бездырочную нумерацию", мне она не нужна :)
P.S. Да, у меня number - это varchar(64) потому что при импорте новых документов, я туда ещё и описание дописываю, хотя
к финишу приходят в основном цифры, и для некоторых филиалов с буквой :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36770852
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,
Игорь ГорбоносВ искупление могу привести свой алгоритм получения такого номера:
благодарю))
Игорь ГорбоносДа, у меня number - это varchar(64) потому что при импорте новых документов, я туда ещё и описание дописываю,
отдельное поле завел для этого
Игорь Горбоносв которую заранее генерятся номера на год вперёд, с запасом
это мне придется хранить где то , последний номер который брал
первый вариант попроще
спасибо за советы)
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36770877
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"aduka05adm" <nospam@sql.ru>; сообщил/сообщила в новостях следующее: news:9192837@sql.ru...
> Автор: aduka05adm
> Игорь Горбонос,
> Игорь Горбонос
> В искупление могу привести свой алгоритм получения такого номера:
>
> благодарю))
> Игорь Горбонос
> Да, у меня number - это varchar(64) потому что при импорте новых документов, я туда ещё и описание
> дописываю,
>
> отдельное поле завел для этого
> Игорь Горбонос
> в которую заранее генерятся номера на год вперёд, с запасом
>
> это мне придется хранить где то , последний номер который брал
> первый вариант попроще
> спасибо за советы)
> Тема Ответить Сообщение
>

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36770880
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,

Ой?
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36770883
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: aduka05adm
> это мне придется хранить где то , последний номер который брал

А по самой таблице, нельзя понять? В таблице как минимум три поля, id - автоинкремент, number - номер для досументов, и
что-то типа date_use - дата когда заняли номер. Можно ещё завести дополнительные поля и хранить там привязки к чему
хочешь :)

> первый вариант попроще

Не спорю :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36770887
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shocker.Pro
> Игорь Горбонос,
> Ой?

Так отож
Кнопки перепутал

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
25 сообщений из 77, страница 3 из 4
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Полуение уникального ID
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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