Показать сообщение отдельно
Старый 26.01.2014, 19:27   #58  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Итого резюмируя, как же все таки сделать озвученный код оптимальнее и с минимальными затратами, а так же с учетом фич, которые появились в AX 2012.
X++:
While select InvGuid, ParentInvGUID,recId from current WHERE current.InvGuid == InvGUID
        Join RecId from parent WHERE parent.InvGUID  == current.ParentInvGUID
{

            SELECT FIRSTONLY RecId, AMOUNTCUR from 
            parentDistr
            WHERE parentDistr.InvGUID == InvGUID &&
                parentDistr.TransRecId == inventoryGuidInvoice.TransRecId
                //...........
                && parentDistr.JuridicalPersonId == inventoryGuidInvoice.JuridicalPersonId;
//...........
            if(parentDistr.RecId)
            {
                update_recordset parentDistrUpd
                setting 
 parentDistrUpd.AMOUNTCUR += inventoryGuidInvoice.AmountCur;//слияние к предку
            }
            else
            {
                RecordInsertList.add(InventoryGuidInvoice);
            }
    }
Далее просто
X++:
RecordInsertList.insertDatabase();
По поводу фич: в двенашке появились временные таблицы tempDB, чуть по-больше создав дополнительно таблицы для наполнения промежуточных расчетов, можно практически уйти от блокировок и все связанного, делая в конце расчета одной операцией либо обновление, либо вставку данных в базовые таблицы.

Я вообще считаю, что циклы должны быть конечными при любом раскладе, любое использование обратного приводит к некоторой расхлябанности в коде и как следствие падению производительности. Пусть лучше разработчик доказывает, что необходимо использовать именно while(true), чем закрывать на это глаза с самого начала. В принципе правильно спланированное приложение позволит выполнять запросы без while(true) и Left Join, на самом деле это уже вопрос более к архитектору приложения, нежели к разработчику. Про использование fieldList, соединений таблиц не говорю, так как этого полно можно прочитать в тренингах.

PS Да и всеж таки код с таблицами tempDB будет с точки зрения целостности, за которую идет война не одну страницу, будет более правильным, в одной транзакции одной операцией. Единственный минус - создание дополнительных объектов в репозитарии.
И не надо ждать ночи на пакетные задания
__________________
Axapta book for developer

Последний раз редактировалось MikeR; 26.01.2014 в 19:40.