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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.07.2012, 16:08   #1  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от MikeR Посмотреть сообщение
Коллеги, вы не поверите, но суть в том, что цикл вообще не нужен.
X++:
WHILE(TRUE)
это стоит для того, что бы просто "запустить" выполнение.
Я подумал, что это очевидно.....
Так ли?
Он нужен для того что бы запускать и следующие итерации тоже, а не только первую.
Цикл будет выполнятся, кока не закончится дерево (не будет парента) и сработает брэйк.
Ну собственно такая эмуляция рекурсии...
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 18.07.2012, 16:20   #2  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Собственно да, человек запускает перебор (чтобы более корректно было), но в других местах это вообще не требуется.
Используется конструкция
X++:
while select forupdate ... {}
что само по себе плохо, так как более корректно

X++:
while select
{
	ttsbegin;
	select forupdate 
	ttscommit;
}
То есть делаем маленькие транзакции.
__________________
Axapta book for developer
Старый 18.07.2012, 16:25   #3  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Кстати, а действительно кто-нибудь пишет рекурсию через
X++:
while (true)
в Dynamics Ax?
__________________
Axapta book for developer
Старый 18.07.2012, 16:35   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от MikeR Посмотреть сообщение
Собственно да, человек запускает перебор (чтобы более корректно было), но в других местах это вообще не требуется.
Используется конструкция
X++:
while select forupdate ... {}
что само по себе плохо, так как более корректно

X++:
while select
{
	ttsbegin;
	select forupdate 
	ttscommit;
}
То есть делаем маленькие транзакции.
Что значит более корректно?
Вы хотите поломать целостность данных?
__________________
Axapta v.3.0 sp5 kr2
Старый 18.07.2012, 16:43   #5  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от AndyD Посмотреть сообщение
Что значит более корректно?
Вы хотите поломать целостность данных?
X++:
table		t1,t2;
ttsbegin;
while select t1
{
	
	select forupdate t2 where t2.recid == t1.RecId;
	.....
	t2.update(); 
	
}
ttscommit;
__________________
Axapta book for developer

Последний раз редактировалось MikeR; 18.07.2012 в 16:45.
Старый 18.07.2012, 17:52   #6  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от MikeR Посмотреть сообщение
X++:
table		t1,t2;
ttsbegin;
while select t1
{
	
	select forupdate t2 where t2.recid == t1.RecId;
	.....
	t2.update(); 
	
}
ttscommit;
И тем не менее.
В чем в этом варианте большая корректность перед первоначальным?
__________________
Axapta v.3.0 sp5 kr2
Старый 18.07.2012, 18:13   #7  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от AndyD Посмотреть сообщение
И тем не менее.
В чем в этом варианте большая корректность перед первоначальным?
Модификация огромного количества (сотни тысяч) записей в Axapta 3.0 SP4
aEremenko: Ресурс заблокирован, ждите...
__________________
Axapta book for developer

Последний раз редактировалось MikeR; 18.07.2012 в 18:29. Причина: поважнее будет
Старый 18.07.2012, 18:28   #8  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
Вы не находите, что приведенная ссылка не имеет никакого отношения к исходному утверждению (потому как в нем не было никакой речи о закрытии/открытии транзакции внутри цикла)?

В вашем же примере получается только увеличение времени выполнения выполнения за счет лишних запросов к базе.
__________________
Axapta v.3.0 sp5 kr2
Старый 21.01.2014, 19:38   #9  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от AndyD Посмотреть сообщение
И тем не менее.
В чем в этом варианте большая корректность перед первоначальным?
Таки вот что гласит документация
X++:
While select Statement with Large Transaction Scope 



ttsBegin; 
 
while select ItemId 
    from salesLine 
{ 
    select firstOnly forUpdate ItemType, ItemBuyerGroupId  
       from inventTable 
           where inventTable.ItemId == salesLine.ItemId; 
 
    If (inventTable && (inventTable.ItemType == InventItemType::Item)) 
    { 
         inventTable.ItemBuyerGroupId = ; 
         inventTable.update(); 
    } 
} 
 
ttsCommit; 


To limit the transaction scope, the code should be written to begin the transaction 
when the following criteria is met: 

While select Statement with Appropriate Transaction Scope 


while select ItemId 
    from salesLine 
{ 
    select firstOnly forUpdate ItemType, ItemBuyerGroupId  
       from inventTable 
           where inventTable.ItemId == salesLine.ItemId; 
 
    If (inventTable && (inventTable.ItemType == InventItemType::Item)) 
    { 
        ttsBegin; 
        inventTable.ItemBuyerGroupId = ; 
        inventTable.update(); 
        ttsCommit; 
    } 
}
Для AndyD DO NOT: Hold database locks for longer than is necessary.
DO: Limit the transaction scope by grabbing locks at the latest possible time and
releasing locks as early as possible.
__________________
Axapta book for developer

Последний раз редактировалось MikeR; 21.01.2014 в 19:41.
Старый 18.07.2012, 16:37   #10  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от MikeR Посмотреть сообщение
Собственно да, человек запускает перебор (чтобы более корректно было), но в других местах это вообще не требуется.
Используется конструкция
X++:
while select forupdate ... {}
что само по себе плохо, так как более корректно

X++:
while select
{
	ttsbegin;
	select forupdate 
	ttscommit;
}
То есть делаем маленькие транзакции.
Сомнительное утверждение... (по крайней мере без контекста )
__________________
Zhirenkov Vitaly
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
.NET business connector не видит изменений в коде Аксапты rkorchagin DAX: Программирование 2 22.01.2010 11:43
Номерная серия длиннее 20 символов - баг в коде Максимка DAX: Функционал 17 29.12.2009 02:11
Нужно сделать выборку из нескольких таблиц (в данном случае из четырех). niktata DAX: Программирование 10 30.09.2008 09:42
Как быстро найти "главную" процедуру обработки в коде X++ ? Gustav DAX: Программирование 12 14.02.2006 12:15
Можно ли в коде управлять свойством Mandatory? kostas DAX: Программирование 5 10.03.2004 11:14

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

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

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