vReport - orden en los informes

Eres un crack, funciona perfectamente.
Muchas gracias!

Yo solo he hecho un retoque, Jorge Velasco fue el que tuvo la idea original.

Pero si habiendo un problema, que ordena siempre de manera ascende.
sortArray .push(true);

Quizás con un pequeño cambio y usando alguna marca en el agrupamiento. Además de poner el campo añadimos de manera manual, (0/1, asc/des), algúna marca si podríamos ordenar los campos según indica la documentación. Aunque…creo que no me funciono en su momento por ejemplo ordenar por cliente.nombre ascendente y fecha descendente.

Si saco un hueco lo pruebo a ver.

Estaré pendiente de tus pruebas. Este tema me interesa mucho.
Gracias Wikan

Buenos después de un día de pruebas, creo que definitivamente el sort no hace caso al ascendente y descendente.
Te pongo el cambio el que le he hecho para definir, en teoría, si la agrupación es ascendente o descendente.

var informeDfn = theRoot.varToString("INF_DEF" );
var regex = /(?:groupExp="\w*\.\#)(\w*(?:\.\w*)*)(?:\-(DES))*/gi
var myArray;
var sort = "";
var orden;

while ((myArray = regex.exec(informeDfn)) !== null){
	sort = myArray[1].replace("#", "");
	sortArray.push(sort);
	orden = (myArray[2] === "DES") ? true : false;
	sortArray.push(orden);
}
// Quitamos la marca de orden
informeDfn = informeDfn.replace(/(groupExp="\w*\.\#\w*(?:\.\w*)*)(\-DES)*/gi, "$1");
theRoot.setVar("INF_DEF", informeDfn);

if(sortArray.length)
	list.sort.apply(this,sortArray);

Lo explico:

  • En el agrupamiento en el vReport se añade el campo normal.
  • Si queremos que el agrupamiento se ordene de manera descendente, añadir detrás el campo -DES
  • Lógicamente dará error pero somo los mejores y lo ignoramos.

Cambios del código:
Al recibir el la definición del informe, de entrada vienen incorrecta cuando queremos que sea descendente. Por lo que he tenido que añadir el replace del final para poder modificar la definición para que deje el agrupamiento igual que si no lo tuviera.

Aún así, aunque en el debug me indica que el sort es true, por lo tanto descendente, me lo sigue haciendo ascendente. Ya en su momento probé con dos campos uno false y otro true y no hacía caso ninguno. Yo creo que hay un bug pero espero que lo puedan probar y verificar.

Gracias por tu aporte wikan, a ver si lo puedo probar!

Gracias Wikan, Lo prueba y te paso comentarios

Buenas, si por favor.
Sobre todo la ordenación uno ascendente y otro descendente. A mi por lo pronto no me funciona. Incluso si alguien lo prueba directamente mejor que mejor.

Hola Wikan,
Hay algo que falla, no devuelve ningún registro. Las variable no dene estar bien definidas

Ten en cuenta que ahora entra y sale la definición del informe.

var informeDfn = theRoot.varToString("INF_DEF" );
...
theRoot.setVar("INF_DEF", informeDfn);

Tienes que capturas la variable INF_DEF en el proceso para luego para pasarlo de nuevo al proceso que hace las salidas

Hola Wikan,
El código debe estar incompleto. Falta definir la variable sortArray, y da error en “list”

Paso código final:

var list = theRegisterListIn;
var informeDfn = theRoot.varToString("INF_DEF" );
var regex = /(?:groupExp="\w*\.\#)(\w*(?:\.\w*)*)(?:\-(DES))*/gi
var myArray = [];
var sort = "";
var sortArray = [];
var orden;

while ((myArray = regex.exec(informeDfn)) !== null){
	sort = myArray[1].replace("#", "");
	sortArray.push(sort);
	orden = (myArray[2] === "DES") ? true : false;
	sortArray.push(orden);
}
// Quitamos la marca de orden
informeDfn = informeDfn.replace(/(groupExp="\w*\.\#\w*(?:\.\w*)*)(\-DES)*/gi, "$1");
theRoot.setVar("INF_DEF", informeDfn);

if(sortArray.length){
	list.sort.apply(this,sortArray);
}
theRegisterListOut.append( list );

Tengo un informe con dos agrupaciones. La segunda no la ordena nunca.
La terminación “-DES” para el orden no funciona. Se come muchos registros sin ordenar y no agrupa bien los registros.

En el mismo proceso que llamas a este script, que le pasas la variable INF_DEF con la definición del informe, estás haciendo después de dispararlo un get para obtener nuevamente INF_DEF y pasarlo al proceso final que gestiona las salidas?

Si (adjunto imagen)
Tengo un informe agrupado por “AGENTE” y dentro de cada agente tiene la agrupación de “CLIENTE”.
Los Agentes bien, pero los clientes de cada agente los presenta por el orden de la lista, es decir, por fecha. Dentro de cada agente existen muchas agrupaciones de un mismo Cliente.
A ti te funciona?

Es decir, tienes…agrupación de AGENTE y CLIENTE definida en el vReport.

Y en el debug, ves que se crea bien el array para enviar a la función sort?

No puedo poner ningún punto de interrupción en el proceso, cada vez que lo intento se cuelga vDevelop

?¿?¿?
Yo lo pongo sin ningún problema, en que versión estás trabajando. No sé, luego lo pruebo. Vuelve al código anterior si te funciona, aunque sea siempre en orden ascendente.

Disculpa

Luis, ahora no recuerdo de memoria. El get debajo justo del disparar te devuelve bien la definición del informe o tiene que estar a la misma altura que el disparar objecto??

Hola Wikan,
Te devuelve el valor correcto de las dos formas.
Estoy en la última versión de vDevelop.
Con el código anterior, la primera agrupación me la ordena bien, pero la segunda (CLIENTE), no la ordena bien, salen varias agrupaciones del mismo cliente
Tela!

Lo malo es que no te va el debug, me gustaría ver si la definición de informe que sale te ha quitado bien el -DES.
De todas formas, con la segunda opción. Si no le pones el indicador -DES debería salirte el informe aunque sea siempre de manera ascendente

Es decir la sección groupExp=“CAMPO.CAMPO.CAMPO-DES” debe salir del proceso groupExp=“CAMPO.CAMPO.CAMPO”
Y si no le pones el indicador, debe ordenar por ambos campos, en teoría.

Hola Manuel, Luis.

No entiendo muy bien el sentido de este código. Si la función sort() del API no ordena por más de un campo, es inútil ordenar por más de una agrupación.
La función sort() es un desastre y debería Velneo hacer algo urgente al respecto.

¿ No sería más sencillo ordenar previamente la Lista con comandos nativos de Velneo que sí permiten ordenar por n-campos y en cualquier sentido ?
Si queremos personalizar el código, en el API también tenemos funciones para ordenar las Listas, a excepción de la función sort() claro.

En cuanto en dónde poner el Get variable local …, en este caso debe ir en el subproceso de Disparar objeto porque tenemos una Salida asignada al proceso con theRegisterListOut.append(list).

Saludos
Paco Satué