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:transaccionallog [2021/08/13 19:24] administraidor |
ada:howto:sicoferp:factory:logmodels:transaccionallog [2021/09/20 13:38] (actual) administraidor |
||
|---|---|---|---|
| Línea 67: | Línea 67: | ||
| "columns":[ | "columns":[ | ||
| { | { | ||
| - | "column_name":"Nombre de la columna", | + | "column_name":"Requerido: Nombre de la columna", |
| "column_old_value": "Valor anterior de la columna", | "column_old_value": "Valor anterior de la columna", | ||
| "column_new_value": "Valor actual de la columna" | "column_new_value": "Valor actual de la columna" | ||
| Línea 79: | Línea 79: | ||
| * **columns**: Arrya de Columnas en la transacción | * **columns**: Arrya de Columnas en la transacción | ||
| * **column_name**: Propiedad contenida en cada indice del array json que representa el nombre de la columna en la transacción. | * **column_name**: Propiedad contenida en cada indice del array json que representa el nombre de la columna en la transacción. | ||
| - | * **column_old_value**: Propiedad contenida en cada indice del array json que representa el valor anterior de la columna en la transacción. | + | * **column_old_value**: Propiedad contenida en cada indice del array json que representa el valor anterior de la columna en la transacción (Requerida para operaciones Update, Delete). |
| - | * **column_new_value**: Propiedad contenida en cada indice del array json que representa el valor actual de la columna en la transacción. | + | * **column_new_value**: Propiedad contenida en cada indice del array json que representa el valor actual de la columna en la transacción (Requerida para operaciones Insert, Update). |
| Ejemplo: | Ejemplo: | ||
| Línea 101: | Línea 101: | ||
| </code> | </code> | ||
| + | === Notas === | ||
| + | * Los valores de las columnas deben ser registrados como String | ||
| Línea 106: | Línea 108: | ||
| 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 114: | Línea 116: | ||
| Los Objetos relacionados en el API son: | Los Objetos relacionados en el API son: | ||
| - | * **n_cst_app**: Clase contenedora de objetos logs | + | * **n_cst_app**: Clase contenedora de objetos logs |
| * **n_cst_log_transactional**: Clase para la gestión de log de transacciones | * **n_cst_log_transactional**: Clase para la gestión de log de transacciones | ||
| + | |||
| + | === Ejemplos de Uso === | ||
| + | Para facilitar la implementación y uso del API de gestión de log de transacciones se crea un objeto interno privado en la clase global **guo_app** el cual puede ser accedido por el método **of_log_transactional()** que devuelve la instancia del objeto. Sin embargo para implementaciones específicas se puede optar por crear y administrar la clase **n_cst_log_transactional** 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. | ||
| + | |||
| + | <code java> | ||
| + | /*Ejemplos de uso utilizando la instancia genérica de la clase guo_app*/ | ||
| + | guo_app.of_log_transactional( ).of_add_log(f_hoy(), "Causación por Plantilla", "Update", "PRESUP01.MAESTRO_ASIENTO_CONTABLE", "codigo_tercero", "0", "6949", true, SQLCA) | ||
| + | guo_app.of_log_transactional( ).of_add_log(f_hoy(), "Causación por Plantilla", "Update", "PRESUP01.MAESTRO_ASIENTO_CONTABLE", ljson, true, SQLCA) | ||
| + | |||
| + | /*Ejemplo de uso definiendo la clase*/ | ||
| + | n_cst_log_transactional luo_log_transactional | ||
| + | luo_log_transactional = Create n_cst_log_transactional | ||
| + | luo_log_transactional.of_add_log(f_hoy(), "Causación por Plantilla", "Update", "PRESUP01.MAESTRO_ASIENTO_CONTABLE", ljson, true, SQLCA) | ||
| + | destroy luo_log_transactional | ||
| + | </code> | ||
| + | |||
| + | == Consideraciones == | ||
| + | * El API puede ser activada o desactivada por medio de la constante: **LOG_TRANSACCIONAL** (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. | ||
| + | * 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 por cada registro que realice operaciones DML. 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_transactional con los siguientes argumentos | ||
| + | string as_dataobject | ||
| + | string as_column | ||
| + | string as_old_value | ||
| + | string as_new_value | ||
| + | */ | ||
| + | |||
| + | //Validaciones previas de control | ||
| + | if IsNull(as_dataobject) then return | ||
| + | if IsNull(as_column) then return | ||
| + | if IsNull(as_old_value) then as_old_value = "" | ||
| + | if IsNull(as_new_value) then as_new_value = "" | ||
| + | |||
| + | //Crear propiedad de la columna con el valor anterior | ||
| + | iuo_json.setattribute(as_dataobject + "." + as_column + "_OldValue", as_old_value) | ||
| + | |||
| + | //Crear propiedad de la columna con el nuevo valor | ||
| + | iuo_json.setattribute(as_dataobject + "." + as_column + "_NewValue", as_new_value) | ||
| + | </code> | ||
| + | |||
| + | <code java> | ||
| + | //En el metodo de guardado del proceso consumir el API de Log de transacciones con el objeto json | ||
| + | guo_app.of_log_transactional( ).of_add_log(Date(ldt_fecha), "w_conexion_cliente_fe::guardar", "update", 'TBL_FE_CONEXION_CLIENTE', iuo_json, true, ts_transaccion) | ||
| + | |||
| + | //Por último se debe reiniciar el componente para otro proceso | ||
| + | iuo_json = Create sailjson | ||
| + | </code> | ||
| + | |||
| + | <code java> | ||
| + | //En el evento itemchanged del datawindow consumir el método local of_add_log_transactional | ||
| + | String ls_column, ls_old_data | ||
| + | ls_column = dwo.name | ||
| + | Choose Case ls_column | ||
| + | Case 'codigo_cliente' | ||
| + | ls_old_data = getitemstring(row, ls_column) | ||
| + | of_add_log_transactional(dataobject, ls_column, ls_old_data, data) | ||
| + | End Choose | ||
| + | </code> | ||
| ==== Modo de uso: Java ==== | ==== Modo de uso: Java ==== | ||
| - | Para las aplicaciones desarrolladas en la tecnología Java 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 las tecnologías (Web): |
| + | |||
| + | * Java | ||
| + | * .Net | ||
| + | * PHP | ||
| + | |||
| + | 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]] | ||
| [[ada:howto:sicoferp:factory:logmodels|←Volver atras]] | [[ada:howto:sicoferp:factory:logmodels|←Volver atras]] | ||