Cómo utilizar Upgrade Codeunits en NAV 2017

Original URL…

Desde la versión 2015 de Microsoft Dynamics NAV hasta la presente, se han venido incorporando al producto bastantes novedades a nivel de desarrollo. Después de haber pasado cierto periodo de madurez, inexplicablemente algunas de éstas no han gozado de tanta popularidad como merecieran, aún siendo tremendamente útiles. Una de estas características es la utilización de upgrade codeunits.

Habitualmente nos habremos topado con este concepto en los entornos de migración de versiones de NAV, como parte del proceso estándar de actualización de datos.

Sin embargo, podemos utilizar esta técnica en tareas más mundanas o habituales, siempre que haya que actualizar la estructura de una o varias tablas.

Un sencillo escenario habitual

Para ilustrar el uso de upgrade codeunits, vamos a realizar un ejemplo simplificado a partir de un escenario muy sencillo.

Imaginemos que tenemos una tabla en NAV, con la siguiente definición de campos:

Cómo utilizar Upgrade Codeunits en NAV 2017

Esta tabla, en el entorno de producción de nuestro cliente, contiene datos:

Cómo utilizar Upgrade Codeunits en NAV 2017

Sobre esta tabla, queremos hacer un cambio en su estructura. Concretamente, queremos cambiar el ID, el nombre, y el tipo de datos del último campo, de forma que la tabla resultante quede así:

Cómo utilizar Upgrade Codeunits en NAV 2017

Vamos a suponer que ya hemos realizado los cambios en esta tabla en un entorno de desarrollo, y ahora queremos actualizar el entorno de producción del cliente. Como hemos visto, en el entorno de producción esta tabla actualmente contiene datos, así que no podemos cambiar su definición tan fácilmente si no queremos perderlos.

Veamos cómo podemos llevar a cabo esos cambios sin perder información.

Cara a cara con el problema

Si intentásemos actualizar esta tabla en el entorno del cliente importando un fichero .fob con la tabla modificada, nos toparemos con este problema.

El sistema detectará que hay cambios potencialmente destructivos en la nueva tabla que estamos importando, y nos avisará de ello.

Cómo utilizar Upgrade Codeunits en NAV 2017

[ Recordemos las opciones de sincronización. Si elegimos la opción Synchronize Schema… Force, estaremos obligando a NAV a actualizar la tabla sí o sí, perdiéndose el contenido de los campos modificados. Evidentemente no es eso lo que queremos. ]

Cómo utilizar Upgrade Codeunits en NAV 2017

La sincronización, evidentemente, fallará:

Cómo utilizar Upgrade Codeunits en NAV 2017

Cómo utilizar Upgrade Codeunits en NAV 2017

Y la tabla nueva se habrá importado, pero como su esquema no se ha sincronizado con SQL Server, no podremos utilizarla. Y entonces sí tenemos un problema.

Cómo utilizar Upgrade Codeunits en NAV 2017

Vamos a ver qué tendríamos que haber hecho para actualizar correctamente los objetos sin perder datos.

El proceso de actualización de datos

Vamos a seguir estos pasos.

  • En nuestro entorno de desarrollo, lo primero que vamos a hacer es crear una copia de la tabla afectada, que llamaremos Temp Mov. Proceso. Esta nueva tabla tendrá necesariamente los mismos campos clave que la original, y el campo o campos que se vayan a modificar. El resto de campos y todo el código asociado a triggers no será necesario.

En nuestro caso tendremos esta nueva tabla:

Cómo utilizar Upgrade Codeunits en NAV 2017

  • Realizamos los cambios en la tabla original, quedándose finalmente así:

Cómo utilizar Upgrade Codeunits en NAV 2017

  • Creamos una nueva codeunit. Será nuestra Upgrade codeunit.

Deberemos marcar la propiedad Subtype = Upgrade.

Cómo utilizar Upgrade Codeunits en NAV 2017

Esta codeunit deberá tener al menos dos funciones:

  • Una función que sirva para copiar y guardar los datos actuales de las tablas afectadas por la actualización, en otra tabla o tablas temporales. Esta función tendrá la propiedad FunctionType = TableSyncSetup.
  • Una función que sirva para, a partir del contenido de las tablas temporales que hemos guardado anteriormente, restaurar (con o sin manipulación previa) los datos a la nueva estructura de datos de la nueva tabla. Esta función tendrá la propiedad FunctionType = UpgradePerCompany (caso más habitual) o UpgradePerDatabase.

