Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Отмена операций  [new]
ilshatkin
Member

Откуда:
Сообщений: 154
Знатоки,
посоветуйте, пожалуйста, каким образом решить следующую задачу.

Есть программа - клиент к ms sql для ведения складского учета. Это программа для проведения операций с товаром вызывает хранимые процедуры. В результате исполнения хранимой процедуры, например отгрузки товара, изменяются данные в разных таблицах, например, в таблицах наличия товара, журнал операций и т.п.

Есть необходимость иметь возможность отмены проведенной операций, пусть даже изменения только после последней операции, т.е. изменения после последнего вызова хранимой процедуры.

Можно, конечно, это сделать на уровне приложения и делать отмену операции с помощью прописанных правил для каждого типа операции.

Но терзают смутные сомнения, что это можно сделать это на уровне БД, просто откатив последние изменения, как это делается в случае неуспешного вызова ХП со следующей конструкцией

BEGIN TRY
BEGIN TRANCOMMIT
  -- разные вызовы 
END TRY
BEGIN CATCH -- Сюда попадаем, если произошла ошибка.
  IF @@TRANCOUNT>0 ROLLBACK
END CATCH


Можно ли нумеровать успешные вызовы и при необходимости делать откаты по ним или например только по последнему вызову ХП?

Буду очень благодарен даже за наводки в матчасть, а за более подробные мысли и советы тем более.
4 авг 14, 01:57    [16394039]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
ilshatkin
Member

Откуда:
Сообщений: 154
ms sql 2008 r2
4 авг 14, 02:02    [16394047]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Нифига не понятно. Но надо просто знать, что закомиченную транзакцию откатить нельзя.

И да, в обычных там программах с программах со складами (и прочим матаном) отмена операции делается обратной проводкой.
4 авг 14, 02:50    [16394076]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
ilshatkin
Но терзают смутные сомнения, что это можно сделать это на уровне БД, просто откатив последние изменения, как это делается в случае неуспешного вызова ХП со следующей конструкцией
Нет, такого механизма нет и не может быть. Поток транзакций затрагивает множество данных, и в общем случае невозможно откатить какую то старую транзакцию, не затронув изменения, сделанные более поздними.

Так что нужно либо делать обратные операции, либо откатывать все транзакции с какого то момента.
4 авг 14, 08:53    [16394220]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Серверные транзакции - это не складские/бухгалтерские транзакции. Они служат только механизмом поддержания целостности данных. Склад/бухгалтерия должны оперировать своими транзакциями на уровне бизнес-логики.
Правильно не отменять транзакцию, а вносить корректировки (называйте их как хотите). Операций "задним числом" в учёте не должно быть.
4 авг 14, 11:20    [16394798]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
ilshatkin
Member

Откуда:
Сообщений: 154
Спасибо за отклики.

Да, я понимаю что отмену операций в бухгалтерии правильно и нужно делать доп. проводкой.

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

Понимаете, пользователю намного проще просто отменить продажу, если он что то внес неправильно. От этого и база "чище" и юзабилити программы возрастает.

Может есть варианты? прописывать правила для каждой операции не охота
4 авг 14, 12:27    [16395273]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
Glory
Member

Откуда:
Сообщений: 104760
ilshatkin
Понимаете, пользователю намного проще просто отменить продажу, если он что то внес неправильно.

От этого серверные транзакции не становятся бухгалтерскими транзакциями.
4 авг 14, 12:30    [16395295]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
ilshatkin
прописывать правила для каждой операции не охота
Наймите программиста, пусть сделает за вас.

Кнопки "отменить" в MSSQL нету. Если охота, ведите свой складской учет в экселе.
4 авг 14, 13:30    [16395637]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
ilshatkin, для " отменить продажу" должны быть составлены бизнес-требования, так, чтобы эту операция можно было запрограммировать.
Т.е. должно существовать формализованное описание того, какие действия необходимо выполнить при отмене продажи, в каких случаях отмена недопустима и т.д.
4 авг 14, 14:13    [16395949]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4270
ilshatkin
Понимаете, пользователю намного проще просто отменить продажу, если он что то внес неправильно. От этого и база "чище" и юзабилити программы возрастает.

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

Как вариант делайте промежуточное состояние продажи. Что-то типа "на проверке".
Проверили - нажали кнопку "Провести" или "Подвтердить".
После этого только обратной операцией.
4 авг 14, 14:25    [16396017]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
ilshatkin
Member

