vReport - orden en los informes

He lanzado un mensaje antes y después de “GET”. Antes puedo obtener “-DES”, y después ya no aparece. Entonces, me devuelve correctamente la definición del informe.
La verdad es que no es capaz de devolverme la segunda agrupación ordenada correctamente. Lo hace manteniendo el orden de la lista dada inicialmente.
Tengo las dos agrupaciones definidas de la siguiente manera:
Agrupación por Agente: Fórmula del agrupamiento: #AGE.NAME
Agrupación por Cliente: Fórmula del agrupamiento: #CLI.NAME
No se si se me escapa algo.
Te paso imagen del proceso que ordena la lista y te paso código final del Script

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 );

Gracias

Luis, no le des más vueltas. Yo lo pruebo con calma con un informe lo más parecido al tuyo.
Asi de entrada creo que tengo uno que estás por ISLA.NAME, EMPLEADO.NAME así que debe ser parecido al tuyo.

Gracias por las pruebas.

PD: A todo esto estamos dando por echo que la función sort funciona.

Gracias Wikan.

Hola Manuel, Luis.

Repito, la función sort() del API no ordena por más de un campo, por lo tanto, 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 queda más remedio que ordenar mediante comandos nativos de Velneo o usando funciones del API equivalentes a excepción de la función sort().

Saludos
Paco Satué

Era lo que me temía.

Ya que estamos en ese punto, es muy posible que sirva usando multiSplit e invert.

Con las cosas que se pueden hacer con la API le haría falta añadir y arreglar esas pequeñas funciones que fallan.

Hola Manuel.

El API necesita un repaso muy a fondo, y por supuesto muchas más funciones.

Efectivamente, con los equivalentes de Multipartir, Ordenar e Invertir de Velneo puedes emular una función Sort() que realmente funcione en el API.

Saludos
Paco Satué

El error de la función sort lo reporté en febrero del 2014, ya que me di cuenta creando un script de ordenación genérico para todos los reports de vreport.

Lo incluyeron como incidencia en diciembre del 2014 (referencia: 3962 ), o sea casi un año después de reportarlo.

Dos años después de reportarlo todavía no está solucionado.

Sin embargo la documentación:

http://velneo.es/info_v7_718_es/velneo_vdevelop_v7/scripts/clases/core/vregisterlist/

No dice que no funciona. Según la documentación funciona correctamente.

No lo dice pese a que insistí en que lo documentaran hasta que se solucionara, para evitarle a la gente pruebas inútiles.

Va a resultar que antes de usar cualquier función, la que sea, hay que mirar las incidencias para ver si funciona o no …

Buenas, Luis cuando puedas prueba con este.

