Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
Многоуважаемый All, помогите выбрать принцип организации сохранения данных. Документы, такие как Клиенты, Поставщики, Накладные будет иметь кнопки “Сохранить”, “Отмена”. Клиент пишется на Delphi, база MS SQL Server. В общем, остановились на двух вариантах, но интересует ваше мнение относительно только накладных: 1) Вся инфа сразу пишется в базу, т.е. при создании, редактировании, удалении продукции из накладной все это сразу попадает в базу, где срабатываю триггеры, и сразу обновляются таблицы складских остатков. Затем, если тыкается кнопка “Сохранить”, то ничо не делается - типа все сохранено :) и закрывается окно, “Отмена” – длается дикий откат, ведь все надо восстановить в первоначальное состояние. Преимущества: остатки правятся автоматом триггерами Недостатки: по сути, вообще некорректный подход, т.е. документ появляется в базе, но кнопка Save еще не нажата; если зависает прога, то документ так и остается, хотя он не был сохранен; Если корректно восстанавливать остатки после “Отмена”, то всю служебную инфу остатков тоже надо куда-то засасывать, а не только ProdID, Qty. 2) Вся инфа по редакированию данных накладной кешируется на клиенте и только когда пользователь тыкает “Сохранить” данные пишутся на сервер, НО тут возникает такая проблема, как заблокировать количество продукции для накладной, ведь данные сразу не пишутся в базу. Возникла такая идея, записывать инфу о продукции из не сохраненных накладных во временную таблицу, так чтоб видели все сессии, а остатки всегда должны рассчитываться с учетом данных в этой временной таблице. Преимущества: накладная либо пишется, либо нет, Недостатки: не совсем понятен механизм резервирования остатков во временной таблице, например, если прога зависла, как сделать чтоб данные этой сессии исчезли. Интересны Ваши мысли по этому поводу, и если есть опыт поделитель, пожалуйста, кто как такое делает. Alex. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2005, 13:22 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
Губо говоря, кнопок должно быть три - Отменить, Сохранить , Выполнить. Все изменения в учетных регистрах - по Выполнить. Ищите по форуму - про документы было... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2005, 13:32 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
Мне второй вариант кажется единственно возможным. Alex UstasНО тут возникает такая проблема, как заблокировать количество продукции для накладной, ведь данные сразу не пишутся в базу. Эта проблема большей частью надумана. Вдруг все 100 продавцов кинутся одновременно продавать последний чайник со склада. Это (в реале) бывает нечасто или у вас много продавцов и мало товара. Лечится установкой условия на количество>0 и реакцией программы, на исключительную ситуацию. ИМХО все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2005, 13:56 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
Зависи от того, в какой области работает система. Иногда лучше разделить на провести-распровести. Для некоторых областей лучшим вариантом будет проведение данных сразу при сохранении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2005, 14:05 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
СерегаЭта проблема большей частью надумана. А за меньшую часть разработчик получает по шее СерегаВдруг все 100 продавцов кинутся одновременно продавать последний чайник со склада. Это (в реале) бывает нечасто Если торговать неходовым дешевым товаром, то нечасто. Если недешевым и в хорошем ассортименте - по многим позициям завоз составляет несколько штук (собственно, всего месяц назад два продавца чуть не передрались из-за того, что один из них продал мне последнюю материнку). Если ходовым.. вспоминаю рассказ одного из заказчиков, как ему пришлось объяснять подъезжавшим браткам, что заказанные ими по телефону новейшие понтовые мобильники закончились на складе. СерегаЛечится установкой условия на количество>0 и реакцией программы, на исключительную ситуацию. Настолько гениально, что нуждается в дополнительных пояснениях. Хотя бы - установкой куда и на какое именно количество. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2005, 14:10 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
softwarerА за меньшую часть разработчик получает по шее От этого все равно не уйти. Главное оплату полностью получить. softwarerЕсли торговать неходовым дешевым товаром, то нечасто...... Тут и правда надо уточнить кто чем и как торгует. И не путать систему заказов с отгрузкой. softwarerНастолько гениально, что нуждается в дополнительных пояснениях. Хотя бы - установкой куда и на какое именно количество. Так на остаток и устанавливается. Можно блокировать минуса, можно предупреждение выдавать, если минуса допустимы. Это по условиям надо смотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2005, 14:34 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
Как вариант сделал так, что все сразу пишется во вспомогательные таблицы, которые практически являются копией рабочих. Тогда сохранить - хранимка в трансакции переписывает данные в рабочую и удаляет во вспомогательной (здесь можно и остатки переписать, хотя я повесил триггер на рабочие) Отменить - просто удаление из вспомогательных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2005, 21:01 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
Нет решения. Только организационные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2005, 08:48 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
Может быть ввести понятие резервирование товара? Плюс разделить на тех кто резервирует и тех кто отпускает. Менеджер резервирует товар. Дальше на скаладе отпускают в порядке поступления и приоритетов менеджеров, например наиглавнейший менеджер может перебить своим заказом заказ какого нибудь поменьше. Я встречался с таким вариантом в фарм. компании, когда резервировали товар несколько человек, а отпуском занимались другие. Резервирование товара не значит что покупатель его гарантировано получит. Гарантии ему могут дать только в момент отгрузки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2005, 10:31 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
Ну очень похоже :) http://www.sql.ru/forum/actualthread.aspx?tid=145611&hl=%e7%e0%e4%e0%f7%ea%e0#1179068 Правда можно решить еще легче используя SET LOCK TIMEOUT NOT WAIT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2005, 10:42 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
В догонку. Резервирование товара позволяет как бы разделить процесс во времени. Сначала резервируем из того что есть (остатки минус резерв), затем отпускаем то что зарезервировано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2005, 10:58 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
Если кому интересно, как будем делать: Основополагающий принципы: - Кеширование самой накладной на сервере - Короткая транзакция записи - Резерв продукции в специалной таблице резервов - Расчет отстатков продукции с учетов таблицы резервов 1) Резерв При указании кол-ва продукции в накладной, запускается sp с параметрами SessionID, GUID, PoductID, Qty, где SessionID - сессия GUID - уникальный номер, ведь в рамках сессии может быть несколько одноврмеменно набираемых докуметов PoductID - код продукции Qty - кол-во При это, если есть достаточное кол-во продукции, то заносится необходимая инфа в таблицу резерва 2) Сохранение данных При сохранении, можно выполнить код как на стороне клиента, так и триггерами. В случае триггера GUID придется писать в шапку накладной. При этом по данным в резерве обновляется склад и очищается резерв. 3) Отмена изменений Очищается резерв 4) Подсчет остатков, чистка зависших сессий. При подстчете остатков, необходимо смотреть, все ли сесии в резерве активны, и если есть подвисшие то кдалять их, и затем считать остатки. Alex. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2005, 15:29 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
Alex UstasЕсли кому интересно, как будем делать: Основополагающий принципы: - Кеширование самой накладной на сервере - Короткая транзакция записи - Резерв продукции в специалной таблице резервов - Расчет отстатков продукции с учетов таблицы резервов Alex. апшипка, читать так: Основополагающий принципы: - Кеширование самой накладной на клиенте - Короткая транзакция записи - Резерв продукции в специалной таблице резервов - Расчет отстатков продукции с учетов таблицы резервов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2005, 15:32 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
Господин Черный плащ абсолютно прав - Alex Ustas ИМХО ошибочно объединил два процесса: процесс резервирования товара и процесс фактической отгрузки. Накладная не должна использоваться как документ резервирования - она предназначена (в бухучете) для фиксации момента фактического перехода права собственности на товарно-материальные ценности. Процесс резервирования производится документом "Заказ покупателя". Для того, чтобы избежать ситуации, когда один и тот-же товар оказывается зарезервирован несколькими sales-managers используется механизм "регистр заказов", в котором фиксируются все действующие заказы. При проведении документа "заказ покупателя" проверяется количество товара на складе и количество заказанного. в случае превышения заказов над фактическими остатками включается механизм "заказ поставщику на основании заказа покупателя". В некоторых случаях целесообразно формировать движение по регистру "Заказы покупателей" сразу же по окончанию ввода строки в документ "Заказ покупателя". Это позволит действовать по принципу "Кто успел, тот и съел" при большом количестве sales-managers. При реализации данного алгоритма также возникают интересные коллизии, но и их можно решить без появления эксцессов типа "обманутые братки", то бишь заказчики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2005, 21:21 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
UrryMcAГосподин Черный плащ абсолютно прав - Alex Ustas ИМХО ошибочно объединил два процесса: процесс резервирования товара и процесс фактической отгрузки. Накладная не должна использоваться как документ резервирования - она предназначена (в бухучете) для фиксации момента фактического перехода права собственности на товарно-материальные ценности. Процесс резервирования производится документом "Заказ покупателя". Для того, чтобы избежать ситуации, когда один и тот-же товар оказывается зарезервирован несколькими sales-managers используется механизм "регистр заказов", в котором фиксируются все действующие заказы. При проведении документа "заказ покупателя" проверяется количество товара на складе и количество заказанного. в случае превышения заказов над фактическими остатками включается механизм "заказ поставщику на основании заказа покупателя". В некоторых случаях целесообразно формировать движение по регистру "Заказы покупателей" сразу же по окончанию ввода строки в документ "Заказ покупателя". Это позволит действовать по принципу "Кто успел, тот и съел" при большом количестве sales-managers. При реализации данного алгоритма также возникают интересные коллизии, но и их можно решить без появления эксцессов типа "обманутые братки", то бишь заказчики. не, никакой ошибки нет, резервирование идет только под накладную и в процессе создания накладной, для пользователя абсолютно прозрачно и он об этом не подозревает. Это необходимо чтоб не использовать длинные транзакции, т.е. если использовать штатные средатва, то нормальной рабочей проги не получиться, это что-то вроде попытки обмануть природу ;) А по поводу резервирования Заказом, тут просто такая штука, прога на западный рынок, и у них есть такое понятие как backorders - т.е. недопоставленная продукция, т.е. на основание invoice в который не полностью покрывает sales order можно сгенерировать backorder - т.е. что необходимо допоставить, и усе, нормальная практика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2005, 13:36 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
>А по поводу резервирования Заказом Понятно. Схема в данном случае может быть и с накладной. Зависит исключительно от бизнес-процесса. Ничего в этом случае сказать не могу - т.к. не знаю Ваш бизнес процесс. >>не, никакой ошибки нет, резервирование идет только под накладную и в >>процессе создания накладной, для пользователя абсолютно прозрачно и он >>об этом не подозревает. Это необходимо чтоб не использовать длинные >>транзакции, т.е. если использовать штатные средатва, то нормальной >>рабочей проги не получиться, это что-то вроде попытки обмануть природу ;) Можно подробнее? Какие "штатные средства" и откуда возникли "длинные" транзакции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2005, 13:46 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
UrryMcA>А по поводу резервирования Заказом Понятно. Схема в данном случае может быть и с накладной. Зависит исключительно от бизнес-процесса. Ничего в этом случае сказать не могу - т.к. не знаю Ваш бизнес процесс. >>не, никакой ошибки нет, резервирование идет только под накладную и в >>процессе создания накладной, для пользователя абсолютно прозрачно и он >>об этом не подозревает. Это необходимо чтоб не использовать длинные >>транзакции, т.е. если использовать штатные средатва, то нормальной >>рабочей проги не получиться, это что-то вроде попытки обмануть природу ;) Можно подробнее? Какие "штатные средства" и откуда возникли "длинные" транзакции? Ну, имеется ввиду, что задача не может быть решена в лоб, т.е. надо или логически разбивать процесс, на как тут предлагили резервирование, или как Вы предлагали Заказ, или в рамках устоявшегося процесса придумывать какие-то подпорки. Мы пошли по пути подпорок, так понятней и проще конечному пользователю. Т.е. мы хотим, чтоб накладная до сохранения могла под себя подгребать продукцию и другие пользователи уже немогли ее использовать в своих накладных, но тем не менее, пользователь всегда должен иметь возможность нажать Cancel - и все должно откатиться в первоначальное состояние. Транзакции используется короткая, тока на момент записи, когда нажимается кнопка Save. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2005, 14:16 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
>>Т.е. мы хотим, чтоб накладная до сохранения могла под себя подгребать продукцию и другие пользователи уже немогли ее использовать в своих накладных, но тем не менее, пользователь всегда должен иметь возможность нажать Cancel - и все должно откатиться в первоначальное состояние. Транзакции используется короткая, тока на момент записи, когда нажимается кнопка Save. Вполне нормальное решение, а не "подпорки" ИМХО. В аналогичной ситуации было сделано таким образом, что товар резервировался даже не в момент окончания ввода строки с товаром/количеством/суммой в документ, а в момент выбора товара в справочнике номенклатуры (количество задавалось сразу в диалоге) и при изменении количества товара в табличной части документа. Естественно - при отмене проведения документа или закрытии его без сохранения резерв аннулировался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2005, 14:22 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
Вас спасет ручная оптимистическая / пессимистическая блокировка. Оптимистическая - это что-то похожее на Ваш вариант 1, т.е. в базе может храниться несколько версий данных, при сохранении проверяется, редактировались ли сохраняемые данные за время, пока у вас открыта форма кем-либо. Если да, возникает конфликт (правила разрешения конфликта на вашей совести, т.е. можно последнюю введенную запись оставить или первую, или по времени начала редактирования отсекать). Оптимистическая предполагает, что таких конфликтов будет мало. Пессимистическая наоборот предполагает, что их будет много, т.е. при редактировании накладной она должна на логическом уровне блокироваться, чтобы никто другой не смог ее редактировать. Т.е. если вы начали редактировать накладную это будет означать, что товары, которые в ней присутствуют, заблокированы, и никто не может изменить их количество или другие параметры на время редактирования. Я бы предпочел вариант с оптимистической блокировкой, хотя он и немного сложнее в реализации, т.к. насколько я понимаю вероятность возникновения конфликтов невысокая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2005, 14:49 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
UrryMcA>>Т.е. мы хотим, чтоб накладная до сохранения могла под себя подгребать продукцию и другие пользователи уже немогли ее использовать в своих накладных, но тем не менее, пользователь всегда должен иметь возможность нажать Cancel - и все должно откатиться в первоначальное состояние. Транзакции используется короткая, тока на момент записи, когда нажимается кнопка Save. Вполне нормальное решение, а не "подпорки" ИМХО. В аналогичной ситуации было сделано таким образом, что товар резервировался даже не в момент окончания ввода строки с товаром/количеством/суммой в документ, а в момент выбора товара в справочнике номенклатуры (количество задавалось сразу в диалоге) и при изменении количества товара в табличной части документа. Естественно - при отмене проведения документа или закрытии его без сохранения резерв аннулировался. просто для этого механизма придется организовывать отдельную таблицу под резервы и инфраструкту для поддержания. это и есть подпорки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2005, 15:12 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
VladiChВас спасет ручная оптимистическая / пессимистическая блокировка. Оптимистическая - это что-то похожее на Ваш вариант 1, т.е. в базе может храниться несколько версий данных, при сохранении проверяется, редактировались ли сохраняемые данные за время, пока у вас открыта форма кем-либо. Если да, возникает конфликт (правила разрешения конфликта на вашей совести, т.е. можно последнюю введенную запись оставить или первую, или по времени начала редактирования отсекать). Оптимистическая предполагает, что таких конфликтов будет мало. Пессимистическая наоборот предполагает, что их будет много, т.е. при редактировании накладной она должна на логическом уровне блокироваться, чтобы никто другой не смог ее редактировать. Т.е. если вы начали редактировать накладную это будет означать, что товары, которые в ней присутствуют, заблокированы, и никто не может изменить их количество или другие параметры на время редактирования. Я бы предпочел вариант с оптимистической блокировкой, хотя он и немного сложнее в реализации, т.к. насколько я понимаю вероятность возникновения конфликтов невысокая. ну, тут как бы проблема даже не в собственно редактировании накладной, сама накладная кешируется на клиенте, и только по Save записывается в базу, проблема в том, что если не писать сразу в базу и не корректировать сразу остатки, то как с одной стороны, откатить все изменения произведенные на складе, если нажата кнопка Cancel, а с другой стороны, то что уже введено по не сохраненной накладной должно как-то быть уже не доступно другим пользователем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2005, 15:18 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
Alex Ustasну, тут как бы проблема даже не в собственно редактировании накладной, сама накладная кешируется на клиенте, и только по Save записывается в базу, проблема в том, что если не писать сразу в базу и не корректировать сразу остатки, то как с одной стороны, откатить все изменения произведенные на складе, если нажата кнопка Cancel, а с другой стороны, то что уже введено по не сохраненной накладной должно как-то быть уже не доступно другим пользователем. Если не писать сразу в базу, то и откатывать ничего не надо. Другое дело, что если не писать сразу в базу, то за время редактирования могут измениться остатки и на складе уже может не оказаться нужного количества товара. В общем, можно с успехом работать по обоим вариантам. В случае когда возникает описанный выше конфликт при сохранении, сохранение не производится и надо будет просто обновить данные в форме и предложить пользователю ввести их заново (это по сути дела оптимистическая блокировка в каком-то виде). В случае, когда информация сразу пишется в базу, возможно несколько вариантов: 1. Ведутся версии изменений, есть поле со статусом "Подтвержден", при этом в случае неподтверждения можно откатиться до предыдущей версии. Выборки делаются только для подтвержденных полей. 2. Ставится статус "Редактируется/не редактируется", при этом записи, которые в данный момент редактируются, недоступны для редактирования другим. Это по сути дела ваиранты с пессимистической блокировкой с подвариантами "Версионник"/"Блокировочник" :). Т.е. примерно то, что делает сама СУБД с транзакциями, только вручную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2005, 16:25 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
Поправка для пункта 1: Выборки делаются только для подтвержденных записей . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2005, 16:26 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
VladiCh Если не писать сразу в базу, то и откатывать ничего не надо. Другое дело, что если не писать сразу в базу, то за время редактирования могут измениться остатки и на складе уже может не оказаться нужного количества товара. В общем, можно с успехом работать по обоим вариантам. В случае когда возникает описанный выше конфликт при сохранении, сохранение не производится и надо будет просто обновить данные в форме и предложить пользователю ввести их заново (это по сути дела оптимистическая блокировка в каком-то виде). ... Дык в том то и дело, в базу информацию об изменяемой накладной и измененных остатках мы не пишем до Save, при этом другие пользователи должны видеть статки In Stock Product Qty - This Invoice Product Qty. Т.е. вариант, что по Save проверяется а можем ли мы со склада снять такое колво продукции, и если не можем выдать сообщение - не приемлем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2005, 16:40 |
|
||
|
Какой принцип сохранения данных выбрать
|
|||
|---|---|---|---|
|
#18+
По-моему тут или в постановке задачи что-то не так, или я ее смысл не понял. То есть остатки должны пересчитываться до нажатия кнопки Save, сразу после добавления позиции в накладную? С какой целью это делается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2005, 16:49 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=145&tid=1545532]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 270ms |
| total: | 411ms |

| 0 / 0 |
