Dynamics AX 3.0 SP5 KR2
SQL Server 2005
Запрос следующего вида:
X++:
static void Job37(Args _args)
{
SalesTable salesReservePhysical;
InventTrans inventTransIssue;
InventDimParm inventDimParm;
InventDim inventDim;
InventDim inventDimCriteria;
;
ttsbegin;
select salesReservePhysical
order by CustAccount
join forupdate inventTransIssue
order by InventTransId
where inventTransIssue.TransType == InventTransType::Sales &&
inventTransIssue.TransRefId == salesReservePhysical.SalesId &&
//salesReservePhysical.Active == NoYes::Yes &&
inventTransIssue.itemId == '140' &&
inventTransIssue.valueOpen == InventTransOpen::Yes &&
inventTransIssue.statusReceipt == StatusReceipt::None &&
inventTransIssue.statusIssue == StatusIssue::ReservOrdered &&
//inventTransIssue.inventTransId != movement.transId() &&
inventTransIssue.inventRefTransId == ''
#inventDimJoin(inventTransIssue.InventDimId,inventDim,inventDimCriteria,inventDimParm,DimIdIdx);
while (inventTransIssue)
{
inventTransIssue.statusIssue = StatusIssue::ReservPhysical;
//inventTransIssue.inventDimId = _inventDim.inventDimId;
inventTransIssue.update();
next inventTransIssue;
}
ttscommit;
}
Вместо SalesTable на самом деле другая таблица, но смысл похожий.
Так вот, в запросе хочу InventTrans выбрать
на обновление.
А вот запрос, который получаю в профайлере:
Оператор SQL: (SalesTable,InventTrans,InventDim) SELECT A.SALESID,…,A.CREATEDBY,A.RECVERSION,A.RECID,B.ITEMID,B.STATUSISSUE,…,B.RECID FROM
SALESTABLE A,INVENTTRANS B,INVENTDIM C WHERE (A.DATAAREAID='dat') AND ((B.DATAAREAID='dat') AND (((((((B.TRANSTYPE=0) AND (B.TRANSREFID=A.SALESID)) AND (B.ITEMID='140')) AND (B.VALUEOPEN=1)) AND (B.STATUSRECEIPT=0)) AND (B.STATUSISSUE=5)) AND (B.INVENTREFTRANSID=' '))) AND ((C.DATAAREAID='dat') AND (C.INVENTDIMID=B.INVENTDIMID)) OPTION(FAST 5) [Идентификатор=5344, Использовано повторно=Нет]
Конкретно мой случай:
Оператор SQL: (ZCH_SalesReservePhysical,InventTrans,InventDim) SELECT A.PRIORITY,A.ACTIVE,A.SALESID,A.RECVERSION,A.RECID,B.ITEMID,…,B.RECID FROM ZCH_SALESRESERVEPHYSICAL
A WITH( NOLOCK),INVENTTRANS B WITH( NOLOCK),INVENTDIM C WITH( NOLOCK) WHERE (A.DATAAREAID='dat') AND ((B.DATAAREAID='dat') AND (((((((((B.TRANSTYPE=0) AND (B.TRANSREFID=A.SALESID)) AND (A.ACTIVE=1)) AND (B.ITEMID='140')) AND (B.VALUEOPEN=1)) AND (B.STATUSRECEIPT=0)) AND (B.STATUSISSUE=5)) AND (B.INVENTTRANSID<>' ЛОТ054717')) AND (B.INVENTREFTRANSID=' '))) AND ((C.DATAAREAID='dat') AND ((C.INVENTDIMID=B.INVENTDIMID) AND (C.INVENTLOCATIONID='КВ-ПЛД-РЦ'))) ORDER BY A.DATAAREAID,A.PRIORITY,B.DATAAREAID,B.INVENTTRANSID OPTION(FAST 18,FORCE ORDER) [Идентификатор=11907, Использовано повторно=Нет]
И, собственно вопросы:
1. Как выбрать InventTrans с UPDLOCK, сохранив сортировку в указанном порядке?
2. Почему в InventDim ничего не выбирается (и в Аксапте RecId = 0), хотя в дебаггере явно вижу, что должна были отобраться записи с учетом склада (только одна аналитика активна)
ЗЫ. Возможно я просто что-то в упор не вижу?
Второй вопрос - чисто из интереса. На самом деле интересует ответ именно на первый