En Microsoft Dynamics AX un contenedor (container) se refiere a un vector (array). A diferencia de otros lenguajes, como C# por ejemplo, el vector acepta múltiple tipos de datos dentro de él, al mismo tiempo.
El siguiente código demuestra cómo agregar los elementos a un contenedor:
int numero = 1;
str cadena = "hola";
long largo = 15684965;
container contenedor;
contenedor += numero;
contenedor += cadena;
contenedor += largo;
// Imprimimos "hola"
info(strfmt("Vamos a saludar: %1", conPeek(contenedor, 2)));
De esta manera los elementos fueron agregados al vector (contenedor).
Cuando trabajamos con diario de facturas, en ocasiones, es necesario obtener la dimensión para la cuenta del proveedor y asignar el número de cuenta (AccountNum) como dimensión. Es por ello, que la siguiente línea de código puede ayudarnos a realizar esa tarea:
DimensionDynamicAccount cuentaDinamica;
RecId recLedgerDimension, codProv = 50123657;
AccountNum numeroCuenta;
// Obtenemos el número de cuenta del proveedor
accountNum = VendTable::findRecId(codProv).AccountNum;
// Obtenemos la cuenta del proveedor. Si no existe el AX lo crea. Es decir, siempre retorna un valor
recLedgerDimension = DimensionStorage::getDynamicAccount(accountNum, LedgerJournalACType::Vend);
// recLedgerDimension posee el código de la dimensión que necesitamos agregar.
Con esto logramos obtener la dimensión para el número de cuenta del proveedor.
En ocasiones no tenemos definidas las dimensiones en AX de manera directa, pero lo obtenemos de otras fuentes externas. Entonces, debemos crear un contenedor donde adicionamos los valores necesarios para convertirlos en una dimensión (generalmente hablamos de LedgerDimension).
Para lograr nuestro objetivo debemos escribir las siguientes líneas de código:
container offsetDim;
RecId recIdResult;
// Primero el valor a mostrar (Display Value).
// Luego la cuenta principal (Main account, generalmente el mismo que Display Value)
// Cantidad de dimensiones (número entero)
// Dimensiones separadas por comas: Nombre, Valor.
offsetDim = ["1.2.01.01.0.0.01.001", "1.2.01.01.0.0.01.001", 2, "AGENCIA", "SUCURSAL1", "CENTRO_DE_COSTO", "101"];
//Básicamente en AX se mostraría "1.2.01.01.0.0.01.001-SUCURSAL1-101".
recIdResult = AxdDimensionUtil::getLedgerAccountId(offsetDim);
info(int642str(recIdResult));
Con esto logramos crear u obtener las dimensiones a partir de un contenedor.
La clase RecordInsertList consiste en una lista de elementos (objetos previamente tratados) el cual permite insertar valores de una lista directamente a la base de datos, realizando esta tarea en una sola llamada sin realizar varios viajes.
Generalmente, vamos realizando algún cambio en un registro y ya lo actualizamos en la base de datos. Si son pocos registros, no hay drama. Pero si hablamos de miles de registros la performance se ve afectada. Donde más útil resulta esta clase es en los reportes.
Forma normal
void probarMetodo(RecId _recId, str _algunParametro)
{
TableTemp tabla, nuevaTabla;
while select tabla
where tabla.RecId == _recId
{
nuevaTabla.data(tabla);
nuevaTabla.CampoX = _algunParametro;
//Llama N veces al metodo insertar. Por cada registro inserta en base de datos.
nuevaTabla.insert();
}
}
Utilizando la clase
void probarMetodo(RecId _recId, str _algunParametro)
{
RecordInsertList tempLista;
TableTemp tabla, nuevaTabla;
tempLista = new RecordInsertList(tableNum(TableTemp));
while select tabla
where tabla.RecId == _recId
{
nuevaTabla.data(tabla);
nuevaTabla.CampoX = _algunParametro;
//Agrega el nuevo registro a la lista.
tempLista.add(nuevaTabla);
}
//Inserta toda la lista en la base de datos. Bulk insert.
tempLista.insertDatabase();
}