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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.02.2006, 18:18   #1  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Цитата:
Сообщение от Wamr
Извините, что встрял, этот запрос вообще вернет полную лажу, так как вместо SUM(dbo.INVENTSUM.POSTEDQTY) надо MAX(dbo.INVENTSUM.POSTEDQTY)

а вот с chel не согласен.В запросе нет ограничений на InventSum, а сам он никогда не чиститься, даже если всё = 0.
Не понял... Что за наезд на мой маленький запросик? С какой это стати там макс должен быть???
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
Старый 02.02.2006, 18:38   #2  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Цитата:
Сообщение от Wamr
Извините, что встрял, этот запрос вообще вернет полную лажу,
запрос действительно не даст корректных остатков на дату как я писал выше,
Цитата:
Сообщение от Wamr
так как вместо SUM(dbo.INVENTSUM.POSTEDQTY) надо MAX(dbo.INVENTSUM.POSTEDQTY)
ну проблему с умножением этого остатка на кол-во проводок это действительно решит, остается еще включить в запрос остатки сформированные проводками до 01.01.06
Цитата:
Сообщение от Wamr
а вот с chel не согласен.В запросе нет ограничений на InventSum, а сам он никогда не чиститься, даже если всё = 0.
и это прекрасно, что не чиститься !
Старый 02.02.2006, 18:42   #3  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
Цитата:
Сообщение от Alexius
ну проблему с умножением этого остатка на кол-во проводок это действительно решит, остается еще включить в запрос остатки сформированные проводками до 01.01.06
Зачем включать? Там же left outer join стоит. Включать не придется. Те остатки, по которым нет проводок после 01.01 - все равно попасть должны.
Старый 02.02.2006, 19:05   #4  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Цитата:
Сообщение от chel
Зачем включать? Там же left outer join стоит. Включать не придется. Те остатки, по которым нет проводок после 01.01 - все равно попасть должны.
Согласно обсуждаемому запросу НЕТ, так как есть условия на поля из таблицы InventTrans
Старый 02.02.2006, 18:57   #5  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Цитата:
Сообщение от Alexius
ну проблему с умножением этого остатка на кол-во проводок это действительно решит, остается еще включить в запрос остатки сформированные проводками до 01.01.06
Стоп-стоп-стоп. А зачем их включать? Идиотская задача была в том чтобы из текущих остатков вычесть проводки сформированный с даты Ф и вычесть их, чтобы получуть остатки на дату Ф....
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/

Последний раз редактировалось Recoilme; 02.02.2006 в 19:02.
Старый 02.02.2006, 18:24   #6  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 868 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Цитата:
Не понял...
Есть 1 InventSum и есть 3 InventTrans (по одной номенклатуре-аналитике)
выборка будет такая
InventSum1, InventTrans1
InventSum1, InventTrans2
InventSum1, InventTrans3
а теперь суммируем..
Старый 02.02.2006, 18:35   #7  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Цитата:
Сообщение от Wamr
Есть 1 InventSum и есть 3 InventTrans (по одной номенклатуре-аналитике)
выборка будет такая
InventSum1, InventTrans1
InventSum1, InventTrans2
InventSum1, InventTrans3
а теперь суммируем..
Торопился, сорри
И продатаареаид - тоже забЫл потому что мы аксапту запускаем с ключём -ноудатаареаид
Вобщем тормоз я
А chel всё равно не прав и карфаген должен быть разрушен (С)
Вобщем всем пока, до новых встреч в эфире
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
Старый 02.02.2006, 19:01   #8  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
ТЫТЫСЫБЕГИН

SELECT ФОРАПДЭЙТ TOP 100 dbo.INVENTSUM.ITEMID AS ITEMID, MAX(dbo.INVENTSUM.POSTEDQTY) - SUM(dbo.INVENTTRANS.QTY) AS QTY,
dbo.INVENTSUM.INVENTDIMID
FROM dbo.INVENTSUM LEFT OUTER JOIN
dbo.INVENTTRANS ON dbo.INVENTSUM.INVENTDIMID = dbo.INVENTTRANS.INVENTDIMID AND
dbo.INVENTSUM.ITEMID = dbo.INVENTTRANS.ITEMID
WHERE (dbo.INVENTTRANS.DATEPHYSICAL >= CONVERT(DATETIME, '2006-01-01 00:00:00', 102)) AND ДАТААРЕАИД = ЧТОТО AND
((dbo.INVENTTRANS.STATUSRECEIPT = 1) OR
(dbo.INVENTTRANS.STATUSISSUE = 1) OR
(dbo.INVENTTRANS.STATUSRECEIPT = 2) OR
(dbo.INVENTTRANS.STATUSISSUE = 2) OR
(dbo.INVENTTRANS.STATUSRECEIPT = 3) OR
(dbo.INVENTTRANS.STATUSISSUE = 3))
GROUP BY dbo.INVENTSUM.ITEMID, dbo.INVENTSUM.INVENTDIMID

