Cómo armar una transformación para una excepción
El siguiente es un ejemplo práctico de cómo armar una transformación para una excepción:
1) El método web ExtraerClientes devuelve la estructura de tipo clsFaultDetail cuando se produce una excepción, que contiene cuatro atributos: DetailArray (array de strings), DetailNodes (array de XmlNode), FaultCode (string) y FaultDescription (string).
2) Con EISProxyManager, la estructura clsFaultDetail se ve así:
3) Para recuperar el valor de un atributo de esta estructura se debe utilizar una transformación especial, que se informará en la transformación origen. Por ejemplo, si al ejecutar el método web ExtraerClientes se utiliza la transformación “EXTRACCION_DE_CLIENTES”, dentro de dicha transformación se deberá especificar el ID de otra transformación que se ejecutará en caso que se produzca una excepción. Eso se hace en el nodo “OnFaultException” de la siguiente manera:
4) Dentro del nodo “OnFaultException”, en el atributo “CallTransformation” se especificó el ID “PROCESAR_FAULT”. Esta nueva transformación se aplicará sobre la estructura clsFaultDetail y funciona como cualquier otra transformación. La ventaja de este método es que si se utiliza la misma estructura para todos los tipos de excepciones de todos los métodos web, entonces sólo habrá que escribir una transformación para capturar las excepciones de todos los métodos web. La siguiente es la transformación referenciada:
5) Al ejecutar el método web correctamente, se dispararán los siguientes queries sobre la base de datos:
Delete From DATOS_EXTRACCION Where TS_USER_ID=’UserId’
Delete From DATOS_CLIENTE Where TS_USER_ID=’UserId’
INSERT INTO DATOS_EXTRACCION (CANTIDAD, TS_USER_ID) VALUES (15, ‘UserId’)
INSERT INTO DATOS_CLIENTE (CUSTOMER_NAME, PKEY, PAR_KEY, TS_BEGIN, TS_END, TS_USER_ID)
VALUES (‘GOMEZ, OSVALDO ALEJANDRO’, ’37f69119-4251-49ef-afbd-90fa651b88cb’, ‘CustPkey’, Getdate(), Getdate(), ‘UserId’)
INSERT INTO DATOS_CLIENTE (CUSTOMER_NAME, PKEY, PAR_KEY, TS_BEGIN, TS_END, TS_USER_ID)
VALUES (‘GOMEZ, DARDO BERNABE’, ‘4418d4e3-1803-4a7b-a490-38f67a10daca’, ‘CustPkey’, Getdate(), Getdate(), ‘UserId’)
INSERT INTO DATOS_CLIENTE (CUSTOMER_NAME, PKEY, PAR_KEY, TS_BEGIN, TS_END, TS_USER_ID)
VALUES (‘HERNANDEZ, CARLOS ROGELIO’, ‘9adbe45d-79c5-4a59-9417-a91adfd720bd’, ‘CustPkey’, Getdate(), Getdate(), ‘UserId’)
INSERT INTO DATOS_CLIENTE (CUSTOMER_NAME, PKEY, PAR_KEY, TS_BEGIN, TS_END, TS_USER_ID)
VALUES (‘FERNANDEZ, CANDIDO’, ‘a5572dde-5742-4dc6-a2b5-740f2fecc756’, ‘CustPkey’, Getdate(), Getdate(), ‘UserId’)
INSERT INTO DATOS_CLIENTE (CUSTOMER_NAME, PKEY, PAR_KEY, TS_BEGIN, TS_END, TS_USER_ID)
VALUES (‘FERNANDEZ, ISMAEL ROBERTO’, ‘6aea6ef7-3e1a-4ab5-945e-64ae0068ad74’, ‘CustPkey’, Getdate(), Getdate(), ‘UserId’)
6) Pero si se produce una excepción, entonces se ejecutarán los siguientes queries:
Delete From DATOS_FAULT Where TS_USER_ID=’UserId’
Delete From DATOS_DETALLE_FAULT Where TS_USER_ID=’UserId’
INSERT INTO DATOS_FAULT (CODE, DESCRIPTION, PKEY, PAR_KEY, TS_BEGIN, TS_END, TS_USER_ID)
VALUES (‘1000’, ‘Cust_Primary_Id debe ser un número.’, ’71cdc675-0c5c-40f2-8d32-d261aee301f9′, ‘CustPkey’, Getdate(), Getdate(), ‘UserId’)
INSERT INTO DATOS_DETALLE_FAULT (DETAIL, PKEY, PAR_KEY, TS_BEGIN, TS_END, TS_USER_ID)
VALUES (‘Error 1000’, ‘b091ecc4-0321-4bc4-8184-2df1ce91a5fe’, ’71cdc675-0c5c-40f2-8d32-d261aee301f9′, Getdate(), Getdate(), ‘UserId’)
INSERT INTO DATOS_DETALLE_FAULT (DETAIL, PKEY, PAR_KEY, TS_BEGIN, TS_END, TS_USER_ID)
VALUES (‘Descripción: Cust_Primary_Id debe ser un número.’, ‘4252f26a-d9c8-4b49-889e-ee8a42eddc43′, ’71cdc675-0c5c-40f2-8d32-d261aee301f9’, Getdate(), Getdate(), ‘UserId’)
INSERT INTO DATOS_DETALLE_FAULT (DETAIL, PKEY, PAR_KEY, TS_BEGIN, TS_END, TS_USER_ID)
VALUES (‘Se produjo un error 1000’, ‘ff6eebf2-61b7-49ed-b7c2-4086f5e37486′, ’71cdc675-0c5c-40f2-8d32-d261aee301f9’, Getdate(), Getdate(), ‘UserId’)
INSERT INTO DATOS_DETALLE_FAULT (DETAIL, PKEY, PAR_KEY, TS_BEGIN, TS_END, TS_USER_ID)
VALUES (‘El mensaje de error es: Cust_Primary_Id debe ser un número.’, ‘e2d5f81a-fe1c-4df6-8ae2-c112715c9ca1′, ’71cdc675-0c5c-40f2-8d32-d261aee301f9’, Getdate(), Getdate(), ‘UserId’)
7) El mensaje que EIS devolverá a la transacción de Engage tendrá el siguiente formato:
Error al invocar el método web [[Exception: Se produjo una excepción en el destino de la invocación.][InnerException: Cust_Primary_Id debe ser un número.][Fault Code: 1000][Fault Detail: clsFaultDetail]].
Es decir, EIS seguirá devolviendo los mensajes de error como hasta ahora, dependiendo de que se informe el nodo FaultString en la respuesta del método web. La diferencia está en que ahora se podrá inspeccionar la estructura que venga en el Detail de la Excepción y guardar datos adicionales en tablas de la BD.
Con respecto a los mensajes de error que devuelve EIS, se hizo también una mejora dentro de lo estándar. Dicha mejora es la capacidad de obtener los valores de Detail de excepciones cuyas estructuras sean del tipo XmlNode o array de XmlNode. Es decir, si el Detail de la estructura de la excepción es de cualquiera de esos tipos de dato, entonces no hace falta escribir una transformación, porque EIS las inspeccionará automáticamente para armar el mensaje de error. Pero si la estructura de la excepción es de cualquier otro tipo, entonces hay que usar una transformación.


