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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.07.2012, 14:26   #1  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Коллеги, что вы думаете о данном коде?
Этот табличный метод
X++:
static void updateParent(InventoryGuidInvoice inventoryGuidInvoice)
{
    InventoryGuid           current, parent;
    InventoryGuidInvoice    parentDistr;
    InvGuid                 InvGuid;
    ;

    InvGuid = inventoryGuidInvoice.InvGUID;

    ttsbegin;
    WHILE(TRUE)
    {
        SELECT FIRSTONLY current WHERE current.InvGuid == InvGUID;
        InvGUID = current.ParentInvGUID;

        SELECT FIRSTONLY parent WHERE current.ParentInvGUID == parent.InvGUID;

        if(parent)
        {
            //parentDistr.disableCache();
            SELECT FIRSTONLY
            FORUPDATE parentDistr
            WHERE parentDistr.InvGUID == InvGUID &&
                parentDistr.TransRecId == inventoryGuidInvoice.TransRecId
                //...........
                && parentDistr.JuridicalPersonId == inventoryGuidInvoice.JuridicalPersonId;

            if(parentDistr)
            {
                parentDistr.AMOUNTCUR += inventoryGuidInvoice.AmountCur;//слияние к предку
                //.......
                parentDistr.Update();
            }
            else
            {
                parentDistr.data(InventoryGuidInvoice);
                parentDistr.InvGUID = parent.InvGUID;
                parentDistr.insert();
            }
        }
        else
        {
            break;
        }

        current.clear();
    }
    ttscommit;
}
__________________
Axapta book for developer
Старый 18.07.2012, 15:07   #2  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
а что вас в нем смущает? код пробегает по цепочке "вверх" и что то апдейтит или создает. Оформление конечно страдает

Последний раз редактировалось ice; 18.07.2012 в 15:10.
Старый 18.07.2012, 15:20   #3  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Вы тоже так пишите?
Я хочу услышать мнения коллег, насколько так вообще корректно писать.
Или может у меня одного глаз замылился.
__________________
Axapta book for developer

Последний раз редактировалось MikeR; 18.07.2012 в 15:27.
Старый 18.07.2012, 15:44   #4  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от MikeR Посмотреть сообщение
Вы тоже так пишите?
Я хочу услышать мнения коллег, насколько так вообще корректно писать.
Или может у меня одного глаз замылился.
Рекурсивный метод тут лучше бы смотрелся.
Ну по крайней мере я бы использовал рекурсию...

OFFTOP: не знал, что PL\SQL Formatter можно к Х++ прикрутить...
__________________
Zhirenkov Vitaly

Последний раз редактировалось ZVV; 18.07.2012 в 15:44. Причина: синтаксис
За это сообщение автора поблагодарили: MikeR (2).
Старый 18.07.2012, 15:57   #5  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Если не касаться оформления, а именно верхних регистров SQL-операторов (лично для меня это непривычно), то while(true) в сочетании с break'ом - это очень "плохой тон", мягко говоря, в программировании в целом (не говоря уже о табличном методе в Ax), о чем, кстати, упоминал в своей книге "Совершенный код" Стив Макконнелл.
ИМХО, следует все же изучить связи таблиц и перестроить данный запрос на while select в сочетании с join'ом, пусть даже с внутренним select'ом.
Даже вложенный while не так бьет по глазам, как while(true), хотя это тоже не есть хорошо.
__________________
С уважением, Александр.
За это сообщение автора поблагодарили: MikeR (2).
Старый 18.07.2012, 15:58   #6  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Коллеги, вы не поверите, но суть в том, что цикл вообще не нужен.
X++:
WHILE(TRUE)
это стоит для того, что бы просто "запустить" выполнение.
Я подумал, что это очевидно.....
__________________
Axapta book for developer
Старый 18.07.2012, 15:59   #7  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Слов нет, одни эмоции Вспомнились комментарии в ководстве к одному "шедевру":
Цитата:
Буааууеееееееееее! Ааааа! Глаза кровоточат!
Честно минут 15 тупил, пытаясь понять глубокий смысл этого кода и заодно - такой схемы данных. Что тут еще скажешь... "Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете" (с) Стив Макконнелл
За это сообщение автора поблагодарили: MikeR (2), jeky (2), someOne (8).
Старый 18.07.2012, 16:07   #8  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Цитата:
Сообщение от MikeR Посмотреть сообщение
Коллеги, вы не поверите, но суть в том, что цикл вообще не нужен.
X++:
WHILE(TRUE)
это стоит для того, что бы просто "запустить" выполнение.
Я подумал, что это очевидно.....
Кстати, да. О чем и говорит firstonly. А теперь и мне стало интересно, зачем так было сделано - "запускать выполнение" таким образом?
__________________
С уважением, Александр.
Старый 18.07.2012, 16:08   #9  
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   #10  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от MikeR Посмотреть сообщение
Коллеги, вы не поверите, но суть в том, что цикл вообще не нужен.
X++:
WHILE(TRUE)
это стоит для того, что бы просто "запустить" выполнение.
Я подумал, что это очевидно.....
Почему? По-моему, это такой обход дерева. И без "while true" работать не будет. При каждой итерации меняется InvGUID и цикл прервется только тогда, когда не найдется parent. И "while true" при таком написании кода очень даже нужен. Понятно, что код можно переписать иначе.
Старый 18.07.2012, 16:20   #11  
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   #12  
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:29   #13  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от oip Посмотреть сообщение
Понятно, что код можно переписать иначе.
Да дело в том, что не для всех это понятно.
__________________
Axapta book for developer
Старый 18.07.2012, 16:30   #14  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от MikeR Посмотреть сообщение
Кстати, а действительно кто-нибудь пишет рекурсию через
X++:
while (true)
в Dynamics Ax?
Да, в АОТе должно быть полно примеров. Например, в классе ReqCalc.
Старый 18.07.2012, 16:31   #15  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
ИМХО, рекурсию лучше организовывать через отдельно написанную функцию внутри метода.
__________________
С уважением, Александр.

Последний раз редактировалось samolalex; 18.07.2012 в 16:33. Причина: 111
Старый 18.07.2012, 16:35   #16  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 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:37   #17  
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
Старый 18.07.2012, 16:39   #18  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от oip Посмотреть сообщение
Да, в АОТе должно быть полно примеров. Например, в классе ReqCalc.
Олег, там используется перебор коллекции
X++:
while (mi.....more())
Это немного другое дело, здесь очевидно, надо было использовать запросную часть.
__________________
Axapta book for developer
Старый 18.07.2012, 16:43   #19  
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, 16:52   #20  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от MikeR Посмотреть сообщение
Олег, там используется перебор коллекции
X++:
while (mi.....more())
Это немного другое дело, здесь очевидно, надо было использовать запросную часть.
Ок. BOMDesignerCtrl\canMoveNode
X++:
    while (true)
    {
        if (bomTableMove.RecId == bomTableDrop.RecId)
        {
            dropParent          = tree.getParent(curParent);
            bomTableDropParent  = node2BOMTable.lookup(dropParent);
            return bomTableMoveParent.RecId != bomTableDropParent.RecId || dropParent == rootId;
        }
        else
        {
            curParent = tree.getParent(curParent);
            if (curParent == rootId)
                return true;
            bomTableDrop = node2BOMTable.lookup(curParent);
        }
    }
 

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