Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
ada:howto:sicoferp:factory:logmodels:registryerrors [2021/07/26 21:09] 192.168.177.6 |
ada:howto:sicoferp:factory:logmodels:registryerrors [2021/09/21 12:53] (actual) administraidor |
||
---|---|---|---|
Línea 12: | Línea 12: | ||
==== Nota: Aplicaciones Powerbuilder ==== | ==== Nota: Aplicaciones Powerbuilder ==== | ||
- | Powerbuilder tiene restricciones para el consumo de servicios Rest por lo tanto en las aplicaciones de esta tecnología se implementará un API para realizar las llamadas. | + | Powerbuilder tiene restricciones para el consumo de servicios Rest por lo tanto en las aplicaciones de esta tecnología se implementará un [[#Modo de uso: Powerbuilder - Documentación|API]] para realizar las llamadas. |
===== Diccionario de Datos ===== | ===== Diccionario de Datos ===== | ||
^OWNER |SICOF ^TABLE |MOV_LOG_ERRORES ^COMMENTS |Contiene el registro de errores genrados en los procesos de las aplicaciones SICOF | | ^OWNER |SICOF ^TABLE |MOV_LOG_ERRORES ^COMMENTS |Contiene el registro de errores genrados en los procesos de las aplicaciones SICOF | | ||
- | ^# ^NAME ^NULLEABLE ^TYPE ^COMMENTS ^^ | + | ^# ^NAME ^NULLEABLE ^TYPE ^COMMENTS ^WS((Define las reglas que debe aplicar el Web Service)) ^ |
- | |1|CODIGO_INTERNO|N|NUMBER(38,0)|Identificador interno del registro (autoincrementado por secuencia)|| | + | |1|CODIGO_INTERNO|N|NUMBER(38,0)|Identificador interno del registro (autoincrementado por secuencia)|Interno, Autoincremental| |
- | |2|COD_ORA_ERROR|Y|NUMBER|Código del error (Puede usuarse para errores del manejador de base de datos pero el campo es multiproposito)|| | + | |2|COD_ORA_ERROR|Y|NUMBER|Código del error (Puede usuarse para errores del manejador de base de datos pero el campo es multiproposito)|Externo, si es un error de base de datos se debe incluir el código del error| |
- | |3|MSJ_ORA_ERROR|Y|VARCHAR2(1024)|Mensaje simple del error (Resumen)|| | + | |3|MSJ_ORA_ERROR|Y|VARCHAR2(1024)|Mensaje simple del error (Resumen)|Externo, si es un error de base de datos se debe incluir el mensaje del error| |
- | |4|NOM_PROCEDIMIENTO|Y|VARCHAR2(128)|Nombre del método, procedimiento, claseo contexto de ejecución local donde se genera el error|| | + | |4|NOM_PROCEDIMIENTO|Y|VARCHAR2(128)|Nombre del método, procedimiento, clase o contexto de ejecución local donde se genera el error|Externo, Requerido| |
- | |5|FECHA|Y|DATE|Fecha en la cuál se genera el error|| | + | |5|FECHA|Y|DATE|Fecha en la cuál se genera el error|No utilizado| |
- | |6|USUARIO_BD|Y|VARCHAR2(32)|Usuario de conexión de la base de datos|| | + | |6|USUARIO_BD|Y|VARCHAR2(32)|Usuario de conexión de la base de datos|Externo, Requerido| |
- | |7|OBSERVACION|Y|VARCHAR2(2048)|Mensaje extendido del error (Detalle)|| | + | |7|OBSERVACION|Y|VARCHAR2(2048)|Mensaje extendido del error (Detalle)|Externo, Requerido| |
- | |8|HOST_CLIENTE|Y|VARCHAR2(50)|Host del cliente (Dirección IP)| | + | |8|HOST_CLIENTE|Y|VARCHAR2(50)|Host del cliente (Dirección IP)|Externo, Requerido| |
- | |9|FECHA_REGISTRO|Y|DATE|Fecha del sistema DB|| | + | |9|FECHA_REGISTRO|Y|DATE|Fecha del sistema DB|Interno, Formato dd/mm/yyyy hh:mm:ss, Requerido| |
- | |10|CODIGO_USUARIO|Y|NUMBER|Código del usuario de la sesión en la cuál se genera el error|| | + | |10|CODIGO_USUARIO|Y|NUMBER|Código del usuario de la sesión en la cuál se genera el error|Externo, Requerido| |
- | |11|CODIGO_MEMPRESA|Y|VARCHAR2(64)|Código de la empresa de la sesión en la cuál se genera el error|| | + | |11|CODIGO_MEMPRESA|Y|VARCHAR2(64)|Código de la empresa de la sesión en la cuál se genera el error|Externo, Requerido| |
- | |12|CODIGO_APLICACION|Y|NUMBER|Código de la aplicación (Identificador interno numérico)|| | + | |12|CODIGO_APLICACION|Y|NUMBER|Código de la aplicación (Identificador interno numérico)|Externo, Requerido| |
- | |13|INFO_APP|Y|VARCHAR2(256)|Información de la aplicación (En las situaciónes donde no se identifique código interno se puede enviar el nombre de la aplicación o información adicional)|| | + | |13|INFO_APP|Y|VARCHAR2(256)|Información de la aplicación (En las situaciónes donde no se identifique código interno se puede enviar el nombre de la aplicación o información adicional)|Externo| |
- | |14|SESSION_MAC|Y|VARCHAR2(64)|MAC del equipo del usuario|| | + | |14|SESSION_MAC|Y|VARCHAR2(64)|MAC del equipo del usuario|Externo| |
- | |15|SESSION_BROWSERVERSION|Y|VARCHAR2(64)|Versión del Navegador|| | + | |15|SESSION_BROWSERVERSION|Y|VARCHAR2(64)|Versión del Navegador|Externo, Requerido| |
- | |16|SESSION_OSTYPE|Y|VARCHAR2(64)|Sistema Operativo|| | + | |16|SESSION_OSTYPE|Y|VARCHAR2(64)|Sistema Operativo|Externo, Requerido| |
- | |17|ERROR_LOG|Y|CLOB|Utilizada solo para casos especiales donde sea necesaria registrar información amplia del error|| | + | |17|ERROR_LOG|Y|CLOB|Utilizada solo para casos especiales donde sea necesaria registrar información amplia del error|Externo, Requerido| |
- | |18|ERROR_TYPE|Y|VARCHAR2(64)|Tipo del error (LEVE, MODERADO, CRITICO por defecto)|| | + | |18|ERROR_TYPE|Y|VARCHAR2(64)|Tipo del error (LEVE, MODERADO, CRITICO por defecto)|Externo| |
+ | |||
+ | ==== Columna: WS ==== | ||
+ | Se adiciona esta columna para identificar reglas asociadas a la implementación de los servicios web que permiten gestionar el almacenamiento de los logs. La columna es una referencia y no hace parte del servicio sin embargo las reglas que se definen en ella si aplican para la columna relacionada: | ||
+ | |||
+ | === Reglas === | ||
+ | |||
+ | * **Interno**: Indica que el campo se gestiona dentro del servicio y por lo tanto no se pedira en los parametros. | ||
+ | * **Autoincremental**: Indica que el campo se comporta como una secuencia. | ||
+ | * **Externo**: Indica que el campo debe estar en los parametros del consumo. | ||
+ | * **Requerido**: Indica que el campo debe ser enviado en el consumo y el servicio debe validarlo para continuar. | ||
+ | * **Obsoleto**: Indica que el campo ya no es utilizado en la nueva implementación. | ||
+ | * **No utilizado**: Indica que el campo no será utilizado en ninguna implementación. | ||
+ | |||
+ | === Nota === | ||
+ | * Todas las operaciones del servicio que gestiona la persistencia de la tabla deben estar documentadas incluyendo la definición de los campos, formatos, longitudes de columnas e indicar si es requerido o no. | ||
+ | |||
+ | ==== Columna: ERROR_LOG ==== | ||
+ | Esta columna sirve para almacenar información extra del error generado((Trazas)) que se generar en los procesos. Se define la siguiente estructura base ejemplo: | ||
+ | |||
+ | <code yaml> | ||
+ | { | ||
+ | "errors":[ | ||
+ | { | ||
+ | "error_code":"Requerido: Número del error o nombre de la excepción", | ||
+ | "error_description": "Requerido: Descripción técnica del error", | ||
+ | "error_tracer": "Pila de mensajes capturada en el error" | ||
+ | "error_line": "Linea del proceso donde se genera el error" | ||
+ | "error_method": "Método donde se genera el error" | ||
+ | } | ||
+ | ] | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Donde: | ||
+ | |||
+ | * **errors**: Array de errores en el proceso | ||
+ | * **error_code**: Propiedad contenida en cada indice del array json. Representa el código del error, alguna aplicaciones pueden represnetar este código como un número o como nombre de excepción. | ||
+ | * **error_description**: Propiedad contenida en cada indice del array json. Representa el mensaje técnico del error generado. | ||
+ | * **error_tracer**: Propiedad contenida en cada indice del array json. Representa la traza del error generado. | ||
+ | * **error_line**: Propiedad contenida en cada indice del array json. Representa la linea donde se ha generado el error. | ||
+ | * **error_method**: Propiedad contenida en cada indice del array json. Representa el método donde se ha generado el error. | ||
+ | |||
+ | Ejemplo: | ||
+ | |||
+ | <code yaml> | ||
+ | { | ||
+ | "errors":[ | ||
+ | { | ||
+ | "error_code":"2501", | ||
+ | "error_description": "Error actualizando saldos de rubros.", | ||
+ | "error_tracer": "ORA-0001 PK Constrainst Invalid" | ||
+ | "error_line": "25" | ||
+ | "error_method": "of_calcular_saldos" | ||
+ | }, | ||
+ | { | ||
+ | "error_code":"java.lang.NullPointerException", | ||
+ | "error_description": "Error actualizando saldos de rubros.", | ||
+ | "error_tracer": "Exception in thread main java.lang.NullPointerException | ||
+ | at Printer.printString(Printer.java:13) | ||
+ | at Printer.print(Printer.java:9) | ||
+ | at Printer.main(Printer.java:19)" | ||
+ | "error_line": "23" | ||
+ | "error_method": "of_calcular_saldos" | ||
+ | } | ||
+ | ] | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | === Notas === | ||
+ | * Los valores de las columnas deben ser registrados como String | ||
==== Modo de uso: Powerbuilder - Documentación ==== | ==== Modo de uso: Powerbuilder - Documentación ==== | ||
Para visualizar la documentación debe descargar el siguiente repositorio [[http://adacsc.co:1443/svn/repository/ADA/SICOF/Objetos%20SICOF/FUENTES/branches/branches%2012.5.2.5.0/doc/documentacion|Documentación]], abrir la pagina Index.html en su navegador web la cual es similar a la siguiente imagen: | Para visualizar la documentación debe descargar el siguiente repositorio [[http://adacsc.co:1443/svn/repository/ADA/SICOF/Objetos%20SICOF/FUENTES/branches/branches%2012.5.2.5.0/doc/documentacion|Documentación]], abrir la pagina Index.html en su navegador web la cual es similar a la siguiente imagen: | ||
- | {{ :ada:howto:sicoferp:factory:logmodels:pbdoclogs.png?600 |}} | + | {{ :ada:howto:sicoferp:factory:logmodels:pbdoc_objetos_sicof.png?600 |}} |
En ella encontrará la documentación de las librerias que hacen parte del framework **Objetos SICOF** el cuál se irá actualizando frecuentmente a medida que se documenten las clases. | En ella encontrará la documentación de las librerias que hacen parte del framework **Objetos SICOF** el cuál se irá actualizando frecuentmente a medida que se documenten las clases. | ||
Línea 57: | Línea 127: | ||
<code java> | <code java> | ||
/*Ejemplos de uso utilizando la instancia genérica de la clase guo_app*/ | /*Ejemplos de uso utilizando la instancia genérica de la clase guo_app*/ | ||
- | guo_app.of_log_error( ).of_add_log("Ejemplo", 10, true, SQLCA) | + | guo_app.of_log_error( ).of_add_log("EJEMPLO_CODE", 10, true, SQLCA) |
- | guo_app.of_log_error( ).of_add_log("Ejemplo", "ERROR_DB", true, SQLCA) | + | guo_app.of_log_error( ).of_add_log("EJEMPLO_CODE", "ERROR_DB", true, SQLCA) |
- | guo_app.of_log_error( ).of_add_log("Ejemplo", 10, ls_args, true, SQLCA) | + | guo_app.of_log_error( ).of_add_log("EJEMPLO_CODE", 10, ls_args, true, SQLCA) |
guo_app.of_log_error( ).of_add_log_text("Ejemplo", "ERROR_DB", "Presupuesto", true, SQLCA) | guo_app.of_log_error( ).of_add_log_text("Ejemplo", "ERROR_DB", "Presupuesto", true, SQLCA) | ||
guo_app.of_log_error( ).of_add_log_text( sqldbcode, sqlerrtext, dataobject, sqlsyntax, ls_ventana, true, lts_db) | guo_app.of_log_error( ).of_add_log_text( sqldbcode, sqlerrtext, dataobject, sqlsyntax, ls_ventana, true, lts_db) | ||
Línea 69: | Línea 139: | ||
"El array de formateo se utiliza cuando el mensaje se genera por expresiones: | "El array de formateo se utiliza cuando el mensaje se genera por expresiones: | ||
Ejemplo: | Ejemplo: | ||
- | Mensaje Base = Hola #1, | + | Mensaje Base = Hola #1 (identificado con el código de mensaje SALUDO_CODE), |
se crea un array con un expresión de la siguiente forma | se crea un array con un expresión de la siguiente forma | ||
array[1] = "Mundo", | array[1] = "Mundo", | ||
Línea 76: | Línea 146: | ||
n_cst_log_error luo_log_error | n_cst_log_error luo_log_error | ||
String ls_args[] | String ls_args[] | ||
- | ls_args[1] = "Expresión 1" | + | ls_args[1] = "Mundo" |
luo_log_error = Create n_cst_log_error | luo_log_error = Create n_cst_log_error | ||
- | luo_log_error.of_add_log("Ejemplo Hola #1", 10, ls_args, true, SQLCA) | + | luo_log_error.of_add_log("SALUDO_CODE", 10, ls_args, true, SQLCA) |
destroy luo_log_error | destroy luo_log_error | ||
/*Ejemplo de uso definiendo la clase de error y | /*Ejemplo de uso definiendo la clase de error y | ||
- | registra en el log el mensaje. | + | registra en el log el mensaje por medio de un código de mensaje. |
Posteriormente elimina la instancia de la clase de gestión de error.*/ | Posteriormente elimina la instancia de la clase de gestión de error.*/ | ||
n_cst_log_error luo_log_error | n_cst_log_error luo_log_error | ||
luo_log_error = Create n_cst_log_error | luo_log_error = Create n_cst_log_error | ||
- | luo_log_error.of_add_log("Ejemplo", 10, true, SQLCA) | + | luo_log_error.of_add_log("EJEMPLO_CODE", 10, true, SQLCA) |
destroy luo_log_error | destroy luo_log_error | ||
/*Ejemplo de uso definiendo la clase de error y | /*Ejemplo de uso definiendo la clase de error y | ||
- | registra en el log el mensaje. | + | registra en el log el mensaje por medio de un código de mensaje. |
Posteriormente elimina la instancia de la clase de gestión de error.*/ | Posteriormente elimina la instancia de la clase de gestión de error.*/ | ||
n_cst_log_error luo_log_error | n_cst_log_error luo_log_error | ||
luo_log_error = Create n_cst_log_error | luo_log_error = Create n_cst_log_error | ||
- | luo_log_error.of_add_log("Ejemplo", "ERROR_DB", true, SQLCA) | + | luo_log_error.of_add_log("EJEMPLO_CODE", "ERROR_DB", true, SQLCA) |
destroy luo_log_error | destroy luo_log_error | ||
</code> | </code> | ||
== Consideraciones == | == Consideraciones == | ||
- | * El API puede ser activada o desactivada por medio de la constante: **LOG_ERRORS** (Solo en aplicaciones SICOF ERP (Appeon/Powerbuilder)). | + | * El API puede ser activada o desactivada por medio de la constante: **LOG_ERRORS** (Solo en aplicaciones SICOF ERP (Appeon/Powerbuilder)) siempre y cuando se utilice la implementación de la clase **guo_app**. |
* El desarrollador es el encargado de gestionar la transacción que realiza la persistencia. | * El desarrollador es el encargado de gestionar la transacción que realiza la persistencia. | ||
* Se automatiza el registro de errores en los objetos **uo_datawindow** y **uo_datastore** en toda su herencia. | * Se automatiza el registro de errores en los objetos **uo_datawindow** y **uo_datastore** en toda su herencia. | ||
* Se automatiza el registro de errores genéricos no controlados lanzados por el evento **systemerror** de Powerbuilder. | * Se automatiza el registro de errores genéricos no controlados lanzados por el evento **systemerror** de Powerbuilder. | ||
+ | * Para el procesamiento de logs de bloques se implementa Clase sailjson para procesamiento de cadenas de texto en ese formato. | ||
+ | * Cada módulo (Contabilidad, Prespuesto, Tesorería, Compras, Talento y Nómina) debe implementar el método de inicialización **guo_app.of_init_logs(SQLCA)** en el método **of_process_step_init_transaction** de la clase **guo_app** especializada por cada módulo. A continuación se muestra una imagen de referencia de la implementación del módulo de presupuesto. Utilice esta guía para implementaciones en otros módulos teniendo presente que la clase **n_cst_app** se especializa con el nombre de la aplicación que la contiene. Ejemplo: en presupuesto la clase especializada es **n_cst_app_presupuesto**, por lo general la clase esta en la libreria principal que contiene el objeto **Application**. | ||
+ | |||
+ | {{ :ada:howto:sicoferp:factory:logmodels:ejemplo_n_cst_app.png?600 |}} | ||
+ | |||
+ | == API Json == | ||
+ | Se adicionan métodos de procesamiento de bloques en formato json los cuales pueden ser utilizados para registrar trazas de error a continuación se muestran ejemplos de uso del API. | ||
+ | |||
+ | <code java> | ||
+ | sailjson ljson, ljson1 | ||
+ | String ls_content | ||
+ | |||
+ | ljson = create sailjson | ||
+ | ljson.setattribute( 'version', '1001') | ||
+ | //add json object | ||
+ | ljson1 = ljson.addobject( 'header') | ||
+ | ljson1.setattribute( 'count', 3) | ||
+ | ljson1.setattribute( 'comment', 'items count') | ||
+ | |||
+ | //add json object array, first item | ||
+ | ljson1 = ljson.addarrayitem( 'data') | ||
+ | ljson1.setattribute( 'colid', 1) | ||
+ | ljson1.setattribute( 'colname', 'aaaaaa') | ||
+ | ljson1.setattribute( 'coladdr', '') | ||
+ | //add second item of the array | ||
+ | ljson1 = ljson.addarrayitem( 'data') | ||
+ | ljson1.setattribute( 'colid', 2) | ||
+ | ljson1.setattribute( 'colname', 'bbbbbbbb') | ||
+ | setnull(ls) | ||
+ | ljson1.setattribute( 'coladdr', ls) | ||
+ | //add third item of the array | ||
+ | ljson1 = ljson.addarrayitem( 'data') | ||
+ | ljson1.setattribute( 'colid', 3) | ||
+ | ljson1.setattribute( 'colname', 'cccccc') | ||
+ | |||
+ | ljson.setattribute( 'creattime', string(now(), 'yyyymmdd.hhmmss')) | ||
+ | |||
+ | ls_content = ljson.getformatjson('' ) | ||
+ | destroy ljson | ||
+ | </code> | ||
+ | |||
+ | == Limitaciones == | ||
+ | Se identifica que actualmente la versión de Appeon (2013/2016) presenta problemas con el procesamiento del API Json para estructuras complejas como Arrays por esta razon cada procesamiento del API debe ser realizado a un solo nivel de complejidad. A continuacion se muestra un ejemplo de uso funcional en Appeon/Powerbuilder que puede ser tomado como referencia. | ||
+ | |||
+ | <code java> | ||
+ | /*PASO 1: Definir un objeto de la clase sailjson en la zona de instancia del componente donde se va utilizar el API como una ventana, objeto no visual, etc*/ | ||
+ | sailjson iuo_json | ||
+ | </code> | ||
+ | |||
+ | <code java> | ||
+ | /*PASO 2: Incializar el objeto iuo_json antes de utilizarlo*/ | ||
+ | iuo_json= create sailjson | ||
+ | </code> | ||
+ | |||
+ | <code java> | ||
+ | /* | ||
+ | PASO 3: No es obligatorio, pero se recomienda crear un método local de asignación para simplificar el proceso como ejemplo se define metodo of_add_log_error con los siguientes argumentos | ||
+ | Integer ai_indx | ||
+ | String as_error_code | ||
+ | String as_error_description | ||
+ | String as_error_line | ||
+ | String as_error_method | ||
+ | String as_error_tracer | ||
+ | */ | ||
+ | |||
+ | //Validaciones previas de control | ||
+ | if IsNull(ai_indx) then ai_indx = 0 | ||
+ | if IsNull(as_error_code) then as_error_code = "" | ||
+ | if IsNull(as_error_description) then as_error_description = "" | ||
+ | if IsNull(as_error_line) then as_error_line = "" | ||
+ | if IsNull(as_error_method) then as_error_method = "" | ||
+ | if IsNull(as_error_tracer) then as_error_tracer= "" | ||
+ | |||
+ | //Registrar las propiedades del error con el indice | ||
+ | iuo_json.setattribute("error" + String(ai_indx) + "_code", as_error_code) | ||
+ | iuo_json.setattribute("error" + String(ai_indx) + "_description", as_error_description) | ||
+ | iuo_json.setattribute("error" + String(ai_indx) + "_line", as_error_line) | ||
+ | iuo_json.setattribute("error" + String(ai_indx) + "_method", as_error_method) | ||
+ | iuo_json.setattribute("error" + String(ai_indx) + "_tracer", as_error_tracer) | ||
+ | |||
+ | </code> | ||
+ | |||
+ | <code java> | ||
+ | //En el metodo donde se gestiona el error se consume el API Log de Errores con traza en formato json, se recomienda uitlizar una transacción diferente a la del proceso para que se pueda almacenar el error | ||
+ | guo_app.of_log_error( ).of_add_log("EJEMPLO_CODE", 10, lson, true, SQLCA) | ||
+ | |||
+ | //Por último se debe reiniciar el componente para otro proceso | ||
+ | iuo_json = Create sailjson | ||
+ | </code> | ||
+ | |||
+ | <code java> | ||
+ | //Invocar el método local of_add_log_error | ||
+ | of_add_log_error(1, "-1", 'Error actualizando base de datos', '100', 'SystemError', '') | ||
+ | </code> | ||
+ | |||
+ | ==== Modo de uso: Java ==== | ||
+ | Para las aplicaciones desarrolladas en las tecnologías (Web): | ||
+ | |||
+ | * Java | ||
+ | * .Net | ||
+ | * PHP | ||
- | ==== Modo de uso: Java (Próximamente) ==== | + | el log de sesión será implementado por medio de un [[http://10.1.20.89/doku.php?id=ada:howto:sicoferp:factory:integrations:logs|Servicio Web]] el cual deberá considerar las reglas de [[#Columna: WS|Columna: WS]] |
- | Para las aplicaciones desarrolladas en la tecnología Java el log de sesión será implementado por medio de un servicio web. | + | |
[[ada:howto:sicoferp:factory:logmodels|←Volver atras]] | [[ada:howto:sicoferp:factory:logmodels|←Volver atras]] | ||