Добрый день.
Собственно тема в заголовке.
В руки попал большой проект на 2012-й аксапте. Код изначально похоже был написан еще в ax3.0. Во многих местах для получения остатков запросы идут к InventSum без учета InventSumDelta. В связи с этим вопрос. Если возникнет необходимость, как можно по-быстрому перевести код для учета InventsumDelta без какого либо серьезного переписывания.
Первая идея - сделать хитрую вьюху (InventSumView) cо структурой полей аналогичной InventSum, которая делает union InventSum и InventSumDelta (но из InventSumDelta нужно взять актуальные для нас строки, фильтруя их по TTSid). А дальше в коде по мере необходимости заменять запрос к InventSum на InventSumView. Тем самым соблюдается требование на минимальные переделки в коде. Можно в коде в разделе объявления переменных заменять одну строку
на
X++:
InventsumView inventsum;
и дело в шляпе.
Средствами X++ такую вьюху создать затруднительно. По крайней мере у меня пока нет идей, кроме как подменять ее определение в SQL.
Как замена создал Union-Query GRD_InventSumAllQuery (данные во вложении).
Там описанная идея реализована. Фильтрация по InventsumDelta.TTSid работает.
На SQL уходит примерно такой запрос
X++:
SELECT T1.ARRIVED,T1.AVAILORDERED,T1.AVAILPHYSICAL,T1.DEDUCTED,T1.INVENTDIMID,T1.ITEMID,T1.LASTUPDDATEEXPECTED,T1.LASTUPDDATEPHYSICAL,T1.ONORDER,T1.ORDERED,T1.PHYSICALINVENT,T1.PHYSICALVALUE,T1.PHYSICALVALUESECCUR_RU,T1.PICKED,T1.POSTEDQTY,T1.POSTEDVALUE,T1.POSTEDVALUESECCUR_RU,T1.QUOTATIONISSUE,T1.QUOTATIONRECEIPT,T1.RECEIVED,T1.REGISTERED,T1.RESERVORDERED,T1.RESERVPHYSICAL,T1.RECID,1
FROM INVENTSUM T1
WHERE ((PARTITION=5637144576)
AND (DATAAREAID=N'GRD')) UNION ALL
SELECT T1.ARRIVED,T1.AVAILORDERED,T1.AVAILPHYSICAL,T1.DEDUCTED,T1.INVENTDIMID,T1.ITEMID,T1.LASTUPDDATEEXPECTED,T1.LASTUPDDATEPHYSICAL,T1.ONORDER,T1.ORDERED,T1.PHYSICALINVENT,T1.PHYSICALVALUE,T1.PHYSICALVALUESECCUR_RU,T1.PICKED,T1.POSTEDQTY,T1.POSTEDVALUE,T1.POSTEDVALUESECCUR_RU,T1.QUOTATIONISSUE,T1.QUOTATIONRECEIPT,T1.RECEIVED,T1.REGISTERED,T1.RESERVORDERED,T1.RESERVPHYSICAL,T1.RECID,2
FROM INVENTSUMDELTA T1
WHERE (((PARTITION=5637144576)
AND (DATAAREAID=N'GRD'))
AND ((ISAGGREGATED=0)
AND (TTSID=5637758929)))
ORDER BY 6
Жаль что нельзя обращаться с Query как с вьюхой. Если бы такой было можно то проблема была бы решена, а так похоже придется извращаться с подменой текста вьюхи в SQL.
Может есть идея как еще можно сделать ?
P.S.
Ax2012 R3 CU9
P.P.S.
В этой теме
Остатки по номенклатуре в разрезе складов внутри транзакции
было обсуждение похожей проблемы
Предложили хорошие варианты решения, но здесь они не подходят так как придется сильно код переписывать.