Откуда:
Сообщений: 154
Владислав Колосов
ilshatkin, для " отменить продажу" должны быть составлены бизнес-требования, так, чтобы эту операция можно было запрограммировать.
Т.е. должно существовать формализованное описание того, какие действия необходимо выполнить при отмене продажи, в каких случаях отмена недопустима и т.д.


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

Ну в общем понятно, что закомиченную транзакцию, пусть даже последнюю, отменить не получится.

Придется сделать отдельную таблицу в которую писать все изменения по хронологии и отменять на основе этой таблицы
4 авг 14, 14:32    [16396053]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
ilshatkin
Member

Откуда:
Сообщений: 154
SQL2008
ilshatkin
Понимаете, пользователю намного проще просто отменить продажу, если он что то внес неправильно. От этого и база "чище" и юзабилити программы возрастает.

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

Как вариант делайте промежуточное состояние продажи. Что-то типа "на проверке".
Проверили - нажали кнопку "Провести" или "Подвтердить".
После этого только обратной операцией.


До бухгалтерии эти данные не успели бы еще дойти, то есть отмена в течении минуты, например.


"Провести" или "Подвтердить" можно, но это в итоге получится после сотого нажатия на них, начнут автоматом нажимать "Провести", "Подвтердить", не проверяя. А потом видят что, например отгрузили не тот товар или не с того склада и начинаем сначала.
Людям свойственно ошибаться, тем более если делают монотонные операции((.
4 авг 14, 14:50    [16396186]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
Konst_One
Member

Откуда:
Сообщений: 11540
к SQL - серверу и транзакциям ваши проблемы вообще не относятся. Вам следует хорошенько спроектировать работу вашего клиентского приложения.
4 авг 14, 14:52    [16396193]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
Glory
Member

Откуда:
Сообщений: 104760
ilshatkin
начнут автоматом нажимать "Провести", "Подвтердить", не проверяя.

Так пускай "Подтвердить" нажимают другие люди. Которые "сразу видят", а не потом.
4 авг 14, 14:52    [16396196]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4270
ilshatkin
... начнут автоматом нажимать "Провести", "Подвтердить", не проверяя...

Если следовать этой логике, то когда-нибудь такие люди перестанут смотреть на экран когда вводят цифры.
Может быть уже определить границу, после которой нужно увольнять человека и брать на его место адекватного,
отвечающего за свои действия?
4 авг 14, 14:57    [16396226]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
ilshatkin
Спасибо за отклики.

Да, я понимаю что отмену операций в бухгалтерии правильно и нужно делать доп. проводкой.

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

Понимаете, пользователю намного проще просто отменить продажу, если он что то внес неправильно. От этого и база "чище" и юзабилити программы возрастает.

Может есть варианты? прописывать правила для каждой операции не охота


Да, конечно есть варианты, придуманы около 2000 лет назад. Называется двойная бухгалтерская запись. Достаточно её реализовать в нормальном виде в СУБД и большинство проблем решится само собой.

Каждая проводка хратится строкой в БД и в ней указано что откуда пришло и куда ушло. Чтобы получить обороты надо просуммировать проводки по определенным признакам, а для получения остатков нужна сумма нарастающим итогом.

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

Если же у вас бухгалтерия реализована, как правка "остатков" на "счетах", то ничего хорошего у вас не выйдет в любом случае.
4 авг 14, 14:58    [16396233]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
Glory
ilshatkin
начнут автоматом нажимать "Провести", "Подвтердить", не проверяя.

Так пускай "Подтвердить" нажимают другие люди. Которые "сразу видят", а не потом.


Тогда это будет оооооооооочень долго. И все равно будет немаленький процент ошибок.
4 авг 14, 15:00    [16396242]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
Glory
Member

Откуда:
Сообщений: 104760
gandjustas
Тогда это будет оооооооооочень долго.

Так вам быстро надо или правильно ?

gandjustas
И все равно будет немаленький процент ошибок.

Т.е. кладовщик "отгрузит" реальный товар, несоответствующий накладной, и нажмет "Подтвердить" ?
4 авг 14, 15:04    [16396273]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
SQL2008
ilshatkin
... начнут автоматом нажимать "Провести", "Подвтердить", не проверяя...

Если следовать этой логике, то когда-нибудь такие люди перестанут смотреть на экран когда вводят цифры.
Может быть уже определить границу, после которой нужно увольнять человека и брать на его место адекватного,
отвечающего за свои действия?


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

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

Тут несколько вариантов:
1) автоматическая проверка, чтобы исключить возможность ввода неверных данных, к сожалению далеко не всегда возможно.
2) Дать возможность отмены действия, чтобы пользователь не боялся ченить не так сделать.
3) Многошаговые проверки нетипичных случаев (согласования).

