====== Reporte Cartera ====== Este reporte muestra los bienes que tiene un funcionario asignados. Por defecto se tiene el chulo de todos los Funcionarios pero se puede generar para un solo funcionario. Los parámetros para ejecutar el reporte son: Seleccionar un período y seleccionar un funcionario: {{:ada:sicoferp:inventariosactivos:compras:ParametrosReporte.PNG?600|}} {{:ada:sicoferp:inventariosactivos:compras:Cartera.PNG?600|}} Si el funcionario para el periodo que se genera no tiene ya bienes asignados o no se le han asignado ningún bien sale el siguiente reporte de Paz y Salvo. (Si se tiene la constante en sicof.m_constantes 'REPORTE_PAZYSALVO_CARTERA' en Aplica = 'N', sino sale el reporte que se tenga configurado en esta constante). {{:ada:sicoferp:compras:formatoPazySalvo.PNG?600|}} Si se ejecuta el reporte para un periodo superior al periodo actual el sistema muestra mensaje indicando que para los parámetros no existe información. {{:ada:sicoferp:inventariosactivos:compras:Mensaje1.PNG?300|}} Exportar Archivo excell Dar click en botón Exportar {{:ada:sicoferp:compras:captura_expexcell.jpg?400|}} exportar Archivo en PDF Dar click en botón Imprimir {{:ada:sicoferp:compras:captura_imppdf.jpg?400|}} {{:ada:sicoferp:compras:captura_imppdf2.jpg?400|}} {{:ada:sicoferp:compras:captura_imppdf3.jpg?400|}} {{:ada:sicoferp:compras:captura_imppdf4.jpg?400|}} {{:ada:sicoferp:compras:captura_imppdf5.jpg?400|}} ===== Corrección de Reporte de Cartera por Funcionario vacio ====== === 1. Descripción del Problema === Módulo: Activos Fijos / Compras. Objeto: w_reportes_activos_fijos / dgr_asignacion_cartera. Síntoma: Al generar el reporte de "Cartera" para un funcionario específico, el sistema arroja el mensaje: "No existe información con esos parámetros", a pesar de que existen activos asignados al usuario y la consulta SQL ejecutada manualmente en base de datos retorna registros. === 2. Análisis de Causa Raíz === Se identificaron tres factores técnicos que impedían la correcta visualización de los datos: Filtro restrictivo en el JOIN (SQL): La DataWindow realizaba un INNER JOIN con la tabla MAE_TERCEROS_SECCION. Si el funcionario tiene activos en DET_ARTICULOS_USUARIO pero no tiene una entrada vigente en la tabla de secciones/estructuras, el JOIN fallaba y excluía al tercero del reporte. Contexto de Empresa: La consulta utiliza SYS_CONTEXT('CTX_SICOF','CODIGO_MEMPRESA'). Si el contexto no se inicializa correctamente antes del Retrieve, la base de datos devuelve 0 filas por seguridad multi-empresa. Lógica de Carga en PowerScript: En la función f_cargar_reporte, el código realizaba un Retrieve inicial "de prueba" y luego cambiaba el DataObject dinámicamente según constantes, perdiendo en ocasiones la consistencia de los argumentos o el estado del objeto. === 3. Solución Aplicada === A. Modificación del SQL (dgr_asignacion_cartera.srd) Se ajustó la cláusula WHERE para que el parámetro de entrada :an_codigo apunte directamente a la tabla de relación de activos, eliminando la dependencia obligatoria de la tabla de secciones para la recuperación de datos básicos. dgr_asignacion_cartera.srd ( MAE_PLACAS_ARTICULOS.CODIGO_PLACA = DET_ARTICULOS_USUARIO.CODIGO_PLACA ) and ( ESTADOS_ARTICULO_PLACAS.CODIGO_ESTADO = MAE_PLACAS_ARTICULOS.ESTADO ) and ( MAE_TERCEROS_SECCION.CODIGO_TERCERO = DET_ARTICULOS_USUARIO.COD_USUARIO_RECIBE ) and ( MAESTRO_TERCEROS.CODIGO_TERCERO = MAE_TERCEROS_SECCION.CODIGO_TERCERO ) and ( ( MAE_TERCEROS_SECCION.codigo_tercero = :an_codigo ) AND ( ( DET_ARTICULOS_USUARIO.COD_USUARIO_RECIBE = :an_codigo ) AND ((to_char (det_articulos_usuario.fecha_elaboracion,'YYYYMM') <= :as_periodo AND det_articulos_usuario.fecha_reintegro IS NULL) OR B. Optimización de Lógica de Carga (w_reportes_activos_fijos.srw) Se refactorizó el evento f_cargar_reporte para el caso asignacion_cartera: Se añadió una validación previa para asegurar que in_usuario no sea 0/Null antes de proceder. Se simplificó la selección del reporte basado en constantes (evitando retrieves dobles innecesarios). Se garantizó la llamada a f_set_context_empresa(ts_transaccion) antes de la recuperación para asegurar la visibilidad de los datos por empresa. i_dw_reporte.SetTransObject(ts_transaccion) // Validar que se haya seleccionado un usuario si no es reporte general IF isnull(in_usuario) OR in_usuario = 0 THEN MessageBox("Atención", "Debe seleccionar un Funcionario para este reporte.") ll_mensaje = 1 Return END IF // Asegurar contexto de empresa f_set_context_empresa(ts_transaccion) // Determinar si existe un reporte de cartera personalizado por constante SELECT trim(valor_alfa) INTO :ls_reporte FROM sicof.M_CONSTANTES WHERE aplica = 'S' AND trim(descripcion) = 'REPORTE_CARTERA' USING ts_transaccion; IF NOT (isnull(ls_reporte) OR ls_reporte = "") THEN f_nombre_datawindow('dgr_' + ls_reporte) END IF // Ejecutar recuperación principal IF i_dw_reporte.Retrieve(in_usuario, is_periodo) = 0 THEN // Fallback: Si no hay cartera activa, intentar con el reporte de Paz y Salvo SELECT trim(valor_alfa) INTO :ls_reporte FROM sicof.M_CONSTANTES WHERE aplica = 'S' AND trim(descripcion) = 'REPORTE_PAZYSALVO_CARTERA' USING ts_transaccion; IF isnull(ls_reporte) OR ls_reporte = "" THEN ls_reporte = 'cartera_funcionario_pazysalvo' f_nombre_datawindow('dgr_' + ls_reporte) i_dw_reporte.Retrieve(in_usuario, is_periodo) END IF === Desarrollado por: [Miguel Muñoz] Fecha: [28/04/2026] Versión de PB: 12.5 ===