Показать сообщение отдельно
Старый 14.04.2007, 12:19   #1  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
не срабатывает select forupdate для joined таблицы?
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), хотя в дебаггере явно вижу, что должна были отобраться записи с учетом склада (только одна аналитика активна)


ЗЫ. Возможно я просто что-то в упор не вижу?
Второй вопрос - чисто из интереса. На самом деле интересует ответ именно на первый

Последний раз редактировалось kashperuk; 14.04.2007 в 12:25. Причина: ЗЫ