Цитата:
Сообщение от
axapter
Интересно получается. Выходят как и положительные, так и отрицательные QTY. Если отрицательные, то это обратные проводки накладной (сторно). Но не возвраты.
На что нужно обратить внимание, чтобы выгрузить возвраты?
В стандартном функционале задача не то, чтобы не решаемая, но решаемая сложным способом. Обычно делают кастомизацию, добавляя в накладную признак того, что это сторно. Но если решать "в общем случае", то логика следующая
1. В рамках одной накладной, как правило, не могут быть одновременно и отгрузки и возвраты. Т.е. либо все строки имеют положительно количество, либо отрицательное. "Смеси" быт не может. Если это не так, то это ошибка.
2. Сторно - это полная копия отгрузки. Т.е. в сумме с отгрузкой получим ноль. Если это не так, то это ошибка.
Следовательно, анализировать надо не каждую накладную в отдельности, а
сумму накладных в разрезе заказа (SalesId).
Правда, тут есть некоторые сложности с датой, поскольку, в общем случае, дата как сторно, так и дата нового проведения после сторно может быть любой. Т.е., в общем случае, под датой надо понимать дату накладной созданной самой последней. Но, опять же, есть сложности идентификации того, какую запись считать созданной "последней"
Для простоты, можно считать, что дата новой накладной не может быть меньше даты исходной накладной. Т.е. достаточно будет взять максимальное значение даты. Хотя, повторюсь, в общем случае, это может быть и не так
PHP код:
Declare @StartDate date ='2017-01-01'
Declare @EndDate date ='2017-01-31'
select
tmp.INVOICEACCOUNT AS [],
tmp.ITEMID AS [],
CONVERT(nvarchar(10),tmp.INVOICEDATE, 104) AS [],
CASE WHEN tmp.QTY>0 THEN CAST(tmp.QTY AS Integer) ELSE 0 END AS [],
CASE WHEN tmp.QTY<0 THEN CAST(-1*tmp.QTY AS INTEGER)ELSE 0 END AS []
from (
SELECT
CUSTINVOICEJOUR.SALESID,
CUSTINVOICEJOUR.INVOICEACCOUNT,
CUSTINVOICETRANS.ITEMID,
-- В общем случае, дата последней накладной может быть любой
-- но для простоты, считаем, что она не может быть меньше ранее созданных
max(CUSTINVOICEJOUR.INVOICEDATE) AS InvoiceDate,
sum(CUSTINVOICETRANS.QTY) AS qty
FROM CUSTINVOICEJOUR
INNER JOIN CUSTINVOICETRANS ON CUSTINVOICEJOUR.SALESID = CUSTINVOICETRANS.SALESID
AND CUSTINVOICEJOUR.INVOICEID = CUSTINVOICETRANS.INVOICEID
AND CUSTINVOICEJOUR.INVOICEDATE = CUSTINVOICETRANS.INVOICEDATE
AND CUSTINVOICEJOUR.NUMBERSEQUENCEGROUP = CUSTINVOICETRANS.NUMBERSEQUENCEGROUP
WHERE CUSTINVOICEJOUR.ORDERACCOUNT = N'00001грд'
AND CUSTINVOICETRANS.ITEMID = N'00001'
-- Явно указать значение DataAreaId
AND CUSTINVOICEJOUR.DATAAREAID = N'XXX'
AND CUSTINVOICETRANS.DATAAREAID = N'XXX'
group by
-- Основная группировка по SalesId, остальное - это уточнение и детализация
CUSTINVOICEJOUR.SALESID,
CUSTINVOICEJOUR.INVOICEACCOUNT,
CUSTINVOICETRANS.ITEMID
-- Ограничение по датам для результата выборки
having max(CUSTINVOICEJOUR.INVOICEDATE) between @StartDate and @EndDate
-- Исключаем из рассмотрения сторно без последующей отгрузки
AND sum(CUSTINVOICETRANS.QTY) <> 0
) as tmp