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

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

Нумерация документов [D7, Paradox]


Страницы:   1 2 3

Leon1 ©   (2005-01-28 08:28:00) 

Народ, ни кто не сталкивался с данной штукой? как лучше реализовать? естественно Номер документа как первичный ключ не подойдет! У меня есть идеи например:
1)реализация с помощью отдельной таблицы с автоинкрементным полем в которую производится вставка перед открытием документа тем самым можно получить значение следующего номера, минус этого способа если документ будет открыт и не записан получится что номер пропал
2)То же что и первое но вставка производится после запсиси документа, а значение автоинкрементного поля получается в момент открытия документа и увеличивается на 1.. минус пользователь может держать фиг знает сколько этот документ открытым и могут родиться документы с содинаковыми номерами
3) SQL запрос на MAX(NumDoc) минус точно такой же как и у 2 способа
4) SQL запрос на COUNT(*) минус номера должны быть изменяемыми и если после первого пошел 10 то следующий получим не 11 а 3...
Мож кто то подскажет еще какие нибудь решения?????


Danilka   (2005-01-31 08:48:00) [1]

[44] Sergey_Masloff   (30.01.05 14:55)
Понятно. Но, как справедливо заметил [41], в таком случае их и удалять надо запрещать.


Petr V. Abramov   (2005-01-30 23:41:00) [2]

> Sergey_Masloff   (30.01.05 16:44) [46]
> Ты не понял метод.
 IMHO, понял
>  Единственно что может произойти -
выключение света за ту долю секунды которую занимает запись 1 записи в кэш.
 Вероятность ж... , не спорю, очень мала. Но, к сожалению,
    Законы Мерфи имеют приоритет над законами больших чисел

