SIGESA: Ordenamiento ListFom

  • Por defecto en SIGESA el ordenamiento de un ListForm se da por el «ID» del registro de forma «DESC» (desendente), esto se da en el SDKUNA en el EntityLazy
  • Por lo que si desea ordenar por una columna diferente los puede hacer así

Ordenamiento por otra columna

  • Para ordenar por otra columna pueda agregar al noEditTable la siguientes lineas
sortField="nombre_columna"
sortDirection="ASC"
  • Por ejemplo
<!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   NOEDITTABLE  ++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--> 
        <components:noEditTable id="noEditTable"
                                header="#{i18n.planOperativo_list_form_table_header}"
                                bean="#{planOperativoBean}"
                                showEditButton="#{!planOperativoBean.deshabilitarEdicion(row)}"
                                i18nKey="planOperativo_list_form_table_header"
                                additionalButtonsBean="#{planOperativoListBeanButtons}"
                                editForm="planOperativoEditForm"
                                methodName="establecerOrdenPlanOperativo"
                                sortField="ninguna"
                                sortDirection="ASC"/>

Ordenamiento por multiples columnas

  • Además si se requiere ordenar por múltiples columnas se puede hacer con
  • Pendiente de ejemplo

Cambiar funcion de lista defecto y ordenar por Page o Por BD, ordenamiento especificación

  • Si desea cambiar la función que lista los registros por otra que por ejemplo modifique el orden puede aplicar la siguiente propiedad
methodName="establecerOrdenPlanOperativo"
  • Por ejemplo
<!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   NOEDITTABLE  ++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--> 
        <components:noEditTable id="noEditTable"
                                header="#{i18n.planOperativo_list_form_table_header}"
                                bean="#{planOperativoBean}"
                                showEditButton="#{!planOperativoBean.deshabilitarEdicion(row)}"
                                i18nKey="planOperativo_list_form_table_header"
                                additionalButtonsBean="#{planOperativoListBeanButtons}"
                                editForm="planOperativoEditForm"
                                methodName="establecerOrdenPlanOperativo"
                                sortField="ninguna"
                                sortDirection="ASC"/>
  • NOTA: el ListForm funciona con PAGE y estas tienen en sus parametros los siguientes 3 parametros
System.out.println("Número de página: " + pageable.getPageNumber());
System.out.println("Tamaño de la página: " + pageable.getPageSize());
System.out.println("Ordenamiento: " + pageable.getSort());
  • Como vemos el tercer parametro es el ordenamiento de la pagina
  • Por lo que si desea modificar el ordenamiento puede hacerlo con
// Obtener el objeto Sort del Pageable actual
        Sort sort = pageable.getSort();
        
        // Crear un nuevo objeto Sort con el ordenamiento deseado
        Sort newSort = Sort.by(Sort.Direction.ASC, "nombre"); // Cambiar a "DESC" si deseas orden descendente
        
        // Aplicar el nuevo ordenamiento al Pageable
        Pageable newPageable = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), newSort);
  • Y se puede hacer combinación de mas de un ordenamiento
tutorialRepository.findAll(Sort.by("published").descending().and(Sort.by("title")));
  • Ahora si lo que requiere es aplicar una ordenamiento desde la BD por que es por ejemplo un selectcase puede hacer una especificación que aplique el ordenamiento deseado
/**
     * Especificación que establece el orden del listado de los planes Operativos
     *
     * @author Gustavo Matamoros González
     * @fechaCreacion: 23/02/2024
     * @Version: 1.0.0
     * @modulo: PPI-PPO
     * @issue: BTPPI-374
     * @return Specification<PlanOperativo>
     */
    public static Specification<PlanOperativo> establecerOrdenPlanOperativo() {
        return new Specification<PlanOperativo>() {
            @Override
            public Predicate toPredicate(Root<PlanOperativo> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {

                // Año del Plan OPerativo
                Expression<Integer> annoPlanOperativo = root.join("etapaPlan").join("periodoAnual").get("ano");

                // Obtener Año actual
                LocalDate fechaHoy = LocalDate.now();
                Integer annoActual = fechaHoy.getYear();

                // Establecer el orden
                cq.orderBy(
                    cb.asc(
                        cb.selectCase()
                        .when(
                            cb.equal(annoPlanOperativo,annoActual ),
                            1
                        )
                        .when(
                            cb.greaterThan(annoPlanOperativo, annoActual),
                            2
                        )
                        .otherwise(3)
                        )
                );

                return null;
            }
        };
    }
  • Y para que no aplique el ordenamiento de la Page debe modificar el page para que en el tercer parametro no tenga valor
if (pageable.getSort().isSorted() && pageable.getSort().getOrderFor("ninguna") != null) {
            paging = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize());
        }
  • Un ejemplo sería
/**
     * Método que establece el orden del listado de los planes Operativos
     *
     * @param filterSpecifications
     * @param pageable
     * @param filterParams
     * @author Gustavo Matamoros González
     * @fechaCreacion: 23/02/2024
     * @Version: 1.0.0
     * @modulo: PPI-PPO
     * @issue: BTPPI-374
     * @return Page<PlanOperativo> 
     */
    @Override
    public Page<PlanOperativo> establecerOrdenPlanOperativo(ArrayList<FilterSpecification> filterSpecifications, Pageable pageable, Map<String, Object> filterParams){

        // Mantener el filtro aplicado por el usuario
        this.setFilterSpecifications(filterSpecifications);

        Specification<PlanOperativo> specFinal;

        // Para aplicar el ordenamiento desde la consulta de la BD cuando el usuario ingresa por primera vez se envia en el ListForm  
        // methodName="establecerOrdenPlanOperativo"
        // sortField="ninguna" (indicando que ordene por la columna ficticia "ninguna" cuando es la primera vez )
        // sortDirection="ASC"
        Pageable paging = pageable;

        if (pageable.getSort().isSorted() && pageable.getSort().getOrderFor("ninguna") != null) {
            paging = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize());
        }
        
        // Especificacion que ordena 
        Specification specEstablecerOrdenPlanOperativo = PlanOperativoSpecs.establecerOrdenPlanOperativo();

        specFinal = Specification.where(this).and(specEstablecerOrdenPlanOperativo);

        return repository.findAll(specFinal,paging);
    }