miércoles, 7 de febrero de 2018

Codigo X++ para simular depreciación de un activo fijo [AX2012]

Con el siguiente código X++ podemos simular la depreciación de un activo fijo hasta el final de su vida, que guardaremos en una tabla para su posterior análisis.
static void DIPSimularDepreciacionActivo()
{
    TmpDateSum      tmpDateSum;
    AssetTable      assetTable;
    AssetBook       assetBook;
    AssetLedgerAccounts  assetLedgerAccounts;
    MainAccountNum       mainAccountNum;
    DIPSimulacionDepreciacion    simulacion;

    delete_from simulacion;

    while select assetTable join assetBook where
        assetTable.AssetId                      == assetBook.AssetId
    &&  assetBook.Depreciation                  == NoYes::Yes
    &&  assetBook.Status                        == AssetStatus::Open
    &&  assetTable.AssetId                      == "218-000063"
    {
        simulacion.clear();
        assetLedgerAccounts = AssetLedgerAccounts::find(assetBook.BookId,AssetParameters::find().PostingProfile,enum2int(AssetTransType::Depreciation),TableGroupAll::GroupId,assetTable.AssetGroup);
        mainAccountNum =  MainAccount::find(DimensionAttributeValueCombination::find(assetLedgerAccounts.OffsetLedgerDimension).MainAccount).MainAccountId;

        //Metodo de calculo utilizado por AX
        tmpDateSum.setTmpData(assetBook.initDepreciationProfile());

        //Datos comunes de linea
        simulacion.AssetGroupId       = assetTable.AssetGroup;
        simulacion.AssetId            = assetTable.AssetId;
        simulacion.MainAccountId      = mainAccountNum;
        simulacion.ImporteAdquisicion = assetBook.AcquisitionPrice;

        //Recorrer dataset depreciacion
        while select tmpDateSum where tmpDateSum.TmpNumerals01 != 0
        {
            simulacion.Periodo               = tmpDateSum.TransDate;        // Fecha depreciacion
            simulacion.Depreciacion          = tmpDateSum.TmpNumerals01;    // Importe depreciacion del periodo
            simulacion.DepreciacionAcumulada = tmpDateSum.Total;            // Importe depreciacion acumulada
            simulacion.NetBookValue          = tmpDateSum.TmpNumerals02;    // Valor neto en libros
            simulacion.insert();
        }
    }
    info("Simulacion terminada");
}
Resultado:









Espero que os sirva de ayuda

jueves, 31 de agosto de 2017

Depurar un informe Report Data Provider en AX2012 R3

En una entrada antigua del blog, hablábamos sobre como depurar código desde Visual Studio en AX2012 (que podéis ver aquí). Este proceso es válido para cualquier código que se ejecute en CIL (Common Intermediate Language), pero debemos tener en cuenta algunas consideraciones para depurar las clases RDP (usadas para desarrollar informes).
El principal inconveniente radica en que los informes RDP se basan en tablas temporales o en memoria, haciendo que no se puedan depurar directamente.
Vamos a ver cómo podemos solucionar este inconveniente y depurar nuestro informe RDP.
Primero debemos asegurarnos de tener permisos para depurar en el servidor actual, por lo que nuestro usuario debe ser miembro del grupo Microsoft Dynamics AX Debugging Users. Y revisar todo lo explicado en mi anterior post.
En la clase que ejecuta el RDP debemos cambiar:
//class TestReportDP extends SRSReportDataProviderBase
class TestReportDP extends SrsReportDataProviderPreProcess
Con esto conseguimos que el informe procese primero los datos, y por último muestre el informe por pantalla. Así podremos acceder a los datos con el depurador.
Debemos asegurarnos también que el método processReport() contenga la siguiente llamada:
Tabla_Temporal.setConnection(this.parmUserConnection());
Por último, tenemos modificar las propiedades de la tabla temporal:
  • CreatedBy = Yes
  • CreatedTransactionId = Yes
  • TableType = Regular
Con estos cambios, ya podemos depurar el código de la clase que procesa los datos del informe.

viernes, 13 de enero de 2017

Rellenar con 0 un texto en AX2012

AX2012 nos proporciona una manera fácil de añadir caracteres extra a una cadena de texto. Imaginemos que necesitamos representar una secuencia FV-#### dentro de AX. Necesitamos entonces incrementar un contador para después almacenarlo o mostrarlo con un formato tipo "FV-0001", "FV-0002" etc. Será necesario entonces rellenar el contador con ceros.

