Thursday, 29 January 2015

Refresh AOT elements

We ran into an issue at a client site where even though I wrote a new ExchangeRateProvider class, it would not show up in the dropdown list.

It turns out we just needed to refresh the elements using this handy option in the AOT.  If you are ever not seeing your code updates reflecting in AX, this only takes a few seconds and could save you hours of headache.


Tuesday, 13 January 2015

Segments of ledger dimensions

static void SR_Extract_SegmentName_values(Args _args)
{
    #define.CostCenter("CostCenter")
    Query                                   query;
    QueryRun                                queryRun;
    QueryBuildDataSource                    qbds,qbdsDate;
    GeneralJournalAccountEntry              generalJournalAccountEntry;
    GeneralJournalEntry                     generalJournalEntry;
    container                               value = conNull();
    OMOperatingUnit                         omou;

    // Dimension
    DimensionStorage        dimensionStorage;

    // Segment
    int                     segmentCount, segmentIndex;
    DimensionStorageSegment segment;
    str 100                 segmentName, MainAccount, segmentValue;
    container               segments;
    query                   = new Query();
    qbds                    = query.addDataSource(tableNum(GeneralJournalAccountEntry));

    // Sum functional and transaction amounts

    qbds.addSelectionField(fieldNum(GeneralJournalAccountEntry, AccountingCurrencyAmount), SelectionField::Sum);
    qbds.addSelectionField(fieldNum(GeneralJournalAccountEntry, TransactionCurrencyAmount), SelectionField::Sum);
    qbds.addGroupByField(fieldNum(GeneralJournalAccountEntry, LedgerDimension));
    qbdsDate = qbds.addDataSource(tableNum(GeneralJournalEntry));
    qbdsDate.joinMode(JoinMode::InnerJoin);
    qbdsDate.fetchMode(QueryFetchMode::One2One);
    qbdsDate.addLink(fieldNum(GeneralJournalAccountEntry, GeneralJournalEntry), fieldNum(GeneralJournalEntry, RecId));
    queryRun = new QueryRun(query);

    while (queryRun.next())
    {
        generalJournalAccountEntry = queryRun.get(tableNum(generalJournalAccountEntry));
        // Get dimension storage
        dimensionStorage = DimensionStorage::findById(GeneralJournalAccountEntry.LedgerDimension);
        if (dimensionStorage == null)
        {
            throw error("@SYS83964");
        }
        // Add segments for all hierarchies
        segments = conNull();
        // Get segments
        segmentCount = dimensionStorage.segmentCountForHierarchy(1);
        for (segmentIndex = 1; segmentIndex <= segmentCount; segmentIndex++)
        {
            // Get segment
            segment = dimensionStorage.getSegmentForHierarchy(1, segmentIndex);
            if (segment.parmDimensionAttributeValueId() != 0)
            {
                // Get segment name
                segmentName = DimensionAttribute::find(DimensionAttributeValue::find(segment.parmDimensionAttributeValueId        ()).DimensionAttribute).Name;

                // Add segment value
                segmentValue = segment.parmDisplayValue();

                if (segmentIndex == 1)
                {
                    MainAccount = segmentValue;
                }

                if (segmentName == #CostCenter)
                {
                   info("Main account – " +  MainAccount);
                   info("Segment Name – " + segmentName);
                   info("Cost center – "  + segmentValue);
                   info(strFmt(‘Total TransactionCurrency amount – %1′,generalJournalAccountEntry.TransactionCurrencyAmount));
                   info(strFmt(‘Total AccountingCurrency amount – %1′, generalJournalAccountEntry.AccountingCurrencyAmount));
                   info("______________________________________");
                }
            }
        }
    }
}

Build Ledger Dimensions

RecId getDimension(str _ledgerAccount, str _businessUnit, str _costCentre, str _jurisdiction, str _subscriberType)  
 {  
   DimensionServiceProvider      DimensionServiceProvider = new DimensionServiceProvider();  
   LedgerAccountContract        LedgerAccountContract = new LedgerAccountContract();  
   DimensionAttributeValueContract   ValueContract;  
   List                ListValueContract = new List(Types::Class);  
   dimensionAttributeValueCombination dimensionAttributeValueCombination;  
   DimensionStorage          dimStorage;  
   if (_businessUnit)  
   {  
     ValueContract = new DimensionAttributeValueContract();  
     ValueContract.parmName('BusinessUnit') ;  
     ValueContract.parmValue(_businessUnit);  
     ListValueContract.addEnd(ValueContract);  
   }  
   if (_costCentre)  
   {  
     ValueContract = new DimensionAttributeValueContract();  
     ValueContract.parmName('CostCentre') ;  
     ValueContract.parmValue(_costCentre);  
     ListValueContract.addEnd(ValueContract);  
   }  
   if (_jurisdiction)  
   {  
     ValueContract = new DimensionAttributeValueContract();  
     ValueContract.parmName('Jurisdiction') ;  
     ValueContract.parmValue(_jurisdiction);  
   }  
   if (_subscriberType)  
   {  
     ValueContract = new DimensionAttributeValueContract();  
     ValueContract.parmName('SubscriberType') ;  
     ValueContract.parmValue(_subscriberType);  
     ListValueContract.addEnd(ValueContract);  
   }  
   LedgerAccountContract.parmMainAccount(_ledgerAccount);  
   LedgerAccountContract.parmValues(ListValueContract);  
   dimStorage = DimensionServiceProvider::buildDimensionStorageForLedgerAccount(LedgerAccountContract);  
   dimensionAttributeValueCombination = DimensionAttributeValueCombination::find(dimStorage.save());  
   return dimensionAttributeValueCombination.RecId;  
 }