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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 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. Причина: ЗЫ
Старый 14.04.2007, 12:35   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Даа. Еще печальней.
NEXT же нельзя использовать для приджойненых курсоров - придется как-то сильно переделывать все. А так не хотелось
Но вопросы в принципе в силе!
Старый 14.04.2007, 13:47   #3  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
почему нельзя просто:
X++:
while select ...
?

попробуйте установить флаг `forupdate` во всех/первой таблице.
Старый 14.04.2007, 14:00   #4  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Да я уже переделал по-другому.

если сделать выборку на обновление по всем полям, то отратабывает нормально выборка. Но позже все равно вылетело бы на next - потому что это получается заджойненый курсор. Из-за этого собственно и пришлось переделать.
Изначально просто хотел минимально отклоняться от уже написанного кода. Это про метод: Classes\InventUpdate\updateDimReservePhysical
Старый 16.04.2007, 09:47   #5  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
X++:
    ttsbegin;
    while select forupdate firstTable
        join secondTable
        where secondTable.ItemId      == firstTable.ItemId
    {
        secondTable.field_1   = 1;
        secondTable.field_2  = 2;
        secondTable.update();
    }
    ttscommit;
Так должно работать
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Старый 16.04.2007, 10:34   #6  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
:)
Цитата:
Сообщение от Russland Посмотреть сообщение
Так должно работать
Так то конечно будет работать.
Интересовала ситация именно с выбором на обновление и LOCK только второго курсора.
Но и это уже не очень актуально.
Старый 05.12.2008, 00:11   #7  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
подниму старую тему, с вашего позволения...

Так можно ли всё-таки в аксе сделать join и выбрать на редактирование только одну (например) таблицу?
Аналогов SQL, типа
X++:
select ... for update of ...
нет, других способов тоже не найдено..
Может в 2009 или дальше что-то изменилось или хотя бы планируется?

Откуда возник вопрос: есть ряд запросов типа (возможно с сортировкой)
X++:
select forUpdate inventTrans where ... join InventDim where ...

select forUpdate inventSum where ... join InventDim where ...
Ну это упрощённый вариант, но идея понятна.
Ясен пень, что блокировать InventDim по смыслу здесь не нужно.
Но как это сделать не понятно.
Разбивать на 2 запроса часто не представляется возможным по причинам либо сортировки, либо производительности, либо ещё чего-то...
А блокировочки то жить очень иногда мешают...
__________________
Zhirenkov Vitaly
Старый 05.12.2008, 08:06   #8  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Цитата:
Сообщение от ZVV
...
Так можно ли всё-таки в аксе сделать join и выбрать на редактирование только одну (например) таблицу?
...
Вы в обычном SQL (например, на диалекте MS SQL 2005) можете написать запрос, которого хотите добиться из аксапты через Х++?
__________________
С уважением,
glibs®
Старый 05.12.2008, 09:31   #9  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Так можно ли всё-таки в аксе сделать join и выбрать на редактирование только одну (например) таблицу?
один из вариантов использовать exists join вместо inner.
Старый 05.12.2008, 10:18   #10  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
другой вариант. Выбирать без обновления, а уже в цикле делать какой-дь find(, true)
Старый 05.12.2008, 10:27   #11  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от glibs Посмотреть сообщение
Вы в обычном SQL (например, на диалекте MS SQL 2005) можете написать запрос, которого хотите добиться из аксапты через Х++?
в оракле - да (см. моё предыдущее сообщение, в MS SQL - незнаю, не уверен).
__________________
Zhirenkov Vitaly
Старый 05.12.2008, 10:31   #12  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от raz Посмотреть сообщение
один из вариантов использовать exists join вместо inner.
как вариант - да, но плохо что при этом придётся ещё раз выбирать inventDim, т.к. данные из него обычно нужны.

Цитата:
Сообщение от Wamr Посмотреть сообщение
другой вариант. Выбирать без обновления, а уже в цикле делать какой-дь find(, true)
Не очень хороший вариант, т.к. тогда возможны варианты с обновлениями незаблокированных данных, пока вы шаритесь по циклу. Слишком много если появляется. Или доп. проверок.

Лучше уже предыдущий вариант озвученный raz.
__________________
Zhirenkov Vitaly
Старый 05.12.2008, 10:31   #13  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Согласен с ZVV - я бы сделал метод на обновляемой таблице, потом вызывал бы его - пусть бы он на сервере и шуршал.

С Уважением,
Георгий
Старый 05.12.2008, 10:42   #14  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от George Nordic Посмотреть сообщение
Согласен с ZVV - я бы сделал метод на обновляемой таблице, потом вызывал бы его - пусть бы он на сервере и шуршал.
Не совсем, честно говоря, понял мысль?
С чем конкретно согласен и можно ли поподробнее про метод на таблице?
__________________
Zhirenkov Vitaly
Старый 05.12.2008, 10:50   #15  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
ZVV, Вы будете смеяться, но именно по этой идеологи и работает Акс4... ну и наверно 2009
ибо в нету (не работает) forupdate в 4ке (на MS SQL)
Старый 05.12.2008, 10:52   #16  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Да я за эту фразу зацепился:
Цитата:
Сообщение от ZVV Посмотреть сообщение
Разбивать на 2 запроса часто не представляется возможным по причинам либо сортировки, либо производительности, либо ещё чего-то...
И подумал, что я либо запрос бы передал в метод на таблице, либо просто параметры. А там уже по ходу пьессы бы и проапдйтил.

Либо лист обработал бы в классе (как в FormLetter сделано).

С Уважением,
Георгий
Старый 05.12.2008, 10:58   #17  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Wamr Посмотреть сообщение
ZVV, Вы будете смеяться, но именно по этой идеологи и работает Акс4... ну и наверно 2009
ибо в нету (не работает) forupdate в 4ке (на MS SQL)
Я думаю вы путаете с оптимистичными блокировками, введёнными в 4.0.
Там действительно forUpdate не идёт в базу, а потом проверяется совпадение recVersion на момент обновления. Если на таблицах убрать оптимистичную блокировку (или "хинтами" в запросе), то всё будет как и в тройке.
__________________
Zhirenkov Vitaly
Старый 05.12.2008, 11:17   #18  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
согласен, можно отключить, но поумолчанию оно включено и такое поведение считается правильным
то есть большинство запросов выполняется именно так.. выборка без блокировок с обновлением "на удачу"
Старый 05.12.2008, 12:00   #19  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Wamr Посмотреть сообщение
согласен, можно отключить, но поумолчанию оно включено и такое поведение считается правильным
то есть большинство запросов выполняется именно так.. выборка без блокировок с обновлением "на удачу"
В случае, если данные скорее всего не изменятся - да.
Но не реализовывть же мне этот механихм на 3-ке.
__________________
Zhirenkov Vitaly
Теги
ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
вызов метода из таблицы в операторе while select V777 DAX: Программирование 7 23.04.2008 09:11
Из-за пробелов не срабатывает select vasiliy DAX: Программирование 4 08.12.2006 15:04
Вопрос про Demand Planner slava09 DAX: Функционал 4 25.09.2006 11:43
joined-курсор был использован в другом операторе SELECT raz DAX: Программирование 8 08.01.2004 12:54
select FORUPDATE renat DAX: Программирование 5 10.09.2003 09:45

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

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

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