lunes, 5 de abril de 2021

Recientemente, se nos ha presentado el siguiente problema al intentar exportar datos mediante las Entidades (PU39):


Con esa información no se puede determinar con claridad que es lo que esta impidiendo la ejecución del proceso.

Si nos vamos al Visor de Eventos, tenemos lo siguiente:


El archivo DMFExecutePackage.exe se encuentra en 2 rutas si lo buscamos en el servidor:

  • C:\Program Files (x86)\Microsoft Dynamics AX\70\DataImportExportFramework\
  • K:\AosService\WebRoot\bin

En la primera ruta existe un archivo de configuración:


En ese archivo validar que la sección baseAddress:

Sea igual que la configuración en los parámetros de importación y exportación en Dynamics 365:


Validado eso, se debe eliminar (o mover, para estar resguardados) el archivo de la primera ruta, considerando que en otros ambientes, no existe este archivo en esta ruta:


Hecho esto, reiniciar el servicio:

Una vez reiniciado, volver a ejecutar el proceso de exportación y verán que finaliza correctamente:



martes, 21 de abril de 2020

Utilizar variables globales en una clase EventHandler


En algunos casos, nos vemos forzados a utilizar clases EventHandler para realizar nuestros desarrollos en vez de las extensiones con Chain Of Command.

En estos casos me he topado muchas veces con la necesidad de utilizar las variables globales definidas en un formulario.

Por ejemplo, en este caso, se necesita obtener la variable global parmSalesTable:


Primero, es necesario obtener el FormRun del método EventHandler.


Luego se debe declarar una variable para obtener el objeto "original", para ello usamos lo siguiente, considerando que el identificador, es el nombre de nuestra variable global:


Para finalizar obtenemos el "valor" de nuestra variable global asignada a una variable local:


De aquí en adelante, ya podemos utilizar la variable global en nuestro método EventHandler local.

viernes, 5 de abril de 2019

Extender Etiquetas

Si bien es muy poco común que se requiera modificar una etiqueta estándar, Dynamics 365 nos permite crear extensiones para las etiquetas.

Por ejemplo, la siguiente etiqueta esta en inglés a pesar de que el idioma configurado es español:



Primer se debe determinar cuál es el archivo de etiquetas que debemos extender, en este caso es el @GLS:

Agregamos un nuevo item a nuestro proyecto del tipo Label File, el nombre debe ser, en este caso, GLS_Extension:

Nota: En caso de que necesiten identificar su archivo de etiquetas para evitar duplicidad y posibles errores en tiempo de ejecución, pueden agregar el identificador luego del "_Extension", es decir, GLS_Extension_XYZ

Siguiendo con el ejemplo, una vez creado el archivo creamos la etiqueta @GLS112225 con el label que deseamos que aparezca en pantalla:

Luego de compilar nuestro modelo, volvemos al formulario y comprobamos que ya tenemos nuestra etiqueta en español:



jueves, 27 de diciembre de 2018

LedgerDimension D365

Desde Ax2012 se utilizan para las cuentas de ax, tanto contables como de cliente o proveedores los ledgerdimension, en D365 se mantiene esta extructura pero con algunos cambios respecto a las clases de ayuda para obtener los datos. Algunas útiles en este sentido son: LedgerDynamicAccountHelper y DimensionAttributeValueSetStorage algunos usos serian:


Obtener el VendAccount:
if(LedgerTrans.AccountType == LedgerJournalACType::Vend )
{
   vendAccount = LedgerDynamicAccountHelper::
                 getAccountNumberFromDynamicAccount(LedgerTrans.LedgerDimension);
}
Cambiar o crear ledgerdimension:
DimensionAttributeValueSetStorage dimensionStorage = 
          DimensionAttributeValueSetStorage::find(custTable.DefaultDimension);
;
dimensionStorage.addItemValues(dimensionAttribute.RecId, 
                    dimAttributeValue.RecId, dimAttributeValue.HashKey);
custTable.DefaultDimension = dimensionStorage.save();



Espero que esta pequeña ayuda les sirva, sin dejar de recordar que existen muchos metodos útiles en estas clases que podrían ayudar a alivianar su códificacion. Exito!

miércoles, 17 de octubre de 2018

Examinar una tabla

Si en algún momento requieren buscar información en una tabla, y no tienen acceso a Visual Studio, pueden hacerlo desde el mismo Dynamics. Para ello ingresa la siguiente URL:

https://YourDyn365URL/?cmp=YourCompany&mi=SysTableBrowser&TableName=TableName

YourDyn365URL es la URL de Dynamics, por ejemplo:
YourCompany es el código de la compañia.
TableName es el nombre de la tabla.

Con esto podrás revisar a información de la tabla sin problemas.

lunes, 1 de octubre de 2018

Solución error al abrir TableBrowser

Hace unos días me apareció el siguiente error al momento de abrir una tabla desde el TableBrowser:


Después de intentos fallidos de compilación completa con sincronización de base de datos, reiniciar el Visual Studio y reiniciar el servidor. El siguiente comando me ayudó a solventar el problema:

devenv.exe /ResetSettings

Por lo general éste se encuentra en la ruta:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\

Pero pueden buscarla en las propiedades del acceso directo del Visual Studio:







miércoles, 26 de septiembre de 2018

Uso de Dimensiones en D365

Como mucho ya han notado, el tema de las dimensiones en D365 ha cambiado a diferencia de otras versiones como en ax2012. les dejó un pequeño método de ejemplo para la creacion de dimenciones por código que talvez los puede orientar:

public DimensionDynamicAccount generateLedgerDimension(MainAccountNum _mainAccount)
{
    int hierarchyCount;
    LedgerRecId            ledgerRecId;
    MainAccount mainAccount;
    RefRecId recordvalue;                
    DimensionSetSegmentName DimensionSet;
    DimensionStorage         dimStorage;
    LedgerAccountContract LedgerAccountContract = new LedgerAccountContract();
    dimensionAttributeValueCombination dimensionAttributeValueCombination;

    mainAccount = MainAccount::findByMainAccountId(_mainAccount);
    if(mainAccount)
    {
        recordvalue = DimensionHierarchy::getAccountStructure(mainAccount.RecId,Ledger::current());
        hierarchyCount = DimensionHierarchy::getLevelCount(recordvalue);
        DimensionSet = DimensionHierarchyLevel::getDimensionHierarchyLevelNames(recordvalue);        
            
        LedgerAccountContract.parmMainAccount(mainAccount.MainAccountId);

        dimStorage = DimensionServiceProvider::buildDimensionStorageForLedgerAccount(LedgerAccountContract);
        dimensionAttributeValueCombination = DimensionAttributeValueCombination::find(dimStorage.save());
        ledgerRecId = dimensionAttributeValueCombination.RecId;
    }
    return ledgerRecId;
}

jueves, 3 de agosto de 2017

Bienvenido a Dynamics Latino

Bienvenido!!!

Se ha creado este espacio para compartir conocimientos, experiencias, trucos y todo cuanto se les ocurra del mundo de Dynamcs (AX, 365FO).
Se compartirá en los proximos dias nuevas actualizaciones y experiencias de los desarrollos y funcionalidades que vamos descubriendo..

Saludos a todos!