Agregar Lista a la Cesta y Orden de Lista


([N3] pacosatu) #1

Hola.

Estaba programando una rutina para preparar la Lista con Agrupamientos, destinada a ser la entrada de un Informe personalizado de VReport.

El procedimiento consiste en:

  • Crear Cesta cesInforme
  • N-Iteraciones de Cargar lista para obtener los registros de cada Agrupamiento ordenados por un determinado Campo
    – Cesta: Cargar lista
  • Cesta: Procesar cesInforme
  • Informe personalizado

Bien, pues el orden de los registros dentro de cada Agrupamiento no se respeta al pasar la Lista a la Cesta, en realidad solo se respeta en la primera Iteración, es decir, si tenemos 5 agrupaciones solo estará ordenada la primera.

Consultado a Soporte, no es un error, es el ¡¡funcionamiento correcto!! para optimizar el traspaso de Fichas.

La solución para respetar el Orden es cargar la Lista de registro en registro:

  • Recorrer lista solo lectura
    — Cesta: Añadir ficha

El resultado final es que tengo que usar un procedimiento poco óptimo (Recorrer lista) porque el equipo de desarrollo ha querido optimizar el traspaso de Fichas sin respetar el Orden establecido.

En fin, os lo comento para que lo tengáis en cuenta: en el traspaso de Listas a la Cesta se puede perder el Orden que tengamos previamente.

Saludos
Paco Satué


([N1] wikan) #2

Muchas gracias Paco.

Curioso comportamiento.

Dentro de la ignorancia, no te sirve un cargar lista solo, ordenar y enviar al informe?


([N2] overBCN) #3

