|
![]() |
#1 |
злыдень
|
Цитата:
Сообщение от Wamr
Извините, что встрял, этот запрос вообще вернет полную лажу, так как вместо SUM(dbo.INVENTSUM.POSTEDQTY) надо MAX(dbo.INVENTSUM.POSTEDQTY)
а вот с chel не согласен.В запросе нет ограничений на InventSum, а сам он никогда не чиститься, даже если всё = 0.
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/ |
|
![]() |
#2 |
Участник
|
Цитата:
Сообщение от Wamr
Извините, что встрял, этот запрос вообще вернет полную лажу,
Цитата:
Сообщение от Wamr
так как вместо SUM(dbo.INVENTSUM.POSTEDQTY) надо MAX(dbo.INVENTSUM.POSTEDQTY)
Цитата:
Сообщение от Wamr
а вот с chel не согласен.В запросе нет ограничений на InventSum, а сам он никогда не чиститься, даже если всё = 0.
![]() |
|
![]() |
#3 |
Участник
|
Цитата:
Сообщение от Alexius
ну проблему с умножением этого остатка на кол-во проводок это действительно решит, остается еще включить в запрос остатки сформированные проводками до 01.01.06
|
|
![]() |
#4 |
Участник
|
Цитата:
Сообщение от chel
Зачем включать? Там же left outer join стоит. Включать не придется. Те остатки, по которым нет проводок после 01.01 - все равно попасть должны.
|
|
![]() |
#5 |
злыдень
|
Цитата:
Сообщение от Alexius
ну проблему с умножением этого остатка на кол-во проводок это действительно решит, остается еще включить в запрос остатки сформированные проводками до 01.01.06
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/ Последний раз редактировалось Recoilme; 02.02.2006 в 19:02. |
|
![]() |
#6 |
----------------
|
Цитата:
Не понял...
выборка будет такая InventSum1, InventTrans1 InventSum1, InventTrans2 InventSum1, InventTrans3 а теперь суммируем.. |
|
![]() |
#7 |
злыдень
|
Цитата:
Сообщение от Wamr
Есть 1 InventSum и есть 3 InventTrans (по одной номенклатуре-аналитике)
выборка будет такая InventSum1, InventTrans1 InventSum1, InventTrans2 InventSum1, InventTrans3 а теперь суммируем.. ![]() И продатаареаид - тоже забЫл потому что мы аксапту запускаем с ключём -ноудатаареаид Вобщем тормоз я ![]() А chel всё равно не прав и карфаген должен быть разрушен (С) Вобщем всем пока, до новых встреч в эфире ![]()
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/ |
|
![]() |
#8 |
злыдень
|
ТЫТЫСЫБЕГИН
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 ТЫТЫСЫКОММИТ Теперь всё правильно???
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/ |
|
![]() |
#9 |
Участник
|
Цитата:
Сообщение от 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. |
|
![]() |
#10 |
Участник
|
Alexius, а где же обещанное включение в запрос проводок "до 01.01.06"?
И кстати, мы углубились уже в такие запросы, которые собственно из аксапты "никак" ![]() |
|
![]() |
#11 |
Участник
|
Цитата:
Сообщение от chel
Alexius, а где же обещанное включение в запрос проводок "до 01.01.06"?
![]() |
|
![]() |
#12 |
Участник
|
Цитата:
Сообщение от Alexius
Проводки и не надо включать, я имел в виду остатки, хранящиеся в InventSum по которым не было проводок после 01.01.06 (то есть они сформированы проводками до 01.01.06), и это сделано
![]() |
|
![]() |
#13 |
Модератор
|
Быстрый (и простой) способ получить суммы и количества по InventTrans на дату - индексированный (или материализованный, в зависимости от СУБД) view. Из аксапты подхватывается
![]() Единственный косяк - возможные проблемы с блокировками и более тяжелая операция обновления таблицы
__________________
-ТСЯ или -ТЬСЯ ? |
|
![]() |
#14 |
Участник
|
Цитата:
Теперь всё правильно???
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. |
|
![]() |
#15 |
----------------
|
пора перемещаться на SQL.RU
Alexius дело говорит, слушайте его ![]() |
|
![]() |
#16 |
злыдень
|
Цитата:
Сообщение от Wamr
пора перемещаться на SQL.RU
Alexius дело говорит, слушайте его ![]() ![]()
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/ |
|
![]() |
#17 |
----------------
|
Еще ремарка
SUM(ISNULL(dbo.INVENTTRANS.QTY, 0)) |
|
![]() |
#18 |
----------------
|
chel синеньким выделено
|
|
![]() |
#19 |
Участник
|
Поскольку это все-таки форму по AXAPTA, а не филиал sql.ru, то я перевел это добро в синтаксис AXAPTA
PHP код:
Так вот, большая и жирная ложка дегдя в этой бочке меда заключается в том, что такой запрос выполняется МЕДЛЕННЕЕ, чем цикл по InventSumDatePhysicalDim:: onHandQty() На том же тестовом примере ЭТОТ запрос выполнялся примерно 1 час 20 минут. Через класс - около 50 минут. Результат одинаковый Хотя, справедливости ради, следует отметить, что этот же самый запрос написанный напрямую в Query Analyzer выполнился примерно за минуту. |
|
![]() |
#20 |
aka awas
|
Владимиру:
Вы удивитесь, посмотрев в профайлере как Аксапта выполняет этот запрос :-) |
|
Теги |
остатки, ax3.0 |
|
![]() |
||||
Тема | Ответов | |||
Остатки на дату InventSumDatePhysical | 6 | |||
Остатки товара на определенную дату | 7 | |||
Скачут остатки | 3 | |||
Цена на дату создания заказа/закупки | 2 | |||
Остатки | 6 |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|