Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.07.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.009 c
6-55705
Le!
2003-05-10 08:57
2003.07.17
Файл по e-mail!


1-55508
Flint
2003-07-04 12:28
2003.07.17
TDateTime conversion


14-55826
panov
2003-06-23 19:50
2003.07.17
А здесь что, филиал www.sql.ru?


14-55754
Mike B.
2003-07-01 15:46
2003.07.17
Враги.


14-55848
shark
2003-07-01 18:02
2003.07.17
Массив





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский