4.1Subinformes (vinculados y no vinculados)
Lo esencial en 30 segundos
- Un subinforme = un informe completo dentro del principal : su propia fuente, sus campos, su formato — la solución cuando una simple combinación no basta (fuentes diferentes, relaciones uno-a-varios múltiples).
- Vinculado o no vinculado, todo cambia : no vinculado = mismos datos mostrados una vez (resumen global) ; vinculado = datos correspondientes por campo de vínculo, ejecutado de nuevo para cada valor del principal.
- Reflejo de Farès : un subinforme vinculado se coloca al nivel de un grupo (una ejecución por grupo), nunca en los Detalles de un informe grande — y se prefiere la combinación cuando las tablas están en la misma base de datos.
Minicaso hilado — Farès y el extracto de cliente con facturas
Farès, controlador de gestión en Argel, debe producir el extracto mensual de los clientes : el informe principal lista los clientes desde la base de datos de gestión, pero las facturas detalladas vienen de otra extracción que la combinación inflaría con duplicados (dos relaciones uno-a-varios : pedidos Y pagos). Inserta un subinforme vinculado sobre el ID de cliente, colocado en el encabezado de grupo Cliente : para cada cliente, el subinforme muestra las facturas de ESE cliente, una sola ejecución por cliente. Primer hito del hilo conductor : Farès combina dos fuentes sin duplicados y sin matar el rendimiento.
Este mismo caso vuelve en el curso, el esquema, el guion y el desafío 48h — y continúa en 4.2, 4.3, 4.4 y 4.5.
1. Un informe dentro de un informe : cuando el subinforme se impone
El nivel 4 abre las funcionalidades expertas. La primera de ellas : los subinformes (Subreports) — un informe completo (su propia fuente, sus campos, su formato) insertado en una sección del informe « principal ». Como para el extracto de Farès, su fuerza es combinar datos que NO se prestan a una simple combinación : fuentes diferentes (dos bases de datos, una base + un archivo), relaciones complejas o uno-a-varios múltiples que crearían duplicados, información conexa para presentar aparte (para cada cliente, sus últimas facturas).
Regla de decisión : cuando las tablas están en la misma base de datos y se relacionan limpiamente por una clave, una combinación sigue siendo más sencilla y más eficaz — es la opción por defecto. El subinforme es la herramienta de los casos en que la combinación no conviene : fuentes no combinables, duplicados de combinación, lógica o agregación independiente. Se inserta vía « Insertar → Subinforme » (nuevo informe o importación de uno existente), y luego se definen los vínculos.
2. Vinculado frente a no vinculado : el campo de vínculo lo hace todo
Distinción clave. Un subinforme no vinculado (unlinked) es independiente : muestra los mismos datos sea cual sea su posición — por ejemplo un resumen global mostrado una vez en un pie de informe. Un subinforme vinculado (linked) está conectado al principal por un campo de vínculo : para cada registro o grupo del principal, muestra los datos correspondientes — los pedidos de ESE cliente, como las facturas de cada cliente de Farès.
Mecanismo : en el paso « Vínculos » (Subreport Links), se elige el campo del principal (p. ej. Cliente.ID) ; Crystal Reports crea un parámetro en el subinforme y lo asocia al campo correspondiente (p. ej. Facturas.ClienteID) — el filtro se aplica automáticamente, idealmente del lado servidor. El campo de vínculo debe existir en ambos lados. Trampa clásica : olvidar el vínculo — el subinforme muestra entonces todos sus datos, como uno no vinculado.
3. El rendimiento : la ubicación decide el coste
Un subinforme vinculado se vuelve a ejecutar para cada valor de vínculo del principal. Colocado en la sección Detalles, se ejecuta una vez POR línea — catastrófico con grandes volúmenes. Colocado en un encabezado o pie de grupo, solo se ejecuta una vez por grupo — es el gesto de Farès : una ejecución por cliente en lugar de una por factura.
Complementos de prudencia : limitar los datos del subinforme (filtro del lado servidor, solo campos útiles), evitar los subinformes anidados (coste multiplicado), considerar una alternativa (combinación, comando SQL en 4.4, vista consolidada) y probar con un volumen real. Los subinformes comparten difícilmente datos con el principal (variables compartidas = avanzado).
🔎 Ejemplo concreto — 🔎 Ejemplo concreto — Las facturas de cada cliente
El extracto de Farès : un principal de clientes, un subinforme de facturas vinculado y bien colocado.
Principal : lista de clientes (agrupado por cliente).
Subinforme vinculado sobre ID de cliente → las facturas de ESE cliente.
Colocado en el ENCABEZADO DE GRUPO (una ejecución por cliente, no por línea).
Lectura : vincular por la clave común, filtrar del lado servidor, colocar al nivel del grupo.
Lección : datos conexos contextualizados, sin duplicados ni hundimiento del rendimiento.
Vocabulario de la sección
- Subinforme (Subreport)
- Informe COMPLETO insertado en otro (el principal) : su propia fuente, sus campos, su formato, mostrado en una sección del principal.
Ejemplo sencillo: Farès muestra las facturas (otra extracción) en el extracto de clientes sin combinarlas.
Lo que no es: una simple sección adicional del mismo informe.
Reflejo: fuentes no combinables o duplicados de combinación : pensar subinforme.
- Subinforme vinculado (linked)
- Conectado al principal por un CAMPO DE VÍNCULO : muestra los datos correspondientes a cada registro o grupo, ejecutado de nuevo por valor de vínculo.
Ejemplo sencillo: Para cada cliente de Farès, el subinforme muestra las facturas de ESE cliente.
Lo que no es: un resumen global idéntico en todas partes.
Reflejo: datos correspondientes por registro : definir el vínculo en ambos lados.
- Subinforme no vinculado (unlinked)
- Independiente : muestra los MISMOS datos sea cual sea su posición en el principal.
Ejemplo sencillo: Farès muestra un resumen global de los impagados una vez en pie de informe.
Lo que no es: un detalle que sigue a cada registro.
Reflejo: resumen global mostrado una vez : no vinculado en pie de informe.
- Coste por ejecución
- Un subinforme vinculado se ejecuta una vez POR valor de vínculo : Detalles = una vez por línea (costoso), grupo = una vez por grupo.
Ejemplo sencillo: Farès pasa de cientos de ejecuciones (Detalles) a una por cliente (grupo).
Lo que no es: un coste fijo independiente de la ubicación.
Reflejo: vinculado + gran volumen : subir siempre al nivel del grupo.
En la práctica — En práctica — Insertar un subinforme
- Inserte un subinforme (« Insertar → Subinforme ») : cree un nuevo informe o importe uno existente, con su propia fuente y sus campos.
- Decida VINCULADO o NO VINCULADO : no vinculado para un resumen global (mismos datos) ; vinculado para datos correspondientes por registro o grupo.
- Para un subinforme VINCULADO, defina el CAMPO DE VÍNCULO (p. ej. ID de cliente) : mostrará los datos correspondientes a cada valor del principal.
- Para el RENDIMIENTO, coloque un subinforme vinculado en un encabezado o pie de GRUPO (una vez por grupo) en lugar de en Detalles (una vez por línea).
Guion listo para decir — justificar el subinforme ante su responsable (30 s)
« Soy Farès : para el extracto de clientes, no puedo combinar las facturas sin crear duplicados — por eso he puesto un subinforme vinculado por el ID de cliente, colocado al nivel del grupo. Una ejecución por cliente en lugar de una por línea : el extracto sigue siendo correcto y se abre en unos segundos. »
Para decir cuando le pregunten por qué no « simplemente combinar » : muestre el total inflado por los duplicados.
Plantilla copiar-pegar — ficha de encuadre de un subinforme
Necesidad : [extracto clientes + facturas otra extracción]
Elección : [combinación imposible → subinforme]
Tipo : [vinculado sobre ID de cliente | no vinculado — resumen global]
Vínculo : principal [Cliente.ID] → subinforme [Facturas.ClienteID], filtro del lado servidor [sí]
Ubicación : [encabezado de grupo Cliente — una ejecución por cliente]
Contenido : [solo campos útiles : N.º factura, fecha, importe]
Extracto de cliente multifuente
Como Farès : principal sobre la base de datos de gestión, subinforme vinculado sobre la otra extracción — una ejecución por cliente.
Doble relación uno-a-varios
Pedidos Y pagos de un cliente : un subinforme por relación para evitar la multiplicación de las líneas.
Resumen global
Total de los impagados mostrado una vez en pie de informe : subinforme no vinculado, sin campo de vínculo.
Gran volumen que se arrastra
Subir el subinforme al grupo, filtrar del lado servidor, considerar un comando SQL o una vista (ver 4.4).
✓ Buenas prácticas
- Coloque un subinforme vinculado al nivel de un GRUPO, no en los Detalles.
- Filtre el subinforme del lado servidor y ponga solo los campos útiles.
- Prefiera una combinación cuando las tablas estén en la misma base de datos.
✗ Errores frecuentes
- Un subinforme vinculado en los Detalles de un informe grande (rendimiento catastrófico).
- Olvidar el vínculo (el subinforme muestra entonces todos sus datos).
- Encadenar subinformes anidados (coste multiplicado).
Puntos clave
- Un SUBINFORME es un informe COMPLETO insertado en otro. Fuerza : combinar datos difíciles de UNIR — fuentes diferentes, relaciones complejas, información conexa.
- Distinción CLAVE : VINCULADO (campo de vínculo — datos correspondientes por registro/grupo) frente a NO VINCULADO (independiente, mismos datos).
- RENDIMIENTO : un vinculado se ejecuta una vez POR valor de vínculo. Detalles = muy costoso ; encabezado/pie de GRUPO = muchas menos ejecuciones.
- Inserción vía « Insertar → Subinforme » y definición de los VÍNCULOS. Probar con volumen real.
Desafío 48h — aplíquelo mañana
En un extracto real : inserte un subinforme vinculado (clave común en ambos lados), colóquelo al nivel del grupo, limite sus campos y compare el tiempo de apertura con una colocación en los Detalles.
- Sé insertar un subinforme y elegir vinculado o no vinculado según la necesidad.
- Sé definir un campo de vínculo presente en ambos lados, filtrado del lado servidor.
- Coloco un subinforme vinculado al nivel del grupo y pruebo con volumen real.
Preguntas frecuentes
¿Cuándo usar un subinforme en lugar de una combinación, y cómo evitar los problemas de rendimiento ?
Cuando las tablas están en la MISMA base de datos y se relacionan por una clave, una COMBINACIÓN es más sencilla y más eficaz — es la opción por defecto. Reserve el SUBINFORME para los casos en que la combinación no conviene : fuentes DIFERENTES no combinables, relaciones múltiples uno-a-varios que crearían duplicados, datos conexos para presentar aparte. Rendimiento : un subinforme vinculado se vuelve a ejecutar para cada valor de vínculo — no lo coloque NUNCA en los Detalles de un informe grande : póngalo en un encabezado o pie de GRUPO, limite sus datos (filtro del lado servidor, campos útiles), evite los anidados, considere un comando SQL o una vista (ver 4.4), y pruebe con un volumen real.
¿Cómo hacer corresponder los datos de un subinforme con cada registro del informe principal ?
VINCULANDO el subinforme al principal por un CAMPO común (p. ej. ID de cliente). Para cada registro o grupo, el principal pasa un valor de vínculo y el subinforme filtra sus datos sobre él. En concreto : inserte el subinforme, y en el paso « Vínculos » elija el campo del principal (Cliente.ID) y asócielo al campo correspondiente del subinforme (Facturas.ClienteID) — Crystal Reports crea el parámetro y aplica el filtro automáticamente. Puntos clave : clave presente en AMBOS lados, filtro del lado servidor, ubicación (Detalles o grupo) que regula la frecuencia de ejecución. Sin vínculo, el subinforme muestra todos sus datos.
¿Dónde colocar un subinforme vinculado para preservar el rendimiento ?