- 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"
<!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<!--++++++++++++++++++++++++++++++++++ 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"
<!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<!--++++++++++++++++++++++++++++++++++ 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());
}
/**
* 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);
}