AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Функционал
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.12.2017, 13:50   #1  
axapter is offline
axapter
Участник
 
48 / 10 (1) +
Регистрация: 20.11.2017
Пока выгружаю из таблиц CUSTINVOICEJOUR и CUSTINVOICETRANS и получается такой запрос
Код:
Declare @StartDate date ='2017-07-01'
Declare @EndDate date ='2017-07-21'

SELECT	
	CUSTINVOICEJOUR.ORDERACCOUNT,
	CUSTINVOICEJOUR.INVOICEACCOUNT,
	CUSTINVOICEJOUR.INVOICEDATE,
        CUSTINVOICEJOUR.REFNUM,
        CUSTINVOICETRANS.ITEMID,
	CUSTINVOICETRANS.QTY,	
	CASE WHEN CUSTINVOICETRANS.QTY>0 THEN CUSTINVOICETRANS.QTY END Отгрузка,
	CASE WHEN CUSTINVOICETRANS.QTY<0 THEN -1 * CUSTINVOICETRANS.QTY END Возврат,
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.INVOICEDATE >= @StartDate AND CUSTINVOICEJOUR.INVOICEDATE <=@EndDate)	
	AND
	CUSTINVOICEJOUR.ORDERACCOUNT='00001ГРД'
	AND
	CUSTINVOICETRANS.ITEMID = 00001
Время выполнения запроса 5 секунд. Но в результате нету возвратов. А возвраты были. Почему так? Тут особенность в том, что в день поставки отгружается продукция и принимается возврат от предыдущих поставок

Выручка будет как расчетная?

Напоминаю, нужно в итоге получить таблицу со следующими колонками:
Код юр. лица, Код ТТ, SKU, Дата, Отгрузки шт., Возврат шт., Реализация шт..
Старый 12.12.2017, 14:33   #2  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,283 / 3491 (123) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от axapter Посмотреть сообщение
Время выполнения запроса 5 секунд.
Сделайте еще джойн по DataareaId. Время может уменьшиться. Запросы из кода X++ и запросы, которые АХ посылает к БД немного разные. АХ посылает запрос еще с фильтрацией по DataareaId по данным табличкам.

Цитата:
Сообщение от axapter Посмотреть сообщение
Но в результате нету возвратов. А возвраты были. Почему так?
Сложно дать ответ не видя данные. Думаю, что Вам надо вручную найти пару накладных и на них оттестировать конечный вид запроса. Возможно он немножко изменится. На форуме можно дать только концептуальное направление. До финального вида нужно уже идти самостоятельно

Цитата:
Сообщение от axapter Посмотреть сообщение
Выручка будет как расчетная?
В конкретном Вами приведенном запросе выручки вообще нет, т.к. запрос выбирает только количество.
__________________
Возможно сделать все. Вопрос времени
Старый 12.12.2017, 14:54   #3  
axapter is offline
axapter
Участник
 
48 / 10 (1) +
Регистрация: 20.11.2017
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Сделайте еще джойн по DataareaId. Время может уменьшиться.
Теперь быстрее стало
Старый 26.01.2018, 11:39   #4  
axapter is offline
axapter
Участник
 
48 / 10 (1) +
Регистрация: 20.11.2017
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Сложно дать ответ не видя данные. Думаю, что Вам надо вручную найти пару накладных и на них оттестировать конечный вид запроса. Возможно он немножко изменится. На форуме можно дать только концептуальное направление. До финального вида нужно уже идти самостоятельно
Если отгрузка, то фиксируется через Сведения о заявках (Заявка) - Заявка на продажу. Если возврат, то Сведения о заказе на покупку (Заказ на покупку). В аксапте отчет о продажах по документам (если присутствуют поля Номер заказа и Номер документа) на один день указывает отдельную строку для отгрузки, и отдельную строку для возврата.


Запрос на выгрузку
X++:
Declare @StartDate date ='2017-01-01'
Declare @EndDate date ='2017-01-31'

SELECT	
	CUSTINVOICEJOUR.INVOICEACCOUNT AS [ ],	
	CUSTINVOICETRANS.ITEMID AS [ ],
	CONVERT(nvarchar(10),CUSTINVOICEJOUR.INVOICEDATE, 104) AS [],		
	CASE WHEN CUSTINVOICETRANS.QTY>0 THEN CAST(CUSTINVOICETRANS.QTY AS Integer) ELSE 0 END AS [],
	CASE WHEN CUSTINVOICETRANS.QTY<0 THEN CAST(-1*CUSTINVOICETRANS.QTY AS INTEGER)ELSE 0 END AS []
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
	AND
	CUSTINVOICEJOUR.DATAAREAID=CUSTINVOICETRANS.DATAAREAID)
