seajey: Electronic Knight (Default)
[personal profile] seajey
Есть у нас хороший клиент, активных пользователь БизнесМенеджерАгро - основного продукта enterprice-части Wilmark'а. Сейчас у них, в связи с объединением с другой компанией, тоже нашего клиента, кстати, большие пертурбации, в том числе и со стандартом отчётности. В процессе перехода к новому формату они заказали нам серию отчётов на начисление различных расходов. Среди них есть отчёт, выдающий расчётные тарифы на перевозку ж/д транспортом реализованного товара.

Тарифные ставки для него берутся из паспорта сделки. И вот, внезапно, ставки глобально поменялись. И сей неприятный факт нужно учесть. Старый механизм уже не работает, замену мы ещё не успели перенести - и дело это не быстрое, а отчётность требуется прямо сейчас. Конечно, всегда можно поправить данные в паспорте сделки, но по разным соображениям, это неудобный и непродуктивный вариант.

Среди артефактов в системе был найден доселе неиспользуемый справочник с характерным названием "Ж/д тарифы" - по сути это табличка в базе со станцией отправки, станцией назначения и тарифом на перевозку между ними. На первое время сойдёт, а там уже нормальный блок маршрутов на подходе.
В-общем, я думал, что придётся поломать голову и повыдирать волосьев, но реальность оказалась не такой безрадостной.

Код до:

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'е кейсами выбираем, в зависимости от того, есть ли в справочнике тарифов данные, ставку либо из справочника, либо, как раньше, из паспорта сделки. Все довольны.

Profile

seajey: Electronic Knight (Default)
SeaJey

April 2020

S M T W T F S
   1234
567891011
12131415161718
1920212223 2425
2627282930  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 6th, 2026 05:30 pm
Powered by Dreamwidth Studios