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 ==== | ||