Podemos utilizar los métodos strRFix () y strLFix () para lograr esto.

    
// ------------------------------------------------(c) 2017 Last
// System: Microsoft Dynamics AX 2013 R3 CU12
// Description:     JOB de ejemplo para rellenar con 0
// Creator:         Juan Ruiz Romero
// Creation date:   13.01.2017
// -----------------------------------------------------------------
// -----------------------------------------------------------------
static void testRellenar0(Args _args)
{
    int i = 1;
    str cadena;
    str resultado;
    
    /*Creamos un string, de longitud 4, con el valor de i y rellenamos con 0*/    
    cadena = strRFix(int2str(i), 4, "0");
    resultado = strFmt("FV-%1", cadena);    
    info(resultado);
    
    cadena = strLFix(int2str(i), 4, "0");
    resultado = strFmt("FV-%1", cadena);    
    info(resultado);
}

Esto llenará resultado con FV-0001. Si usamos strLFix en lugar de strRFix, se rellenará con 0 a la derecha, dando como resultado FV-1000.



jueves, 23 de junio de 2016

Crear documentos de MS Word desde AX 2012 R3

Buenas tardes a todos, hace tiempo que no publico nada en el blog por motivos de falta de tiempo, los que hayan realizado una migración de algún ERP me entenderán....

Nuestro objetivo de hoy es crear documentos de Word directamente desde AX 2012. Para ello utilizaremos una plantilla de Word previamente diseñada, que después utilizaremos en nuestro código x++.

Crearemos nuestra plantilla, para ello insertaremos los marcadores de posición en el lugar deseado, según veis en la imagen:


viernes, 23 de octubre de 2015

Importar Clientes Prospecto (Relaciones Empresariales) en AX 2012 R3 [JOB]

Buenos tardes a todos, durante la migración de Dynamics AX4 a AX2012 R3 nos encontramos con que no existe ninguna entidad en el DMF (Data Migration FrameWork) para importar clientes prospecto (antiguas relaciones empresariales en AX4).

En este caso he realizado un JOB para simular este proceso. Utilizando las clases System.Data.SqlClient podemos leer datos directamente de la base de datos SQL Server de AX4.
El job puede ser ejecutado para actualizar los nuevos clientes prospecto creados durante la fase de migración.

viernes, 12 de junio de 2015

Actualización Acumulativa 9 (CU9) para AX 2012 R3

Ayer (10 de junio) fue liberada la nueva actualización acumulativa 9 para Dynamics AX 2012 R3, conocida popularmente como CU9. Esta actualización ya puede ser descargada desde Lifecycle ServicesCustomerSource y PartnerSource. El Build number para este CU9 es 6.3.2000.326. Para los que necesitéis instrucciones para la instalación, pueden descargar la guía oficial de instalación de CU9 para AX 2012R3.
Esta CU9 presenta cambios en los siguientes módulos:
– Recursos Humanos
– Retail
– TMS
– WMS
También presenta cambios en las siguientes funcionalidades específicas de país:
Australia, Bélgica, Brasil, Europa, Alemania, India, Italia, Lituania, México, Holanda, Polonia, Rusia, España, Reino Unido, Estados Unidos.
A nivel de Desarrollo, también se introdujo un cambio en la funcionalidad de Extensibilidad MPOS en Retail.
Para ver el detalle de estos cambios, pueden consultar la página oficial aquí (What’s new). Para el caso de WMS y TMS, pueden encontrar información aún más detallada sobre los cambios aquí (Blog oficial de SCM).
Como sucedió con la CU8 de AX 2012 R3, el número de versión de la aplicación mostrará un número distinto de 6.3.2000.323 si se le aplica la CU9 a una instalación existente de AX2012R3. Esto es debido a todos los modelos granulares que han sido aplicados al sistema a través del instalador de CU9. El modelo (ax-model) que indica que todo los modelos de la CU9 han sido aplicados es el que tiene el número de versión 6.3.2000.323. Usando el método de  slipstream como se detalla en la guía de instalación, resultará en una instalación con un único modelo aplicado para la CU9, con el build number 6.3.2000.326.

jueves, 15 de enero de 2015

Depurar código desde Visual Studio en AX2012

A partir de la versión 6 de AX (AX2012) la mayor parte del código se ejecuta en el entorno de CIL y no puede depurarse desde el depurador de Microsoft Dynamics AX en X++. Igual os habréis sorprendido al introducir un punto de interrupción en x++ y después ver que no se ejecuta el depurador aun estando seguros de que la ejecución pasa por ese punto. Esto significa que el código se está ejecutando en CIL y necesitamos depurarlo con Visual Studio.

Vamos a ver el proceso que debemos realizar (siempre en un entorno de tes/desarrollo):