powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Какой принцип сохранения данных выбрать
25 сообщений из 71, страница 1 из 3
Какой принцип сохранения данных выбрать
    #33381298
Alex Ustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Многоуважаемый All, помогите выбрать принцип организации сохранения данных. Документы, такие как Клиенты, Поставщики, Накладные будет иметь кнопки “Сохранить”, “Отмена”. Клиент пишется на Delphi, база MS SQL Server. В общем, остановились на двух вариантах, но интересует ваше мнение относительно только накладных:

1) Вся инфа сразу пишется в базу, т.е. при создании, редактировании, удалении продукции из накладной все это сразу попадает в базу, где срабатываю триггеры, и сразу обновляются таблицы складских остатков. Затем, если тыкается кнопка “Сохранить”, то ничо не делается - типа все сохранено :) и закрывается окно, “Отмена” – длается дикий откат, ведь все надо восстановить в первоначальное состояние.

Преимущества: остатки правятся автоматом триггерами
Недостатки: по сути, вообще некорректный подход, т.е. документ появляется в базе, но кнопка Save еще не нажата; если зависает прога, то документ так и остается, хотя он не был сохранен; Если корректно восстанавливать остатки после “Отмена”, то всю служебную инфу остатков тоже надо куда-то засасывать, а не только ProdID, Qty.

2) Вся инфа по редакированию данных накладной кешируется на клиенте и только когда пользователь тыкает “Сохранить” данные пишутся на сервер, НО тут возникает такая проблема, как заблокировать количество продукции для накладной, ведь данные сразу не пишутся в базу. Возникла такая идея, записывать инфу о продукции из не сохраненных накладных во временную таблицу, так чтоб видели все сессии, а остатки всегда должны рассчитываться с учетом данных в этой временной таблице.

Преимущества: накладная либо пишется, либо нет,
Недостатки: не совсем понятен механизм резервирования остатков во временной таблице, например, если прога зависла, как сделать чтоб данные этой сессии исчезли.

Интересны Ваши мысли по этому поводу, и если есть опыт поделитель, пожалуйста, кто как такое делает.

Alex.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33381350
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Губо говоря, кнопок должно быть три - Отменить, Сохранить , Выполнить.
Все изменения в учетных регистрах - по Выполнить.
Ищите по форуму - про документы было...
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33381468
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне второй вариант кажется единственно возможным.

Alex UstasНО тут возникает такая проблема, как заблокировать количество продукции для накладной, ведь данные сразу не пишутся в базу.
Эта проблема большей частью надумана. Вдруг все 100 продавцов кинутся одновременно продавать последний чайник со склада. Это (в реале) бывает нечасто или у вас много продавцов и мало товара. Лечится установкой условия на количество>0 и реакцией программы, на исключительную ситуацию.

ИМХО все.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33381504
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зависи от того, в какой области работает система.
Иногда лучше разделить на провести-распровести.
Для некоторых областей лучшим вариантом будет проведение данных сразу при сохранении.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33381525
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СерегаЭта проблема большей частью надумана.
А за меньшую часть разработчик получает по шее

СерегаВдруг все 100 продавцов кинутся одновременно продавать последний чайник со склада. Это (в реале) бывает нечасто
Если торговать неходовым дешевым товаром, то нечасто. Если недешевым и в хорошем ассортименте - по многим позициям завоз составляет несколько штук (собственно, всего месяц назад два продавца чуть не передрались из-за того, что один из них продал мне последнюю материнку). Если ходовым.. вспоминаю рассказ одного из заказчиков, как ему пришлось объяснять подъезжавшим браткам, что заказанные ими по телефону новейшие понтовые мобильники закончились на складе.

СерегаЛечится установкой условия на количество>0 и реакцией программы, на исключительную ситуацию.
Настолько гениально, что нуждается в дополнительных пояснениях. Хотя бы - установкой куда и на какое именно количество.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33381611
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerА за меньшую часть разработчик получает по шее
От этого все равно не уйти. Главное оплату полностью получить.

softwarerЕсли торговать неходовым дешевым товаром, то нечасто......
Тут и правда надо уточнить кто чем и как торгует. И не путать систему заказов с отгрузкой.

softwarerНастолько гениально, что нуждается в дополнительных пояснениях. Хотя бы - установкой куда и на какое именно количество.
Так на остаток и устанавливается. Можно блокировать минуса, можно предупреждение выдавать, если минуса допустимы. Это по условиям надо смотреть.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33382655
Фотография vma_mnt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант сделал так, что все сразу пишется во вспомогательные таблицы, которые практически являются копией рабочих.