Opcionalmente es posible crear una tercera función para comprobar que se cumplen ciertas precondiciones que indicaremos nosotros, antes de realizarse la actualización de datos. Esta función deberá tener la propiedad FunctionType = CheckPrecondition.

  • Creamos la función para guardar los datos en la tabla temporal. Es necesario marcar la propiedad FunctionType = TableSyncSetup, y añadir como parámetro por referencia un registro de la tabla virtual 2000000135 Table Synch. Setup. [ También necesitaremos una variable local que apunte a la codeunit 9900Data Upgrade Mgt. ]

Cómo utilizar Upgrade Codeunits en NAV 2017

Cómo utilizar Upgrade Codeunits en NAV 2017

  • Este paso es opcional. Hemos decidido que el sistema no permitirá actualizar los datos si hay registros en la tabla Lín. Diario General, así que hemos creado una función de testeo de precondiciones. Hemos de marcar la propiedad FunctionType = CheckPrecondition.

Cómo utilizar Upgrade Codeunits en NAV 2017

Cómo utilizar Upgrade Codeunits en NAV 2017

  • Por último, escribimos una función que lee los registros de la tabla temporal, y los devuelve a los nuevos campos o campos modificados de la tabla original. Es necesario que esta función tenga la propiedad FunctionType = UpgradePerCompany.

Cómo utilizar Upgrade Codeunits en NAV 2017

Cómo utilizar Upgrade Codeunits en NAV 2017

  • El resultado final de nuestra upgrade codeunit será algo así:

Cómo utilizar Upgrade Codeunits en NAV 2017

  • Exportamos estos objetos a un fichero .fob: Nuestra tabla modificada, nuestra tabla temporal, y nuestra upgrade codeunit.

Cómo utilizar Upgrade Codeunits en NAV 2017

  • Abrimos el entorno de producción del cliente, o aquél que queramos actualizar, e importamos el fichero .fob:

Cómo utilizar Upgrade Codeunits en NAV 2017

Elegimos sincronización con Validación:

Cómo utilizar Upgrade Codeunits en NAV 2017Cómo utilizar Upgrade Codeunits en NAV 2017

Cómo utilizar Upgrade Codeunits en NAV 2017Cómo utilizar Upgrade Codeunits en NAV 2017

  • Inmediatamente después, realizamos la actualización de datos, invocando manualmente la opción Herramientas –> Actualización de datos –> Iniciar…:

Cómo utilizar Upgrade Codeunits en NAV 2017Cómo utilizar Upgrade Codeunits en NAV 2017

Cómo utilizar Upgrade Codeunits en NAV 2017

  • Y ya hemos terminado. Hemos actualizado la estructura de la tabla Proceso sin perder los datos. Podemos comprobarlo:

Cómo utilizar Upgrade Codeunits en NAV 2017

Comentarios adicionales

¿Qué ha pasado con nuestra función de tipo CheckPrecondition? Si la base de datos destino no hubiese cumplido los requisitos (en nuestro caso, no debería haber registros en la tabla Lín. Diario General), el proceso de actualización se hubiese detenido con un error, y tendríamos que usar los comandos de Powershell para averiguar el motivo del mismo:

Cómo utilizar Upgrade Codeunits en NAV 2017Cómo utilizar Upgrade Codeunits en NAV 2017

Conclusión

Aunque la solución a este tipo de escenarios puede implementarse por código realizando usualmente varios procesos manuales (a los que estamos más que habituados), conviene plantearse la utilización de upgrade codeunits en aquellos casos en los que el volumen de datos a actualizar sea muy grande, o tengamos varias empresas.

Sus principales bazas residen en su alto rendimiento de proceso y en la posibilidad de semiautomatizar su ejecución mediante los comandos de Powershell.

Como siempre, estoy abierto a críticas constructivas. Así que podéis hacernos llegar vuestros comentarios o correcciones respecto a este artículo con total libertad. Un saludo.

Anuncios

Upgrade Codeunits

