El rayo ordenador de listas

Que levante la mano el desarrollador que no haya escuchado la frase:

“A Velneo le cuesta ordenar listas.

Este ha sido un tema muy popular en el foro oficial de Velneo donde se han propuesto diferentes maneras de ordenar listas de registros utilizando tanto la instrucción nativa “Ordenar lista“, como las de la clase de “VRegisterList”.

 

Si ordenamos una lista por un campo y posteriormente queremos ordenar por otro campo, perdemos la primera ordenación… hasta ahora.

ordenar listas

Ordenar listas con vJavaScript

Hoy proponemos un script/proceso que permite ordenar una lista de registros utilizando distintos tipos de criterios:

Lista de campos

Una lista de campos especificados como cadena, imaginemos que tenemos una tabla de facturas enlazada con una tabla de clientes y queremos obtener los registros de la tabla de facturas ordenados por el nombre del cliente [A → Z, ascendiente] y por fecha de factura [antiguas → recientes, descendiente]

CLIENTE.NAME,A;FECHA,D

Función comparadora

Vamos a crear una función JS que recibe dos objetos VRegister como parámetros y devuelve -1, 0 ó +1 dependiendo de qué registro consideremos mayor o menor, aquí tenemos mayor libertad para definir un criterio de ordenamiento:

function(reg1, reg2){
 //Ordenamos de mayor a menor por longitud del nombre de cliente
 if(reg1.fieldToString(‘CLIENTE.NAME’).length > reg2.fieldToString(‘CLIENTE.NAME’).length)
  return +1;
 if(reg1.fieldToString(‘CLIENTE.NAME’).length < reg2.fieldToString(‘CLIENTE.NAME’).length)
  return -1;
 //Ordenamos de menor a mayor el valor absoluto del campo TEMP
 if(Math.abs(reg1.fieldToDouble(‘TEMP’)) > Math.abs(reg2.fieldToDouble(‘TEMP’)))
  return -1;
 if(Math.abs(reg1.fieldToDouble(‘TEMP’)) < Math.abs(reg2.fieldToDouble(‘TEMP’)))
  return +1;
 return 0;
}

Este método tiene una serie de limitaciones, que si os parece interesante podéis probar a resolver:

  • La ordenación por lista de campos los trata siempre como alfabéticos.
  • El proceso está basado en el algoritmo de ordenación por inserción, que tiene un orden de complejidad O(n2) por lo que el tiempo de ejecución aumenta notablemente con el tamaño de la lista a ordenar, podría sustituirse por un algoritmo quicksort.

Si queréis aportar mejoras o ideas estaré encantado de ir actualizando este experimento

 

  • * NOTA * Si tienes problemas con la instalación vuelve a descargarlo… El “rayo” no estaba bien cargado

¿Ordenas ya tus registros a la velocidad del rayo?

Pruébalo y déjame un comentario mas abajo

Foto: Abel Escobar

Pedro Porlán
pporlan@gmail.com

Pedro Porlán es Ingeniero Técnico Industrial y trabaja como programador en Click Aplicaciones, donde desarrolla y mantiene aplicaciones en Velneo 6x y 7. Además ha trabajado en diversas empresas creando y manteniendo soluciones basadas VB6, C++, LAMP, Oracle APEX...

No Comments

Post A Comment

Pin It on Pinterest