// Ordenación automática
var list = theRegisterListIn;
var informeDfn = theRoot.varToString("INF_DEF" );
var regex = /(?:groupExp="\w*\.\#)(\w*(?:\.\w*)*)(?:\-(DES))*/gi
var myArray;

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

He echo alguna prueba y aparentemente funciona. Incluso si puedes añade agrupamiento sin cabecera ni pie para forzar alguna ordenación.

Hola Wikan,
Parece que funciona el orden de las agrupaciones. Lo he probado en dos y OK.
Lo que no funciona es el orden Descendente, hace caso omiso.
Paso código nuevo, faltaba declarar alguna variable.

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

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

if(sortArray.length){
	sortArray.reverse().forEach(function(orden){
		list.sort(orden.campo, orden.orden);
	})	
}
theRegisterListOut.append( list );

Entonces, la función Sort() funciona correctamente?
Muchas gracias, eres un crack

Lo que no funciona es la sobrecarga por la cual usas sort con varios campos.

En este caso está aplicando el sort sucesivas veces sólo con un campo.

Wikan, ¿No se desordena la primera ordenación al aplicarle el segundo órden?, ¿o se me escapa algo?

Buenas tardes.

Luis, si eso parece.
Modifica este trozo y prueba:

...
if(sortArray.length){
	sortArray.reverse().forEach(function(orden){
		//list.sort.apply(this,[orden.campo, orden.orden]);
		list.sort(orden.campo, orden.orden);
		if(orden.orden === true){
			list.invert();
		}
	})	
}
...

La variable sort ya no se usa, ahora creo un array de objectos para guardar la combinación campo y orden.

Disculpa los errores pero es una parte del proceso previo que tengo para los informes por que además de eso hago más cosas.

Infortic, si eso parece además que no hace caso al orden, si es ascendente o descendente.

Ayer mande un soporte y me comunicaron eso que lo hiciera en orden invertido de ahí el .reverse.

** Me acabo de dar cuenta que aún así en la barra de estado da un error de sintaxis por la “chapuza” de la marca “-DES” pero yo no le veo otro sitio donde poder añadirla.

Por lo pronto cedo el testigo, parece que funciona pero me he retraso un poco y hay que seguir.

Gracias por todo lo que le has dedicado. Ahora funciona!
Gracias

Hombre me refiero que tengo que sacar más trabajo, lo había retomado por que pensaba que después de x versiones funcionaba. Como me ha tocado volver a tocar informes de agrupamientos y demás.

Pero si funciona ya perfecto, la verdad es que así ahorra procesos intermedios.
Lo bueno es que puedes poner agrupamientos sin cabecera y pie y fuerzas la ordenación, vamos igual que la v6

Hola wikan.

Comprobé que tu código funciona correctamente, así que intenté prototipar la función sort para que funcione de la forma que debería.

Mi dominio de js es muy rudimentario así que lo hecho bastante cutre.

El tema es que no me reconoce el prototipo, me dice que la función ordenar no existe.

¿ Sabes si lo que hago se puede hacer en velneo ?

VRegisterList.prototype.ordenar = function( ord1 , desc1 ){
	this = sortlist( ord1 , desc1 , "" , 0 , "" , 0 , "" , 0 );
}

VRegisterList.prototype.ordenar = function( ord1 , desc1 , ord2, desc2 ){
	this = sortlist( ord1 , desc1 , ord2 , desc2 , "" , 0 , "" , 0 );	
}

VRegisterList.prototype.ordenar = function( ord1 , desc1 , ord2, desc2 , ord3 , desc3 ){
	this = sortlist( ord1 , desc1 , ord2 , desc2 , ord3 , desc3 , "" , 0 );
}

VRegisterList.prototype.ordenar = function( ord1 , desc1 , ord2, desc2 , ord3 , desc3 , ord4 , desc4 ){
	this = sortlist( ord1 , desc1 , ord2 , desc2 , ord3 , desc3 , ord4 , desc4 );
}

function sortlist(ord1 , desc1 , ord2 , desc2 , ord3 , desc3 , ord4 , desc4 , list) {

var sortArray = [];
if ( ord1 != "" ) { 
	sortArray.push({
		campo: ord1,
		orden: desc1})
}
if ( ord2 != "" ) { 
	sortArray.push({
		campo: ord2,
		orden: desc2})
}
if ( ord3 != "" ) { 
	sortArray.push({
		campo: ord3,
		orden: desc3})
}

if ( ord4 != "" ) { 
	sortArray.push({
		campo: ord4,
		orden: desc4})
}

sortArray.reverse().forEach(function(orden){
	list.sort(orden.campo, orden.orden);
	if(orden.orden === true){
		list.invert();
	}
});

return(list);

}

Luego la llamada.

#include "(CurrentProject)/gesReports/extVRegisterList.js"

var list = theRegisterListIn;

var ORDEN1 = theRoot.varToString("ORDEN1").replace("#", "");
var ORDEN2 = theRoot.varToString("ORDEN2").replace("#", "");
var ORDEN3 = theRoot.varToString("ORDEN3").replace("#", "");

var DESC1 = theRoot.varToBool("DESC1");
var DESC2 = theRoot.varToBool("DESC2");
var DESC3 = theRoot.varToBool("DESC3");

//list = sortlist(ORDEN1,DESC1,ORDEN2,DESC2,ORDEN3,DESC3 , "" , 0 , list);
list.ordenar(ORDEN1,DESC1,ORDEN2,DESC2,ORDEN3,DESC3);

theRegisterListOut.append(list);


Aunque creo que Paco ha hecho grandes avances en ordenación en :

http://velneo.es/foros/topic/a-velneo-le-cuesta-ordenar/

Lo suyo sería poder prototipar estas funciones en VRegisterList para dejarlo “apañao”

Buenas Infortic.
No está mal, yo en su momento hice una para VRegister https://github.com/manugc/VRegisterExtended

Pero creo que VRegisterList tiene algo especial, yo también intente hacer un prototype y no me dejaba. El prototype funciona con un objeto ya creado.
Intenta hacer un prototype con VRegister a ver si te deja.

Aunque yo lo haría con una sola función para no limitar el número de operaciones.
Javascript tiene un objeto “especial” arguments que es el array de las variables de entrada, por lo que puedes hacer tu función ordenar sin parámetros:

function sortlist() {
..
}

Y usar arguments como array para obtener las combinaciones, con lo que te quedaría dinámico.

Probaré, aunque conforme lo he puesto no funciona, me dice que list.ordenar no existe, no sé si estoy prototipando mal.

Por lo que veo está protipado como tu ejemplo de VRegisterExtended pero no me reconoce la función añadida.