24 de junio de 2017

Múltiples bandas de detalle en informes (1)

En los foros apareció este comentario "Alguien ha realizado un reporte con dos detalles, es decir tengo 2 tablas que deseo que aparezcan en mi reporte... Que cuando termine la primera, a continuación se muestre la otra tabla"

Allí hubo una primera respuesta correcta. Vamos a ampliar un poco este tema, sobre la base de lo que hay en la beta pública de VFP 9.0. Seguramente, con el tiempo se podrá completar más; pero vamos asimilando las nuevas características de VFP 9.0 Debido a que este artículo se ha realizado con la versión Beta pública de VFP9, algunos aspectos pudieran sufrir modificaciones cuando se libere la versión definitiva.

Bandas multidetalles - Esta una de las mejoras más importantes de esta nueva versión. Veamos un ejemplo donde la tabla padre Clientes se enlaza con dos tablas hijas: Ordenes y Pagos. El objetivo del informe es obtener todos los datos agrupados del cliente. Creando 2 bandas de detalle, y teniendo las dos tablas hijas relacionadas con Cliente.dbf el resultado que obtenemos es el deseado según la pregunta planteada en el foro… " un reporte con dos detalles, 2 tablas que deseo que aparezcan en mi reporte...Que cuando termine la primera, a continuación se muestre la otra tabla"

¿Cómo se obtiene?

Definir multibandas - De forma predeterminada los informes se crean con una sola banda de detalle. Se pueden adicionar bandas desde el diálogo Bandas Opcionales (Optional Bands), incrementando el valor dentro del control Spinner (hasta 20). Luego, hay que definir el alias para cada banda, este aspecto lo veremos con detenimiento. Al aumentar un número aparece una nueva banda de detalle y al disminuir uno se elimina la banda con mayor número (la última en haber sido creada)

El trabajo multibandas nos ofrece nuevas posibilidades; pero nos exige ser mucho más cuidadosos, porque ahora en cada banda no estará la tabla padre sino una de las hijas, y hay que definir el nombre del alias en el cuadro de texto Expresión del Alias principal (Target alias expresion,) del Cuadro de diálogo Propiedades de la banda de detalle (Detail band propierties). En caso de estar trabajando con una sola banda, pues no pasa nada si la dejamos en blanco, toma la tabla padre que será justo lo que deseamos.


El cuadro de diálogo Detalles (Detail) contiene las propiedades de la banda de Detalles.

Alias principal (Target alias) - Es el alias que se recorre en la banda donde se encuentra. Es una expresión. Debe ir entre comillas, para que evalúe la expresión y obtenga los valores existentes en el Alias indicado. Si no se ponen las comillas, se entiende que es una expresión, por ejemplo Clientes, pudiendo ser una variable, o un campo que contiene el nombre del alias que se obtiene en tiempo de ejecución. Este nombre va a aparecer en la barra gris que define la banda. Se recomienda definir los campos incluyendo el nombre del alias para evitar confusiones. El tipo de alias dependerá del contenido que se quiera mostrar.

Nueva cláusula SUMMARY - Esta cláusula nos permite obtener sólo los encabezados y pie de cada banda sin mostrar el contenido de los detalles, es una buena opción, porque ahora el usuario podrá decidir si quiere la información compactada o detallada. Vea más adelante los resultados que se obtienen al emplearla.

Las variables y expresiones calculadas en el informe adquieren una nueva dimensión, Reset based on, en la ficha Variables de la ventana Propiedades indica que se deben procesar los registros de la tabla hija y no se limpia hasta que no termine el informe, lo que permite realizar cálculos y combinaciones entre las bandas utilizando valores calculados de unas en otras. Al seleccionar un número de banda específica, VFP procesa el cálculo solamente durante el proceso de esa banda. Si se escoge más de un sitio, pues se procesa mientras duren las bandas seleccionadas.

Diferencias entre las Bandas de Detalles y las Agrupaciones de Datos (Data Grouping)

Bandas de DetallesAgrupaciones de Datos
Se pueden anidarNo se anidan, son consecutivas
No se crean subgrupos dentro de ellasSe crean subgrupos
Dependen del alias principal (target alias) que se le indiqueNo dependen del alias principal (target alias)
Su límite máximo es de 20 bandasSu límite máximo es de 74 bandas
Su límite mínimo es una bandaSu límite mínimo es cero bandas
Cuando termina una banda, si existe otra banda de detalle el puntero se mueve nuevamente al inicio del alias actualCuando acaba un grupo, el puntero se mueve al siguiente registro
La expresión para el alcance de una banda de detalle (target alias) se limita a una expresión que de nombre a una tabla abierta en la sesión de datos actualNo existe límite para la creación de una expresión que defina el alcance de un grupo

Diferencias entre los encabezados y pies de Bandas de Detalle y los encabezados y pies de Bandas de Grupos

Encabezados y pies de Bandas de DetalleEncabezados y pies de Bandas de Grupos
Se pueden mostrar los encabezados y pie de banda (son opcionales). Si existen, se muestran incluso cuando no hay datos, por ejemplo que no haya coincidencia entre la tabla padre y la hija. Si no se desea imprimir el encabezado de la banda de detalle en este caso, debe utilizar una expresión del tipo NOT EOF(<target alias>) en Imprimir cuando (Print When)Si no hay elemento de agrupación en la selección, no se puede mostrar encabezado y/o pie para él, debido a que no existe tampoco el grupo como tal. Tiene que existir algún elemento, incluso si no se desea imprimir el detalle y se emplea la cláusula SUMMARY en el comando REPORT FORM, que se encarga de eliminarla.
La cláusula SUMMARY en el comando REPORT FORM, elimina todas las bandas de detalle, así como sus correspondientes encabezados y pies.La cláusula SUMMARY en el comando REPORT FORM, NO elimina los encabezados y pies de las bandas de grupo.
Si se incluye la cláusula SUMMARY, NO se ejecutan los eventos OnEntry / OnExit.Aunque se incluya la cláusula SUMMARY, los eventos OnEntry / OnExit SIEMPRE se ejecutan.

