====== PowerBuilder - Implementaciones - Contexto Multiempresa ====== **SICOF ERP**, soporta configuraciones que permiten administrar sucursales (seccionales) por cliente. Esta funcionalidad es denominada **Multiempresa** y se puede implementar gracias al soporte que brinda la base de datos Oracle 11gR2 y versiones posteriores. Esta sección describe las actividades que deben ser implementadas por los desarrolladores Backend de la tecnología Powerbuilder para soportar **Multiempresa** en las funcionalidades que se implementen o mantengan. ===== Constantes Relacionadas ===== Para soportar la funcionalidad **Multiempresa** existen 3 constantes relacionadas las cuales se describen a continuación: * **BLOQUEAR_TRANSACCION**: Esta constante permite bloquear la transacción en el entorno **Multiempresa** para asegurar que los datos modificados persisten en la empresa de la sesión iniciada. Aplica cuando se utiliza el API de contexto. * **APLICAR_CONTEXTO**: Esta constante adiciona al contexto local de sesión el código de la empresa cuando se utiliza el API de contexto. * **LOG_REGISTER_SESSION**: Esta constante utilitaria se utiliza para registrar el Inicio y Fin de Sesión (Normal) en **SICOF ERP**. Se relaciona en el modelo multiempresa porque permite guardar la empresa de la sesión iniciada. Esta API es implementada automáticamente en los procesos de Login y Logout del sistema. ===== Modelos de Contexto de Empresa SICOF ERP ===== Existe 2 modelos de empresa soportados en SICOF ERP los cuales estan definidos en el siguiente repositorio [[http://adacsc.co:1443/svn/repository/ADA/SICOF/Documentos/Desarrollos/PowerBuilder/ScriptsDB/Tags/App/Financiero/25%20ENTORNO%20MULTIEMPRESA |SVN]] ==== Modelo Uni-Empresa ==== Este es el modelo tradicional de la mayoría de clientes que utilizan SICOF ERP. Aplica para clientes que sólo tienen una configuración de empresa por base de datos. Algunos de los clientes que soportan esta funcionalidad son: * ADA * LaPoint * VIVA * Valor+ * AMVA * Metroparques * CAR * Unillanos Para activar este modelo se deben registrar/actualizar las [[#|Constantes Relacionadas]] en el siguiente script **0001b CONSTANTES ENTORNO MULTIEMPRESA INACTIVO.sql** con los siguientes estados: --============================================================================== -- Fecha: 3:06 p. m. martes, 11 de mayo de 2021 - carlos.torres@ada.co -- Insert para definir la constante de bloqueo de transacción en entorno multiempresa --============================================================================== INSERT INTO SICOF.M_CONSTANTES (DESCRIPCION, APLICA, VALOR, VALOR_ALFA, FECHA_REGISTRO, CODIGO_MEMPRESA) SELECT 'BLOQUEAR_TRANSACCION', 'N', NULL, 'N', SYSDATE, '9999999999' FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM SICOF.M_CONSTANTES WHERE TRIM(DESCRIPCION) LIKE '%BLOQUEAR_TRANSACCION%'); --============================================================================== -- Fecha: 3:06 p. m. martes, 11 de mayo de 2021 - carlos.torres@ada.co -- Insert para definir la constante de registro de inicia y fin de sesión --============================================================================== INSERT INTO SICOF.M_CONSTANTES (DESCRIPCION, APLICA, VALOR, VALOR_ALFA, FECHA_REGISTRO, CODIGO_MEMPRESA) SELECT 'LOG_REGISTER_SESSION', 'S', NULL, 'S', SYSDATE, '9999999999' FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM SICOF.M_CONSTANTES WHERE TRIM(DESCRIPCION) LIKE '%LOG_REGISTER_SESSION%'); --============================================================================== -- Fecha: 3:06 p. m. martes, 11 de mayo de 2021 - carlos.torres@ada.co -- Insert para definir la constante de seteo de contexto en entorno multiempresa --============================================================================== INSERT INTO SICOF.M_CONSTANTES (DESCRIPCION, APLICA, VALOR, VALOR_ALFA, FECHA_REGISTRO, CODIGO_MEMPRESA) SELECT 'APLICAR_CONTEXTO', 'N', NULL, 'N', SYSDATE, '9999999999' FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM SICOF.M_CONSTANTES WHERE TRIM(DESCRIPCION) LIKE '%APLICAR_CONTEXTO%'); COMMIT; === Nota === La columna que soporta la empresa se llama **CODIGO_MEMPRESA**. ==== Modelo Multi-Empresa ==== Este modelo permite configurar en una sola instancia de base de datos configuraciones de varias empresas por medio de la columna **CODIGO_MEMPRESA** la cuál es propagada en todas las tablas especificas de las funcionalidades que contiene SICOF ERP. Algunos de los clientes que soportan esta funcionalidad son: * FOSEMED * FINEB Para activar este modelo se deben registrar/actualizar las [[#|Constantes Relacionadas]] en el siguiente scripts **0001a CONSTANTES ENTORNO MULTIEMPRESA ACTIVO.sql** con los siguientes estados: --============================================================================== -- Fecha: 3:06 p. m. martes, 11 de mayo de 2021 - carlos.torres@ada.co -- Insert para definir la constante de bloqueo de transacción en entorno multiempresa --============================================================================== INSERT INTO SICOF.M_CONSTANTES (DESCRIPCION, APLICA, VALOR, VALOR_ALFA, FECHA_REGISTRO, CODIGO_MEMPRESA) SELECT 'BLOQUEAR_TRANSACCION', 'S', NULL, 'S', SYSDATE, '9999999999' FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM SICOF.M_CONSTANTES WHERE TRIM(DESCRIPCION) LIKE '%BLOQUEAR_TRANSACCION%'); --============================================================================== -- Fecha: 3:06 p. m. martes, 11 de mayo de 2021 - carlos.torres@ada.co -- Insert para definir la constante de registro de inicia y fin de sesión --============================================================================== INSERT INTO SICOF.M_CONSTANTES (DESCRIPCION, APLICA, VALOR, VALOR_ALFA, FECHA_REGISTRO, CODIGO_MEMPRESA) SELECT 'LOG_REGISTER_SESSION', 'S', NULL, 'S', SYSDATE, '9999999999' FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM SICOF.M_CONSTANTES WHERE TRIM(DESCRIPCION) LIKE '%LOG_REGISTER_SESSION%'); --============================================================================== -- Fecha: 3:06 p. m. martes, 11 de mayo de 2021 - carlos.torres@ada.co -- Insert para definir la constante de seteo de contexto en entorno multiempresa --============================================================================== INSERT INTO SICOF.M_CONSTANTES (DESCRIPCION, APLICA, VALOR, VALOR_ALFA, FECHA_REGISTRO, CODIGO_MEMPRESA) SELECT 'APLICAR_CONTEXTO', 'S', NULL, 'S', SYSDATE, '9999999999' FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM SICOF.M_CONSTANTES WHERE TRIM(DESCRIPCION) LIKE '%APLICAR_CONTEXTO%'); COMMIT; === Notas === * Las tablas específicas son aquellas que soportan funcionalidades por cada empresa configurada. Ejemplo: Asientos Contables. * Las tablas generales son aquellas que comparten la información por todas las empresas configuradas. Ejemplo: Constantes. ===== Modo de Implementación Multiempresa en las Aplicaciones Powerbuilder ===== Para implementar el soporte multiempresa en las aplicaciones Powerbuilder debe seguir los siguientes pasos: ==== Setear contexto de empresa por transacción - Modo separado ==== Toda sentencia SQL embebida en el código Powerbuilder debe estar precedida por una instrucción de seteo de contexto la cuál se invoca por medio de la clase **n_cst_context** ubicada en la librería **sf00util.pbl** de Objetos SICOF de la siguiente manera: //Ejemplo de Referencia: n_cst_context iuo_context iuo_context = Create n_cst_context iuo_context.of_sql_embedded_context(ts_transaccion, gd_cempresa) SELECT FORMATO INTO :ls_datawindow FROM DET_FORMATOS_DOCUMENTO WHERE CODIGO_DOCUMENTO = 14 AND ACTIVO = 'S' Using ts_transaccion; El modo de implementación anterior puede ser sustituido por un modo centralizado gracias al objeto **guo_app** instancia de la clase **n_cst_app** ubicada en la librería **sf00util.pbl** de Objetos SICOF la cuál está disponible desde el inicio de sesión: //Ejemplo de Referencia: guo_app.of_sql_embedded_context(ats_db) SELECT CONCEPTO_CONTABLE, TIPO_CONTABLE INTO :ldb_concepto_contable, :ldb_tipo_contable FROM PRESUP01.MAE_CUENTAS_POR_COBRAR WHERE CODIGO_CPCOBRAR = :adb_cpcobrar USING ats_db; Este modo de seteo de contexto es el utilizado por los productos: * Contabilidad * Presupuesto * Tesorería * Nómina * Talento (Pendiente por implementar) ==== Setear contexto de empresa por transacción - Modo integrado ==== Toda sentencia SQL embebida en el código Powerbuilder debe incluir la columna **CODIGO_MEMPRESA** en su definición de la siguiente manera: //Ejemplo de Referencia: SELECT MAX(PERIODO) INTO :ls_periodo_cerrado FROM COMPRAS01.MAE_CIERRE_KARDEX WHERE codigo_mempresa in(to_char(:gd_cempresa),'9999999999') AND CERRADO = 'S' Using ts_transaccion; Este modo de seteo de contexto es el utilizado por los productos: * Compras ==== Instrucciones que aplican para el Seteo de contexto de empresa por transacción ==== * SELECT * INSERT * UPDATE * DELETE * DECLARE El seteo aplica para todas las tablas de configuración/almacenamiento específico por empresa. Ejemplos: * Asientos Contables * Cuentas por Cobrar * Comprobantes de Egreso * Comprobantes de Ingreso * Kardex * Empleados ==== Utilizar API Core de Objetos de acceso a Datos ==== Todos los objetos de acceso a datos deben heredar de las clases core de Objetos SICOF las cuales son: * uo_datastore * uo_datawindow * uo_datawindow_dddw * uo_datawindow_free * uo_datawindow_lista Estas clases implementan el seteo de contexto automático. ===== Consideraciones ===== * REQUERIDO: Toda sentencia embebida SQL debe implementar seteo de contexto para las tablas especificas. * REQUERIDO: Todo objeto de acceso a datos debe heredar del API Core de Acceso a Datos de Objetos SICOF. * RECOMENDADO: En cualquier mantenimiento de código se debe hacer revisión del soporte multiempresa. * No es necesario implementar seteo de contexto en las tablas generales. [[ada:howto:sicoferp:pb:implements|←Volver atrás]]