You use upgrade codeunits when you make changes to a table definition, either from the Microsoft Dynamics NAV Development Environment or during an upgrade. Upgrade codeunits migrate existing business data from the old table structure into the new table structure. An upgrade codeunit serves the following purposes:

  • Provides instructions for how to handle data changes to a table during schema synchronization. For more information, see Synchronizing Table Schemas.
  • Provides the logic for migrating existing data in the business data table from the old format to the new format after schema synchronization.
  • Provides instructions for updating custom report layouts to dataset changes. For more information, see Updating Custom Report Layouts by Using Upgrade Codeunits.

A typical example of when to use an upgrade codeunit is when you remove a field from a table definition and you do not want to lose the existing data in the business data table. Instead, you want to use it somewhere else in the new application.

You implement upgrade codeunits when you make destructive changes to tables in Microsoft Dynamics NAV Development Environment. For more information about destructive changes, see Handling Destructive Changes With Table Schema Synchronization. After you have created an upgrade codeunit to handle table changes, you can use it when you upgrade data from an earlier version of Microsoft Dynamics NAV to the current version. A single upgrade codeunit will typically contain table schema synchronization instructions and data migration logic for multiple tables that have changed from one version of Microsoft Dynamics NAV to another. More…

How I Reduced Data Upgrade Time By 78 Hours

Upgrade projects are lots of fun. They are full of challenges that keep you busy day and night all the time. More…

As Rashed said, you need some time for standard object upgrade. testing data and additional training. But the main time for this upgrade project depends of customization level. I made the same upgrade (almost without any customization) and small database for one week. But I have upgrade project with really many customizations (only classic used) in 3-4 months. Depends of number and complexity of customization. This is my experience. Aleksandar Totovic .                  

Upgrade Considerations

Depending on which version you are upgrading from, and the degree to which your solution differs from the standard version of Microsoft Dynamics NAV, you may want to prepare your solution for the upgrade. This topic provides tips for things to consider when you prepare to upgrade to Microsoft Dynamics NAV 201X. More…

Upgrading to Microsoft Dynamics NAV 2017

Link…

Use the following table to determine the procedures that you must complete for your upgrade scenario.

Scenario Procedures
Full upgrade from one of the following versions:

  • Microsoft Dynamics NAV 2013
  • Microsoft Dynamics NAV 2013 R2
  • Microsoft Dynamics NAV 2015
  • Microsoft Dynamics NAV 2016
  1. Upgrading the Application Code
  2. Upgrading the Data
Full upgrade from one of the following versions:

  • Microsoft Dynamics NAV 2009 SP1
  • Microsoft Dynamics NAV 2009 R2
  • Microsoft Dynamics NAV 5.0
  • Microsoft Dynamics NAV 4.0
  1. Upgrade to Microsoft Dynamics NAV 2013.
    For more information, see Upgrading to Microsoft Dynamics NAV 2013 in the MSDN Library.

    Alternatively, you can upgrade from Microsoft Dynamics NAV 2009 SP1 or Microsoft Dynamics NAV 2009 R2 to Microsoft Dynamics NAV 2015 as described on the Dynamics NAV Team Blog.

  2. Upgrading the Application Code
  3. Upgrading the Data

After the upgrade, links between interaction records and logged email messages is lost. To resolve this issue, the administrator has to log all mails again to restore the links. For more information, see Logging Interaction Links are Lost When You Upgrade from Microsoft Dynamics NAV 2009 R2.

Technical upgrade of Microsoft Dynamics NAV 2017 database to a new platform version with no application changes, such as with a cummulative update

You can also use this procedure to convert a previous Dynamics NAV database to Microsoft Dynamics NAV 2017 technical requirements, and then upgrade the application and data later.

Before you begin the upgrade process, see Upgrade Considerations for tips about things to consider when you prepare to upgrade to Microsoft Dynamics NAV 2017.

Automating the Upgrade Process using Sample Windows PowerShell Scripts

You can use Windows PowerShell scripts to help you upgrade to Microsoft Dynamics NAV 2017. You can use automation to upgrade a single Dynamics NAV database as well as multiple Dynamics NAV databases that use the same application. Microsoft Dynamics NAV 2017 provides sample scripts that you can adapt for your deployment architecture. For more information, see Automating the Upgrade Process using Sample Windows PowerShell Scripts.