Тогда сохранить - хранимка в трансакции переписывает данные в рабочую и удаляет во вспомогательной (здесь можно и остатки переписать, хотя я повесил триггер на рабочие)

Отменить - просто удаление из вспомогательных.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33383026
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет решения. Только организационные.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33383336
Может быть ввести понятие резервирование товара? Плюс разделить на тех кто резервирует и тех кто отпускает. Менеджер резервирует товар. Дальше на скаладе отпускают в порядке поступления и приоритетов менеджеров, например наиглавнейший менеджер может перебить своим заказом заказ какого нибудь поменьше. Я встречался с таким вариантом в фарм. компании, когда резервировали товар несколько человек, а отпуском занимались другие. Резервирование товара не значит что покупатель его гарантировано получит. Гарантии ему могут дать только в момент отгрузки.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33383367
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну очень похоже :)
http://www.sql.ru/forum/actualthread.aspx?tid=145611&hl=%e7%e0%e4%e0%f7%ea%e0#1179068
Правда можно решить еще легче используя SET LOCK TIMEOUT NOT WAIT.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33383417
В догонку. Резервирование товара позволяет как бы разделить процесс во времени. Сначала резервируем из того что есть (остатки минус резерв), затем отпускаем то что зарезервировано.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33384467
Alex Ustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если кому интересно, как будем делать:

Основополагающий принципы:
- Кеширование самой накладной на сервере
- Короткая транзакция записи
- Резерв продукции в специалной таблице резервов
- Расчет отстатков продукции с учетов таблицы резервов

1) Резерв

При указании кол-ва продукции в накладной, запускается sp
с параметрами SessionID, GUID, PoductID, Qty, где
SessionID - сессия
GUID - уникальный номер, ведь в рамках сессии может быть несколько одноврмеменно набираемых докуметов
PoductID - код продукции
Qty - кол-во

При это, если есть достаточное кол-во продукции, то заносится необходимая инфа в таблицу резерва

2) Сохранение данных

При сохранении, можно выполнить код как на стороне клиента, так и триггерами. В случае триггера
GUID придется писать в шапку накладной. При этом по данным в резерве обновляется склад и очищается резерв.

3) Отмена изменений

Очищается резерв

4) Подсчет остатков, чистка зависших сессий.

При подстчете остатков, необходимо смотреть, все ли сесии в резерве активны,
и если есть подвисшие то кдалять их, и затем считать остатки.

Alex.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33384478
Alex Ustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex UstasЕсли кому интересно, как будем делать:

Основополагающий принципы:
- Кеширование самой накладной на сервере
- Короткая транзакция записи
- Резерв продукции в специалной таблице резервов
- Расчет отстатков продукции с учетов таблицы резервов

Alex.

апшипка, читать так:

Основополагающий принципы:
- Кеширование самой накладной на клиенте
- Короткая транзакция записи
- Резерв продукции в специалной таблице резервов
- Расчет отстатков продукции с учетов таблицы резервов
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33388914
UrryMcA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господин Черный плащ абсолютно прав - Alex Ustas ИМХО ошибочно объединил два процесса: процесс резервирования товара и процесс фактической отгрузки.

Накладная не должна использоваться как документ резервирования - она предназначена (в бухучете) для фиксации момента фактического перехода права собственности на товарно-материальные ценности.

Процесс резервирования производится документом "Заказ покупателя". Для того, чтобы избежать ситуации, когда один и тот-же товар оказывается зарезервирован несколькими sales-managers используется механизм "регистр заказов", в котором фиксируются все действующие заказы. При проведении документа "заказ покупателя" проверяется количество товара на складе и количество заказанного. в случае превышения заказов над фактическими остатками включается механизм "заказ поставщику на основании заказа покупателя".

В некоторых случаях целесообразно формировать движение по регистру "Заказы покупателей" сразу же по окончанию ввода строки в документ "Заказ покупателя". Это позволит действовать по принципу "Кто успел, тот и съел" при большом количестве sales-managers.

При реализации данного алгоритма также возникают интересные коллизии, но и их можно решить без появления эксцессов типа "обманутые братки", то бишь заказчики.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33389950
Alex Ustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UrryMcAГосподин Черный плащ абсолютно прав - Alex Ustas ИМХО ошибочно объединил два процесса: процесс резервирования товара и процесс фактической отгрузки.

Накладная не должна использоваться как документ резервирования - она предназначена (в бухучете) для фиксации момента фактического перехода права собственности на товарно-материальные ценности.

Процесс резервирования производится документом "Заказ покупателя". Для того, чтобы избежать ситуации, когда один и тот-же товар оказывается зарезервирован несколькими sales-managers используется механизм "регистр заказов", в котором фиксируются все действующие заказы. При проведении документа "заказ покупателя" проверяется количество товара на складе и количество заказанного. в случае превышения заказов над фактическими остатками включается механизм "заказ поставщику на основании заказа покупателя".

