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:fileuploadlog [2021/08/18 21:36] administraidor |
ada:howto:sicoferp:factory:logmodels:fileuploadlog [2021/09/21 13:09] (actual) administraidor |
||
---|---|---|---|
Línea 123: | Línea 123: | ||
=== Ejemplos de Uso === | === Ejemplos de Uso === | ||
- | Para facilitar la implementación y uso del API de gestión de errores se crea un objeto interno privado en la clase global **guo_app** el cual puede ser accedido por el método **of_log_error()** que devuelve la instancia del objeto. Sin embargo para implementaciones específicas se puede optar por crear y administrar la clase de error **n_cst_log_error** según considere el desarrollador. | + | Para facilitar la implementación y uso del API de gestión de log de cargas se crea un objeto interno privado en la clase global **guo_app** el cual puede ser accedido por el método **of_log_file_upload()** que devuelve la instancia del objeto. Sin embargo para implementaciones específicas se puede optar por crear y administrar la clase **n_cst_log_file_upload** según considere el desarrollador. |
A continuación se listan ejemplos de uso el cuál presenta las forma de utilizar el API, para más información debe consultar la documentación en el repositorio. | A continuación se listan ejemplos de uso el cuál presenta las forma de utilizar el API, para más información debe consultar la documentación en el repositorio. | ||
Línea 129: | Línea 129: | ||
<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_CODE", 10, true, SQLCA) | + | guo_app.of_log_file_upload( ).of_set_process_header(f_hoy(), "carga_prueba.txt", "Carga de Terceros") |
- | guo_app.of_log_error( ).of_add_log("EJEMPLO_CODE", "ERROR_DB", true, SQLCA) | + | guo_app.of_log_file_upload( ).of_add_log(10, "codigo_tercero", "columna nula", true, SQLCA) |
- | guo_app.of_log_error( ).of_add_log("EJEMPLO_CODE", 10, ls_args, true, SQLCA) | + | guo_app.of_log_file_upload( ).of_add_log(f_hoy(), "carga_prueba.txt", "Carga de Terceros", 10, "codigo_tercero", "columna nula", true, SQLCA) |
- | guo_app.of_log_error( ).of_add_log_text("Ejemplo", "ERROR_DB", "Presupuesto", true, SQLCA) | + | guo_app.of_log_file_upload( ).of_add_log(f_hoy(), "carga_prueba.txt", "Carga de Terceros", 10, ljson, true, SQLCA) |
- | guo_app.of_log_error( ).of_add_log_text( sqldbcode, sqlerrtext, dataobject, sqlsyntax, ls_ventana, true, lts_db) | + | |
- | /*Ejemplo de uso definiendo la clase de error, | + | /*Ejemplo de uso definiendo la clase*/ |
- | instancia el array de formateo de mensaje y | + | n_cst_log_file_upload luo_log_file_upload |
- | registra en el log el mensaje formateado. | + | luo_log_file_upload= Create n_cst_log_file_upload |
- | Posteriormente elimina la instancia de la clase de gestión de error. | + | luo_log_file_upload.of_add_log(f_hoy(), "carga_prueba.txt", "Carga de Terceros", 10, ljson, true, SQLCA) |
- | "El array de formateo se utiliza cuando el mensaje se genera por expresiones: | + | destroy luo_log_file_upload |
- | Ejemplo: | + | |
- | 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 | + | |
- | array[1] = "Mundo", | + | |
- | de esta forma al usar el método of_add_log se genera el mensaje: Hola Mundo". | + | |
- | */ | + | |
- | n_cst_log_error luo_log_error | + | |
- | String ls_args[] | + | |
- | ls_args[1] = "Mundo" | + | |
- | luo_log_error = Create n_cst_log_error | + | |
- | luo_log_error.of_add_log("SALUDO_CODE", 10, ls_args, true, SQLCA) | + | |
- | destroy luo_log_error | + | |
- | + | ||
- | /*Ejemplo de uso definiendo la clase de error y | + | |
- | 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.*/ | + | |
- | n_cst_log_error luo_log_error | + | |
- | luo_log_error = Create n_cst_log_error | + | |
- | luo_log_error.of_add_log("EJEMPLO_CODE", 10, true, SQLCA) | + | |
- | destroy luo_log_error | + | |
- | + | ||
- | /*Ejemplo de uso definiendo la clase de error y | + | |
- | 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.*/ | + | |
- | n_cst_log_error luo_log_error | + | |
- | luo_log_error = Create n_cst_log_error | + | |
- | luo_log_error.of_add_log("EJEMPLO_CODE", "ERROR_DB", true, SQLCA) | + | |
- | 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_UPLOAD_FILE** (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 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. | * 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 **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 == | == API Json == | ||
Línea 212: | Línea 184: | ||
destroy ljson | destroy ljson | ||
</code> | </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> | <code java> | ||
- | /*Ejemplo de Uso del API con el Log de Errores*/ | + | /*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 ljson, ljson1 | + | sailjson iuo_json |
- | ljson = create sailjson | + | </code> |
- | //add json object array, first item | + | |
- | ljson1 = ljson.addarrayitem( 'errors') | + | <code java> |
- | ljson1.setattribute( 'error_code', '-1') | + | /*PASO 2: Incializar el objeto iuo_json antes de utilizarlo*/ |
- | ljson1.setattribute( 'error_description', 'Error actualizando base de datos') | + | iuo_json= create sailjson |
- | ljson1.setattribute( 'error_line', '100') | + | </code> |
- | ljson1.setattribute( 'error_method', 'SystemError') | + | |
- | ljson1.setattribute( 'error_tracer', '') | + | <code java> |
- | //add second item of the array | + | /* |
- | ljson1 = ljson.addarrayitem( 'errors') | + | 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_file_upload con los siguientes argumentos |
- | ljson1.setattribute( 'error_code', '-10') | + | Integer ai_indx |
- | ljson1.setattribute( 'error_description', 'Error general del sistema') | + | String as_column_name |
- | ljson1.setattribute( 'error_line', '101') | + | String as_column_value |
- | ljson1.setattribute( 'error_method', 'SystemError') | + | String as_column_notifications[] |
- | ljson1.setattribute( 'error_tracer', 'SystemOutMemoryError') | + | */ |
- | //Consumir Log de Errores con traza en formato json | + | |
- | guo_app.of_log_error( ).of_add_log("EJEMPLO_CODE", 10, lson, true, SQLCA) | + | //Validaciones previas de control |
- | </code> | + | if IsNull(ai_indx) then ai_indx = 0 |
+ | if IsNull(as_column_name) then return | ||
+ | if IsNull(as_column_value) then as_column_value = "" | ||
+ | if IsNull(as_column_notifications) then return | ||
+ | if UpperBound(as_column_notifications) = 0 then return | ||
+ | |||
+ | //Registrar las propiedades de la notificación con el indice | ||
+ | iuo_json.setattribute("column" + String(ai_indx) + "_name", as_column_name) | ||
+ | iuo_json.setattribute("column" + String(ai_indx) + "_value", as_column_value) | ||
+ | |||
+ | //Registrar los mensajes de notificación con los indices | ||
+ | Integer li_i, li_count | ||
+ | String ls_msg | ||
+ | li_count = UpperBound(as_column_notifications) | ||
+ | for li_i = 1 to li_count | ||
+ | ls_msg = as_column_notifications[li_i] | ||
+ | iuo_json.setattribute("column" + String(ai_indx) + "_notifications" + String(li_i), ls_msg) | ||
+ | next | ||
+ | |||
+ | </code> | ||
+ | |||
+ | <code java> | ||
+ | //En el metodo donde se gestionan las notificaciones se consume el API Log de Cargas con traza en formato json, se recomienda utilizar una transacción diferente a la del proceso para que se pueda almacenar la notificación | ||
+ | guo_app.of_log_file_upload( ).of_add_log(f_hoy(), "carga_prueba.txt", "Carga de Terceros", 10, iuo_json, 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_file_upload | ||
+ | of_add_log_file_upload (1, 'codigo_tercero', '', ls_notificaciones) | ||
+ | </code> | ||
==== Modo de uso: Java ==== | ==== Modo de uso: Java ==== |