Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.17;
Скачать: CL | DM;

Вниз

Вопрос по генерации автоинкрементных полей   Найти похожие ветки 

 
softmaster ©   (2003-06-22 20:15) [0]

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


 
Fantasy ©   (2003-06-23 05:39) [1]

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

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
что скажите есть другой выход ??


 
Fantasy ©   (2003-06-23 05:49) [2]

или

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 06:58) [3]

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


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

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


 
Johnmen ©   (2003-06-23 09:45) [5]

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

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


 
Zacho ©   (2003-06-23 10:16) [6]

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


 
softmaster ©   (2003-06-23 12:21) [7]

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


 
Zacho ©   (2003-06-23 12:30) [8]


> softmaster © (23.06.03 12:21)

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



Страницы: 1 вся ветка

Текущий архив: 2003.07.17;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
1-55584
VDen
2003-07-02 20:14
2003.07.17
Не сворачивается окно...


7-55861
TarAntul
2003-05-05 05:22
2003.07.17
Как в XP заменить в explorer.exe на свою прогу?


14-55757
Фикус
2003-07-03 09:10
2003.07.17
Список файлов на сайте


6-55698
BlackAspid
2003-05-13 16:28
2003.07.17
Как получить HTML из TWebBrowser ?


8-55670
pheonix
2003-03-27 06:02
2003.07.17
skin на delphi