HOWTO: Dimensiones y Macros en X++

El manejo de dimensiones por código en Microsoft Dynamics AX no es muy intuitivo al principio aunque con un poco de práctica se comprueba que no es tanto como parece. AX nos ofrece una serie de ayudas para facilitar estas tareas y entre otras las mas útiles son las macros #InventDim*

InventDim macros | 1

El propio estándar utiliza estas macros en multitud de lugares, por ejemplo este es un fragmento del método find() de la tabla estandar PriceDiscTable (Acuerdos comerciales):

static PriceDiscTable find(PriceType            relation,
                           TableGroupAll        itemCode,
                           ItemRelation         itemRelation,
                           TableGroupAll        accountCode,
                           CustVendRel          accountRelation,
                           InventDim            inventDimCriteria,
                           UnitID               unitID,
                           CurrencyCode         currency,
                           AmountQty            amountQty,
                           boolean              update = false)
{
    PriceDiscTable  priceDiscTable;
    InventDim       inventDim;
    InventDimParm   inventDimParm;
    ;

    inventDimParm.initFromInventDim(inventDimCriteria);
    priceDiscTable.selectForUpdate  (update);
    priceDiscTable.selectLocked     (update);

    select firstonly priceDiscTable
        index hint PriceDiscIdx
        where priceDiscTable.Relation           == relation         &&
              priceDiscTable.ItemCode           == itemCode         &&
              priceDiscTable.ItemRelation       == itemRelation     &&
              priceDiscTable.AccountCode        == accountCode      &&
              priceDiscTable.AccountRelation    == accountRelation  &&
              priceDiscTable.Currency           == currency         &&
              priceDiscTable.UnitId             == unitID           &&
              priceDiscTable.QuantityAmount     == amountQty
            #InventDimExistsJoin(priceDiscTable.inventDimId, InventDim,
                                 InventDimCriteria, InventDimParm);

    return priceDiscTable;
}

Lo importante aquí es el uso de la macro #InventDimExistsJoin. El objetivo de esta macro es hacer un join de la tabla de dimensiones InventDim hacia la tabla con la que estemos trabajando, PriceDiscTable en este caso, por lo que los parámetros que necesita estarán orientados a conseguir ese join:

  1. Campo de la tabla maestra con el que hacer el join. Siempre será un InventDimId
  2. Variable de tipo InventDim que usaremos para hacer el join y recuperar los resultados de las dimensiones
  3. Variable de tipo InventDim con los datos que deseamos buscar. Será necesario unicamente completar los datos de las dimensiones sobre las que nos interese buscar.
  4. Variable de tipo InventDimParm indicando en qué dimensiones queremos buscar. Existen diversas funciones en esta tabla para iniciar varias dimensiones a la vez en base a diferentes criterios. Por ejemplo activar sólo las dimensiones de producto activas para un determinado artículo.

Para comprender bien el funcionamiento de la variable InventDimParm (4) y las funciones de la misma tabla, hay que pensar que tiene la misma función que el diálogo que nos presenta AX siempre que manejamos dimensiones para decirle cuales queremos ver. en este caso le decimos a AX cuales queremos utilizar para la búsqueda. Esto es, para conseguir este filtro:

InventDim macros | 2

    InventDimParm   inventDimParm;
    ;

    inventDimParm.InventLocationIdFlag  = NoYes::Yes;
    inventDimParm.WMSLocationIdFlag     = NoYes::Yes;

Una vez definido dónde queremos buscar, especificamos qué queremos buscar:

    InventDim       inventDimCriteria;
    ;

    inventDimCriteria.InventLocationId  = 'mialmacen';
    inventDimCriteria.wMSLocationId     = 'miubicacion';

Y ahora todo junto!

static void JAEE_InventDimMacro(Args _args)
{
    // Tablas del join
    PriceDiscTable  priceDiscTable;
    InventDim       inventDim;
   
    // Tablas de rango
    InventDimParm   inventDimParm;
    InventDim       inventDimCriteria;
    ;

    // ¿Dónde quiero buscar?
    inventDimParm.InventLocationIdFlag  = NoYes::Yes;
    inventDimParm.WMSLocationIdFlag     = NoYes::Yes;

    // ¿Qué quiero buscar?
    inventDimCriteria.InventLocationId  = 'mialmacen';
    inventDimCriteria.wMSLocationId     = 'miubicacion';
   
    // Adelante!
    select priceDiscTable
        where priceDiscTable.ItemRelation == 'miproducto'
       #InventDimExistsJoin(priceDiscTable.inventDimId, inventDim,
                            inventDimCriteria, inventDimParm);
}

Y eso es todo.

Feliz Navidad!

Descarga