18.07.2012, 17:00 | #21 |
MCT
|
Отыскал таки
По существу - ты бы сам рекомендовал при однозначной связи потомком и родителя делать через while (true), а не через рекурсию?
__________________
Axapta book for developer |
|
18.07.2012, 17:06 | #22 |
Роман Долгополов (RDOL)
|
Спор ни о чем.
Например с помощью топора можно построить дом или проломить кому нибудь голову. Из этого можно сделать однозначное заключение о применимости топора в любых условиях? Рекурсия может легко переполнить стек. Но это утверждение опять же ничего не значит в отрыве от конкретной задачи |
|
18.07.2012, 17:22 | #23 |
MCT
|
Какие споры?
А это здесь зачем? А что X++: while(true)
__________________
Axapta book for developer |
|
18.07.2012, 17:45 | #24 |
Участник
|
ни где не встречал требований, каким образом делать проход по дереву, так что выбранный программистом подход имеет место быть. и отлавливать ошибки в таком подходе гораздо легче, чем при использовании рекурсии. но рекурсия конечно красивей
|
|
18.07.2012, 17:52 | #25 |
Участник
|
Цитата:
В чем в этом варианте большая корректность перед первоначальным?
__________________
Axapta v.3.0 sp5 kr2 |
|
18.07.2012, 17:56 | #26 |
Участник
|
с рекурсией поосторожнее, в 2012 она не поддерживается в CIL
|
|
18.07.2012, 17:59 | #27 |
Участник
|
Нет, не может!
Может получиться бесконечный цикл, но переполнения не будет!
__________________
Axapta 3.0 sp - хз какой, kr2 |
|
18.07.2012, 18:13 | #28 |
MCT
|
Цитата:
aEremenko: Ресурс заблокирован, ждите...
__________________
Axapta book for developer Последний раз редактировалось MikeR; 18.07.2012 в 18:29. Причина: поважнее будет |
|
18.07.2012, 18:15 | #29 |
MCT
|
Смотря, что положить внутрь цикла.
__________________
Axapta book for developer |
|
18.07.2012, 18:28 | #30 |
Участник
|
Вы не находите, что приведенная ссылка не имеет никакого отношения к исходному утверждению (потому как в нем не было никакой речи о закрытии/открытии транзакции внутри цикла)?
В вашем же примере получается только увеличение времени выполнения выполнения за счет лишних запросов к базе.
__________________
Axapta v.3.0 sp5 kr2 |
|
18.07.2012, 18:34 | #31 |
MCT
|
Цитата:
Значит вы не поняли или не смог я вам объяснить.
__________________
Axapta book for developer |
|
18.07.2012, 18:47 | #32 |
Участник
|
С точки зрения сохранения целостности данных обновление всего "дерева", наверно, все же нужно выполнять в одной транзакции, однако, сама по себе схема данных, из-за которой "выросло дерево" и из-за особенностей обновления которого возникают, как я понимаю, блокировки, вызывает какие-то неясные подозрения. Такое ощущение, что реализована попытка решить задачу, обычно решаемую с помощью закрытия склада, т.е. будто бы на каждом обновлении идет проход по графу зависимостей проводок и накручиваются коррекции.
|
|
18.07.2012, 19:26 | #33 |
MCT
|
Большое всем спасибо за высказанные мнения.
Наверное тему все ж таки закрою, так как за меня взялись серьезные тролли. Приходится объяснять очевидные вещи, а это грозит перейти в обсуждение теории относительности (кто вокруг кого крутится ) Мое мнение таково, что не зря существуют в серьезных системах определенные фреймворки и надо их знать, что бы было легко поддреживать код. А так согласен, что писать можно лишь бы работало. В сравнение с ремонтом машин - в сервис БМВ берут слесаря после ремонта Жигулей только после переатестации, так как ремонт отличается, хотя и там и там одни и те же гайки, но подход к ремонту отличен. Да можно вручить "местному спецу" отремонтировать и БМВ, но ездить на машине скорее всего будете не долго.
__________________
Axapta book for developer |
|
18.07.2012, 19:33 | #34 |
Участник
|
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/ |
|
|
За это сообщение автора поблагодарили: MikeR (1), alex55 (1). |
18.07.2012, 19:47 | #35 |
Участник
|
Цитата:
Цитата:
И надо помнить, что стандартное закрытие склада ограничено глубиной 50 уровней на чисто программистском уровне. Тупо чтобы не было бесконечных циклов. Но они все равно возникают время от времени может быть и здесь нужно было ограничить? Хороший программист должен был поднять этот метод до постановщика и обсудить возможность появления бесконечных циклов. Скорее всего, надо было менять ТЗ. Но похоже здесь проявился Программистский подход (Хоть я и обещал этот термин не использовать) |
|
18.07.2012, 19:53 | #36 |
Участник
|
Цитата:
если же постановку на человеческом языке привести не получается, то... с деревом в реляционной базе именно так... через зад. |
|
21.01.2014, 19:38 | #37 |
MCT
|
Цитата:
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; } } 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. |
|
|
|