Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по генерации автоинкрементных полей [D5, IB5.x]


softmaster ©   (2003-06-22 20:15:00) 

Народ, всем привет!
Еще вопрос- есть поле НОМЕР ДОКУМЕНТА.
Для генерации его применяем генератор в базе.
к примеру, сгенерировали 35,36,37.
потом опять все номера удалили.
А генератор дальше генерирует 38 и т.д.
как сделать так, чтобы он генерировал снова эти значения
или ка можно еще сделать
?
Заранее благодарен.


Zacho   (2003-06-23 12:30:00) [1]


> softmaster © (23.06.03 12:21)

Тогда обрати внимание на несколько моментов:
1. Получение номера и вставка документа в БД должно быть в отдельной короткой транзакции, запускаемой непосредственно после окончания редактирования документа.
2. Транзакция должна быть wait с уровнем изоляции SNAPSHOT TABLE STABILITY с явнымрезервированием болокируемой таблицы. Т.е параметры транзакци должны быть такими:
wait
consistency
lock_write=<имя таблицы>
exclusive


softmaster   (2003-06-23 12:21:00) [2]

Ребята , всем спасибо
Все таки я склоняюсь к мысли насчет SELECT MAX...


Zacho   (2003-06-23 10:16:00) [3]

Если нужна генерация номеров без пропусков, то единственный способ - для получения номера сделать SELECT MAX(номер)+1 в транзакции SNAPSHOT TABLE STABILITY с явным резервированием таблицы protected write. А генератор для этого не подходит. Если же пропуски в нумерации допустимы, и нужно просто начать нумерацию с начало, то Johnmen © (23.06.03 09:45)


Johnmen   (2003-06-23 09:45:00) [4]

>...или ка можно еще сделать?

Просто сбросить значение генератора...


Rol   (2003-06-23 07:44:00) [5]

>Fantasy
Сдаётся мне, что на этот генератор в базе есть триггер. Тогда, соответственно, и решение реализуется в этом же триггере элементарно.


Fantasy   (2003-06-23 06:58:00) [6]

это все прямым перебором!
И вобше могу доказать что за 20 запросов к базе данных могу найти первую не сушествуюшю цифру из(2^20) 1 048 576 записей
правдо не помю чей это алгоритм
(помоему алгоритм последователного приближения)


Fantasy   (2003-06-23 05:49:00) [7]

или

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
i:= 1;
while Table1.Locate("Nomer",i, [loPartialKey]) do i:= i+1;
Table1.Insert;
Table1["Nomer"]:=i;
/// Твои данные
Table1.Post;
end;


Fantasy   (2003-06-23 05:39:00) [8]

Интересный ворос !
Я думаю единственый выход такой.

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
i:= 0;
repeat
i:= i+1;
until not Table1.Locate("Nomer",i, [loPartialKey]);
Table1.Insert;
Table1["Nomer"]:=i;
/// Твои данные
Table1.Post;
end;

Я и демо написал качай с http://seda.kuzbass.com/Demo.zip
Дельфи 7
что скажите есть другой выход ??


Наверх

Титульная страница Поиск, карта сайта Написать письмо