- En la siguente se explica como crear un reporte utilizando JASPER para SIGESA
- Para la creación de la Herramienta se utilizará JASPER-STUDIO en la versión 6.20.0
- Ahora si es la primera vez que se abre la herramienta lo primero que debemos hacer es crear una concexión a la base de datos, que para PPI es DESA07, para esto hacemos:
Creación de conexión
- Para crear reportes primero debemos descargar el driver para oracle desde aquí
- https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html
- Ahora abrimos jasperStudio
- Y le damos File->New->JasperReport
- Seleccionamos donde vamos a guardar el reporte
- Y le indicamos su nombre, para SIEGSA los nombres tienen la siguiente estructura
R-PROYECTO-MODULO-ENTIDADES (3 PRIMERAS LETRAS)
// EJEMPLO:
R-PBS-ABS.CLITAV
- Le damos siguiente y debemos dar clic en la opción de: Data Adapter->New
- Seleccionamos Databe JDBC Connection
- Agregamos los datos de conexión (actualizado 2024)
Nombre: ORACLE-UNA-DESA07
JDBC Driver: Oracle (oracle.jdbc.driver.OracleDriver)
JDBC Url: jdbc:oracle:thin:@sigesadesa.una.ac.cr:1521/DESA07.una.ac.cr
Username: adm
Password: sigesa2015
- Agregamos el driver que descargamos al inicio
- Probamos la conexión
- Resultado
- Si ya hemos configurado algún «Data Adapters», pero ingresamos a un nuevo equipo y tenemos que agregar uno nuevo hacemos:
Agregar nuevo adaptador
- Con la herramienta levantada vamos a la sección de «Data Adapters»
- Y le damos la opción de «Create Data Adapter»
- Seleccionamos «Database JDBC Connection»
- Agregamos los datos de conexión
jdbc:oracle:thin:@sigesa-desa.una.ac.cr:1521:DESAXXX
adm
sigesa2015
- Agregamos el driver que descargamos al inicio
- Probamos la conexión
- Resultado
- Y con esto tendremos la nueva conexión
Creación de nuevo reporte
- Una vez que ya tenemos una conexión a desa07, por demos crear un nuevo reporte
- File->Jasper Report
- Y Seleccionamos la opción de «Blank Letter Landscape»
- Establecemos el nombre del reporte y donde lo vamos almacenar
- FORMATO: R-PPI-PPE_NOMBRE / R=REPORTE PPI=PROYECTO PPE=MÓDULO
- Le damos siguiente y nos solicita el Data Source
- Luego para este punto podriamos agregarle la consulta SQL si la tenemos en la siguiente sección
- NOTA IMPORTANTE: si contamos ya con la consulta la podemos pegar aquí, sin embargo es importante indicar que la consulta se pega sin el punto y coma «;», por que si no nos da error de consulta
- Pero otra opción es hacer clic en el botón de «Finish» y luego agregarle al consulta cuando la tengamos
- Para esto abrir SQLDeveloper yamos a crear la consulta
- Para este ejemplo vamos a crear la siguiente consulta que utiliza las siguiente tablas
- Y contiene las siguientes condiciones:
- PPI.PLAN_ACCION_ESTRATEGICA.ACTIVO == 1
- PPI-ENCARGADO_MONITOERO.ACTIVO==1
- Debe mostrar los siguientes campos:
- Meta Estratégica (Código y Descripción concatenados)
- Ámbito de Acción Universitaria (NOMBRE)
- Códigos de Responsables (ENCARGADO_MONITOREO)
- Responsables (Unión de todas las entidades que usaron la meta estratégica en alguna de sus acciones) Separado por un enter.
- Tiene como parámetros los siguientes campos:
- Tipo de Etapa.
- Se mostrará en el autocomplete el nombre del tipo de etapa.
- Generar y vincular el método que obtenga los distintos tipos de etapas de las etapas de planificación que tengan un tipo de plan de Acciones Estratégicas (PXE).
- Periodo Anual.
- Se mostrará en el autocomplete el año.
- Generar y vincular el método que obtenga los distintos periodos anuales de las etapas de planificación que tengan un tipo de plan de Acciones Estratégicas (PXE).
- Encargado de Monitoreo. Se utilizará para seleccionar el encargado específico.
- Además como el reporte tiene parametros vamos a dejar valores fijos en la consulta que simulen los valores que serán pasados como parametros para luego remplazarlos
- NOTA: si queremos probar los parametros en SQL Developer lo podemos hacer con dos puntos «:»
- Y asi cuando ejecutemos la consulta nos solicita los parametros
- Para este caso:
- periodoAnual: 202
- tipoEtapa:1
- encrgadoMonitoreo: 141
- Quedando así la consulta:
/*************************************************************************/
/*********************** DOCUMENTACIÓN *******************************/
/*************************************************************************/
--T1: PPI_META_PMP
--T2: PPI.AMBITO_ACCION_UNIVERSITARIA
--T3: PPI.ACCION_ESTRATEGICA
--T4: PPI.PLAN_ACCION_ESTRATEGICA
--T5: EPF.UNIDAD_EJECUTORA (PARA: PPI.PLAN_ACCION_ESTRATEGICA)
--T6: PPI.ENCARGADO_MONITOREO
--T7: EPF.UNIDAD_EJECUTORA (PARA: PPI.ENCARGADO_MONITOREO)
--T8: PPI.ETAPA_PLAN
--T9: PPI.ETAPA_PLAN (SELECT INTERNO)
--T10. EPF.PERIODO_ANUAL
--T11.PPO.TIPO_ETAPA
SELECT * FROM META_PMP;
SELECT * FROM ENCARGADO_MONITOREO;
SELECT * FROM UNIDAD_EJECUTORA;
SELECT
T10.ANO AS PERIODO_ANUAL,
T11.NOMBRE AS TIPO_ETAPA,
T7.CODIGO AS ENCARGADO_NONITOREO_CODIGO,
T7.NOMBRE AS ENCARGADO_NONITOREO_NOMBRE,
T8.NOMBRE AS ETAPA,
TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION) AS META_ESTRATEGICA,
T2.NOMBRE AS AMBITO_ACCION_UNIVERSITARIA,
LISTAGG(T5.CODIGO ,CHR(13))WITHIN GROUP(ORDER BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES_cod,
LISTAGG( T5.NOMBRE,CHR(13))WITHIN GROUP(ORDER BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES
FROM PPI.META_PMP T1
INNER JOIN PPI.AMBITO_ACCION_UNIVERSITARIA T2 ON (T2.ID_AMBITO_ACCION_UNIVERSITARIA = T1.AMBITO_ACCION_UNIVERSITARIA)
INNER JOIN PPI.ACCION_ESTRATEGICA T3 ON (T3.META_PMP = T1.ID_META_PMP)
INNER JOIN PPI.PLAN_ACCION_ESTRATEGICA T4 ON (T4.ID_PLAN_ACCION_ESTRATEGICA = T3.PLAN_ACCION_ESTRATEGICA)
INNER JOIN EPF.UNIDAD_EJECUTORA T5 ON (T5.ID_UNIDAD_EJECUTORA = T4.UNIDAD_EJECUTORA)
INNER JOIN PPI.ENCARGADO_MONITOREO T6 ON (T6.ID_ENCARGADO_MONITOREO = T1.ENCARGADO_MONITOREO)
INNER JOIN EPF.UNIDAD_EJECUTORA T7 ON (T7.ID_UNIDAD_EJECUTORA = T6.UNIDAD_EJECUTORA)
INNER JOIN PPI.ETAPA_PLAN T8 ON (T8.ID_ETAPA_PLAN = T4.ETAPA_PLAN)
INNER JOIN EPF.PERIODO_ANUAL T10 ON (T10.ID_PERIODO_ANUAL = T8.PERIODO_ANUAL)
INNER JOIN PPI.TIPO_ETAPA T11 ON (T11.ID_TIPO_ETAPA = T8.TIPO_ETAPA)
WHERE
-- PARAMETRO:ENCARGADO_MONITOREO
(T6.UNIDAD_EJECUTORA = :encargadoMonitoreo)
AND
-- PARAMETRO: ETAPA_PLAN
(T4.ETAPA_PLAN =
(SELECT
T9.ID_ETAPA_PLAN
FROM ETAPA_PLAN T9
WHERE
T9.PERIODO_ANUAL = :periodoAnual
AND T9.TIPO_ETAPA = : tipoEtapa
AND T9.TIPO_PLAN = (
SELECT
VALOR
FROM SAS.PARAMETRO
WHERE LLAVE = 'param_ppi_ppe_tipoPlan_PXE'))
)
AND
-- CONDICIÓN: PPI.ENCARGADO_MONITOREO.ACTIVO=1
(T6.ACTIVO = 1)
AND
-- CONDICIÓN: PPI.PLAN_ACCION_ESTRATEGICA.ACTIVO=1
(T4.ACTIVO = 1)
GROUP BY
T10.ANO,
T11.NOMBRE,
T7.CODIGO,
T7.NOMBRE,
T8.NOMBRE,
TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION),
T2.NOMBRE;
- Para descargarlo: aquí
- Ahora que tenemos el SQL vamos al Jasper Studio y buscamos el icono
- Nos abre una ventana donde vamos a pegar el SELECT
- IMPORTANTE: quitar el punto y coma «;» utilizado en SQL Developer si no nos da error de consulta
- Consulta final:
SELECT
T10.ANO AS PERIODO_ANUAL,
T11.NOMBRE AS TIPO_ETAPA,
T7.CODIGO AS ENCARGADO_NONITOREO_CODIGO,
T7.NOMBRE AS ENCARGADO_NONITOREO_NOMBRE,
T8.NOMBRE AS ETAPA,
TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION) AS META_ESTRATEGICA,
T2.NOMBRE AS AMBITO_ACCION_UNIVERSITARIA,
LISTAGG(T5.CODIGO ,CHR(13))WITHIN GROUP(ORDER BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES_cod,
LISTAGG( T5.NOMBRE,CHR(13))WITHIN GROUP(ORDER BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES
FROM PPI.META_PMP T1
INNER JOIN PPI.AMBITO_ACCION_UNIVERSITARIA T2 ON (T2.ID_AMBITO_ACCION_UNIVERSITARIA = T1.AMBITO_ACCION_UNIVERSITARIA)
INNER JOIN PPI.ACCION_ESTRATEGICA T3 ON (T3.META_PMP = T1.ID_META_PMP)
INNER JOIN PPI.PLAN_ACCION_ESTRATEGICA T4 ON (T4.ID_PLAN_ACCION_ESTRATEGICA = T3.PLAN_ACCION_ESTRATEGICA)
INNER JOIN EPF.UNIDAD_EJECUTORA T5 ON (T5.ID_UNIDAD_EJECUTORA = T4.UNIDAD_EJECUTORA)
INNER JOIN PPI.ENCARGADO_MONITOREO T6 ON (T6.ID_ENCARGADO_MONITOREO = T1.ENCARGADO_MONITOREO)
INNER JOIN EPF.UNIDAD_EJECUTORA T7 ON (T7.ID_UNIDAD_EJECUTORA = T6.UNIDAD_EJECUTORA)
INNER JOIN PPI.ETAPA_PLAN T8 ON (T8.ID_ETAPA_PLAN = T4.ETAPA_PLAN)
INNER JOIN EPF.PERIODO_ANUAL T10 ON (T10.ID_PERIODO_ANUAL = T8.PERIODO_ANUAL)
INNER JOIN PPI.TIPO_ETAPA T11 ON (T11.ID_TIPO_ETAPA = T8.TIPO_ETAPA)
WHERE
-- PARAMETRO:ENCARGADO_MONITOREO
(T6.UNIDAD_EJECUTORA = $P{encargadoMonitoreo} )
AND
-- PARAMETRO: ETAPA_PLAN
(T4.ETAPA_PLAN =
(SELECT
T9.ID_ETAPA_PLAN
FROM ETAPA_PLAN T9
WHERE
T9.PERIODO_ANUAL = $P{periodoAnual}
AND T9.TIPO_ETAPA = $P{tipoEtapa}
AND T9.TIPO_PLAN = (
SELECT
VALOR
FROM SAS.PARAMETRO
WHERE LLAVE = 'param_ppi_ppe_tipoPlan_PXE'))
)
AND
-- CONDICIÓN: PPI.ENCARGADO_MONITOREO.ACTIVO=1
(T6.ACTIVO = 1)
AND
-- CONDICIÓN: PPI.PLAN_ACCION_ESTRATEGICA.ACTIVO=1
(T4.ACTIVO = 1)
GROUP BY
T10.ANO,
T11.NOMBRE,
T7.CODIGO,
T7.NOMBRE,
T8.NOMBRE,
TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION),
T2.NOMBRE
- Verificamos que tenemos la conexión correcta
- Hora este select es un caso especial ya que utiliza la función de ORACLE LISTAGG que permite agrupar datos en una sola columna
- Por esta razón en lenguaje debemos utilizar «plsql» pero para un SELECT tradicional se debe selecionar «sql»
- Ahora le inidcamos a JASPER que nos lea las columnas necesarias
- Le damos OK
- Y con esto ya podemos comenzar a trabajar en el reporte
- Ahora como este reporte tiene un formato un poco diferente al estándar de SIGESA donde todos los campos están en una columna como se muestra en la siguiente imágen
- Y al tener gran cantidad de datos en la columna de Meta Estratégica, se tomo la desición de presentarlo en el siguiente formato
- Pero para un reporte tradicional lo primero que se debe hacer es
- Ocultar las secciones
- Page Header
- Column Header
- Column Footer
- Page Footer
- Summary
- Para esto en el menú inferior izquierdo “Outline” se encuentran todas las secciones le damos clic derecho “Delete”
- Quedando así
- Para este ejemplo vamos agregar el paso adicional que permite «Agrupar» por meta
Agrupar por metas
- Ahora sobre el menú de “Outline” le damos “Create Group”
- Y le damos un nombre y seleccionamos el campo principal que no se repite
- Le indicamos que agregue footer y header
- Esto nos agrega la seccion de METAS Group Header 1
- Ahora solo queda que dentro del área de METAS Group Header se agregen los campos por los que se van a agrupar los registros y acomodar los campos
Formato del documento
- Lo primero que se debe hacer es configurar el documento como tal para esto debemos
- Hacer clic en el tpitulo del reporte y nos muestra sus propiedades
- Vamos a la sección de Advanced y modificamos
- Description: Descripción del reporte
- Bottom Margin / Left Margin / Right Margin / Top Margin: los establecemos a cero
- Además para cuando el usuario dije parametros que no devuelven datos y no presente una página en blanco y se considere un error vamos a buscar la propiedad «When No Data» y le damos el valor de All Sections No Detail
- Dando como resultado
Encabezado
- Para crear el encabezado agregamos un campo “Static Text”
- Con las siguientes propiedades para PPI
- Font: Dejavu Sans
- Tamaño: 10
- Centrado: horizontal y vertical
- Negrita
- Todos los campos deben estar a un 100% del width del reporte es decir 792 px
- Y la altura es de 12px
- Centrado horizontal y vertical
- Y debe tener la siguiente estructura
- EL formato del título es:
- UNA
- Sistema
- Módulo
- Reporte de
- Para este ejemplo el formato se modificó un poco el diseño
- Ahora debemos agregar un título descriptor del módulo, agregamos dentro de title
- Y debemos agregar la fecha de la generación del reporte
- agregamos una etiqueta
- Y para que la fecha se toma de la herramienta utilizamos el componete de “Currente Date”
- Y le indicamos el formato requerido en:
- Para un campo de fecha es: dd/MM/yyyy
- ahora debemos agregar la paginación del documento para esto vamos buscar la variables existentes en Jasper específicamente la «Page Number»
- Y la agregamos y en sus propiedades en Expression lo modificamos para que tenga la siguiente estructura, donde le agregamos de una vez la variable de contador de paginas
"Página " + $V{PAGE_NUMBER} + " de " +$V{PAGE_COUNT}
- Y le modificamos su altura
- NOTA IMPORTANTE: todas las filas deben quedar a un 100% del Witdh para que cuando se exporte a excel no creen columnas en blanco o adicionales
Para reporte normal
- Ahora para listar los campos, dentro del menpu inferior izquierdo, existe una sección de “Fields” donde debemos arrastrar los campos al formulario, para luego acomodarlos
- Esto nos tira de una vez una label del nombre de la columna, este lo acomadmos den la sección| title
- Asi solo queda acomodar las columnas
- Ahora podemo sver un preview
- Debemos revisar en formato pdf como excel
Notas importantes
- Para campos de tipo fecha el formato es: dd/MM/yyyy
- Para simbolo de colones de debe poner la text filed->Inheritance->PDF Embedded
- Los campos deben tener una altura de 12
- Pero si pueden tener una altura variable se les debe agregar
- Como se indico antes todos los reportes deben tener sus campos al 100% de Witdh
- Siempre se debe probar la exportación a excel para comprobar que no se creen filas o columnas en blanco
- Reporte final jrxml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.20.0.final using JasperReports Library version 5.5.2 -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="R-PPI-PPE-MetasPorEncargadoMonitoreo" pageWidth="792" pageHeight="612" orientation="Landscape" whenNoDataType="AllSectionsNoDetail" columnWidth="792" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="2a308c2d-44a1-4353-9718-b01c1157286b">
<property name="com.jaspersoft.studio.data.sql.tables" value=""/>
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="DESA07"/>
<property name="com.jaspersoft.studio.report.description" value="Reporte de Metas Estratégicas por Encargado de Monitoreo"/>
<parameter name="encargadoMonitoreo" class="java.lang.Long">
<parameterDescription><![CDATA[Parámetro Id de Unidad Ejecutora Encargada de Monitoreo]]></parameterDescription>
</parameter>
<parameter name="periodoAnual" class="java.lang.Long">
<parameterDescription><![CDATA[Período Anual de]]></parameterDescription>
</parameter>
<parameter name="tipoEtapa" class="java.lang.Long">
<parameterDescription><![CDATA[Tipo de Etapa]]></parameterDescription>
</parameter>
<queryString>
<![CDATA[SELECT
T10.ANO AS PERIODO_ANUAL,
T11.NOMBRE AS TIPO_ETAPA,
T7.CODIGO AS ENCARGADO_NONITOREO_CODIGO,
T7.NOMBRE AS ENCARGADO_NONITOREO_NOMBRE,
T8.NOMBRE AS ETAPA,
TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION) AS META_ESTRATEGICA,
T2.NOMBRE AS AMBITO_ACCION_UNIVERSITARIA,
LISTAGG(T5.CODIGO ,CHR(13))WITHIN GROUP(ORDER BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES_cod,
LISTAGG( T5.NOMBRE,CHR(13))WITHIN GROUP(ORDER BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES
FROM PPI.META_PMP T1
INNER JOIN PPI.AMBITO_ACCION_UNIVERSITARIA T2 ON (T2.ID_AMBITO_ACCION_UNIVERSITARIA = T1.AMBITO_ACCION_UNIVERSITARIA)
INNER JOIN PPI.ACCION_ESTRATEGICA T3 ON (T3.META_PMP = T1.ID_META_PMP)
INNER JOIN PPI.PLAN_ACCION_ESTRATEGICA T4 ON (T4.ID_PLAN_ACCION_ESTRATEGICA = T3.PLAN_ACCION_ESTRATEGICA)
INNER JOIN EPF.UNIDAD_EJECUTORA T5 ON (T5.ID_UNIDAD_EJECUTORA = T4.UNIDAD_EJECUTORA)
INNER JOIN PPI.ENCARGADO_MONITOREO T6 ON (T6.ID_ENCARGADO_MONITOREO = T1.ENCARGADO_MONITOREO)
INNER JOIN EPF.UNIDAD_EJECUTORA T7 ON (T7.ID_UNIDAD_EJECUTORA = T6.UNIDAD_EJECUTORA)
INNER JOIN PPI.ETAPA_PLAN T8 ON (T8.ID_ETAPA_PLAN = T4.ETAPA_PLAN)
INNER JOIN EPF.PERIODO_ANUAL T10 ON (T10.ID_PERIODO_ANUAL = T8.PERIODO_ANUAL)
INNER JOIN PPI.TIPO_ETAPA T11 ON (T11.ID_TIPO_ETAPA = T8.TIPO_ETAPA)
WHERE
-- PARAMETRO:ENCARGADO_MONITOREO
(T6.UNIDAD_EJECUTORA = $P{encargadoMonitoreo} )
AND
-- PARAMETRO: ETAPA_PLAN
(T4.ETAPA_PLAN =
(SELECT
T9.ID_ETAPA_PLAN
FROM ETAPA_PLAN T9
WHERE
T9.PERIODO_ANUAL = $P{periodoAnual}
AND T9.TIPO_ETAPA = $P{tipoEtapa}
AND T9.TIPO_PLAN = (
SELECT
VALOR
FROM SAS.PARAMETRO
WHERE LLAVE = 'param_ppi_ppe_tipoPlan_PXE'))
)
AND
-- CONDICIÓN: PPI.ENCARGADO_MONITOREO.ACTIVO=1
(T6.ACTIVO = 1)
AND
-- CONDICIÓN: PPI.PLAN_ACCION_ESTRATEGICA.ACTIVO=1
(T4.ACTIVO = 1)
GROUP BY
T10.ANO,
T11.NOMBRE,
T7.CODIGO,
T7.NOMBRE,
T8.NOMBRE,
TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION),
T2.NOMBRE]]>
</queryString>
<field name="PERIODO_ANUAL" class="java.math.BigDecimal">
<property name="com.jaspersoft.studio.field.name" value="PERIODO_ANUAL"/>
<property name="com.jaspersoft.studio.field.label" value="PERIODO_ANUAL"/>
</field>
<field name="TIPO_ETAPA" class="java.lang.String">
<property name="com.jaspersoft.studio.field.name" value="TIPO_ETAPA"/>
<property name="com.jaspersoft.studio.field.label" value="TIPO_ETAPA"/>
</field>
<field name="ENCARGADO_NONITOREO_CODIGO" class="java.lang.String">
<property name="com.jaspersoft.studio.field.name" value="ENCARGADO_NONITOREO_CODIGO"/>
<property name="com.jaspersoft.studio.field.label" value="ENCARGADO_NONITOREO_CODIGO"/>
</field>
<field name="ENCARGADO_NONITOREO_NOMBRE" class="java.lang.String">
<property name="com.jaspersoft.studio.field.name" value="ENCARGADO_NONITOREO_NOMBRE"/>
<property name="com.jaspersoft.studio.field.label" value="ENCARGADO_NONITOREO_NOMBRE"/>
</field>
<field name="ETAPA" class="java.lang.String">
<property name="com.jaspersoft.studio.field.name" value="ETAPA"/>
<property name="com.jaspersoft.studio.field.label" value="ETAPA"/>
</field>
<field name="META_ESTRATEGICA" class="java.lang.String">
<property name="com.jaspersoft.studio.field.name" value="META_ESTRATEGICA"/>
<property name="com.jaspersoft.studio.field.label" value="META_ESTRATEGICA"/>
</field>
<field name="AMBITO_ACCION_UNIVERSITARIA" class="java.lang.String">
<property name="com.jaspersoft.studio.field.name" value="AMBITO_ACCION_UNIVERSITARIA"/>
<property name="com.jaspersoft.studio.field.label" value="AMBITO_ACCION_UNIVERSITARIA"/>
</field>
<field name="RESPONSABLES_COD" class="java.lang.String">
<property name="com.jaspersoft.studio.field.name" value="RESPONSABLES_COD"/>
<property name="com.jaspersoft.studio.field.label" value="RESPONSABLES_COD"/>
</field>
<field name="RESPONSABLES" class="java.lang.String">
<property name="com.jaspersoft.studio.field.name" value="RESPONSABLES"/>
<property name="com.jaspersoft.studio.field.label" value="RESPONSABLES"/>
</field>
<group name="METAS">
<groupExpression><![CDATA[$F{META_ESTRATEGICA}]]></groupExpression>
<groupHeader>
<band height="64">
<staticText>
<reportElement x="0" y="6" width="200" height="12" uuid="8d4bb611-d497-4baa-a578-f774f2105a3b">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
</reportElement>
<textElement>
<font fontName="DejaVu Sans" isBold="true"/>
</textElement>
<text><![CDATA[Meta Estratégica:]]></text>
</staticText>
<textField>
<reportElement x="200" y="6" width="592" height="34" uuid="070d890b-19ed-43b9-8191-259cf077252e">
<property name="com.jaspersoft.studio.unit.width" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement>
<font fontName="DejaVu Sans"/>
</textElement>
<textFieldExpression><![CDATA[$F{META_ESTRATEGICA}]]></textFieldExpression>
</textField>
<staticText>
<reportElement x="0" y="40" width="200" height="12" uuid="3ec019ae-8c39-4539-8ba2-dc2a4be4a9ab">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
</reportElement>
<textElement>
<font fontName="DejaVu Sans" isBold="true"/>
</textElement>
<text><![CDATA[Ámbito de Acción Universitaria:]]></text>
</staticText>
<textField>
<reportElement x="200" y="40" width="592" height="12" uuid="c0770fb3-b827-4dd1-909b-f19fe7379641">
<property name="com.jaspersoft.studio.unit.width" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement>
<font fontName="DejaVu Sans"/>
</textElement>
<textFieldExpression><![CDATA[$F{AMBITO_ACCION_UNIVERSITARIA}]]></textFieldExpression>
</textField>
<staticText>
<reportElement x="0" y="52" width="200" height="12" uuid="0ab534bc-987c-4912-982e-0a68a666c7c7">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<property name="com.jaspersoft.studio.unit.y" value="pixel"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
</reportElement>
<textElement>
<font fontName="DejaVu Sans" isBold="true"/>
</textElement>
<text><![CDATA[Códigos de Responsables:]]></text>
</staticText>
<staticText>
<reportElement x="200" y="52" width="592" height="12" uuid="3eaafcaa-23c0-41bf-ab37-e1c4ae1ea82a">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
</reportElement>
<textElement textAlignment="Left">
<font fontName="DejaVu Sans" isBold="true"/>
</textElement>
<text><![CDATA[Responsables:]]></text>
</staticText>
<line>
<reportElement x="0" y="5" width="792" height="1" uuid="d242e07c-172d-43bd-a639-3fbd20da7b5a">
<property name="com.jaspersoft.studio.unit.width" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<graphicElement>
<pen lineColor="#CCCCCC"/>
</graphicElement>
</line>
</band>
</groupHeader>
<groupFooter>
<band/>
</groupFooter>
</group>
<background>
<band splitType="Stretch"/>
</background>
<title>
<band height="107" splitType="Stretch">
<staticText>
<reportElement x="0" y="0" width="792" height="12" uuid="bd45c4c8-d81a-4dfc-85d7-64e406f20b84">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
</reportElement>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font fontName="DejaVu Sans" isBold="true"/>
</textElement>
<text><![CDATA[UNIVERSIDAD NACIONAL]]></text>
</staticText>
<staticText>
<reportElement x="0" y="12" width="792" height="12" uuid="32d9721b-a334-4893-b1a4-f5d124ffec27">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
</reportElement>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font fontName="DejaVu Sans" isBold="true"/>
</textElement>
<text><![CDATA[ÁREA DE PLANIFICACIÓN]]></text>
</staticText>
<staticText>
<reportElement x="0" y="24" width="792" height="12" uuid="910be7fc-e1ad-4976-bf26-239616baa7e9">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
</reportElement>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font fontName="DejaVu Sans" isBold="true"/>
</textElement>
<text><![CDATA[REPORTE METAS ESTRATÉGICAS POR ENCARGADO DE MONITOREO]]></text>
</staticText>
<staticText>
<reportElement x="360" y="36" width="80" height="14" uuid="3fcf71fb-ed79-4381-891b-31e2a26cb306">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement textAlignment="Center">
<font fontName="DejaVu Sans"/>
</textElement>
<text><![CDATA[SIGESA-PPI]]></text>
</staticText>
<textField pattern="dd/MM/yyyy">
<reportElement x="0" y="50" width="200" height="12" uuid="1033ab71-bd80-4b63-a768-5c8b2b4bb6a5">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement>
<font fontName="DejaVu Sans"/>
</textElement>
<textFieldExpression><![CDATA[new java.util.Date()]]></textFieldExpression>
</textField>
<textField>
<reportElement x="200" y="95" width="592" height="12" uuid="fff7867d-4621-4e0e-b9eb-d8d565649258">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement>
<font fontName="DejaVu Sans"/>
</textElement>
<textFieldExpression><![CDATA[$F{ENCARGADO_NONITOREO_CODIGO}+ " " +$F{ENCARGADO_NONITOREO_NOMBRE}]]></textFieldExpression>
</textField>
<staticText>
<reportElement x="0" y="95" width="200" height="12" uuid="7b465201-07f2-4e7f-89e5-d5d8043745ca">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
</reportElement>
<textElement>
<font fontName="DejaVu Sans" isBold="true"/>
</textElement>
<text><![CDATA[Encargado de Monitoreo:]]></text>
</staticText>
<staticText>
<reportElement x="0" y="71" width="200" height="12" uuid="d4e2250d-d314-4313-b188-90cc04cf2e72">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
</reportElement>
<textElement>
<font fontName="DejaVu Sans" isBold="true"/>
</textElement>
<text><![CDATA[Perido Anual:]]></text>
</staticText>
<textField>
<reportElement x="200" y="71" width="592" height="12" uuid="2e164a3e-373b-456f-895c-70867e356dc2">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement>
<font fontName="DejaVu Sans"/>
</textElement>
<textFieldExpression><![CDATA[$F{PERIODO_ANUAL}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="200" y="50" width="592" height="12" uuid="e9a1193b-a423-4649-8150-55a819bf3d26">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement textAlignment="Right">
<font fontName="DejaVu Sans"/>
</textElement>
<textFieldExpression><![CDATA["Página " + $V{PAGE_NUMBER} + " de " +$V{PAGE_COUNT}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="200" y="83" width="592" height="12" uuid="e7b635ae-c860-40ae-981e-b3e1a28a8f7a">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement>
<font fontName="DejaVu Sans"/>
</textElement>
<textFieldExpression><![CDATA[$F{TIPO_ETAPA}]]></textFieldExpression>
</textField>
<staticText>
<reportElement x="0" y="83" width="200" height="12" uuid="1ea924b1-18b4-4d1f-a698-e82fbd48353d">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
</reportElement>
<textElement>
<font fontName="DejaVu Sans" isBold="true"/>
</textElement>
<text><![CDATA[Tipo Etapa:]]></text>
</staticText>
</band>
</title>
<detail>
<band height="30" splitType="Immediate">
<property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.FreeLayout"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<textField isStretchWithOverflow="true">
<reportElement x="0" y="0" width="200" height="30" uuid="10444560-e9db-4129-b67c-172cfeab2b53">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement>
<font fontName="DejaVu Sans"/>
</textElement>
<textFieldExpression><![CDATA[$F{RESPONSABLES_COD}]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="true">
<reportElement x="200" y="0" width="592" height="30" uuid="d297a0d6-4471-4d3a-87f0-b1ac2ff3d751">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement>
<font fontName="DejaVu Sans"/>
</textElement>
<textFieldExpression><![CDATA[$F{RESPONSABLES}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
- Lo puede descargar desde aquí
Prueba del reporte
- Ahora vamos a incluir este reporte dentro de SIGESA para probar su funcionamiento
- para esto
Agregar los archivos al proyecto
- Como estamos trabajando con jasperStudio en local y los archivos de SIGESA se encuentran en la MV debemos conectarnos por ssh y pegar los archivos en la ruta, si no existe la ruta la debemos crear
- sigesa-ppi-ppe->sigesa-ppi-ppe-web->src->main->resources->META-INF->resources->reports
- Y antes de pasar los archivos debemos compilarlo
- Pasamos los archivos tanto el archivo .jasper como jrxml
- Ahora para probar los reportes de forma local en la MV debemos crear una carpeta de nombre “reportes” en “/”
ssh cgi@10.0.100.30
sudo mkdir /reportes
sudo chmod 777 -R /reportes/
- Y debemos pegar los reportes ahi tambien
Desplegar Reporte en SIGESA
- Luego debemos registrar el nuevo reporte dentro del sistema
- ingresamos a:
Lista de Reportes
- Completamos:
- NOTA: los nombre son de 3 digitos debia ser R-PPI-PPE-METPORENCMON
- Luego debemos reportar el recurso
Lista de Recursos
- Nuevo, pero aqupi debemos registrarlo de la siguiente forma
/pages/reporteJobLauncher.xhtml?reporte=R-PPI-PPE-METPORENCMON
- Y le debemos asiganar un rol, para PPI UNA_PPI_ADMIN
- Ahora debemos registrar el recurso en lista de menu
Lista de Menú
- Agregamos el menú
- Y con esto ya podremos probar su funcionamiento
Parametros
- Ahora en el reporte vamos a crear el parametro de Encargado de Monitoreo
- Para esto dentro de Jasper Studio en el menú de Outline->Parameters->Create Parameter
- Creamos el parametro de ENCARGADO_MONITOREO con las siguientes propiedades:
- Nombre: sin raya baja ú otro caracter
- Class: Por ser llave java.lang.Long sino java.lang.String
- Descripción: descrpcion del parametro (Parámetro Id de Unidad Ejecutora Encargada de Monitoreo)
- Ahora debemos crear dos métodos un para el autocomplete y otro para el LOV
- Hora para explicar mejor:
- Dentro de la tabla ENCARGADO_MONITOREO existe una relación a UNIDAD_EJECUTORA
- Por tanto para crear en los parametros del reporte un autocomplete que muestre solo las UNIDAD_EJECUTORA que existen en la tabla ENCARGADO_MONITOREO y que esten activos
- Y como nota adicional como debemos mostrar en el autocomplete las UNIDADDES_EJECUTORAS, en los parametros debemos utilizar esta entidad que pertenece a EPF, por tanto aquí la modificación debe ser mínima
- Por tanto, para ENCARGADOS_MONITOREO
- Debemos crear un método que me devuelva los EM que estén activos
- Y luego otra función que obtenga los EM activos y recorra la lista y obtenga los id de UNIDAD_EJECUTORA
- Para que luego una metodo de UNIDAD_EJECUTORA obtenga esta lista y solo presente estas unidades
EncargadoMonitoreoRepository.java
- Lo primero que hacemos es crear una función que nos devuelva una lista de EncargadosMonitoreo que tengan en su activo = true
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/
/**
* Definición que retorna un List<EncargadoMonitoreo> de todos los Encargado de Monitoreo donde activo = 1
*
* @param activo : 1 = activo / 0 = inactivo
* @param query : codigo digitado por el usuario
* @author: Gustavo Matamoros G.
* @version: 1.0.0
* @fechaCreacion: 08/11/2022
* @fechaModificacion: 08/11/2022
* @modulo: PPI-PPE
* @issue: PPI-244
*/
public List <EncargadoMonitoreo> findAllByActivo(Boolean activo);
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/
EncargadoMonitoreoService.java
- Debemos tambien en el service declarar la función que va obtener la lista de encargadosMonitoreo donde activo = 1
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/
/**
* Definición que retorna un List<EncargadoMonitoreo> de todos los Encargado de Monitoreo donde activo = 1
*
* @param activo : 1 = activo / 0 = inactivo
* @author: Gustavo Matamoros G.
* @version: 1.0.0
* @fechaCreacion: 08/11/2022
* @fechaModificacion: 08/11/2022
* @modulo: PPI-PPE
* @issue: PPI-244
*/
public List <EncargadoMonitoreo> findAllByActivo(Boolean activo);
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/
- Pero no solo requerimos obtener la lista de los EM, sino mas bien una lista de los ID de las Unidades Ejecutoras que existen dentro de EM
- Por esta razón creamos una función adicional que va realizar esta tarea
- Agregamos entonces la definición
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/
/**
*
* * Definición que retorna un List<Long> de Id's de Unidad Ejecutora, donde:
* * los Id's existan en Encargado de Monitoreo
* * Y si activo = 1
*
* @author: Gustavo Matamoros g.
* @version: 1.0.0
* @fechaCreacion: 08/11/2022
* @fechaModificacion: 08/11/2022
* @modulo: PPI-PPE
* @issue: PPI-244
*/
/**********************************************************************/
public List<Long> getIdsUnidadesEjecutorasEncargadoMonitoreoActivo();
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/
EncargadoMonitoreoServiceImpl.java
- Ahorta vamos a crear la sobreescritura de los métodos
- Primero la findAllByActivo, que practicamente le vamos a decir que busque los «true»
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/
/**
* Ver {@link EncargadoMonitoreoService#findAllByActivo( java.lang.Boolean) }
* Definición que retorna un List<EncargadoMonitoreo> de todos los Encargado de Monitoreo donde activo = 1
*
* @param activo : 1 = activo / 0 = inactivo
* @author: Gustavo Matamoros G.
* @version: 1.0.0
* @fechaCreacion: 08/11/2022
* @fechaModificacion: 08/11/2022
* @modulo: PPI-PPE
* @issue: PPI-244
*/
@Override
public List <EncargadoMonitoreo> findAllByActivo(Boolean activo){
// retornamos los true (activo=1)
return repository.findAllByActivo(Boolean.TRUE);
}
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/
- Y la función «getIdsUnidadesEjecutorasEncargadoMonitoreoActivo»
- Que va obtener todos los Encargados de Monitoreo donde EM.Activo == 1
- Luego va aconstruir una list de id de UE
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
/**
* Ver {@link EncargadoMonitoreoService#getIdsUnidadesEjecutorasEncargadoMonitoreoActivo( ) }
*
* * Método que retorna un List<Long> de Id's de Unidad Ejecutora, donde:
* * los Id's existan en Encargado de Monitoreo
* * Y si activo = 1
*
* @author: Gustavo Matamoros g.
* @version: 1.0.0
* @fechaCreacion: 08/11/2022
* @fechaModificacion: 08/11/2022
* @modulo: PPI-PPE
* @issue: PPI-244
*/
/**********************************************************************/
@Override
public List<Long> getIdsUnidadesEjecutorasEncargadoMonitoreoActivo() {
// Se crea una lista de Long's para almacenar los Id's de las Unidades Ejecutoras
List <Long> unidadesEjecutorasIds = new ArrayList<>();
// Obtenemos todos los encargados de monitoreo que están activos (activo=1)
List <EncargadoMonitoreo> encargadoMonitoreoActivos = repository.findAllByActivo(Boolean.TRUE);
// Recorremos la lista de encargados de Monitoreo, obtenemos el Id de de la Unidad Ejecutora y lo agregamos a la lista
for (EncargadoMonitoreo encargadoMonitoreo : encargadoMonitoreoActivos) {
unidadesEjecutorasIds.add(encargadoMonitoreo.getUnidadEjecutora().getId());
}
// Retornamos la lista
return unidadesEjecutorasIds;
}
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
EPF: Unidad Ejecutora
- Ahora dentro del proyecto EPF, se encuentran los archivos de administración de UNIDAD_EJECUTORA
- Como es un proyecto de EPF y no PPI, solo debemos hacer cambios mínimos que serían una función que se encargue de:
- autocomplete: findAutoCompleteUnidadEjecutoraEncargadoMonitoreoActivo
- LOV: findAutoCompleteUnidadEjecutoraEncargadoMonitoreoActivoLOV
- Además ya dentro de UnidadEjecutoraServiceImpl.java existe una función «findAllDistinctByIdIn» que recibe la consulta (query) List <Long> de ID_UNIDADES_EJECUTORAS, pageable que va recibir la lista de id de UE que deseamos mostrar, facilitando la tarea
UnidadEjecutoraService.java
- Creamos la definición para el autocomplete
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
/**
* Definición que devuelve un Page<UnidadEjecutora> de Unidades Ejecutoras de acuerdo los Encargados de Monitoreo para autocomplete
*
* @param filterSpecifications: filtro de especificaciones
* @param query: consulta del usuario
* @param acl: paramatero de ACL
* @param pageable: paramatro para paginación
* @return: Page<UnidadEjecutora>
*
* @author Gustavo Matamoros G.
* @fechaCreacion: 07/11/2022
* @fechaModificacion: 08/11/2022
* @módulo: PPI-PPE
* @issue: PPI-244
*/
public Page<UnidadEjecutora> findAutoCompleteUnidadEjecutoraEncargadoMonitoreoActivo(
ArrayList<FilterSpecification> filterSpecifications,
String query,
String acl,
Pageable pageable);
- Y la definición para el LOV, que hacen lo mismo pero varian los parémetros
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
/**
* Definición que devuelve un Page<UnidadEjecutora> de Unidades Ejecutoras de acuerdo los Encargados de Monitoreo para LOV
*
* @param filterSpecifications: filtro de especificaciones
* @param pageable: paramatro para paginación
* @param params: parametros
* @return: Page<UnidadEjecutora>
*
* @author Gustavo Matamoros G.
* @fechaCreacion: 07/11/2022
* @fechaModificacion: 08/11/2022
* @módulo: PPI-PPE
* @issue: PPI-244
*/
public Page<UnidadEjecutora> findAutoCompleteUnidadEjecutoraEncargadoMonitoreoActivoLOV(
ArrayList<FilterSpecification> filterSpecifications,
Pageable pageable,
Map<String,Object> params);
UnidadEjecutoraServiceImpl.java
- Creamos la función de autocomplete
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
/**
* Método que devuelve un Page<UnidadEjecutora> de Unidades Ejecutoras de acuerdo los Encargados de Monitoreo para autocomplete
*
* @param filterSpecifications: filtro de especificaciones
* @param query: consulta del usuario
* @param acl: paramatero de ACL
* @param pageable: paramatro para paginación
* @return: Page<UnidadEjecutora>
*
* @author Gustavo Matamoros G.
* @fechaCreacion: 07/11/2022
* @fechaModificacion: 08/11/2022
* @módulo: PPI-PPE
* @issue: PPI-244
*/
@Override
public Page<UnidadEjecutora> findAutoCompleteUnidadEjecutoraEncargadoMonitoreoActivo(
ArrayList<FilterSpecification> filterSpecifications,
String query,
String acl,
Pageable pageable) {
// Obtenemos la lista de UE a mostrar
List<Long> unidadesEjecutorasId = encargadoMonitoreoService.getIdsUnidadesEjecutorasEncargadoMonitoreoActivo();
//Retornamos la lista de unidades ejecutoras
return findAllDistinctByIdIn(query, unidadesEjecutorasId, pageable);
}
- Creamos la función del LOV
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
/**
* Método que devuelve un Page<UnidadEjecutora> de Unidades Ejecutoras de acuerdo los Encargados de Monitoreo para LOV
*
* @param filterSpecifications: filtro de especificaciones
* @param pageable: paramatro para paginación
* @param params: parametros
* @return: Page<UnidadEjecutora>
*
* @author Gustavo Matamoros G.
* @fechaCreacion: 07/11/2022
* @fechaModificacion: 08/11/2022
* @módulo: PPI-PPE
* @issue: PPI-244
*/
@Override
public Page<UnidadEjecutora> findAutoCompleteUnidadEjecutoraEncargadoMonitoreoActivoLOV(
ArrayList<FilterSpecification> filterSpecifications,
Pageable pageable,
Map<String, Object> params) {
// Le pasamos los filterSpecifications
this.setFilterSpecifications(filterSpecifications);
// Obtenemos la lista de UE a mostrar
List<Long> unidadesEjecutorasId = encargadoMonitoreoService.getIdsUnidadesEjecutorasEncargadoMonitoreoActivo();
//Retornamos la lista de las unidades ejecutoras
return findAllDistinctByIdIn("", unidadesEjecutorasId, pageable);
}
SIGESA
- Ahora debemos configurar el parametro
- Vamos a ir a SIGESA a
Lista de Reportes
- Y en la sección de parametros le damos agregar uno
- Y le agregamos los siguientes datos
- IMPORTANTE: Para campos autocomplete debe seleccionar tipo: Objeto
- Ahora de damos agregar
- Nos indica que se ha agregado correctamente pero que no se ha guardado en la BD
- Ahora si selecionamos tipo:Objeto no aparece un nuevo botón que nos permite configurar el autocomplete
- Y le agregamos la clase que deseamos trabajar
- Si la clase que vamos a trabajar no se encuentra registrada dentro de SIGESA
- Primero vamos a SAS->SAS->SAS – Mantenimiento->Lista de Entidades
- Y le damo nuevo
Lista de Entidades
- Reportamos la clase
- Nombre: Nombre de la BD de la tabla
- Clase Mapeada: ubicación de la clase
- Ahora podemos regresar al reporte
Lista de Reportes
- Seleccionamos el reporte a trabajar
- Ingresamos al parametro
- Configuramos el parametro
- Le asignamos los valores
- Clase Mapeada: clase que va atender el autocomplete
- Propiedad objeto: campo por el que se va hacer la busqueda
- Método filtrado: este es opcional y es para el autocomplete
- Si no se pone nada va hacer una findAll
- Y si es un método se debe poner aquí
- Título del LOV Bean: título que va a presentar en el LOV
- LOV Bean: LOV que se va encargar del manejo del la búsqueda
- Método filtrado LOV: este es opcional y es para el LOV, su funcionalidad es igual que el de autocomplete pero sus parametros son diferentes
- Si no se pone nada va hacer una findAll
- Y si es un método se debe poner aquí
- Luego de esto guardamos
- Y ahora debemos regresar
- Y volver a ingresar a la edición del parametro
- Y asegurarmos que en la sección de avanzado haya reconocido
- Nombre bean
- Servicio clase
- Converter Bean
- Y si no asignarlos
- Guardamos
- Regresamos
- Guardamos los cambios
- Y regresamos
- Y guardamos
- Ya podemos ir al reporte y consultar su funcionamiento
- Ingresamos al reporte y le damos a editar el parametro
- Aparece el autocomplete, probamos su funcionamiento
- Y el LOV
- Seleccionamos una opción y aceptamos su valor
- Y lanzamos el reporte
- Obtenemos el resultado
- Y si no tiene datos
Notas: importentes prueba parametros en Jasper Studio
- A continuación vamos a trabajar los parametros de tipoEtapa y periodoAnual
- NOTA:
- Pero como datos importantes
- Los parametros de SIGESA tipo llave son de tipo
java.lang.Long
- Quedando asi
EncargadoMonitoreo
tipoEtapa
periodoAnual es long
- Y el select se encuentra de la siguiente forma
SELECT
T10.ANO AS PERIODO_ANUAL,
T11.NOMBRE AS TIPO_ETAPA,
T7.CODIGO AS ENCARGADO_NONITOREO_CODIGO,
T7.NOMBRE AS ENCARGADO_NONITOREO_NOMBRE,
T8.NOMBRE AS ETAPA,
TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION) AS META_ESTRATEGICA,
T2.NOMBRE AS AMBITO_ACCION_UNIVERSITARIA,
LISTAGG(T5.CODIGO ,CHR(13))WITHIN GROUP(ORDER BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES_cod,
LISTAGG( T5.NOMBRE,CHR(13))WITHIN GROUP(ORDER BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES
FROM PPI.META_PMP T1
INNER JOIN PPI.AMBITO_ACCION_UNIVERSITARIA T2 ON (T2.ID_AMBITO_ACCION_UNIVERSITARIA = T1.AMBITO_ACCION_UNIVERSITARIA)
INNER JOIN PPI.ACCION_ESTRATEGICA T3 ON (T3.META_PMP = T1.ID_META_PMP)
INNER JOIN PPI.PLAN_ACCION_ESTRATEGICA T4 ON (T4.ID_PLAN_ACCION_ESTRATEGICA = T3.PLAN_ACCION_ESTRATEGICA)
INNER JOIN EPF.UNIDAD_EJECUTORA T5 ON (T5.ID_UNIDAD_EJECUTORA = T4.UNIDAD_EJECUTORA)
INNER JOIN PPI.ENCARGADO_MONITOREO T6 ON (T6.ID_ENCARGADO_MONITOREO = T1.ENCARGADO_MONITOREO)
INNER JOIN EPF.UNIDAD_EJECUTORA T7 ON (T7.ID_UNIDAD_EJECUTORA = T6.UNIDAD_EJECUTORA)
INNER JOIN PPI.ETAPA_PLAN T8 ON (T8.ID_ETAPA_PLAN = T4.ETAPA_PLAN)
INNER JOIN EPF.PERIODO_ANUAL T10 ON (T10.ID_PERIODO_ANUAL = T8.PERIODO_ANUAL)
INNER JOIN PPI.TIPO_ETAPA T11 ON (T11.ID_TIPO_ETAPA = T8.TIPO_ETAPA)
WHERE
-- PARAMETRO:ENCARGADO_MONITOREO
(T6.UNIDAD_EJECUTORA = :encargadoMonitoreo)
AND
-- PARAMETRO: ETAPA_PLAN
(T4.ETAPA_PLAN =
(SELECT
T9.ID_ETAPA_PLAN
FROM ETAPA_PLAN T9
WHERE
T9.PERIODO_ANUAL = :periodoAnual
AND T9.TIPO_ETAPA = : tipoEtapa
AND T9.TIPO_PLAN = (
SELECT
VALOR
FROM SAS.PARAMETRO
WHERE LLAVE = 'param_ppi_ppe_tipoPlan_PXE'))
)
AND
-- CONDICIÓN: PPI.ENCARGADO_MONITOREO.ACTIVO=1
(T6.ACTIVO = 1)
AND
-- CONDICIÓN: PPI.PLAN_ACCION_ESTRATEGICA.ACTIVO=1
(T4.ACTIVO = 1)
GROUP BY
T10.ANO,
T11.NOMBRE,
T7.CODIGO,
T7.NOMBRE,
T8.NOMBRE,
TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION),
T2.NOMBRE;
- Como vemos tenemos los parametros con «:»
- Entonces para poder utilizarlos en Jasper Studio
- En la sección de parametros podemos tomar uno y arrastrarlo y remplazar
- y remplazar
- Hacemos lo mismo para los otros parametros
- Quedando así:
SELECT
T10.ANO AS PERIODO_ANUAL,
T11.NOMBRE AS TIPO_ETAPA,
T7.CODIGO AS ENCARGADO_NONITOREO_CODIGO,
T7.NOMBRE AS ENCARGADO_NONITOREO_NOMBRE,
T8.NOMBRE AS ETAPA,
TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION) AS META_ESTRATEGICA,
T2.NOMBRE AS AMBITO_ACCION_UNIVERSITARIA,
LISTAGG(T5.CODIGO ,CHR(13))WITHIN GROUP(ORDER BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES_cod,
LISTAGG( T5.NOMBRE,CHR(13))WITHIN GROUP(ORDER BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES
FROM PPI.META_PMP T1
INNER JOIN PPI.AMBITO_ACCION_UNIVERSITARIA T2 ON (T2.ID_AMBITO_ACCION_UNIVERSITARIA = T1.AMBITO_ACCION_UNIVERSITARIA)
INNER JOIN PPI.ACCION_ESTRATEGICA T3 ON (T3.META_PMP = T1.ID_META_PMP)
INNER JOIN PPI.PLAN_ACCION_ESTRATEGICA T4 ON (T4.ID_PLAN_ACCION_ESTRATEGICA = T3.PLAN_ACCION_ESTRATEGICA)
INNER JOIN EPF.UNIDAD_EJECUTORA T5 ON (T5.ID_UNIDAD_EJECUTORA = T4.UNIDAD_EJECUTORA)
INNER JOIN PPI.ENCARGADO_MONITOREO T6 ON (T6.ID_ENCARGADO_MONITOREO = T1.ENCARGADO_MONITOREO)
INNER JOIN EPF.UNIDAD_EJECUTORA T7 ON (T7.ID_UNIDAD_EJECUTORA = T6.UNIDAD_EJECUTORA)
INNER JOIN PPI.ETAPA_PLAN T8 ON (T8.ID_ETAPA_PLAN = T4.ETAPA_PLAN)
INNER JOIN EPF.PERIODO_ANUAL T10 ON (T10.ID_PERIODO_ANUAL = T8.PERIODO_ANUAL)
INNER JOIN PPI.TIPO_ETAPA T11 ON (T11.ID_TIPO_ETAPA = T8.TIPO_ETAPA)
WHERE
-- PARAMETRO:ENCARGADO_MONITOREO
(T6.UNIDAD_EJECUTORA = $P{encargadoMonitoreo} )
AND
-- PARAMETRO: ETAPA_PLAN
(T4.ETAPA_PLAN =
(SELECT
T9.ID_ETAPA_PLAN
FROM ETAPA_PLAN T9
WHERE
T9.PERIODO_ANUAL = $P{periodoAnual}
AND T9.TIPO_ETAPA = $P{tipoEtapa}
AND T9.TIPO_PLAN = (
SELECT
VALOR
FROM SAS.PARAMETRO
WHERE LLAVE = 'param_ppi_ppe_tipoPlan_PXE'))
)
AND
-- CONDICIÓN: PPI.ENCARGADO_MONITOREO.ACTIVO=1
(T6.ACTIVO = 1)
AND
-- CONDICIÓN: PPI.PLAN_ACCION_ESTRATEGICA.ACTIVO=1
(T4.ACTIVO = 1)
GROUP BY
T10.ANO,
T11.NOMBRE,
T7.CODIGO,
T7.NOMBRE,
T8.NOMBRE,
TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION),
T2.NOMBRE
- Guardamos
- Y si le damos en preview
- nos solicitará los valores de los parametros
- Y así podemos garantizar el uso de parametros en los reportes desde Jasper Studio}
Parámetro: tipoEtapa
- Ahora vamos a crear lo necesario para obtener los tipos de Etapa que existan para un tipo de plan que es una parametro SIGESA, específicamente param_ppi_ppe_tipoPlan_PXE
- Lo primero que vamos hacer es que dentro de TipoPLan exista un métod que devuelva un TipoPlan según el parametro param_ppi_ppe_tipoPlan_PXE
TipoPlanService.java
- Agregamos
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
/**
* Definición que devuelve un TipoPlan según parametro SIGESA: param_ppi_ppe_tipoPlan_PXE
*
* @return:TipoPlan
*
* @author Gustavo Matamoros G.
* @version: 1.0.0
* @fechaCreacion: 10/11/2022
* @fechaModificacion: 10/11/2022
* @módulo: PPI-PPE
* @issue: PPI-244
*/
public TipoPlan obtenerTipoPlan_PXE();
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
TipoPlanServiceImpl.java
- Agregamos la definición
- Pero para esto vamos a utilizar una función existente dentro de tipoPlan que ubica un TipoPlan según parametro
@Override
public TipoPlan findTipoPlanByParametro(String param) {
try {
return findOne(Long.valueOf(parametroService.findOneByLlave(param).getValor()));
} catch (NumberFormatException ex) {
return null;
}
}
- Por lo tanto los que debemos agregar es:
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
/**
* Método que devuelve un TipoPlan según parametro SIGESA: param_ppi_ppe_tipoPlan_PXE
* Ver {@link TipoPlanService#obtenerTipoPlan_PXE() }
*
* @return:TipoPlan
*
* @author Gustavo Matamoros G.
* @version: 1.0.0
* @fechaCreacion: 10/11/2022
* @fechaModificacion: 10/11/2022
* @módulo: PPI-PPE
* @issue: PPI-244
*/
@Override
public TipoPlan obtenerTipoPlan_PXE(){
return findTipoPlanByParametro("param_ppi_ppe_tipoPlan_PXE");
}
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
EtapaPlanRepository.java
- Ahora dentro de EtapaPLan vamos a agregar un método que devuelva un tipoPlan según un tipoPlan pasado como parametro
public List<EtapaPlan> findAllByTipoPlan(TipoPlan tipoPlan);
EtapaPlanService.java
- Agregamos la definicion retorne todas las EtapaPlan que que tengan el tipoPlan = 3 (param_ppi_ppe_tipoPlan_PXE)
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
/**
* Definición que devuelve un List<EtapaPlan> donde los ID's se encuentren en ETAPA_PLAN y por parametro SIGESA: param_ppi_ppe_tipoPlan_PXE
*
* @return:List<EtapaPlan>
*
* @author Gustavo Matamoros G.
* @fechaCreacion: 12/11/2022
* @fechaModificacion: 12/11/2022
* @módulo: PPI-PPE
* @issue: PPI-244
*/
public List<EtapaPlan> obtenerEtapaPlanPorTipoPlan_PXE();
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
EtapaPlanServiceImpl.java
- Agregamos el método
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
/**
* Ver {@link EtapaPlanService#obtenerEtapaPlanPorTipoPlan_PXE() }
* @author: Gustavo Matamoros G.
* @version: 1.0.0
* @fechaCreacion: 12/11/2022
* @fechaModificacion: 12/11/2022
* @modulo: PPI-PPE
* @issue: PPI-244
*/
public List<EtapaPlan> obtenerEtapaPlanPorTipoPlan_PXE() {
TipoPlan tipoPlan_PXE = tipoPlanService.obtenerTipoPlan_PXE();
return repository.findAllByTipoPlan(tipoPlan_PXE);
}
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
TipoEtapaService.java
- Agregamos la definición para el autocomplete
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
/**
* Definición que devuelve un Page<TipoEtapa> donde los ID's se encuentren en ETAPA_PLAN y por parametro SIGESA: param_ppi_ppe_tipoPlan_PXE para autocomplete
*
* @param filterSpecifications: filtro de especificaciones
* @param query: consulta del usuario
* @param acl: paramatero de ACL
* @param pageable: paramatro para paginación
* @return: Page<UnidadEjecutora>
*
* @author Gustavo Matamoros G.
* @fechaCreacion: 11/11/2022
* @fechaModificacion: 11/11/2022
* @módulo: PPI-PPE
* @issue: PPI-244
*/
public Page<TipoEtapa> findAutoCompleteTipoEtapaInEtapaPlanAndTipoPlan_PXE(
ArrayList<FilterSpecification> filterSpecifications,
String query,
String acl,
Pageable pageable
);
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
- Y agregamos la definición para el LOV
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
/**
* Definición que devuelve un Page<TipoEtapa> donde los ID's se encuentren en ETAPA_PLAN y por parametro SIGESA: param_ppi_ppe_tipoPlan_PXE para LOV
*
* @param filterSpecifications: filtro de especificaciones
* @param pageable: paramatro para paginación
* @param params: parametros
* @return: Page<UnidadEjecutora>
*
* @author Gustavo Matamoros G.
* @fechaCreacion: 07/11/2022
* @fechaModificacion: 08/11/2022
* @módulo: PPI-PPE
* @issue: PPI-244
*/
public Page<TipoEtapa> findAutoCompleteTipoEtapaInEtapaPlanAndTipoPlan_PXE_LOV(
ArrayList<FilterSpecification> filterSpecifications,
Pageable pageable,
Map<String, Object> params
);
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
TipoEtapaServiceImpl.java
- Agregamos el método para autocomplete
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
/**
* Método que devuelve un Page<TipoEtapa> donde los ID's se encuentren en ETAPA_PLAN y por parametro SIGESA: param_ppi_ppe_tipoPlan_PXE para autocomplete
*
* @param filterSpecifications: filtro de especificaciones
* @param query: consulta del usuario
* @param acl: paramatero de ACL
* @param pageable: paramatro para paginación
* @return: Page<UnidadEjecutora>
*
* @author Gustavo Matamoros G.
* @fechaCreacion: 11/11/2022
* @fechaModificacion: 11/11/2022
* @módulo: PPI-PPE
* @issue: PPI-244
*/
@Override
public Page<TipoEtapa> findAutoCompleteTipoEtapaInEtapaPlanAndTipoPlan_PXE(
ArrayList<FilterSpecification> filterSpecifications,
String query,
String acl,
Pageable pageable
) {
// Almacena la lista de tipoEtapa final
List<TipoEtapa> listaTiposEtapas = new ArrayList<>();
//Almacena la lista de tipoPlan por PXE
List<TipoEtapa> listaEtapaPlanPorTipoPlan_PXE = new ArrayList<>();
// Obtenermos todas la EtapaPlan por PXE
for(EtapaPlan etapa : etapaPlanService.obtenerEtapaPlanPorTipoPlan_PXE()){
// Y obtenemos su tipoEtapa
listaEtapaPlanPorTipoPlan_PXE.add(etapa.getTipoEtapa());
}
// Obtenemos y recorremos todos los tipoEtapa y preguntamos si existe en EtapaPlan y si si agregamos a la lista
for(TipoEtapa te : this.findAll()){
if(listaEtapaPlanPorTipoPlan_PXE.contains(te)){
listaTiposEtapas.add(te);
}
}
// Retornamos la listaTipoEtapa
return new PageImpl(listaTiposEtapas);
}
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
- Y el método para el LOV
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
/**
* Definición que devuelve un Page<TipoEtapa> donde los ID's se encuentren en ETAPA_PLAN y por parametro SIGESA: param_ppi_ppe_tipoPlan_PXE para LOV
*
* @param filterSpecifications: filtro de especificaciones
* @param pageable: paramatro para paginación
* @param params: parametros
* @return: Page<UnidadEjecutora>
*
* @author Gustavo Matamoros G.
* @fechaCreacion: 11/11/2022
* @fechaModificacion: 11/11/2022
* @módulo: PPI-PPE
* @issue: PPI-244
*/
@Override
public Page<TipoEtapa> findAutoCompleteTipoEtapaInEtapaPlanAndTipoPlan_PXE_LOV(
ArrayList<FilterSpecification> filterSpecifications,
Pageable pageable,
Map<String, Object> params
) {
// Le pasamos los filterSpecifications
this.setFilterSpecifications(filterSpecifications);
// Almacena la lista de tipoEtapa final
List<TipoEtapa> listaTiposEtapas = new ArrayList<>();
//Almacena la lista de tipoPlan por PXE
List<TipoEtapa> listaEtapaPlanPorTipoPlan_PXE = new ArrayList<>();
// Obtenermos todas la EtapaPlan por PXE
for(EtapaPlan etapa : etapaPlanService.obtenerEtapaPlanPorTipoPlan_PXE()){
// Y obtenemos su tipoEtapa
listaEtapaPlanPorTipoPlan_PXE.add(etapa.getTipoEtapa());
}
// Obtenemos y recorremos todos los tipoEtapa y preguntamos si existe en EtapaPlan y si si agregamos a la lista
for(TipoEtapa te : this.findAll()){
if(listaEtapaPlanPorTipoPlan_PXE.contains(te)){
listaTiposEtapas.add(te);
}
}
// Retornamos la listaTipoEtapa
return new PageImpl(listaTiposEtapas);
}
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
TipoEtapaLOVBean.java
- Además como el LOVBean para TipoEtapa No exista lo creamos
/*
* Copyright (c) 2022.
*
* Centro de Gestion Informatica
* Direccion de Tecnologias de la Informacion y Comunicacion
* Universidad Nacional - Costa Rica
* http://www.una.ac.cr
*
*/
/**********************************************************************/
/**********************************************************************/
/********************* PACKAGE ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.ppo.view.LOV;
/**********************************************************************/
/**********************************************************************/
/********************* IMPORT'S ******************************/
/**********************************************************************/
/**********************************************************************/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++ SDK-UNA ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.view.commons.LOV;
import cr.ac.una.cgi.sdkuna.view.commons.LOVColumn;
import cr.ac.una.cgi.sdkuna.view.commons.LOVImpl;
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++ Proyecto: PPI/PPO ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.TipoEtapa;
import cr.ac.una.cgi.sigesa.ppi.ppo.service.TipoEtapaService;
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++ SPRING-BOOT ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++ TIPOS DE DATOS ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++ DOCUMENTACIÓN ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/**
* Spring LOVBean Session para la administración de la entidad {@link TipoEtapa}
*
* @author Gustavo Matamoros González
* @fecha 13/11/2022
*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++ CONFIGURACIÓN ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
@Component
@Scope("session")
/**********************************************************************/
/**********************************************************************/
/**************** DEFINICIÓN DE CLASE *****************************/
/**********************************************************************/
/**********************************************************************/
public class TipoEtapaLOVBean extends LOVImpl<TipoEtapa, TipoEtapaService> implements LOV, Serializable {
/*************************************************************************************************/
/*************************************************************************************************/
/****************************** CONSTRUCTOR *********************************************/
/*************************************************************************************************/
/*************************************************************************************************/
public TipoEtapaLOVBean() {
}
/*************************************************************************************************/
/*************************************************************************************************/
/*************************************************************************************************/
/*************************************************************************************************/
/*************************************************************************************************/
/*************************************************************************************************/
/*************************************************************************************************/
/****************************** FUNCIÓN INIT *********************************************/
/*************************************************************************************************/
/*************************************************************************************************/
@PostConstruct
public void init() {
List<LOVColumn> columns = new ArrayList<>();
// Creamos las relaciones y ordenes de las columnas para el listado
LOVColumn column1 = new LOVColumn("nombre", getI18n("tipoEtapa_nombre_label"), true);
//Agregamos las columnas a la variable
columns.add(column1);
// Enviamos las columnas
this.setTableColumns(columns);
}
}
Parametro: periodoAnual
- Ahora el periodo anual pertenece a EPF
- Por tanto debemos crear todos los metdos necesarios dentro de PPO y PPE para que PeriodoAnual solo tenga una pequeña función
- Para esto en:
EtapaPlanService.java
- Vamos a crear la definición de autocomplete y LOV que va se ejecutada por periodo anual
- Autocomplete
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
/**
* Definición que devuelve un Page<PeriodoAnual> donde los ID's se encuentren en ETAPA_PLAN y por parametro SIGESA: param_ppi_ppe_tipoPlan_PXE para autocomplete
*
* @param filterSpecifications: filtro de especificaciones
* @param query: consulta del usuario
* @param acl: paramatero de ACL
* @param pageable: paramatro para paginación
* @return: Page<PeriodoAnual>
*
* @author Gustavo Matamoros G.
* @fechaCreacion: 11/11/2022
* @fechaModificacion: 11/11/2022
* @módulo: PPI-PPE
* @issue: PPI-244
*/
public Page<PeriodoAnual> periodosAnualesPorTipoPlan_PXE(
ArrayList<FilterSpecification> filterSpecifications,
String query,
String property,
Pageable pageable);
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
- LOV
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
/**
* Definición que devuelve un Page<PeriodoAnual> donde los ID's se encuentren en ETAPA_PLAN y por parametro SIGESA: param_ppi_ppe_tipoPlan_PXE para LOV
*
* @param filterSpecifications: filtro de especificaciones
* @param pageable: paramatro para paginación
* @param params: parametros
* @return: Page<UnidadEjecutora>
*
* @author Gustavo Matamoros G.
* @fechaCreacion: 11/11/2022
* @fechaModificacion: 11/11/2022
* @modulo: PPI-PPE
* @issue: PPI-244
*/
public Page<PeriodoAnual> periodosAnualesPorTipoPlan_PXE_LOV(
ArrayList<FilterSpecification> filterSpecifications,
Pageable pageable,
Map<String, Object> params
);
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
EtapaPlanServiceImpl.java
- Autocomplete
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
/**
* Ver {@link EtapaPlanService#periodosAnualesPorTipoPlan_PXE() }
* @author: Gustavo Matamoros G.
* @version: 1.0.0
* @fechaCreacion: 12/11/2022
* @fechaModificacion: 12/11/2022
* @modulo: PPI-PPE
* @issue: PPI-244
*/
public Page<PeriodoAnual> periodosAnualesPorTipoPlan_PXE(
ArrayList<FilterSpecification> filterSpecifications,
String query,
String property,
Pageable pageable){
// Almacena la lista de periodos
List<PeriodoAnual> listaPeridosAnuales = new ArrayList<>();
List<PeriodoAnual> listaPeridosAnualesEnEtapas = new ArrayList<>();
for(EtapaPlan plan : this.obtenerEtapaPlanPorTipoPlan_PXE()){
listaPeridosAnualesEnEtapas.add(plan.getPeriodoAnual());
}
for(PeriodoAnual per : periodoAnualService.findAll()){
if(listaPeridosAnualesEnEtapas.contains(per)){
listaPeridosAnuales.add(per);
}
}
return new PageImpl(ordenaPlanesAnuales(listaPeridosAnuales));
}
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
- LOV
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
/**
* Ver {@link EtapaPlanService#periodosAnualesPorTipoPlan_PXE_LOV() }
* @author: Gustavo Matamoros G.
* @version: 1.0.0
* @fechaCreacion: 12/11/2022
* @fechaModificacion: 12/11/2022
* @modulo: PPI-PPE
* @issue: PPI-244
*/
public Page<PeriodoAnual> periodosAnualesPorTipoPlan_PXE_LOV(
ArrayList<FilterSpecification> filterSpecifications,
Pageable pageable,
Map<String, Object> params){
// Almacena la lista de periodos
List<PeriodoAnual> listaPeridosAnuales = new ArrayList<>();
List<PeriodoAnual> listaPeridosAnualesEnEtapas = new ArrayList<>();
for(EtapaPlan plan : this.obtenerEtapaPlanPorTipoPlan_PXE()){
listaPeridosAnualesEnEtapas.add(plan.getPeriodoAnual());
}
for(PeriodoAnual per : periodoAnualService.findAll()){
if(listaPeridosAnualesEnEtapas.contains(per)){
listaPeridosAnuales.add(per);
}
}
return new PageImpl(ordenaPlanesAnuales(listaPeridosAnuales));
}
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
- Y además vamos a crear una función privada para ordenar lo periodos anuales
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
/**
* Funcion que ordena una lista de Periodos Anuales
* @author: Gustavo Matamoros G.
* @version: 1.0.0
* @fechaCreacion: 12/11/2022
* @fechaModificacion: 12/11/2022
* @modulo: PPI-PPE
* @issue: PPI-244
*/
private List<PeriodoAnual> ordenaPlanesAnuales(List<PeriodoAnual> listaPeriodosAnuales) {
Collections.sort(listaPeriodosAnuales, new Comparator<PeriodoAnual>() {
@Override
public int compare(PeriodoAnual pp1, PeriodoAnual pp2) {
return pp1.getAno().compareTo(pp2.getAno());
}
});
return listaPeriodosAnuales;
}
/******************************************************************************************************************/
/******************************************************************************************************************/
/******************************************************************************************************************/
PeridoAnualService.java
- Como periodos ANuales pertenece a EPF
- Vamos a crear las funciones de autocomplete que invoquen a las funciones anteriores
- Agregamos autocomplete y LOV
public Page<PeriodoAnual> periodosAnualesPorTipoPlan_PXE(ArrayList<FilterSpecification> filterSpecifications, String query, String property, Pageable pageable);
public Page<PeriodoAnual> periodosAnualesPorTipoPlan_PXE_LOV(ArrayList<FilterSpecification> filterSpecifications, Pageable pageable, Map<String, Object> params);
PeridoAnualServiceImpl.java
- Agregamos
@Override
public Page<PeriodoAnual> periodosAnualesPorTipoPlan_PXE(
ArrayList<FilterSpecification> filterSpecifications,
String query,
String property,
Pageable pageable){
return etapaPlanService.periodosAnualesPorTipoPlan_PXE( filterSpecifications, query, property, pageable);
}
@Override
public Page<PeriodoAnual> periodosAnualesPorTipoPlan_PXE_LOV(
ArrayList<FilterSpecification> filterSpecifications,
Pageable pageable,
Map<String, Object> params
){
return etapaPlanService.periodosAnualesPorTipoPlan_PXE_LOV( filterSpecifications, pageable,params);
}
ReportarParametros en SIGESA
- Ingresamos al reporte
- Ingresamos a los parametros y los configuramos
- Tipo etapa configuración
- Parametro periodo anual
Probar el reporte
Publicar el reporte en servidor desarrollo
- Ingresamos al servidor remoto
ssh cgi@10.0.100.30
- Nos ubicamos a la dirección del reporte
cd /reportes/
- Lo identificamos
- Lo enviamos al servidor
scp R-PPI-PPE-METPORENCMON.jasper tomcat8@10.0.2.231:/reportes
- pass: user4tomcat
- RESULTADO
The authenticity of host '10.0.2.231 (10.0.2.231)' can't be established.
ED25519 key fingerprint is SHA256:tf9W7YHb8qPy5qUn9+G8dVVCTWx4fAN+Y4N6sic3mjg.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.2.231' (ED25519) to the list of known hosts.
tomcat8@10.0.2.231's password:
R-PPI-PPE-METPORENCMON.jasper 100% 36KB 1.1MB/s 00:00
- Ya podemos ingresar a SIGESA DESARROLLO y probar
- http://10.0.2.231:8080/sigesa-webapp/pages/