Herramientas de usuario

Herramientas del sitio


ada:howto:sicoferp:factory:logmodels:fileuploadlog

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

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"​10ljson, true, SQLCA)
-guo_app.of_log_error( ).of_add_log_textsqldbcodesqlerrtextdataobjectsqlsyntaxls_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 arrayfirst 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 obligatoriopero 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 ​
 +if IsNull(as_column_namethen return 
 +if IsNull(as_column_valuethen as_column_value = ""​ 
 +if IsNull(as_column_notificationsthen 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 ====
ada/howto/sicoferp/factory/logmodels/fileuploadlog.1629322582.txt.gz · Última modificación: 2021/08/18 21:36 por administraidor