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.
Todo aquel que tenga un código mejor para actualizar un segmento, es bienvenido.
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
Publicar un comentario