PDA

Ver la Versión Completa : Eliminar páginas sin registros en detalle


Tomás
29-10-2003, 00:58:41
Hola a todos:

Tengo dos tablas InterBase Master/Detall
Master: ALUMNOS
Detalle: FALTAS

Hago un informe mensual de faltas de cada alumno seleccionando las del mes del informe (una página por alumno):

'Select * from FALTAS where CODIALUMNO=:CODIGO and INICIOFALTA >= '+chr(39)+sIni+chr(39)+' and INICIOFALTA <= '+chr(39)+sFin+chr(39) ;

El problema es que el alumno que no tiene faltas ese mes tambien sale su página con su nombre, aunque por supuesto sin faltas y quiero que los que no tienen faltas ese mes no aparezcan, o por lo menos que no se impriman.

¿Cómo se hace esto?

Un saludo. Tomás.

PD. No se si esta duda es del apartado de impresión o de SQL.

roman
29-10-2003, 03:32:24
La pregunta tiene todo el aspecto de ser de SQL sin embargo no acabo de entender cómo está eso de que aparecen los alumnos sin faltas. Tu consulta es un simple SELECT y aparecerán únicamente los registros que cumplan las condiciones.

Por ello me parece que tu problema tiene que ver con la forma en que ejecutas estas consultas para mandar los datos a impresión. Posiblemente uses algún ciclo haciendo una consulta en cada vuelta. Posiblemente lo único que debsa entonces hacer es verificar los resultados de cada consulta y mandar a imprimir sólo si realmente existen registros.

De cualquier forma, aunque es difícil decir pues no indicas cómo mandas a imprimir, pareciera que estás trabajando de más si es cierto que ejecutas una consulta por alumno. Tendría más sentido ejecutar una sola consulta

'Select * from FALTAS where INICIOFALTA >= '+chr(39)+sIni+chr(39)+' and INICIOFALTA <= '+chr(39)+sFin+chr(39)

y pasársela a algún reporteador para que imprima todos los resultados de una sóla vez.

Y te reitero, suponiendo que la condición

INICIOFALTA >= '+chr(39)+sIni+chr(39)+' and INICIOFALTA <= '+chr(39)+sFin+chr(39)

es la que marca que sólo se traten las faltas del mes entonces la consulta SQL no tiene porque regresar ningún registro de más.

Si nos aclaras un poco más quizá podamos ayudarte mejor.

// Saludos

rvinfo
29-10-2003, 13:31:48
Seguramente Roman tiene razón y haces la consulta Sql después de haber impreso la banda "master".

Tienes que averigüar si el dato ha de salir o no en el beforePrint de la banda "master", no en el de la banda "detail" (en este caso seguramente haciendo como dice Roman o, una opción menos eficaz, haciendo la consulta Sql en la banda "master"). Si ves que no va a existir "Detail" entonces no imprimes la "Master".

__cadetill
29-10-2003, 13:49:28
y no creeis que lo más sencillo es hacer una join entre las 2 tablas y, así, si tiene faltas saldrá en el resultado de la join y, si no tiene, pues no saldrá??? :confused:

De esta manera pasamos la responsabilidad de los datos a la Query y dejamos el reporte lo más sencillo posible (un TQRGroup con la propiedad ForceNewPage a true y una banda Detail para el detalle)

No se, es una idea

rvinfo
29-10-2003, 14:03:51
Perdón, escribí "Tomás" cuando quería decir "Roman", ya he editado mi mensaje.

En todo caso sólo pretendía que Tomás comprendiera que no debe intentar controlar una banda con información "Detail", el control se debe efectuar en el DataSet que recorre el QuickRep o en la banda con la información "master".

Un saludo.

Tomás
30-10-2003, 14:29:26
Hola a todos:

Lo primero deciros que solo soy aficionado a Delphi y principiante, esto es para que os hagais una idea de mi nivel, y que seguramente no se hace como yo lo intento, pero desconozco otros enfoques, como el Join que comenta Cadetill.

Intentaré hacerme entender con un ejemplo simplificado:

Tengo la tabla master "ALUMNOS" y la detalle "FALTAS" con estos registros.

1. ABAD ABAD, Ana
a) 21-09-2003
b) 05-10-2003

2. GIL GIL, Pedro
a) 06-10-2003

Para el informe de septiembre hago esta consulta en la tabla detalle "FALTAS"

'Select * from FALTAS where CODIALUMNO=:CODIGO and INICIOFALTA >= '+chr(39)+sIni+chr(39)+' and INICIOFALTA <= '+chr(39)+sFin+chr(39) ;

donde sIni=01-09-2003 y sFin=30-09-2003

después QRImpriInforme.Preview;

y el resultado es

ABAD ABAD, Ana
21-09-2003

GIL GIL, Pedro

¿Lo enfoco mál desde el principio?
¿Debo hacer el Join?
¿Donde puedo consultar algo sobre Join?, pero que no esté en Inglés, que apenas entiendo.

Un saludo. Tomás.

__cadetill
30-10-2003, 14:49:33
bueno, el Join como tu le llamas, no es más que la unión de 2 tablas en una sentencia SQL

