Este es el log utilizado para registrar las notificaciones que puedan presentar en los procesos de cargas de información.
A continuación se listan los tipos de notificaciones que deben ser considerados en el log de Cargas
Este servicio debe consumirse en los procesos de cargas de:
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.
OWNER | SICOF | TABLE | FILE_UPLOAD_LOG | COMMENTS | Contiene el log de cargas de archivos o procesos de las aplicaciones de la compañia |
---|---|---|---|---|---|
# | NAME | NULL | TYPE | COMMENTS | WS1) |
1 | ID | N | NUMBER | Código interno del registro (Se controla por secuencia) | Interno, Autoincremental |
2 | FECHA | Y | DATE | Fecha en la cuál se genera la carga | No utilizado |
3 | NOMBRE_ARCHIVO | Y | VARCHAR2(256) | Mensaje simple del error (Resumen) | Externo, Requerido |
4 | NOMBRE_PROCESO | Y | VARCHAR2(256) | Nombre del proceso que realiza la carga | Externo, Requerido |
5 | NUMERO_LINEA | Y | NUMBER | Número de linea del archivo donde se genera la notificación | Externo, Requerido |
6 | COLUMNA_GRUPO | Y | VARCHAR2(1024) | Columna o grupo de colunas que generan la notificación | Obsoleto, Externo |
7 | NOTIFICACION | Y | VARCHAR2(2048) | Mensaje de notificación | Obsoleto, Externo |
8 | LOG_LINEA | N | CLOB | Array Json que contiene las notificaciones generadas en la linea | Externo, Requerido |
8 | HOST_CLIENTE | Y | VARCHAR2(50) | Host del cliente (Dirección IP) | Externo, Requerido |
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 | 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 | Externo, Requerido |
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) | Externo |
14 | SESSION_MAC | Y | VARCHAR2(64) | MAC del equipo del usuario | Externo |
15 | SESSION_BROWSERVERSION | Y | VARCHAR2(64) | Versión del Navegador | Externo, Requerido |
16 | SESSION_OSTYPE | Y | VARCHAR2(64) | Sistema Operativo | Externo, Requerido |
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:
Esta columna sirve para almacenar todas la notificaciones que se pueden presentar al procesar una linea del archivo de la carga. Se define la siguiente estructura base ejemplo:
{ "columns":[ { "column_name":"Requerido: Nombre de la columna", "column_value": "Requerido: Valor de la columna", "column_notifications": [ {"msg":"Requerido: Mensaje de Notificación 1"}, {"msg":"Requerido: Mensaje de Notificación 2"}, {"msg":"Requerido: Mensaje de Notificación N"} ] } ] }
Donde:
Ejemplo:
{ "columns":[ { "column_name":"fecha_sistema", "column_value": "01/01/20", "column_notifications": [ {"msg":"El año de la fecha es menor a la vigencia actual"}, {"msg":"La fecha no tiene el formato dd/mm/yyyy"} ] } ] }
Para visualizar la documentación debe descargar el siguiente repositorio Documentación, abrir la pagina Index.html en su navegador web la cual es similar a la siguiente imagen:
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.
La Libreria que contiene la funcionalidad de los logs es la librería sf00util.pbl
Los Objetos relacionados en el API son:
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.
/*Ejemplos de uso utilizando la instancia genérica de la clase guo_app*/ guo_app.of_log_file_upload( ).of_set_process_header(f_hoy(), "carga_prueba.txt", "Carga de Terceros") guo_app.of_log_file_upload( ).of_add_log(10, "codigo_tercero", "columna nula", 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_file_upload( ).of_add_log(f_hoy(), "carga_prueba.txt", "Carga de Terceros", 10, ljson, true, SQLCA) /*Ejemplo de uso definiendo la clase*/ n_cst_log_file_upload luo_log_file_upload luo_log_file_upload= Create n_cst_log_file_upload luo_log_file_upload.of_add_log(f_hoy(), "carga_prueba.txt", "Carga de Terceros", 10, ljson, true, SQLCA) destroy luo_log_file_upload
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.
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
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.
/*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
/*PASO 2: Incializar el objeto iuo_json antes de utilizarlo*/ iuo_json= create sailjson
/* 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 Integer ai_indx String as_column_name String as_column_value String as_column_notifications[] */ //Validaciones previas de control 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
//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
//Invocar el método local of_add_log_file_upload of_add_log_file_upload (1, 'codigo_tercero', '', ls_notificaciones)
Para las aplicaciones desarrolladas en las tecnologías (Web):
el log de sesión será implementado por medio de un Servicio Web el cual deberá considerar las reglas de Columna: WS