ТЫТЫСЫКОММИТ

Теперь всё правильно???
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
Старый 02.02.2006, 19:13   #9  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Цитата:
Сообщение от Recoilme
Теперь всё правильно???
НЕА

ТЫТЫСЫБЕГИН

SELECT ФОРАПДЭЙТ TOP 100 dbo.INVENTSUM.DATAAREAID, dbo.INVENTSUM.ITEMID AS ITEMID, MAX(dbo.INVENTSUM.POSTEDQTY) - ISNULL(SUM(dbo.INVENTTRANS.QTY),0) /*Спасибо Владимиру Максимову*/ AS QTY,
dbo.INVENTSUM.INVENTDIMID
FROM dbo.INVENTSUM LEFT OUTER JOIN
dbo.INVENTTRANS ON dbo.INVENTSUM.INVENTDIMID = dbo.INVENTTRANS.INVENTDIMID AND
dbo.INVENTSUM.ITEMID = dbo.INVENTTRANS.ITEMID AND
dbo.INVENTSUM.DATAAREAID = dbo.INVENTTRANS.DATAAREAID

WHERE dbo.INVENTSUM.DATAAREAID = 'ABC' AND ((dbo.INVENTTRANS.RECID IS NULL) OR ((dbo.INVENTTRANS.DATEPHYSICAL >= CONVERT(DATETIME, '2006-01-01 00:00:00', 102)) AND ((dbo.INVENTTRANS.STATUSRECEIPT = 1) OR
(dbo.INVENTTRANS.STATUSISSUE = 1) OR
(dbo.INVENTTRANS.STATUSRECEIPT = 2) OR
(dbo.INVENTTRANS.STATUSISSUE = 2) OR
(dbo.INVENTTRANS.STATUSRECEIPT = 3) OR
(dbo.INVENTTRANS.STATUSISSUE = 3)) )
GROUP BY dbo.INVENTSUM.DATAAREAID, dbo.INVENTSUM.ITEMID, dbo.INVENTSUM.INVENTDIMID

ТЫТЫСЫКОММИТ

Последний раз редактировалось Alexius; 02.02.2006 в 19:19.
Старый 02.02.2006, 19:17   #10  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
Alexius, а где же обещанное включение в запрос проводок "до 01.01.06"?

И кстати, мы углубились уже в такие запросы, которые собственно из аксапты "никак"
Старый 02.02.2006, 19:25   #11  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Цитата:
Сообщение от chel
Alexius, а где же обещанное включение в запрос проводок "до 01.01.06"?
Проводки и не надо включать, я имел в виду остатки, хранящиеся в InventSum по которым не было проводок после 01.01.06 (то есть они сформированы проводками до 01.01.06), и это сделано
Старый 02.02.2006, 19:28   #12  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
Цитата:
Сообщение от Alexius
Проводки и не надо включать, я имел в виду остатки, хранящиеся в InventSum по которым не было проводок после 01.01.06 (то есть они сформированы проводками до 01.01.06), и это сделано
Да, точно... Что можно сказать - жжошь. Пеши чаще.
Старый 02.02.2006, 19:35   #13  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1850 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Быстрый (и простой) способ получить суммы и количества по InventTrans на дату - индексированный (или материализованный, в зависимости от СУБД) view. Из аксапты подхватывается
Единственный косяк - возможные проблемы с блокировками и более тяжелая операция обновления таблицы
__________________
-ТСЯ или -ТЬСЯ ?
Старый 02.02.2006, 19:10   #14  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,713 / 1201 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Теперь всё правильно???
Ну, если совсем уж правильно, то нужно:

MAX(InventSum) - IsNull(SUM(InventTrans),0)

И DataAreaId на обе таблицы

Да, при LEFT JOIN в директиве WHERE допустимы только условия на таблицу InventSum, а все условия на таблицу InventTrans надо перенести в условия объединения:

Код:
SELECT
	InventSum.ItemId,
	InventSum.InventDimId,
	MAX(InventSum.PostedQty) - IsNull(SUM(InventTrans.Qty),0) as Qty
FROM InventSum
LEFT JOIN InventTrans ON InventSum.InventDimId = InventTrans.InventDimId
		AND InventSum.ItemId = InventTrans.ItemId
		AND InventSum.DataAreaId = InventTrans.DataAreaId
		AND InventTrans.DatePhysical >= '20060101'
		AND (InventTrans.StatusIssue IN (1,2,3) 
			OR InventTrans.StatusReceipt IN (1,2,3))
WHERE InventSum.DataAreaId = ...
GROUP BY 
	InventSum.ItemId,
	InventSum.InventDimId

Последний раз редактировалось Владимир Максимов; 02.02.2006 в 19:19.
Старый 02.02.2006, 19:13   #15  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 868 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
пора перемещаться на SQL.RU
Alexius дело говорит, слушайте его
Старый 03.02.2006, 09:29   #16  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Цитата:
Сообщение от Wamr
пора перемещаться на SQL.RU
Alexius дело говорит, слушайте его
Боюсь там за такие запросы руки оторвут и обратно, на axforum вышлют, чтоб устрашились.
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
Старый 02.02.2006, 19:16   #17  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 868 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Еще ремарка
SUM(ISNULL(dbo.INVENTTRANS.QTY, 0))
Старый 02.02.2006, 19:20   #18  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 868 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
chel синеньким выделено
Старый 03.02.2006, 16:14   #19  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,713 / 1201 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Поскольку это все-таки форму по AXAPTA, а не филиал sql.ru, то я перевел это добро в синтаксис AXAPTA

PHP код:
static void Sum_Date_new(Args _args)
{
    
#AviFiles
    
SysOperationProgress    sysOperationProgress;

    
Qty             ostatok;
    
Int               intLine,
                      
progressTotal;
    
int               startTime;
    
FromDate    fromDate    06\\05\\2005;

    
InventSum   inventSum;
    
InventTrans inventTrans;
    
InventDim   inventDim;
    ;

    
progressTotal = (select count(RecIdfrom inventSum).recId;

    
sysOperationProgress = new SysOperationProgress();
    
sysOperationProgress.setAnimation(#AviTransfer);
    
sysOperationProgress.setCaption('Расчет остатка на дату');
    
sysOperationProgress.setTotal(progressTotal);
    
sysOperationProgress.setText("Подготовка расчета...");
    
sysOperationProgress.update(true);

// Если надо, включаем режим грязного чтения
//    inventSum.selectLocked(false);  

    
startTime timenow();
    while 
select itemIdinventDimIdmaxof(PhysicalInvent)
        
from inventSum
        group by itemId
inventDimId
            outer join sum
(Qty)
            
from inventTrans
            where inventTrans
.ItemId == inventSum.ItemId
                
&& inventTrans.inventDimId == inventSum.InventDimId
                
&& ((inventTrans.DateInvent fromDate
                    || (! 
inventTrans.DateInvent && inventTrans.DatePhysical fromDate))
                && (
inventTrans.StatusIssue == StatusIssue::Sold
                    
|| inventTrans.StatusIssue == StatusIssue::Deducted
                    
|| inventTrans.StatusIssue == StatusIssue::Picked
                    
|| inventTrans.StatusReceipt == StatusReceipt::Purchased
                    
|| inventTrans.StatusReceipt == StatusReceipt::Received
                    
|| inventTrans.StatusReceipt == StatusReceipt::Registered)
                
exists join recId
                from inventDim
                where inventDim
.inventDimId == inventSum.InventDimId
                    
&& (inventDim.InventLocationId == 'Склад')
    {
        
intLine++;
        
ostatok += inventSum.PhysicalInvent inventTrans.Qty;
        
sysOperationProgress.setText(strFmt('Осталось %1 из %2',progressTotal-intLine,progressTotal));
        
sysOperationProgress.setCount(intLine);

    }

    
sysOperationProgress.kill();
    
info(strfmt('Количество строк %1'intLine));
    
info(strfmt('На %1 остаток %2 шт'fromDateostatok));
    
info(strfmt('%1''Процесс успешно завершен'));
    
info(strfmt('Время длительности процесса: %1'time2str(timenow() - startTime,1,1)));


exists join по InventDim сделан, чтобы не возится с группировками еще и по полям из InventDim. Если делать напрямую в Query Analyzer, то можно заменить на INNER JOIN.

Так вот, большая и жирная ложка дегдя в этой бочке меда заключается в том, что такой запрос выполняется МЕДЛЕННЕЕ, чем цикл по InventSumDatePhysicalDim:: onHandQty()

На том же тестовом примере ЭТОТ запрос выполнялся примерно 1 час 20 минут. Через класс - около 50 минут. Результат одинаковый

Хотя, справедливости ради, следует отметить, что этот же самый запрос написанный напрямую в Query Analyzer выполнился примерно за минуту.
Старый 07.02.2006, 14:38   #20  
Ronin is offline
Ronin
aka awas
NavAx Club
 
16 / 30 (2) +++
Регистрация: 21.06.2004
Адрес: г. Москва
Владимиру:
Вы удивитесь, посмотрев в профайлере как Аксапта выполняет этот запрос :-)
Теги
остатки, ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Остатки на дату InventSumDatePhysical Raven Melancholic DAX: Программирование 6 10.05.2007 15:29
Остатки товара на определенную дату Lucky13 DAX: Программирование 7 27.03.2007 14:27
Скачут остатки Def DAX: Программирование 3 03.05.2006 14:27
Цена на дату создания заказа/закупки George Nordic DAX: Функционал 2 29.06.2005 15:56
Остатки dog37 DAX: Программирование 6 02.06.2005 11:25
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 19:43.