Hola,
Tenemos un problem en vReport con el Orden en que queremos presentar los registros y sus agrupaciones.
Ahora, si creas un informe y le añades distintas Cabeceras, nunca te ordena en función de las Cabeceras, sino el orden te lo da la lista de salida. Un serio problema. Ya que si tenemos una lista con x registros y queremos imprimir un informe vReport, antes tendremos que ordenar los registros según las agrupaciones que tenga el informe. Dile a un Cliente que se dedique a ordenar la lista varias veces según el informe que vaya a imprimir.
Yo tengo definidos los informes vReport en una tabla, y el Usuario selecciona el informe según criterios de tabla. Hay muchos informes y cada uno tiene distintas agrupaciones.
En su dia se hizo un pequeño proceso en JavaScript que ordenaba el informe según las agrupaciones, pero se ve que hay un bug de Velneo que solo ordena la primera agrupación (paso foro :

var list = theRegisterListIn;
var regex = /(?:groupExp=")(?:\w+\.)?(\#\w+(\.\w+)*)/gi
var myArray;
var sort = "";

while ((myArray = regex.exec(theRoot.varToString("INF_DEF" ))) !== null){
	(sort != "" )? sort+=";" : sort;
	sort += myArray[1].replace("#", "");
	//alert(sort);
}
list.sort( sort ); // No funciona con varios campos y la documentación...
theRegisterListOut.append( list );

De momento es un verdadero incordio y quebradero de cabeza.
Saludos


([N3] pacosatu) #4

Hola Luis.

Ya quedó claro en ese hilo que VReport no ordena, ni lo hace vReport ni ningún motor de Informes que yo haya usado.

Simplemente tenemos que alimentar al informe con una Lista ya agrupada y ordenada. El motor de VReport recorrerá la Lista de inicio a fin secuencialmente, creando las cabeceras/pies de los agrupamientos e imprimiendo los Detalles.

Agrupar y ordenar cualquier lista en Velneo es muy fácil, ¡como debe de ser!.

Para ilustrar el caso que he comentado anteriormente, pongo un ejemplo para ver que a veces no sirve con Cargar lista -> Ordenar campos -> Imprimir.

Supongamos una tabla con 3 tipos de operaciones Ventas-V, Gastos-G e Ingresos-I (TIPO_OPE). Dentro de cada operación habrá diferentes Conceptos de Ventas (Ventas en caja, Ventas en máquinas, …), Gastos (Gastos documentados, Personal, Anticipos, …) e Ingresos (Efectivo, Visa, AmericanExpress, …) (TIPO_CON).

Queremos sacar un Informe con todas las Operaciones agrupadas por Ventas, Gastos e Ingresos y dentro de cada agrupación a su vez agrupadas por Conceptos.

Los requisitos son que el Usuario decidirá el Orden en que aparecen los tipos de Operaciones, es decir, puede querer la secuencia Ventas-Ingresos-Gastos o Ingresos-Ventas-Gastos.

Por lo tanto tenemos 2 campos de ordenación TIPO_OPE y TIPO_CON. La pega es que el campo TIPO_OPE tiene ordenación arbitraria, decidida por el usuario y por esta razón no podemos usar Cargar lista -> Ordenar campos -> Imprimir.

Así que no nos queda más remedio que:

  • El Usuario decide la secuencia Ingresos-I , Ventas-V, Gastos-G.
    Cesta crear cesInforme
    Cargar TIPO_OPE = “I”
    Ordenar por TIPO_CON
    Recorrer lista solo lectura (¡¡OJO!! no funciona Cesta: Añadir lista, se pierde el Orden)
    – Cesta: Añadir ficha
    Cargar TIPO_OPE = “V”
    Ordenar por TIPO_CON
    Recorrer lista solo lectura
    – Cesta: Añadir ficha
    Cargar TIPO_OPE = “G”
    Ordenar por TIPO_CON
    Recorrer lista solo lectura
    – Cesta: Añadir ficha
    Cesta: Procesar cesInforme
    Imprimir informe personalizado

Necesitamos una Cesta obligatoriamente para ir volcando los tres TIPO_OPE (I,V,G) en el orden decidido por el Usuario.

Por supuesto podemos automatizar el proceso con un Array que rellena el Usuario:
Array: Insert item (ATIPO_OPE, “I”)
Array: Insert item (ATIPO_OPE, “V”)
Array: Insert item (ATIPO_OPE, “G”)
For (N, 0, N<3, 1)
– Cargar TIPO_OPE = ATIPO_OPE[N]
– Ordenar por TIPO_CON
– Recorrer lista solo lectura (¡¡OJO!! no funciona Cesta: Añadir lista, se pierde el Orden)
---- Cesta: Añadir ficha

Tened en cuenta que las operaciones entre Listas y Cestas son muy rápidas, se ejecutan en primer plano en memoria y solo se copian los punteros de tabla. Por lo tanto no hay problema de montar un Informe con varios niveles de agrupamiento cuyo orden sea arbitrario como en este caso.

Saludos
Paco Satué


([N2] overBCN) #5

Hola Paco,
Razón tienes cuando dices que ordenar una lista es juego de niños, pero… Te pongo un ejemplo que sucede a menudo y no sólo en Velneo sino en muchas plataformas.
A los clientes les damos la facilidad de poder crear o personalizar informes. Aquí no entra nuestra intervención, solo ésta el cliente.
Ejemplo; quieren sacar un informe de la tabla facturas, y como siempre, sacan por pantalla los registros que quieren imprimir (inicialmente sale ordenada la lista última factura la primera, orden fecha invertida). Desde esta rejilla de pueden imprimir un sinfín de informes y cada uno con distintas agrupaciones o orden.
Como lo hacemos? Que le digo al cliente?
Lo que no se puede hacer es un proceso por cada informe. Que sentido tiene el personalizar de informes si nunca salen bien ordenados?
No creo que sea el único que tenga este problema, no?
Saludos


([N3] pacosatu) #6

Hola Luis.

Estás planteando un problema de Interface. El usuario no solo dispone de una Rejilla en la que puede hacer agrupaciones y ordenaciones a voluntad, sino que además quiere reflejar el resultado en un Informe.
Tendríamos que disponer de una Rejilla mucho más avanzada de la que disponemos ahora en Velneo y con un motor que generara la estructura XML de vReport. Pongo un ejemplo del XML generado por el diseñador de vReport:


<?xml version="1.0" encoding="UTF-8"?>
<NCReport version="2.13.0" name="Estructura xml del Informe" type="report">
    <options>
        <encoding>UTF-8</encoding>
		...
		<subReportOnNewPage>true</subReportOnNewPage>
    </options>
    <datasources>
        <datasource id="DATA_1" ... > ... </datasource>
    </datasources>
    <variables>
        <variable id="VAR_1" type="num" ... > ... </variable>
		...
	</variables>
    <pageheader id="PH" ... >
		...
    </pageheader>
    <pagefooter id="PF" ... >
    <reportheader id="RH" height="16">
		...
    </reportheader>
    <details>
        <detail id="DETALLE_1" ... >
            <items>
				...
            </items>
            <groups>
                <group id="GRUPO_1" ... >
                    <groupheader id="GH_GRUPO_1" ... > ... </groupheader>
                </group>
                <group id="GRUPO_2" ... >
                    <groupheader id="GH_GRUPO_2" ... > ... </groupheader>
                    <groupfooter id="GF_GRUPO_2" ... > ... </groupfooter>
                </group>
            </groups>
        </detail>
    </details>
</NCReport>

Por lo tanto, estamos hablando de diseñar un programa que haga lo siguiente:

  • El usuario agrupa y ordena las filas/columnas en una Rejilla avanzada
  • Una vez el usuario finaliza, analizamos la Lista resultante con la estructura de agrupaciones/ordenaciones
  • Generamos un XML compatible con el motor de Informes de NCReport (léase VReport)

Generar el XML es fácil porque es puro texto.
Quizás lo más complicado es diseñar un sistema de plantillas XML con todos los Items de los Detalles/Agrupaciones/Cabeceras/Pies preparadas únicamente para decidir la estructura de agrupaciones/ordenaciones.

Reconozco que sería un Plugin estupendo para Velneo.

Saludos
Paco Satué


([N2] overBCN) #7

Hola Paco,
Gracias por tu respuesta.
Gracias al aporte de Wikan en el artículo del foro “vReport - Orden en los informes” podemos disfrutar del orden correcto en las agrupaciones que creamos en los informes de vReport.
Saludos


([N3] pacosatu) #8

Hola Luis.

Me alegro mucho, problema resuelto entonces.
Así da gusto el foro, solucionando problemas reales.

Saludos
Paco Satué