Рабочий момент
Feb. 15th, 2012 12:15 amЕсть у нас хороший клиент, активных пользователь БизнесМенеджерАгро - основного продукта enterprice-части Wilmark'а. Сейчас у них, в связи с объединением с другой компанией, тоже нашего клиента, кстати, большие пертурбации, в том числе и со стандартом отчётности. В процессе перехода к новому формату они заказали нам серию отчётов на начисление различных расходов. Среди них есть отчёт, выдающий расчётные тарифы на перевозку ж/д транспортом реализованного товара.
Тарифные ставки для него берутся из паспорта сделки. И вот, внезапно, ставки глобально поменялись. И сей неприятный факт нужно учесть. Старый механизм уже не работает, замену мы ещё не успели перенести - и дело это не быстрое, а отчётность требуется прямо сейчас. Конечно, всегда можно поправить данные в паспорте сделки, но по разным соображениям, это неудобный и непродуктивный вариант.
Среди артефактов в системе был найден доселе неиспользуемый справочник с характерным названием "Ж/д тарифы" - по сути это табличка в базе со станцией отправки, станцией назначения и тарифом на перевозку между ними. На первое время сойдёт, а там уже нормальный блок маршрутов на подходе.
В-общем, я думал, что придётся поломать голову и повыдирать волосьев, но реальность оказалась не такой безрадостной.
Код до:
@WorkingTable - расчётная таблица,
DealItems - паспорт сделки,
@ServicesTable - табличка со статьями расходов,
wt.Quantity - количество, на которое нужно расчитать тариф
di.Amount - тарифная ставка
Код после:
Цепляем основную таблицу со сделками, и уже на неё, через тройное условие, отдельную табличку с тарифами. В SELECT'е кейсами выбираем, в зависимости от того, есть ли в справочнике тарифов данные, ставку либо из справочника, либо, как раньше, из паспорта сделки. Все довольны.
Тарифные ставки для него берутся из паспорта сделки. И вот, внезапно, ставки глобально поменялись. И сей неприятный факт нужно учесть. Старый механизм уже не работает, замену мы ещё не успели перенести - и дело это не быстрое, а отчётность требуется прямо сейчас. Конечно, всегда можно поправить данные в паспорте сделки, но по разным соображениям, это неудобный и непродуктивный вариант.
Среди артефактов в системе был найден доселе неиспользуемый справочник с характерным названием "Ж/д тарифы" - по сути это табличка в базе со станцией отправки, станцией назначения и тарифом на перевозку между ними. На первое время сойдёт, а там уже нормальный блок маршрутов на подходе.
В-общем, я думал, что придётся поломать голову и повыдирать волосьев, но реальность оказалась не такой безрадостной.
Код до:
SELECT dbo.fGetIDFirstWarehouseInChain(wt.DealID), wt.DealID, di.ServiceID, wt.Quantity, wt.Quantity*di.Amount, di.Amount FROM @WorkingTable AS wt LEFT JOIN DealItems AS di ON di.DealID = wt.DealID INNER JOIN @ServicesTable AS st ON st.ServiceID = di.ServiceID WHERE di.CDate IS NULL
@WorkingTable - расчётная таблица,
DealItems - паспорт сделки,
@ServicesTable - табличка со статьями расходов,
wt.Quantity - количество, на которое нужно расчитать тариф
di.Amount - тарифная ставка
Код после:
SELECT dbo.fGetIDFirstWarehouseInChain(wt.DealID), wt.DealID, di.ServiceID, wt.Quantity, CASE WHEN ta.TariffID IS NOT NULL THEN ta.Tariff ELSE di.Amount END *wt.Quantity, CASE WHEN ta.TariffID IS NOT NULL THEN ta.Tariff ELSE di.Amount END FROM @WorkingTable AS wt LEFT JOIN DealItems AS di ON di.DealID = wt.DealID INNER JOIN @ServicesTable AS st ON st.ServiceID = di.ServiceID LEFT JOIN Deals AS de ON di.DealID = de.DealID LEFT JOIN Tariffs AS ta ON ta.LoadingPlaceID = de.LoadingPlaceID AND ta.DestinationID = de.DestinationID AND ta.CDate IS NULL WHERE di.CDate IS NULL
Цепляем основную таблицу со сделками, и уже на неё, через тройное условие, отдельную табличку с тарифами. В SELECT'е кейсами выбираем, в зависимости от того, есть ли в справочнике тарифов данные, ставку либо из справочника, либо, как раньше, из паспорта сделки. Все довольны.