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/