Надо применять все три варианта вместе, тогда можно создать удобную и надежную систему.
4 авг 14, 15:08    [16396307]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
Konst_One
Member

Откуда:
Сообщений: 11540
поэтому то уже давно для складов используют терминальные комплексы с мобильными терминалами сбора данных
4 авг 14, 15:09    [16396322]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
Glory
gandjustas
Тогда это будет оооооооооочень долго.

Так вам быстро надо или правильно ?

Надо и быстро, и правильно. И не надо рассказывать что это невозможно - вполне возможно.

Glory
gandjustas
И все равно будет немаленький процент ошибок.

Т.е. кладовщик "отгрузит" реальный товар, несоответствующий накладной, и нажмет "Подтвердить" ?

В заголовке накладной будет отгрузка колес, а в позициях будет колбаса (ошибся оператор при вводе). Кладовщик заметит? Маловероятно.
4 авг 14, 15:12    [16396346]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
ilshatkin
Member

Откуда:
Сообщений: 154
gandjustas
Да, конечно есть варианты, придуманы около 2000 лет назад. Называется двойная бухгалтерская запись. Достаточно её реализовать в нормальном виде в СУБД и большинство проблем решится само собой.

Каждая проводка хратится строкой в БД и в ней указано что откуда пришло и куда ушло. Чтобы получить обороты надо просуммировать проводки по определенным признакам, а для получения остатков нужна сумма нарастающим итогом.

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

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


Спасибо за совет, про двойную бухгалтерскую запись знаю, сознательно не использую, так как приложение - это простая складская программа. "Для получения остатков нужна сумма нарастающим итогом" - в первую очередь из-за этого, нет желания постоянно пересчитывать и потом еще периоды закрывать
4 авг 14, 15:15    [16396376]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
ilshatkin
Спасибо за совет, про двойную бухгалтерскую запись знаю, сознательно не использую, так как приложение - это простая складская программа. "Для получения остатков нужна сумма нарастающим итогом" - в первую очередь из-за этого, нет желания постоянно пересчитывать и потом еще периоды закрывать
Пробовали в свое время делать и с проводками, и без (ибо была "простая складская программа"). В итоге, без проводок оказалось хуже, а писанины при этом не меньше.
4 авг 14, 15:22    [16396433]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
Glory
Member

Откуда:
Сообщений: 104760
gandjustas
Glory
пропущено...

Т.е. кладовщик "отгрузит" реальный товар, несоответствующий накладной, и нажмет "Подтвердить" ?

В заголовке накладной будет отгрузка колес, а в позициях будет колбаса (ошибся оператор при вводе). Кладовщик заметит? Маловероятно.

В каком еще заголовке ?
У вас в документе отгружаемый товар добавляется в двух независимых полях ?
Может у вас кладовщик еще товар выдает по словесному описанию клиента ?

gandjustas
Glory
пропущено...

Так вам быстро надо или правильно ?

Надо и быстро, и правильно. И не надо рассказывать что это невозможно - вполне возможно.

Ну так это вы говорите "Тогда это будет оооооооооочень долго."
4 авг 14, 15:23    [16396436]     Ответить | Цитировать Сообщить модератору
 Re: Отмена операций  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
ilshatkin
Спасибо за совет, про двойную бухгалтерскую запись знаю, сознательно не использую, так как приложение - это простая складская программа. "Для получения остатков нужна сумма нарастающим итогом" - в первую очередь из-за этого, нет желания постоянно пересчитывать и потом еще периоды закрывать


У вас взаимоисключающие параграфы. Вы НЕ знаете двойную бухгалтерскую запись если считаете, что надо "закрывать периоды" в СУБД.

Имея таблицу проводок не представляет никаких сложностей сделать индексированные представления, которые вам будут считать обороты за день\месяц\квартал\год.

Далее также просто сделать функцию, которая суммирует дебет и кредит по индексированным представлениям, получая сумму остатка а заданную дату. Причем все это делается inline-функциями, которые потом нормаль пережевывает оптимизатор.

Классическая статья на эту тему - http://rsdn.ru/article/db/RDBMS.xml

Статья кстати 2002 года, но до сих пор многие уверены, что надо "закрывать периоды".
4 авг 14, 15:24    [16396449]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить