![]() |
Eliminar páginas sin registros en detalle
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. |
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 |
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". |
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 |
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. |
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. |
bueno, el Join como tu le llamas, no es más que la unión de 2 tablas en una sentencia SQL
ejemplo Código:
'select * Código:
select * (o campos) 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 |
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. |
Cita:
|
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! |
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. |
hola rvinfo
Cita:
hola Tomás Cita:
Ya nos contareis los 2 a ver que tal |
La franja horaria es GMT +2. Ahora son las 02:08:42. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi