Обсуждение: Остатки товара.

Поиск
Список
Период
Сортировка

Остатки товара.

От
"vlads"
Дата:
Допустим, есть справочник товаров (tovar) с двумя полями
x(Serial) и name(text)
т.е. код товара и его наименование.
А также справочник складов (sklad) с аналогичными полями:
x(Serial) и name(text)
Третий справочник: справочник операций прихода/расхода
(oper):
x(Serial), dat(data), xtovar(int), xsklad(int) и kol(int)
где поле kol - это кол-во прихода или расхода (штук)
товара
dat - дата операции.
а xtovar и xsklad - ссылки на коды товара и склада.
Задача такова. При добавлении строки oper система должна
автоматически в каком-нибудь третьем справочнике хранить
актуальные остатки товара: справочник остатков (ost)
x(Serial), xtovar(int), xsklad(int) и kol(int).

Проблема, с которой я к Вам обращаюсь: Как я понимаю - это
работа с триггерами. Алгоритм такой:
- Триггер должен сначала понять, есть ли вообще строка в
справочнике ost (xtovar-xsklad) и если её нету - создать
новую с нулевой суммой.
- Ну и в существующую или в созданную новую строку
добавить/отнять необходимую сумму товара.

Вопросов несколько:
1) Если это делают несколько пользователей - не случится
ли так что два пользователя одновременно не найдут пару
(xtovar-xsklad) и создадут каждый свою такую пару. И
получится дубляж строк. Как этого избежать.
2) Как понять триггеру, что нужной строки с уникальной
парой (xtovar-xsklad) нет, чтобы он создал.
3) Может кто то какой то другой вариант решения проблемы.

Заранее спасибо.

Re: [pgsql-ru-general] Остатки товара.

От
Виктор Вислобоков
Дата:
Вариантов несколько.
Многое зависит от количества товаров. Если каталог небольшой можно
использовать триггеры, если в нём сотни тысяч или миллионы позиций, а
также частое обновление, триггеры могут оказаться нерациональными. В
этом случае, возможно лучшим решением будет периодический запуск
процедуры, которая будет обсчитывать и сохранять остатки.

Можно и вообще без триггеров обойтись и всю логику с подсчётами
остатков выполнять прямо в вмомент внесения изменений в количество
товара. Т.е. запрашивать по другим таблицам остаток, менять его и
сохранять. Всё зависит от размера каталога.

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

25 апреля 2012 г. 4:59 пользователь vlads <vlads@ngs.ru> написал:
> Допустим, есть справочник товаров (tovar) с двумя полями
> x(Serial) и name(text)
> т.е. код товара и его наименование.
> А также справочник складов (sklad) с аналогичными полями:
> x(Serial) и name(text)
> Третий справочник: справочник операций прихода/расхода (oper):
> x(Serial), dat(data), xtovar(int), xsklad(int) и kol(int)
> где поле kol - это кол-во прихода или расхода (штук) товара
> dat - дата операции.
> а xtovar и xsklad - ссылки на коды товара и склада.
> Задача такова. При добавлении строки oper система должна автоматически в
> каком-нибудь третьем справочнике хранить актуальные остатки товара:
> справочник остатков (ost)
> x(Serial), xtovar(int), xsklad(int) и kol(int).
>
> Проблема, с которой я к Вам обращаюсь: Как я понимаю - это работа с
> триггерами. Алгоритм такой:
> - Триггер должен сначала понять, есть ли вообще строка в справочнике ost
> (xtovar-xsklad) и если её нету - создать новую с нулевой суммой.
> - Ну и в существующую или в созданную новую строку добавить/отнять
> необходимую сумму товара.
>
> Вопросов несколько:
> 1) Если это делают несколько пользователей - не случится ли так что два
> пользователя одновременно не найдут пару (xtovar-xsklad) и создадут каждый
> свою такую пару. И получится дубляж строк. Как этого избежать.
> 2) Как понять триггеру, что нужной строки с уникальной парой (xtovar-xsklad)
> нет, чтобы он создал.
> 3) Может кто то какой то другой вариант решения проблемы.
>
> Заранее спасибо.
>
> --
> Sent via pgsql-ru-general mailing list (pgsql-ru-general@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-ru-general