4.3. Modificar un segmento de una ledgerDimension.

Esta vez os escribiré un job con el que podréis modificar el valor de un segmento de una ledgerDimension.

Es posible que dependiendo de la versión con la que trabajéis, el select que utilizo para encontrar el segmento no sirva.
Este es el método (dimensionStorage.setSegment) al cual le tenemos que indicar el número de segmento y el valor que vamos a insertar.

Bien, para nuestro ejemplo de hoy tomaremos el registro que podéis ver en la imagen y substituiremos el valor del segundo segmento (Oficina) que actualmente tiene New York por London.



El job que realizará ésta modificación es el que sigue. Quedaros sobretodo con el método para encontrar el número de segmento así no se lo tendremos que poner como hardcode.

static void ModificarSegmentoLedgerDimension(Args _args)
{
    DimensionAttribute                  dimAttr;
    DimensionAttributeSetitem       dimAttrSetitem;
    DimensionHierarchyLevel        dimensionHierachyLevel;
    DimensionStorage                   dimensionStorage;
    DimensionStorageSegment      dimensionStorageSegment;
    DimensionAttribute                  dimensionAttribute;
    DimensionAttributeValue         dimensionAttributeValue;
    LedgerDimensions_Dimension ledgerDimensions;
    LedgerJournalTable                 ledgerJournalTable;
    LedgerJournalTrans                 ledgerJournalTrans;
    LedgerStructure                      ledgerStructure;

    int                                           excludedType = DimensionAttributeType::MainAccount;

    #define.DimensionName('Office')
    #define.DimensionValue('London')

    ttsBegin;

    select firstOnly forUpdate ledgerJournalTrans
        where ledgerJournalTrans.RecId  == 5637207871;

    dimensionAttribute      = DimensionAttribute::findbyname(#DimensionName);
    dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, #DimensionValue);
    dimensionStorage        = DimensionStorage::findbyId(ledgerJournalTrans.LedgerDimension);

    //Nos devolverá el número de segmento de la dimensión
    select firstOnly dimensionHierachyLevel
                join ledgerStructure
                where ledgerStructure.DimensionHierarchy    == dimensionHierachyLevel.DimensionHierarchy
                 &&   ledgerStructure.ledger                == ledger::current()
                        join dimAttr
                        where dimAttr.recId == dimensionHierachyLevel.dimensionAttribute
                           && dimAttr.type  != excludedType
                           && dimAttr.name  == #DimensionName
                               join recId
                               from dimAttrSetitem
                               where dimAttrSetitem.dimensionAttribute     == dimAttr.recId;

    dimensionStorage.setSegment(dimensionHierachyLevel.level,     DimensionStorageSegment::constructFromValue(#DimensionValue, dimensionAttributeValue));

    ledgerJournalTrans.LedgerDimension  = dimensionStorage.save();
    ledgerJournalTrans.update();

    ttsCommit;
}


En el depurador podemos observar como se actualizará con el valor de London.



Y aquí el resultado.



Todo aquel que tenga un código mejor para actualizar un segmento, es bienvenido.

Comentarios