В некоторых случаях целесообразно формировать движение по регистру "Заказы покупателей" сразу же по окончанию ввода строки в документ "Заказ покупателя". Это позволит действовать по принципу "Кто успел, тот и съел" при большом количестве sales-managers.

При реализации данного алгоритма также возникают интересные коллизии, но и их можно решить без появления эксцессов типа "обманутые братки", то бишь заказчики.

не, никакой ошибки нет, резервирование идет только под накладную и в процессе создания накладной, для пользователя абсолютно прозрачно и он об этом не подозревает. Это необходимо чтоб не использовать длинные транзакции, т.е. если использовать штатные средатва, то нормальной рабочей проги не получиться, это что-то вроде попытки обмануть природу ;)

А по поводу резервирования Заказом, тут просто такая штука, прога на западный рынок, и у них есть такое понятие как backorders - т.е. недопоставленная продукция, т.е. на основание invoice в который не полностью покрывает sales order можно сгенерировать backorder - т.е. что необходимо допоставить, и усе, нормальная практика.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33389989
UrryMcA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А по поводу резервирования Заказом
Понятно. Схема в данном случае может быть и с накладной. Зависит исключительно от бизнес-процесса. Ничего в этом случае сказать не могу - т.к. не знаю Ваш бизнес процесс.

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

Можно подробнее? Какие "штатные средства" и откуда возникли "длинные" транзакции?
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33390104
Alex Ustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UrryMcA>А по поводу резервирования Заказом
Понятно. Схема в данном случае может быть и с накладной. Зависит исключительно от бизнес-процесса. Ничего в этом случае сказать не могу - т.к. не знаю Ваш бизнес процесс.

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

Можно подробнее? Какие "штатные средства" и откуда возникли "длинные" транзакции?

Ну, имеется ввиду, что задача не может быть решена в лоб, т.е. надо или логически разбивать процесс, на как тут предлагили резервирование, или как Вы предлагали Заказ, или в рамках устоявшегося процесса придумывать какие-то подпорки. Мы пошли по пути подпорок, так понятней и проще конечному пользователю. Т.е. мы хотим, чтоб накладная до сохранения могла под себя подгребать продукцию и другие пользователи уже немогли ее использовать в своих накладных, но тем не менее, пользователь всегда должен иметь возможность нажать Cancel - и все должно откатиться в первоначальное состояние. Транзакции используется короткая, тока на момент записи, когда нажимается кнопка Save.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33390126
UrryMcA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>Т.е. мы хотим, чтоб накладная до сохранения могла под себя подгребать продукцию и другие пользователи уже немогли ее использовать в своих накладных, но тем не менее, пользователь всегда должен иметь возможность нажать Cancel - и все должно откатиться в первоначальное состояние. Транзакции используется короткая, тока на момент записи, когда нажимается кнопка Save.

Вполне нормальное решение, а не "подпорки" ИМХО.

В аналогичной ситуации было сделано таким образом, что товар резервировался даже не в момент окончания ввода строки с товаром/количеством/суммой в документ, а в момент выбора товара в справочнике номенклатуры (количество задавалось сразу в диалоге) и при изменении количества товара в табличной части документа.

Естественно - при отмене проведения документа или закрытии его без сохранения резерв аннулировался.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33390219
VladiCh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вас спасет ручная оптимистическая / пессимистическая блокировка. Оптимистическая - это что-то похожее на Ваш вариант 1, т.е. в базе может храниться несколько версий данных, при сохранении проверяется, редактировались ли сохраняемые данные за время, пока у вас открыта форма кем-либо. Если да, возникает конфликт (правила разрешения конфликта на вашей совести, т.е. можно последнюю введенную запись оставить или первую, или по времени начала редактирования отсекать). Оптимистическая предполагает, что таких конфликтов будет мало.
Пессимистическая наоборот предполагает, что их будет много, т.е. при редактировании накладной она должна на логическом уровне блокироваться, чтобы никто другой не смог ее редактировать. Т.е. если вы начали редактировать накладную это будет означать, что товары, которые в ней присутствуют, заблокированы, и никто не может изменить их количество или другие параметры на время редактирования.
Я бы предпочел вариант с оптимистической блокировкой, хотя он и немного сложнее в реализации, т.к. насколько я понимаю вероятность возникновения конфликтов невысокая.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33390309
Alex Ustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UrryMcA>>Т.е. мы хотим, чтоб накладная до сохранения могла под себя подгребать продукцию и другие пользователи уже немогли ее использовать в своих накладных, но тем не менее, пользователь всегда должен иметь возможность нажать Cancel - и все должно откатиться в первоначальное состояние. Транзакции используется короткая, тока на момент записи, когда нажимается кнопка Save.

