![]() |
|
Модераторы: skyboy |
![]()
|
|
| mus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 22.5.2005 Репутация: нет Всего: 1 |
(РАБОТАЕМ С MySQL)
Задача следующая: Вывести на экран результат вычисления стоимости товара после поступления новой партии на склад по средствам алгоритма вычисления средневзвешенного. Заказчик всегда должен знать средневзвешенную стоимость товара. Средневзвешенная стоимость считается так: ( стоимость_товара * остаток на складе + стоимость_товара_в_новой_партии * кол_во_товара_в_новой_партии) / общее_получившееся_кол-во Например: 01.01 пришла самая первая партия товара Z по цене $10 в кол-ве 10 штук 01.02 остаток (кол-во пришедшего - кол-во проданного) = 5 шт. цена_товара_Z_в_новой_партии = 15 кол-во_в_новой_партии = 10 Итого = ( 10 * 5 + 15 * 10) / 15 = 13.3 Средневзвешенная на момент 01.02 = 13.3 01.03 остаток = 10 цена_товара_новой_партии = 25 кол-во = 20 Итого = (10 * 13.3 + 25 * 20) / 30 = 21.1 Так вот, среднешвзвешенное хранить не представляется возможным, так как в случае удаления факта закупки (например - удалили вторую запись из пяти) или удаления факта продажи нам придется пересчитывать это значение. Так вот, чтобы построить такой запрос логично ли использовать ЛИШЬ ресурсы MySQL? И представляется ли возможным вообще без наличия хранимых процедур (использую 4-ю версию) решить эту задачу с помощью лишь SQL-запроса? Как осуществить подобие рекурсии для решения этой задачи? |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
ок. посмотрим. тебе надо получить для каждого товара средневзвешенную цену, да?
таблица Товары idТовара название таблица Склад(незначимые в данном случае поля, вроде даты поступления и т.д. отбросим) idТовара количество цена таблица Поступление idТовара количество цена
|
|||
|
||||
| mus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 22.5.2005 Репутация: нет Всего: 1 |
Нет, схема такая...
Очень формально (использую лишь нужные атрибуты): PRODUCTION production_id title weight ORDER (Закупка) order_id date trans_cost (стоимость транс. нужна при расчете цены) supplier_id (ИД поставщика) SUP_ORD (Характеристическая связь "многие-ко-многим" между поставщиками, заказами и продукцией) sup_ord_id order_id production_id quantity price SALE (Продажи) sale_id date trans_cost client_id SALE_CLIENT (Характеристическая связь "многие-ко-многим" sale_client_id sale_id production_id quantity price |
|||
|
||||
| Бонифаций |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 827 Регистрация: 15.9.2005 Где: Brisbane Репутация: 20 Всего: 40 |
1) удалять старые (не последнюю добавленную ) записи - это неправильно. Воспитанные бухгалтеры так не поступают. Воспитанные бухгалтеры в случае ошибок добавляют новую сторнировочную (корректирующую) запись
2) почему нельзя просто хранить в базе и количество и закупочную цену всех товаров? тогда средневзвешенная стоимость считается просто select товар, sum( количество * цена)/ count(*) group by товар 3) а в какой таблице вы храните текущие остатки на складе? Или неужели пересчитываете все каждый раз исходя из order и sale? -------------------- Бонифаций. |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
тяжело было её в первом посте привести? :-/ не совсем
а то получается средняя для партии полная цена почему "неправильно"? Нет, удалять из базы, конечно, ничего нельзя - народ должен знать своих "героев". но зачем добавлять "корректирующие записи", если можно сделать так, что для пользователя удаление будет похоже на удаление - не видно в списке, не участвует в расчете? нужные атрибуты(исходя из формулы): количество единиц в партии стоимость единицы в партии название товара партии(для полноты статистики) В приведенной схеме перечислено намного больше полей. Чтоб запутать, или просто кроме названия продукта и средневзвешенной цены надо что-то ещё? |
|||
|
||||
| Бонифаций |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 827 Регистрация: 15.9.2005 Где: Brisbane Репутация: 20 Всего: 40 |
Именно потому что не участвует в расчетах. Если вы удалите вчерашнюю запись, то (скажем) отчеты за день, уже подписанные бухгалтером и подшитые, становятся недействительными. А списание товаров, которые убыли сегодня утром, произошло по неправильной цене. И т.д. и т.п. Разрешение править бухгалтерские или складские документы задним числом - рано или поздно приводит к проблемам. В том числе с аудитом. Поэтому если делать по уму то удалять можно только те записи которые только что добавил (сам). Это сообщение отредактировал(а) Бонифаций - 4.3.2007, 14:45 -------------------- Бонифаций. |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
||||
|
||||
| Бонифаций |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 827 Регистрация: 15.9.2005 Где: Brisbane Репутация: 20 Всего: 40 |
именно. Не фиктивные а корректирующие. На момент времени когда это обнаружили. Это называется "сторнирующая запись".
Это сообщение отредактировал(а) Бонифаций - 4.3.2007, 19:41 -------------------- Бонифаций. |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Я что-то не понимаю... ну таблица прихода, надо посчитать средневзвешенное, которое мы хранить не собираемся... корректировки какие-то...
Но ведь где-то есть и таблица расходов. С количествами и ценами... Если в первой таблице сложить весь приход в деньгах и в штуках, то же проделать с таблицей расходов, а потом вычесть - распрекрасно получаем остаток и в штуках, и в рублях. Поделив, получаем средневзвешенную цену остатков. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |