2016-09-22 4 views
0

Ich muss das Budget für eine bestimmte Dimension berechnen (AX 2012 R2).Berechnen Budget Balance von Code

Ich führe den folgenden Code funktioniert richtig, aber es dauert eine lange Zeit zu beenden.

Es ist, weil dies alle Haushaltssalden berechnet, die AX hat und nicht nur die, die ich will.

Am Ende, die Variable BudgetTmpBalance Es hat die Datensätze aller Budgeteinträge.

Da ist etwas, das ich nicht in Betracht ziehe. Wer weiß was ist?

Vielen Dank im Voraus.

Code:

BudgetTransactionLine    recBudgetTransactionLine; 
DimensionAttributeValueCombination recDimensionAttributeValueCombination;   
date        FiscalYearStart, FiscalYearEnd; 
AccountingDistribution    recAccountingDistribution;  
Query        query = new Query(); 
QueryBuildDataSource    qbds; 
QueryBuildDataSource    qbdsJoin; 
QueryBuildRange     qbr; 
BudgetCalculateBalance    budgetCalculateBalance = new BudgetCalculateBalance(); 
BudgetTmpBalance     budgetTmpBalance; 
DimensionDisplayValue    pDimensionDisplayValue; 

; 

pDimensionDisplayValue = "Correct Value"; 

select * from recDimensionAttributeValueCombination where recDimensionAttributeValueCombination.LedgerDimensionType == LedgerDimensionType::Budget && 
                  recDimensionAttributeValueCombination.DisplayValue  == pDimensionDisplayValue; 

FiscalYearStart = str2Date("01/04/" + int2str(year(today())), 123); 
FiscalYearEnd = str2Date("31/03/" + int2str(year(today()) + 1), 123); 

//Find recId of header that I Want (Works fine) 
select BudgetTransactionHeader from recBudgetTransactionLine where recBudgetTransactionLine.LedgerDimension == recDimensionAttributeValueCombination.RecId && 
                     (recBudgetTransactionLine.Date >= FiscalYearStart && recBudgetTransactionLine.Date <= FiscalYearEnd); 

qbds = query.addDataSource(tableNum(BudgetTransactionHeader)); 
qbr = qbds.addRange(FieldNum(BudgetTransactionHeader, TransactionStatus)); 
qbr.value(queryValue(1)); 
qbr = qbds.addRange(FieldNum(BudgetTransactionHeader, RecId)); 
qbr.value(queryValue(recBudgetTransactionLine.BudgetTransactionHeader));//Header RecId (correct value) 
qbdsJoin= qbds.addDataSource(tableNum(BudgetTransactionLine)); 
qbdsJoin.relations(false); 
qbdsJoin.fields().dynamic(NoYes::Yes); 
qbdsJoin.addLink(fieldNum(BudgetTransactionHeader, RecId), fieldNum(BudgetTransactionLine, BudgetTransactionHeader)); 
qbdsJoin.joinMode(JoinMode::InnerJoin); 

budgetCalculateBalance.parmDimensionFocus("CTA+UN+CC");  
budgetCalculateBalance.parmCalculateLedgerAmounts(NoYes::Yes); 
budgetCalculateBalance.parmFiscalCalendarRecId(Ledger::fiscalCalendar()); 
budgetCalculateBalance.parmStartDate(FiscalYearStart); 
budgetCalculateBalance.parmEndDate(FiscalYearEnd); 
budgetCalculateBalance.parmIncludeSubModels(NoYes::No); 
budgetCalculateBalance.parmIncludeAllBudgetModelsIfNotSpecified(NoYes::No); 
budgetCalculateBalance.parmBudgetModelId("TOTAL"); 
budgetCalculateBalance.parmBudgetType(); 
budgetCalculateBalance.parmAccumulateAmounts(NoYes::No); 
budgetCalculateBalance.parmLedgerCategory(CurrentOperationsTax::Current); 
budgetCalculateBalance.parmQuery(query); 
budgetTmpBalance = budgetCalculateBalance.calculatePeriodBalances(); 

Antwort

0

Gelöst Jetzt ist der Prozess, in 5 Sekunden abgeschlossen!

hier die correcto Code:

BudgetTransactionLine    recBudgetTransactionLine; 
DimensionAttributeValueCombination recDimensionAttributeValueCombination;   
date        FiscalYearStart, FiscalYearEnd; 
AccountingDistribution    recAccountingDistribution;  
Query        query; 
QueryBuildDataSource    qbds; 
QueryBuildDataSource    qbdsJoin; 
QueryBuildRange     qbr; 
BudgetCalculateBalance    budgetCalculateBalance = new BudgetCalculateBalance(); 
BudgetTmpBalance     budgetTmpBalance; 
DimensionDisplayValue    pDimensionDisplayValue; 
#define.LedgerDimensionDataSourceName('BudgetTransactionLine_1') 

; 

pDimensionDisplayValue = "Correct Value"; 

select * from recDimensionAttributeValueCombination where recDimensionAttributeValueCombination.LedgerDimensionType == LedgerDimensionType::Budget && 
                 recDimensionAttributeValueCombination.DisplayValue  == pDimensionDisplayValue; 

FiscalYearStart = str2Date("01/04/" + int2str(year(today())), 123); 
FiscalYearEnd = str2Date("31/03/" + int2str(year(today()) + 1), 123); 

//Find recId of header that I Want (Works fine) 
select BudgetTransactionHeader from recBudgetTransactionLine where recBudgetTransactionLine.LedgerDimension == recDimensionAttributeValueCombination.RecId && 
                    (recBudgetTransactionLine.Date >= FiscalYearStart && recBudgetTransactionLine.Date <= FiscalYearEnd); 

budgetCalculateBalance.parmDimensionFocus("CTA+UN+CC");  
budgetCalculateBalance.parmFiscalCalendarRecId(Ledger::fiscalCalendar()); 
budgetCalculateBalance.parmCalculateLedgerAmounts(NoYes::Yes); 
budgetCalculateBalance.parmFilterByBudgetType(NoYes::Yes); 
budgetCalculateBalance.parmIncludeSubModels(NoYes::Yes); 
budgetCalculateBalance.parmStartDate(FiscalYearStart); 
budgetCalculateBalance.parmEndDate(FiscalYearEnd); 
if(TieneCC) 
    budgetCalculateBalance.parmDimensionFocus("CTA+UN+CC"); 
else 
    budgetCalculateBalance.parmDimensionFocus("CTA+UN"); 

query = new Query(querystr(BudgetCalculateBalance)); 
BudgetTransactionManager::addDimensionCriteriaForLedgerDimension(query, recDimensionAttributeValueCombination.RecId, #LedgerDimensionDataSourceName); 
budgetCalculateBalance.parmQuery(query);   
budgetTmpBalance = budgetCalculateBalance.calculatePeriodBalances();