Вполне нормальное решение, а не "подпорки" ИМХО.

В аналогичной ситуации было сделано таким образом, что товар резервировался даже не в момент окончания ввода строки с товаром/количеством/суммой в документ, а в момент выбора товара в справочнике номенклатуры (количество задавалось сразу в диалоге) и при изменении количества товара в табличной части документа.

Естественно - при отмене проведения документа или закрытии его без сохранения резерв аннулировался.

просто для этого механизма придется организовывать отдельную таблицу под резервы и инфраструкту для поддержания. это и есть подпорки.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33390332
Alex Ustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VladiChВас спасет ручная оптимистическая / пессимистическая блокировка. Оптимистическая - это что-то похожее на Ваш вариант 1, т.е. в базе может храниться несколько версий данных, при сохранении проверяется, редактировались ли сохраняемые данные за время, пока у вас открыта форма кем-либо. Если да, возникает конфликт (правила разрешения конфликта на вашей совести, т.е. можно последнюю введенную запись оставить или первую, или по времени начала редактирования отсекать). Оптимистическая предполагает, что таких конфликтов будет мало.
Пессимистическая наоборот предполагает, что их будет много, т.е. при редактировании накладной она должна на логическом уровне блокироваться, чтобы никто другой не смог ее редактировать. Т.е. если вы начали редактировать накладную это будет означать, что товары, которые в ней присутствуют, заблокированы, и никто не может изменить их количество или другие параметры на время редактирования.
Я бы предпочел вариант с оптимистической блокировкой, хотя он и немного сложнее в реализации, т.к. насколько я понимаю вероятность возникновения конфликтов невысокая.

ну, тут как бы проблема даже не в собственно редактировании накладной, сама накладная кешируется на клиенте, и только по Save записывается в базу, проблема в том, что если не писать сразу в базу и не корректировать сразу остатки, то как с одной стороны, откатить все изменения произведенные на складе, если нажата кнопка Cancel, а с другой стороны, то что уже введено по не сохраненной накладной должно как-то быть уже не доступно другим пользователем.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33390553
VladiCh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Ustasну, тут как бы проблема даже не в собственно редактировании накладной, сама накладная кешируется на клиенте, и только по Save записывается в базу, проблема в том, что если не писать сразу в базу и не корректировать сразу остатки, то как с одной стороны, откатить все изменения произведенные на складе, если нажата кнопка Cancel, а с другой стороны, то что уже введено по не сохраненной накладной должно как-то быть уже не доступно другим пользователем.
Если не писать сразу в базу, то и откатывать ничего не надо. Другое дело, что если не писать сразу в базу, то за время редактирования могут измениться остатки и на складе уже может не оказаться нужного количества товара.

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

В случае, когда информация сразу пишется в базу, возможно несколько вариантов:
1. Ведутся версии изменений, есть поле со статусом "Подтвержден", при этом в случае неподтверждения можно откатиться до предыдущей версии. Выборки делаются только для подтвержденных полей.
2. Ставится статус "Редактируется/не редактируется", при этом записи, которые в данный момент редактируются, недоступны для редактирования другим.
Это по сути дела ваиранты с пессимистической блокировкой с подвариантами "Версионник"/"Блокировочник" :). Т.е. примерно то, что делает сама СУБД с транзакциями, только вручную.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33390558
VladiCh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправка для пункта 1:
Выборки делаются только для подтвержденных записей .
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33390603
Alex Ustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VladiCh
Если не писать сразу в базу, то и откатывать ничего не надо. Другое дело, что если не писать сразу в базу, то за время редактирования могут измениться остатки и на складе уже может не оказаться нужного количества товара.

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


Дык в том то и дело, в базу информацию об изменяемой накладной и измененных остатках мы не пишем до Save, при этом другие пользователи должны видеть статки
In Stock Product Qty - This Invoice Product Qty. Т.е. вариант, что по Save проверяется а можем ли мы со склада снять такое колво продукции, и если не можем выдать сообщение - не приемлем.
...
Рейтинг: 0 / 0
Какой принцип сохранения данных выбрать
    #33390639
VladiCh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему тут или в постановке задачи что-то не так, или я ее смысл не понял.
То есть остатки должны пересчитываться до нажатия кнопки Save, сразу после добавления позиции в накладную? С какой целью это делается?
...
Рейтинг: 0 / 0
25 сообщений из 71, страница 1 из 3
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Какой принцип сохранения данных выбрать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]