Los encabezados y pies de ambos tipos de bandas tienen características similares, por ejemplo la evaluación de su contenido y el código colocado en sus eventos OnEntry y OnExit ocurren en el mismo momento.

Otros Ejemplos

1. Con un único cursor.

Para poner los totales al inicio, en el encabezado de banda.

Hacer 2 bandas con igual alias, en la primera banda se calcula el total y se muestra el valor calculado en el encabezado. Pero esta banda no tiene más nada, no hay nada en el detalle ni el pie de banda.

Entonces, en la segunda banda están los datos en el detalle; lo importante es que VFP no está apuntando al último registro de esa tabla, por haber hecho SUM, COUNT, o la operación que sea, no, el puntero de la tabla al llegar a la segunda banda apunta al registro que corresponde por la relación padre-hija que existe con la tabla padre que es quien rige el informe.

El ejemplo concreto es imprimir para cada vendedor sus ventas (valor) y el porcentaje con relación al total, para lo cual necesitamos el total previamente calculado.

En este caso se utiliza una expresión representando el alias igual al alias principal (target alias) en la primera banda de detalle. Esto le dice al VFP que desea procesar todos los registros de la tabla antes de moverse a la siguiente banda de detalles.

2. Con múltiples cursores.

Cuando tiene múltiples cursores, utilice un alias principal (target alias) en blanco cuando desee que una banda sea procesada sólo una vez. Esto es útil si se desea mostrar información resumida, algo similar a lo que brinda el encabezado y pie de grupo.

Ejemplo:

Necesitamos agrupar el informe por ClienteID. Podemos ofrecer información sobre el Cliente en el Encabezado o pie de banda de grupo. Pero, podemos además colocar una banda de detalle entre Ordenes y Pagos que contenga información adicional sobre el Cliente, que puede ser, por ejemplo el estado actual de su cuenta. Al no colocar Alias principal (Target alias) su contenido aparecerá sólo antes de que se vaya a procesar la banda de Pagos. No hace falta escribir código en Imprimir cuando (Print When) ni seleccionar Eliminar datos repetidos (Suppress Repeated Value).

¿Qué ocurre en tiempo de ejecución? VFP verifica que el dato Alias principal (target alias) esté vacío o en uso, luego verifica que sea el alias actual o hija. Si el desarrollador tiene establecido su comportamiento de uno-a-muchos, por ejemplo con SET SKIP en su entorno de datos, el VFP lo respeta. Si no tiene definido nada, crea uno y lo elimina al finalizar el informe para dejar el entorno tal y como estaba.

  • Si la primera banda de detalles no tiene Alias principal (target alias), procesa el primer registro de la tabla principal y se mueve a la siguiente banda de detalles.
  • Si la primera banda de detalles tiene Alias principal (target alias) que es un alias hijo del alias principal, procesa todos los registros de la tabla hija mostrando los relacionados y pasa a la siguiente banda. El puntero permanece en el primer registro de la tabla principal.
  • Si la primera banda tiene el nombre de alias igual al nombre del alias principal, procesa todos los registros del alias principal y luego se mueve a la siguiente banda de detalles.

Limitaciones:

  • Mezclar múltiples columnas y múltiples bandas. Utilizar múltiples columnas en informes multibandas puede trabajar en algunos casos; pero pueden darse muchos casos de efectos desagradables si trata de darle columnas diferentes a las bandas y si no inician en página nueva para cada grupo y van de arriba abajo.
  • No es posible re-ordenar las bandas. No es un proceso nativo, pero se puede hacer eliminando y adicionando bandas y re-colocando los objetos en la posición que se desea. Se puede agrandar el tamaño de otras bandas, mover hacia ellas el contenido de la banda a eliminar re-crearla y luego re-posicionar los objetos. Se pueden seleccionar todos los objetos de la banda si se hace Doble-Clic en la banda separadora.

Como vemos, las posibilidades para trabajar los informes se amplían notablemente en esta nueva versión y aunque quedaría mucho por lograr, al menos, esta pregunta de los foros, ya tiene respuesta nativa en VFP 9.0

Saludos,

Ana María Bisbé York
http://www.amby.net

3 comentarios :

  1. Buenas noches, he intentado realizar un informe con grupos y sus subtotales incluido el detalle y no me sale el reporte como requiero. Por ejemplo:

    1. activo 500 (grupo 1)
    11. activo corriente 500 (grupo 2)
    1101. activo disponible 500 (grupo 3)
    110101. caja 200 (grupo 4)
    11010101. caja 100 (detalle)
    11010102. caja chica 100 (detalle)
    110102. bancos 300 (grupo 4)
    11010201. banco a 200 (detalle)
    11010201. banco b 100 (detalle)

    ResponderBorrar
  2. Buenas tardes, tengo dos tablas una de encabezados de documentos y otra con los detalles, en primera banda el alias target en blanco, en el detalle algunos campos de la tabla principal con el formato alias.nombrecampo, luego en la segunda banda el alias target con el alias de la tabla con los detalles de los documentos, hasta aqui todo funciona, el problema es el siguente, incluyo la banda SUMMARY donde agrego una variable para totalizar el campo precio en la tabla principal, me muestra un resultado duplicado, he probado en reset based on con report y detail1 y nada, que esta mal en las bandas???

    ResponderBorrar

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.