> Anatoly Podgoretsky ©   (28.01.05 20:14) [41]
> Без дырок говоришь, тогда надо закладывать право
> обязательности и неудоляемости
 и регулярного backup`а, чтоб совсем глубокой дырки не было :)


Anatoly Podgoretsky   (2005-01-30 17:10:00) [3]

Номер можно присваивать и после сохранения, только нуже таймстамп. Отсутствие дырок и последовательность в данном случае гарантирована.


Sergey_Masloff   (2005-01-30 16:44:00) [4]

Petr V. Abramov ©   (30.01.05 16:29) [45]
Ты не понял метод. Номер генерится ДО всего. Единственно что может произойти - выключение света за ту долю секундыкоторую занимает запись 1 записи в кэш. Если не в лом еще раз прочти изложеную методику.
 Начинается все с того что вызывается функция которая
1) Дергает генератор
2) Пишет его значение в кэш с описаными атрибутами
3) Коммитит
4) Возвращает значение пользователю (документа еще нет)

Время выполнения этого - ну не знаю, ну пара-тройка сотен тактов процессора.То есть с выключением очень точно надо угадать.


Petr V. Abramov   (2005-01-30 16:29:00) [5]

Sergey_Masloff   (30.01.05 11:04) [42]
> А потом юзер думае - а на фиг этот документ.
 Уточняю: вся это происходит непосредственно перед коммит, т.е. когда уже нажато Save и пути обратно нет. Иначе в блокировку вопрешься 100%

> Ну не знаю. Я когда-то сделал так:
>  Когда пользователь создает новый документ  (пока у себя - записи в базу нет) процедура берет новый номер генератора и ....
Выключили свет -> дырка в номерах :)  Генератор-то работает не в контексте транзакции, поэтому при recovery его значение не откатится.


Sergey_Masloff   (2005-01-30 14:55:00) [6]

Danilka ©   (30.01.05 13:58) [43]
Ну настрой на 20 минут. Не оформил документ за 20 минут - в сад. Вобщем, все настраивается. В конкретно той задаче были именно такие условия - чтобы дырок не было и 1 день. Так и сделал.

>я не знаю таких документов, где дырки запрещены законодательно
Это в библиотечном учете. Не помню точно но руководящий документ есть. Они до этого шахматки рисовали знаешь наверное такая расчерченая бумажка с номерами присвоил - зачеркни.


Danilka   (2005-01-30 13:58:00) [7]

Как тут весело.

[42] Sergey_Masloff   (30.01.05 11:04)
> зарезервирован более суток (восьми часов, двух часов - настраивается
> - плод вырубона электричества или снятия клиента по Ctrl-Alt-Del)

более суток не очень приятно. да и так, остается мизерная вероятность того, что появится документы с нарушеной хронологической последовательностью (например, последовательность:
20.10.2004  235
20.10.2004  237
21.10.2004  236
), а это более недопустимо чем дырки. Точнее, это-то как раз и недопустимо для ряда документов законодательно, а дырки допустимы, по-крайней мере, я не знаю таких документов, где дырки запрещены законодательно.


Sergey_Masloff   (2005-01-30 11:04:00) [8]

Petr V. Abramov ©   (28.01.05 18:47) [40]
>Если нужна нумерация уникальная и "без дырок" - без пропуска >номеров, тогда
> заводим табличку из одной записи с одним полем last_num,
>update ... set last_num = last_num + 1, читаем и сразу commit
А потом юзер думае - а на фиг этот документ. Я его и заводить не буду. И получаем в базе огрызок у которого есть только номер (да и его сохранить не удастся)

> Другого способа нет, или "дырки" будут, или потенциальное >нарушение уникальности
Ну не знаю. Я когда-то сделал так:
1)есть таблица-буфер (кэш, как угодно назови) c полями типа номер, дата резервирования, кто резервировал.
2) Когда пользователь создает новый документ  (пока у себя - записи в базу нет) процедура берет новый номер генератора и создает запись в буфере - вася пупкин зарезервировал номер 10 в 9:30 18 января. Коммитим.
3) Пользователь работает с документом. Потом 3 варианта
 - все нормально документ пишем в базу. При этом из буфера ранее зарезервированый номер удаляем все в порядке.
 - все плохо документ дискардим. В буфере номер помечаем как свободный.
 - выключили свет все накрылось. Ничего не далаем да и не можем.

4) Создается новый документ. Перед тем как генерировать новый документ сначала лезем не к генератору а в буфер и ищем там первый номер который а) помечен как свободный (последствие отмены документа) б) зарезервирован более суток (восьми часов, двух часов - настраивается - плод вырубона электричества или снятия клиента по Ctrl-Alt-Del). У этого номера изменяется дата резервирования - дальше см. выше. Если в буфере - кеше записей нет то генерируем новую запись вставляем ее в буфер на кону мочло начинай сначала.

Вся эта петрушка была сделана в моем первом самостоятельном проекте работает уже 8 лет из них 6 лет без моего участия. Сбоев нет все нумеруется.


Anatoly Podgoretsky   (2005-01-28 20:14:00) [9]

Без дырок говоришь, тогда надо закладывать право обязательности и неудоляемости.


Petr V. Abramov   (2005-01-28 18:47:00) [10]

Если нужна нумерация уникальная и " без дырок" - без пропуска номеров, тогда
 заводим табличку из одной записи с одним полем last_num,
update ... set last_num = last_num + 1, читаем и сразу commit
 Другого способа нет, или "дырки" будут, или потенциальное нарушение уникальности


msguns   (2005-01-28 16:38:00) [11]

>Leon1   (28.01.05 15:36) [37]
>вместо этого беспочвенные оскорбления

Давайте разберемся.
1. По поводу оскорблений. Видимо, основанием для такого "тяжелого" аргумента послужило мое вот это:
У Вас, простите, каша в голове

Это Вы считаете оскорблением ?

Во-первых, видимо, Вас никто никогда не оскорблял.
Во-вторых, если заменить это на слово "неразбериха", Вам станет легче ? Если да, то я не против, давайте заменим. Более нигде, сколько не читал свои посты, не заметил даже намека на оскорбление. Более того, пытался с максимальной вежливостью и ясностью Вам помочь. Причем, вполне искренне.

2. Что касается "почвенности", то о кашея сказал после Ваших [14], [18], [20], [25], [29-31], [33] и (особенно !) [35]
Попробуйте непредвзято прочитать эти свои посты и оценить сам себя. Определенно складывается впечатление, что человек нахватался терминов и кое-каких отрывочных знаний об этих терминах, но четкой картины и, главное, понимания концепции построения БД, у него нет: трехзвенки, ERP, "колизии", "Линейки серверов" - все нарублено в одну кастрюлю, как венегрет.
Это не значит, что чел безграмотный. Вполне возможно, что он спец в программировании, но в другой области., например, в 1С.  
Кроме того, на лицо явно недостаточное знание объекта автоматизации, т.е. торговли, а также делопроизводства и бухгалтерии. О чем Вам, кстати, многие тут намекали. Причем в достаточно вежливой форме.

ИМХО, стОит задуматься вместо того, чтобы банально состроить из себя оскорбленного. В следующий раз на Вас просто не будут тратить столько своего времени и внимания. Вам от этого станет легче ?

И еще напоследок: перечитайте еще раз Правила Форума. Там четко сказано, что здесь никто никому ничем не обязан. В следующий раз, прежде чем оскорбиться и, не разбирая клавиш, строчить "ответку", вспомните это золотое правило. Глядишь, и температура не будет повышаться.


Digitman   (2005-01-28 16:04:00) [12]


> вопрос стоял ели еще кто то понминт есть ли еще способы
> реализовать мехнаизм нумерации?


реализация механизма базируется на неких правилах.
с т.з. правил "нумерации входящей первички" - таких правил попросту нет.. каждый твой контрагент имеетправо нумеровать свои док-ты как ему вздумается. Отсюда и выводы соотв-щие .. для тебя .. и не только ..

что же касается уникального ID док-та в пределах базы как таковой - это НЕ имеет никакогоотношения к "нумерации входящей первички"
каждый док-т в имеет уникальный ID (он же вправе считаться первич.ключем записи для внутренних БД-связей), но не обязан иметь уникальным атрибут под названием "номер входящего документа" - последний вводится на основании реального входящего документа контрагента, этот номер контрагент формирует как ему заблагорассудится, ибо он имеет на то полное право.


Leon1   (2005-01-28 15:36:00) [13]

Мы по всей видимости гом о разных вещах, не составляет проблем сделать нумерацию, не составляет труда написать софт, и модель данных давно есть, вся база данных на лицо, и про реляционные теории мне говорить не нужно, вопрос стоял ели еще кто то понминт есть ли еще способы реализовать мехнаизм нумерации? вместо этого беспочвенные оскорбления и т.п. Просто негде подчерпнуть информацию о том как это реализуется на практике от того и неуверенность прав ли я или нет.... нормализация избыточность целостность..... транзакции... 1НФ 2НФ 3НФ 4НФ.... все это теория... у нормального программиста нормализация БД должна быть автоматически заложена... ай у меня температура 39 меня плющит...


msguns   (2005-01-28 15:20:00) [14]

>Leon1   (28.01.05 15:03)

Повторю еще раз: Вы акцентируете свое внимание абсолютно не на том ! У Вас, простите, каша в голове вместо четко представляемой модели данных, а Вы мало того, что озабочены выбором СУБД (проблема с номером Вами совершенно надумана и мы гуртом долго пытались Вам это втолковать, но, похоже, безрезультатно), так еще абсолютно мизерный трабл пытаетесь "оригинально" решить с помощью этой СУБД. Видимо, подобные задачи Вам в диковинку.
Вот Вам совет:
1. Почитайте что-нибудь о принципах реализации складского учета в торговле, посмотрите работающие программы, их интерфейс, обмен данными с БД и т.д. Поговорите со знакомыми программистами, имеющими наработки в этой области.
2. Почитайте о клиент-серверных СУБД, транзакциях, генераторах, хранимых процедурах..
3. Почитайте хотя бы в основных чертах о принципах построения баз данных, нормализации, избыточности, целостности и т.д.

Уверен, что если Вы воспользуетесь моим советом, то сабжевый вопрос отвалится сам по себе.

С уважением и пожеланием успехов в совсем нелегком деле проектирования Баз Данных.


Leon1   (2005-01-28 15:03:00) [15]

Ну положем есть в FibPlus штуевина которая может определить для InterBase значение генератора, но тем неменее когда Master запись отсутствует все равно нельзя вставлять запись в Detail таблицу с отсутсвующим Id из Master...


Sergey13   (2005-01-28 14:44:00) [16]

2[29] Leon1   (28.01.05 14:22)
>Для любой субд (и это факт) до физического попадания Записи в Master таблицу предугадать какой Id пудет не возможно, если это конечно не однопользоватльская программа

Это самое большое твое заблуждение.


Leon1   (2005-01-28 14:43:00) [17]

Мне например удобнее DateDoc,TimeDoc, может я конечно и заблуждаюсь но если использовать DateTime то каким образом можно отгруппировать документы в итоге по дням? здается мне что полсе GROUP BY (DateRimeDoc) я получу отдельной строчкой кажный документ...???


Anatoly Podgoretsky   (2005-01-28 14:40:00) [18]

Соловьев ©   (28.01.05 13:08) [22]
Предпочитаю MS SQL и я, но на него деньги нужны и не малые. А FireBird бесплатен.

Заблуждение MS SQL тоже бесплатен, но только сооветстующая облегченная версия, называется MSDE

Leon1   (28.01.05 14:22) [29]
1) Таблица содержит(ID,NumDoc,DateDoc,TimeDoc); -> (ID,NumDoc, DateTimeDoc);


Leon1   (2005-01-28 14:29:00) [19]

Я не упорствую на счет парадокса, поймите меня правильно... я если честно сма склонен к использованию Interbase или еще чего - то из Линейки SQL серверов...


Leon1   (2005-01-28 14:24:00) [20]

Можно расценить как крик души, а что разве с помошью Paradox нельзя создать путевую трехзвенку?  ;-)


Страницы:   1 2 3

Наверх

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