Показать сообщение отдельно
Старый 29.01.2018, 11:54   #28  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,654 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от 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.INVOICEDATE104) 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.INVOICEDATEbetween @StartDate and @EndDate
    
-- Исключаем из рассмотрения сторно без последующей отгрузки
    
AND sum(CUSTINVOICETRANS.QTY) <> 0
    
) as tmp 
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 29.01.2018 в 12:10.