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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.07.2012, 17:00   #21  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от oip Посмотреть сообщение
Ок. BOMDesignerCtrl\canMoveNode
Отыскал таки
По существу - ты бы сам рекомендовал при однозначной связи потомком и родителя делать через while (true), а не через рекурсию?
__________________
Axapta book for developer
Старый 18.07.2012, 17:06   #22  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Спор ни о чем.
Например с помощью топора можно построить дом или проломить кому нибудь голову. Из этого можно сделать однозначное заключение о применимости топора в любых условиях?

Цитата:
Сообщение от MikeR Посмотреть сообщение
Отыскал таки
По существу - ты бы сам рекомендовал при однозначной связи потомком и родителя делать через while (true), а не через рекурсию?
Рекурсия может легко переполнить стек. Но это утверждение опять же ничего не значит в отрыве от конкретной задачи
Старый 18.07.2012, 17:22   #23  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от db Посмотреть сообщение
Спор ни о чем.
Какие споры?


Цитата:
Сообщение от db Посмотреть сообщение
Рекурсия может легко переполнить стек.
А это здесь зачем?
А что
X++:
while(true)
не может?!
__________________
Axapta book for developer
Старый 18.07.2012, 17:45   #24  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,740 / 404 (17) +++++++
Регистрация: 23.03.2006
ни где не встречал требований, каким образом делать проход по дереву, так что выбранный программистом подход имеет место быть. и отлавливать ошибки в таком подходе гораздо легче, чем при использовании рекурсии. но рекурсия конечно красивей
Старый 18.07.2012, 17:52   #25  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 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, 17:56   #26  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
858 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
с рекурсией поосторожнее, в 2012 она не поддерживается в CIL
Старый 18.07.2012, 17:59   #27  
egorych is offline
egorych
Участник
Самостоятельные клиенты AX
Oracle
 
761 / 154 (7) ++++++
Регистрация: 09.11.2006
Адрес: Краснодарский край
Цитата:
Сообщение от MikeR Посмотреть сообщение
А что
X++:
while(true)
не может?!
Нет, не может!
Может получиться бесконечный цикл, но переполнения не будет!
__________________
Axapta 3.0 sp - хз какой, kr2
Старый 18.07.2012, 18:13   #28  
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:15   #29  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от egorych Посмотреть сообщение
Нет, не может!
Может получиться бесконечный цикл, но переполнения не будет!
Смотря, что положить внутрь цикла.
__________________
Axapta book for developer
Старый 18.07.2012, 18:28   #30  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Вы не находите, что приведенная ссылка не имеет никакого отношения к исходному утверждению (потому как в нем не было никакой речи о закрытии/открытии транзакции внутри цикла)?

В вашем же примере получается только увеличение времени выполнения выполнения за счет лишних запросов к базе.
__________________
Axapta v.3.0 sp5 kr2
Старый 18.07.2012, 18:34   #31  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от AndyD Посмотреть сообщение
приведенная ссылка не имеет никакого отношения к исходному утверждению (потому как в нем не было никакой речи о закрытии/открытии транзакции внутри цикла)?
Вторая ссылка тоже ни о чем не говорит?
Значит вы не поняли или не смог я вам объяснить.
__________________
Axapta book for developer
Старый 18.07.2012, 18:47   #32  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
С точки зрения сохранения целостности данных обновление всего "дерева", наверно, все же нужно выполнять в одной транзакции, однако, сама по себе схема данных, из-за которой "выросло дерево" и из-за особенностей обновления которого возникают, как я понимаю, блокировки, вызывает какие-то неясные подозрения. Такое ощущение, что реализована попытка решить задачу, обычно решаемую с помощью закрытия склада, т.е. будто бы на каждом обновлении идет проход по графу зависимостей проводок и накручиваются коррекции.
Старый 18.07.2012, 19:26   #33  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Большое всем спасибо за высказанные мнения.
Наверное тему все ж таки закрою, так как за меня взялись серьезные тролли.
Приходится объяснять очевидные вещи, а это грозит перейти в обсуждение теории относительности (кто вокруг кого крутится )
Мое мнение таково, что не зря существуют в серьезных системах определенные фреймворки и надо их знать, что бы было легко поддреживать код.
А так согласен, что писать можно лишь бы работало.
В сравнение с ремонтом машин - в сервис БМВ берут слесаря после ремонта Жигулей только после переатестации, так как ремонт отличается, хотя и там и там одни и те же гайки, но подход к ремонту отличен. Да можно вручить "местному спецу" отремонтировать и БМВ, но ездить на машине скорее всего будете не долго.
__________________
Axapta book for developer
Старый 18.07.2012, 19:33   #34  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
MikeR, отвечу поскольку ты попросил.
В целом согласен с предыдущими авторами.