WHERE	
	(CUSTINVOICEJOUR.INVOICEDATE >= @StartDate AND CUSTINVOICEJOUR.INVOICEDATE <=@EndDate)	
	AND
	CUSTINVOICEJOUR.ORDERACCOUNT='00001грд'
	AND
	CUSTINVOICETRANS.ITEMID = 00001
Интересно получается. Выходят как и положительные, так и отрицательные QTY. Если отрицательные, то это обратные проводки накладной (сторно). Но не возвраты.

На что нужно обратить внимание, чтобы выгрузить возвраты?
Старый 26.01.2018, 16:06   #5  
axapter is offline
axapter
Участник
 
48 / 10 (1) +
Регистрация: 20.11.2017
Получается для получения возвратов надо еще использовать таблицу PurchTable? Важно получить и дату клиента, и дату проводки (поставки)?
Старый 26.01.2018, 17:13   #6  
axapter is offline
axapter
Участник
 
48 / 10 (1) +
Регистрация: 20.11.2017
Важно получить и дату клиента, и дату проводки (поставки)
Старый 29.01.2018, 11:54   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,657 / 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.
Старый 12.12.2017, 14:56   #8  
axapter is offline
axapter
Участник
 
48 / 10 (1) +
Регистрация: 20.11.2017
Цитата:
Сообщение от axapter Посмотреть сообщение
Выручка будет как расчетная?

Напоминаю, нужно в итоге получить таблицу со следующими колонками:
Код юр. лица, Код ТТ, SKU, Дата, Отгрузки шт., Возврат шт., Реализация шт..
Извиняюсь, не выручка, а реализация шт.
Старый 30.01.2018, 15:09   #9  
potential is offline
potential
Участник
 
84 / 35 (2) +++
Регистрация: 13.04.2012
Адрес: Санкт-Петербург
Цитата:
Сообщение от axapter Посмотреть сообщение
не выручка, а реализация шт.
присмотритесь к сообщению где вам намекают плясать от InventTrans
Старый 15.02.2018, 09:16   #10  
axapter is offline
axapter
Участник
 
48 / 10 (1) +
Регистрация: 20.11.2017
Чем INVOICEDATE отличается от DATAAREAID?
Старый 15.02.2018, 10:02   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от axapter Посмотреть сообщение
Чем INVOICEDATE отличается от DATAAREAID?
Типом данных как минимум
Старый 15.02.2018, 10:09   #12  
axapter is offline
axapter
Участник
 
48 / 10 (1) +
Регистрация: 20.11.2017
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Типом данных как минимум
INVOICEDATE это DateTime, а DATAAREAID это nvarchar(4). Насколько я правильно понимаю, что эти даты совпадают по строкам. В запросе в конструкциях ON и WHERE что лучше использовать?
Старый 15.02.2018, 13:16   #13  
mdanko2000 is offline
mdanko2000
Участник
 
44 / 40 (2) +++
Регистрация: 21.04.2014
Цитата:
Сообщение от axapter Посмотреть сообщение
INVOICEDATE это DateTime, а DATAAREAID это nvarchar(4). Насколько я правильно понимаю, что эти даты совпадают по строкам. В запросе в конструкциях ON и WHERE что лучше использовать?
INVOICEDATE - дата накладной
DATAAREAID внутренний идентификатор компании
IMHO: в ON сцепка по обеим полям обязательна
а в Where желательно указать из какой компании DATAAREAID делается выборка
IMHO2: во все индексы генерируемые из среды, ядро всегда добавляет DATAAREAID при генерации на сервере
За это сообщение автора поблагодарили: S.Kuskov (2), БАХ43 (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вопрос по Проектам PSA DAX: Функционал 35 19.01.2007 22:26
Вопрос по проектам Фиксированная цена PSA DAX: Функционал 9 29.06.2006 14:23
Еще вопрос про покрытие по аналитикам в Сводном планировании rt2 DAX: Функционал 3 24.03.2006 18:56
Вопрос по запросу (query) Александр_1975 DAX: Программирование 2 23.01.2004 17:35
Вопрос по Запросу отчета ravil DAX: Программирование 0 18.12.2003 17:06

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 09:04.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.