LiveJournal will be undergoing maintenance on May 25, and might display errors until complete. Please see http://lj-maintenance.livejournal.com/ for details and updates.

SeaJey (seajey) wrote,
  • Location: @home
  • Music: шум вентиляторов

Рабочий момент

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

Кросспост отсюда. Комментировать можно здесь и на DW. Количество комментов там: comment count unavailable
Tags: sql, t-sql, wilmark, work
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded  

  • 0 comments