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/19 14:55] administraidor |
ada:howto:sicoferp:factory:logmodels:transaccionallog [2021/09/20 13:38] (actual) administraidor |
||
---|---|---|---|
Línea 140: | Línea 140: | ||
* 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. | ||
* 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 **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 generar la clase esta en la libreria principal que contiene el objeto **Application**. | + | * 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 |}} | {{ :ada:howto:sicoferp:factory:logmodels:ejemplo_n_cst_app.png?600 |}} | ||
Línea 179: | Línea 179: | ||
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 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> | <code java> | ||
- | /*Ejemplo de Uso del API con el Log de Cargas*/ | + | /*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, ljson2 | + | sailjson iuo_json |
- | ljson = create sailjson | + | |
- | //add json object array, first item | + | |
- | ljson1 = ljson.addarrayitem('columns') | + | |
- | ljson1.setattribute( 'column_name', 'codigo_tercero') | + | |
- | ljson1.setattribute( 'column_old_value', '0') | + | |
- | ljson1.setattribute( 'column_new_value', '1234') | + | |
- | //add second item of the array | + | |
- | ljson1 = ljson.addarrayitem( 'columns') | + | |
- | ljson1.setattribute( 'column_name', 'valor_debito') | + | |
- | ljson1.setattribute( 'column_old_value', '0') | + | |
- | ljson1.setattribute( 'column_new_value', '100000') | + | |
- | //Consumir Log de Cargas con traza en formato json | + | |
- | guo_app.of_log_transactional( ).of_add_log(f_hoy(), "Causación por Plantilla", "Update", "PRESUP01.DET_ASIENTO_CONTABLE", ljson, true, SQLCA) | + | |
</code> | </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 ==== |