![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по генерации автоинкрементных полей [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
что скажите есть другой выход ??