jueves, 12 de enero de 2012

Capturar mensajes de error en un TRY-CATCH ABAP



Es sencillo, el problema se presenta cuando tenemos en nuestra aplicacion abap un TRY-CATCH y deseamos conocer el mensaje que devuelve el sistema y no poner un mensaje personalizados en CATCH.





Un ejemplo de la situacion seria la siguiente la siguiente.

DATA: g_ti_marc TYPE HASHED TABLE OF marc WITH UNIQUE KEY matnr.

 SELECT *
 INTO TABLE g_ti_marc
 FROM           marc
 FOR ALL ENTRIES IN g_ti_mara   
 WHERE matnr EQ g_ti_mara-matnr.



En esta situacion lo mas probable es que el programa haga un dump por indice repetido en una tabla tipo HASHED.
Bien ahora para camputar el error podemos hacerlo controlando con un tipo de error generico como CX_ROOT asi:

Declaramos 2 variables:
DATA: lr_cx_root       TYPE REF TO cx_root,
           l_c_message  TYPE string.

La primera hace referencia a la clase CX_ROOT de la misma clase del error generico y la segunda es una variable donde almacenaremos el mensaje.

TRY.

     SELECT *
     INTO TABLE g_ti_marc
     FROM           marc
     FOR ALL ENTRIES IN g_ti_mara   
     WHERE matnr EQ g_ti_mara-matnr.

*.Capturamos el error y lo llevamos a la instancia lr_cx_root.
   CATCH CX_ROOT INTO lr_cx_root.

*.....Luego extraemos el mensaje de error que arroja el sistema accediendo al metodo *.....if_message~get_longtext( ).

       l_c_message = lr_cx_root->if_message~get_longtext( ).

*.....Por ultimo podremos realizar ya lo que queramos con el mensaje de error por ejemplo *.....imprimirlo.

       MESSAGE l_c_message TYPE 'E'.

  END TRY.

 Y listo de esta manera podremos controlar los mensaje de error que nos arroja el sistema cuando los capturamos con TRY-CATCH espero les sea util.

1 comentario:

  1. Gracias por esta información, pero me salta una duda: como hago para capturar el ID del mensaje de error, de que forma o con otro método?

    ResponderEliminar

Es muy importante saber que opinas de este espacio, por eso te agradezco tus aportes.