Domanda

Il mio problema è l'impostazione di alcuni valori di dimensione letti da una fonte esterna.

Data la dichiarazione AX 2009:

ledgerJournalTrans.Dimension    = ledgerTable.Dimension;
ledgerJournalTrans.Dimension[1] = "abc";

Qual è il modo equivalente a quello in Ax 2012?

Questa causa assume l'esistenza di una dimensione "dipartimento" come prima dimensione.

È stato utile?

Soluzione

Prima delle cose, le dimensioni legacy in AX 2009 sono state completamente rifatto e sostituito In AX 2012. Le nuove ledgerdimension sono una combinazione dell'account e dei valori delle vecchie dimensioni necessarie in base alla struttura dell'account e alle strutture delle regole avanzate. Per saperne di più sul nuovo framework di dimensioni in AX 2012, prova a leggere il carta bianca Informazioni sul nuovo framework di dimensioni.

Supponendo che il dipartimento sia la prima dimensione e che entrambe le dimensioni utilizzino il LedgerDimensionAccount EDT semplifichi un po 'questo scenario, ma il nuovo framework di dimensioni è molto flessibile, quindi questa ipotesi potrebbe non essere corretta. Anche se lo è, semplicemente specificare un nuovo valore per il reparto può richiedere che la struttura della combinazione debba cambiare drasticamente a causa delle strutture di regole avanzate che possono essere impostate.

Onestamente, Considererei solo il codice qui sotto come solo una dimostrazione di come funzionano alcune basi, non qualcosa che dovrebbe essere usato in produzione. Detto questo, questo codice dovrebbe realizzare ciò che desideri, se quel campo di dimensione su Ledgertable è stato sostituito con un campo LedgerDimension usando LedgerDimensionAccount EDT che memorizza una combinazione completa.

DimensionStorage dimensionStorage;
DimensionAttribute deparmentDimensionAttribute;
DimensionAttributeValue newDepartmentValue;

// Find the deparment dimension attribute
deparmentDimensionAttribute = DimensionAttribute::findByName("Department");  

// Find the new department value we want to put in the new combination.
newDepartmentValue = DimensionAttributeValue::findByDimensionAttributeAndValue(deparmentDimensionAttribute, "abc");

// Load a DimensionStorage instance with the old combination and update the first segment with new value
dimensionStorage = DimensionStorage::findById(ledgerTable.LedgerDimension);
dimensionStorage.setSegment(1,DimensionStorageSegment::constructFromValue("abc", newDepartmentValue));
ledgerJournalTrans.LedgerDimension = dimensionStorage.save();

Altri suggerimenti

Il mio caso era lo scenario delle "dimensioni predefinite", quindi ho dovuto adattarmi un po '. Questo è il metodo che alla fine ho usato:

Sul DimensionAttribute Tabella Aggiungi un nuovo nome di campo Number Quindi aggiungi questo metodo:

public static DimensionAttribute findByNumber(DimensionOrdinal _number)
{
    DimensionAttribute dimensionAttribute;
    select firstonly dimensionAttribute where dimensionAttribute.Number == _number;
    return dimensionAttribute;
}

Ciò identifica esplicitamente la dimensione con un numero corrispondente.

Sul DimensionAttributeValueSetStorage Classe Aggiungi il metodo:

public void addItemNumber(DimensionOrdinal _idx, SysDim _value)
{
    DimensionAttributeValue attrValue;
    DimensionAttribute attr = DimensionAttribute::findByNumber(_idx);
    if (!attr)
        throw error(strFmt("@SYS342559", _idx));
    attrValue = DimensionAttributeValue::findByDimensionAttributeAndValue(attr, _value, false, true);
    this.addItemValues(attr.RecId, attrValue.RecId, attrValue.HashKey);
}

Il DimensionAttributeValueSetStorage Gestisce le "dimensioni predefinite" come descritto nel white paper @dlannoye menzionato.

Quindi il codice corrispondente legge in questo modo:

dimensionStorage = DimensionAttributeValueSetStorage::find(salesTable.DefaultDimension);
dimensionStorage.addItemNumber(1, "abc");
salesTable.DefaultDimension = dimensionStorage.save();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top