Прежде всего - насколько я понимаю, вопрос не об оформлении кода, а о сути метода. Метод по сути выполняет обход и обновление дерева. Причем почему-то достраивает дерево на лету. На человеческий язык пользовательской задачи этот метод я не могу перевести.

========================
С деревом в реляционных базах - плохо.
Я об этом писал http://axapta.mazzy.ru/lib/tree2/ (там ссылки есть на обсуждения у других)
Особенно плохо с универсальным деревом parent/child с произвольной глубиной.

Обход универсального дерева в реляционых базах никак не делается в один запрос.
Это по запросам.

Кроме того, работа с универсальным деревом с произвольной глубиной именно через бесконечный цикл и делается. Или через рекурсию. (Но рекурсия на сложных структурах в java выполняется сложно, поскольку в java все переменные передаются по ссылке)
Это по циклу/рекурсии.

по поводу ttsbegin/ttscommit - тоже согласен. для сохранения целостности правильно поставлено.

Цитата:
Сообщение от MikeR Посмотреть сообщение
Этот табличный метод
X++:
static void updateParent(InventoryGuidInvoice inventoryGuidInvoice)
{
    InventoryGuid           current, parent;
    InventoryGuidInvoice    parentDistr;
...
        SELECT FIRSTONLY current WHERE current.InvGuid == InvGUID;
...
        SELECT FIRSTONLY parent WHERE current.ParentInvGUID == parent.InvGUID;
...
}
можно было бы чуть пооптимизировать и сделать в один запрос.
но если у таблицы задано кэширование, то два простых запроса по одному ключу каждый будут брать данные из кэша самой Аксапты, что здорово сэкономит на запросах к SQL. Поэтому может быть и правильно, что два запроса.

====================
в общем: если в постановке задачи стояло универсальное дерево, то по-другому написать было сложно

другое дело, что деревья в реляционной базе - зло. и их просто не нужно допускать по возможности. А если уж необходимость в дереве есть, то рассмотреть возможность другого хранения ссылок (не parent/child). Почитай по ссылкам со страницы http://axapta.mazzy.ru/lib/tree2/
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: MikeR (1), alex55 (1).
Старый 18.07.2012, 19:47   #35  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Такое ощущение, что реализована попытка решить задачу, обычно решаемую с помощью закрытия склада, т.е. будто бы на каждом обновлении идет проход по графу зависимостей проводок и накручиваются коррекции.
Цитата:
Сообщение от mazzy Посмотреть сообщение
Особенно плохо с универсальным деревом parent/child с произвольной глубиной.
Да, и полностью согласен с gl00mie. Похоже на закрытие склада.
И надо помнить, что стандартное закрытие склада ограничено глубиной 50 уровней на чисто программистском уровне. Тупо чтобы не было бесконечных циклов. Но они все равно возникают время от времени

может быть и здесь нужно было ограничить?

Хороший программист должен был поднять этот метод до постановщика и обсудить возможность появления бесконечных циклов. Скорее всего, надо было менять ТЗ. Но похоже здесь проявился Программистский подход (Хоть я и обещал этот термин не использовать)
__________________
полезное на axForum, github, vk, coub.
Старый 18.07.2012, 19:53   #36  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от mazzy Посмотреть сообщение
Метод по сути выполняет обход и обновление дерева. Причем почему-то достраивает дерево на лету. На человеческий язык пользовательской задачи этот метод я не могу перевести.
и еще одно. похоже, что метод часть большой подсистемы. если бы можно было бы привести постановку задачи на исходом человеческом языке, то можно было бы обсудить насколько метод и выбранные в нем структуры отражает постановку.

если же постановку на человеческом языке привести не получается, то... с деревом в реляционной базе именно так... через зад.
__________________
полезное на axForum, github, vk, coub.
Старый 21.01.2014, 19:38   #37  
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.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
.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, время: 14:45.