Ir guardando errores en una tabla

Cursos de Navision 100% online Foros Foro Dynamics NAV y Business Central Ir guardando errores en una tabla

Etiquetado: , ,

Este debate contiene 3 respuestas, tiene 2 mensajes y lo actualizó  Cristina Nicolàs hace 1 año, 5 meses.

Viendo 4 publicaciones - del 1 al 4 (de un total de 4)
  • Autor
    Publicaciones
  • #3661

    pedperpat
    Participante

    Buenos días, estoy haciendo un proyecto en el que necesito guardar los errores que aparezcan en una tabla para que el usuario pueda verlos todos juntos una vez ha pasado el proceso.

    No sé muy bien como hacerlo, ya que debe ir recogiendo los errores que aparezcan pero sin detener la ejecución en ningún momento.

    #3678

    Cristina Nicolàs
    Jefe de claves

    Hola pedperpat,

    La verdad es que el tema es interesante y ya le he comentado a Laura que seguramente merece un curso de desarrollo dedicado a este tema. Lo haré seguro porqué además es un tema que me gusta y con el que he tenido que lidiar en infinidad de ocasiones.

    El hecho de recuperar errores sin detener la ejecución del programa en Navision es posible, pero más bien pobre.
    Como comentas en otro post (al que contestaré también en cuanto acabe con este), es posible definir funciones como Try, y hacer algo similar al Try/Catch de otros lenguajes de programación.
    Esta opción apareció en versiones recientes (no recuerdo si en NAV 2016 o NAV 2017), y aunque la he utilizado alguna vez, no me acaba de convencer del todo, así que yo continuo gestionando el tema de los errores “a la antigua usanza”.

    Y esta antigua usanza es:

    El único objeto que hasta la aparición del Try/Catch en las funciones ofrecía gestión de errores son las Codeunits, y SÓLO cuando se utilizan con Codeunit.RUN.

    El código tenía que ser algo así como:

    IF NOT MiCodeunit.RUN THEN
    BEGIN
      MiTabla."Error Text" := GETLASTERRORTEXT;
      CLEARLASTERROR;
    END;

    Al solo poder utilizar Codeunit.RUN, lógicamente el código que queramos utilizar tiene que estar en el trigger OnRun de la codeunit.

    Y otro tema es el posible paso de parámetros a aquello que queramos ejecutar, que se puede hacer con una función SetParameters en la propia codeunit, que deberemos llamar justo antes del Codeunit.RUN.

    Y otro tema es que para que esto funcione, no puede haber ninguna transacción de escritura en marcha.

    Y también hay que controlar que el mensaje que nos devuelva GETLASTERRORTEXT no sea más largo que la longitud del campo de la tabla donde lo queremos guardar.

    Vamos, que ya digo, que el tema merece un curso en condiciones que grabaré seguro porque me gusta el tema y me parece interesante.

    Un saludo,
    Cristina Nicolàs

    Curso presencial. Conviértete en un Experto en Business Central.

    Curso organizado como un máster.
    Las inscripciones anticipadas terminan el 28 de febrero.
    Inicio del curso: 26 de Abril
    Más información

    #3688

    pedperpat
    Participante

    Buena información, lo de que no tiene que haber ninguna transacción de escritura en marcha lo soluciono con un COMMIT antes de ejecutar el bloque de código de IF Codeunit.RUN.

    Por preferencia prefiero hacer el CLEARLASTERROR antes del GETLASTERROR, es decir,

    CLEARLASTERROR;
    
    IF NOT MiCodeunit.RUN THEN
    BEGIN
      MiTabla."Error Text" := GETLASTERRORTEXT;
    END;

    Lo prefiero así por el proceso repetitivo que va a ir pasando por los registros, aún así ambas formas son correctas y harían la misma ejecución. Al final se resume a gustos 😉

    • Esta respuesta fue modificada hace 1 año, 5 meses por  pedperpat.
    #3694

    Cristina Nicolàs
    Jefe de claves

    lo de que no tiene que haber ninguna transacción de escritura en marcha lo soluciono con un COMMIT antes de ejecutar el bloque de código de IF Codeunit.RUN

    Así es, pero igualmente debemos tener muy claro qué se está ejecutando para no poner un COMMIT en cualquier lado.
    Si estamos haciendo un proceso completamente independiente, podemos poner un COMMIT.
    Si estamos en medio de un proceso de registro, y ahí es donde lanzamos nuestro proceso, no podemos poner un COMMIT porque podríamos liarla y dejar cosas inconsistentes.

    Un saludo,
    Cristina Nicolàs

    Curso presencial. Conviértete en un Experto en Business Central.

    Curso organizado como un máster.
    Las inscripciones anticipadas terminan el 28 de febrero.
    Inicio del curso: 26 de Abril
    Más información

Viendo 4 publicaciones - del 1 al 4 (de un total de 4)

Debes estar registrado para responder a este debate.

Members Currently Active: 2
robertemg, mpaspa
Keymaster | Moderator | Participant | Spectator | Blocked
Additional Forum Statistics
Threads: 722, Posts: 2.395, Members: 809
Welcome to our newest member, Carlos Lopez
Most users ever online was 15 on 5 April, 2019 9:31 am