ejemplo


'select *
from alumnos a inner join
faltas b on (b.CODIALUMNO = a.CODIGO )
where b.INICIOFALTA between' + QuotedStr(sIni) + ' and '
+ QuotedStr(sFin)

es decir, la estructura de una inner join es la que sigue

select * (o campos)
from tabla1 inner join tabla2 on (condiciones de unión)

Básicamente, un Inner Join, lo que te hace es unir las 2 tablas (o las que sean, sólo has de ir concatenando Inners Joins) y devolver aquellos rejistros que cumplen las condiciones de unión. Claro está que, si un registro de la tabla 1 no tiene su respectivo en la tabla 2, éste no aparecerá en la consulta. Por eso que, en tu caso es lo que te combiene, ya que sólo quieres los alumnos que tengan faltas.

Si el caso fuera que quieres todos los alumnos tengan o no faltas (vamos, lo que te sale ahora), para eso existen también el left outer join y el rigth outer join, pero eso ya lo trataremos en otra ocasión ;)

Espero que la explicación te sirva

rvinfo
30-10-2003, 17:44:27
Tomás, lo que te vienen a decir es que no uses el master/detail, sino que directamente obtengas todas las faltas de los alumnos en una sola SQL.

Así el informe recorrerá únicamente ese SQL donde sólo estarán los alumnos con faltas, que son los que te interesan. Pero entonces eres tú quien tiene que distinguir cuando empieza y acaba la información de un alumno. Si quieres seguir manteniendo la estética del informe:

Alumno 1
... Falta 1
... Falta 2

Tendrás que poner "Alumno 1" en una banda de grupo y las Faltas en la banda Detail. E intentar que salga el grupo cuando tu quieres, cosa nada fácil :( porque funcionan de pena.

Otra opción sería cambiar el informe para que sólo hubiera una banda Detail y la información se viera así:

Alumno 1 Falta 1
Alumno 1 Falta 2

Sería entonces fácil ver cuándo estás repitiendo el nombre del alumno para poder eliminarlo de modo que quedara:

Alumno 1 Falta 1
.................Falta 2

-------------

El join no es más que una consulta Sql del tipo:

Select * from alumnos, faltas where alumnos.codigoalumno = faltas.codigoalumno

pero que se escribe con la gramática:

Select * from alumnos inner join faltas on (alumnos.codigoalumno = faltas.codigoalumno)

-------------------

Espero no estar diciendo cosas que ya sabías. Un saludo.

__cadetill
30-10-2003, 17:58:57
Posteado originalmente por rvinfo
E intentar que salga el grupo cuando tu quieres, cosa nada fácil :( porque funcionan de pena.

Por qué dices esto?? Si las bandas TQrGroup funcionan muy bien!!! Yo las uso a diario y, sin problemas (y tengo unos cuantos listados hechos con este componente e incluso anidados,.....) :confused:

rvinfo
30-10-2003, 18:19:02
Pues verás, yo les indico un campo del Quickrpt.dataset en la propiedad "expression" (para que aparezca cada vez que cambie el contenido de ese campo) y no hace ni caso. Por lo que tengo que usar el evento BeforePrint para controlarlas manualmente.

Pensaba que a todo el mundo les iban mal, de hecho creo haber visto varios hilos hablando de problemas con esas bandas. Ahora que me dices que a tí te funcionan bien me pregunto qué me puede estar pasando a mi...

¡Un saludo!

Tomás
30-10-2003, 20:37:46
Hola, lo primero muchas gracias a los tres: Román, Rvinfo y Cadetill.

He hecho la Join (ahora ya se que es femenimo: unión), y saco estas conclusiones:

- Si tengo el ejemplo que puse:

1. ABAD ABAD, Ana
a) 21-09-2003
b) 05-10-2003

2. GIL GIL, Pedro
a) 06-10-2003

el resultado de una Join sin condiciones sería una tabla cuya estructura es la suma de las dos y con estos tres registros

NOMBRE FECHA
----------- ---------
ABAD ABAD, Ana 21-09-2003
ABAD ABAD, Ana 05-10-2033
GIL GIL, Pedro 06-10-2003


- El QR que tenía antes no me sirve, y debo de hacer otro con TQRGroup.

¿estoy en lo cierto?


Un saludo. Tomás.

__cadetill
30-10-2003, 21:14:45
hola rvinfo
Posteado originalmente por rvinfo
Ahora que me dices que a tí te funcionan bien me pregunto qué me puede estar pasando a mi...

Si quieres ver una demo del funcionamiento de esta banda, en mi web tienes uns ejemplo de utilización del QR con explicaciones de su manejo. Te recomiendo que le des una ojeada y, si te queda alguna duda, pos aquí estamos :)

hola Tomás
Posteado originalmente por Tomás
- El QR que tenía antes no me sirve, y debo de hacer otro con TQRGroup.

¿estoy en lo cierto?

La verdad es que no se si te sirve (no se cómo lo tenías antes), pero sí, necesitas utilizar esta banda. Para ver su funcionamiento, te digo lo mismo que al amigo rvinfo

Ya nos contareis los 2 a ver que tal