Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-06-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
mostrar SOLO cliente de los que tengo un sólo registro

Hola,

Estoy trabajando con delphi6 e interbase 7.

Tengo que motar un informe (report), y para ello me he creado o lo estoy intentando, un procedimiento que me filtra los cliente por una serie de datos de modo que al final, me muestra todos los registros correspondientes a cada uno de los clientes que cumplen mi condición.

Hasta aquí todo bien. El tema es que ahora lo que necesito hacer es que de ese listado que he obtenido, si un cliente tiene más de un registro, entonces NO me muestre los registros de ese alumno y si tiene SÓLO un registro me lo muestre en el listado.

Alguna idea?????

Por favor, ayuda,


Muchas gracias de antemano, y por todo

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #2  
Antiguo 07-06-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Hola Virginia

No se si te he entendido (podrías poner el SQL que lanzas), pero quizás con un simple Distinct lo puedas solucionar

Código SQL [-]
select distinct campos
from tablas
where condiciones

Espero te sirva
Responder Con Cita
  #3  
Antiguo 07-06-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Hola Cadetill,

por desgracia, no es tan fácil, pues efectivamente utilizo el distint, pero los registros no son totalmente iguales, tienen campos algo distintos. Esto es lo que tengo dentro del bloque del procedimiento:


Código SQL [-]
FOR
select distinct alumnos.NUMALU, (alumnos.NOMALU || ' ' || alumnos.APELALU) AS APENOM,
 alumnos.FNACALU, alumnos.TELFALU, (alumnos.viaalu || ' ' || alumnos.domialu) as CALLE,
  alumnos.codpalu, alumnos.pobalu, alumnos.sexalu,
  matri.fecfin,
  grupos.alias,
 (clientes.nomcl || ' ' ||  clientes.apelcl) as nomcli, clientes.sexcl

 FROM (((alumnos INNER JOIN matri ON alumnos.numalu=matri.NUMALU)
       inner JOIN grupos ON matri.numgrup=grupos.numgrup)
       inner join clientes on alumnos.nic=clientes.nic)


 WHERE ((matri.caubaja=1) AND (grupos.PRODUCTO>'21' AND grupos.producto<'34'))
 ORDER BY alumnos.numalu, matri.fecfin desc

into
:VNUMALU, :vnombre, :vfnaci,:VTELFALU,  :VCALLE, :VCPALU,
:VPOBLALU, :VSEXALU,  :VFECFINCURSO, :valias, :VNOMCLI, :VSEXCL
DO BEGIN                                            
  NUMALU= :VNUMALU;
  NOMBRE=  :vnombre;
  FNACI= :vfnaci;
  TELFALU=  :VTELFALU;
  CALLE= :VCALLE;
  CPALU= :VCPALU;
  POBLALU= :VPOBLALU;
  SEXALU= :VSEXALU;
  FECFINCURSO= :VFECFINCURSO;
  NOMCLI= :VNOMCLI;
  SEXCL= :VSEXCL;
  alias= :valias;

  suspend;
END /*fin del for*/

Muchas gracias,

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #4  
Antiguo 07-06-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Hola.

Esto te va a listar los registros no repetidos por el campo nombre.

select nombre
from Tabla EXT
where (select count(*) from Tabla INT where INT.nombre = EXT.nombre) = 1

Si esto no es lo que quieres, tendrás que explicarte mejor.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #5  
Antiguo 07-06-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Cita:
Empezado por guillotmarc
Esto te va a listar los registros no repetidos por el campo nombre.

select nombre
from Tabla EXT
where (select count(*) from Tabla INT where INT.nombre = EXT.nombre) = 1

Si esto no es lo que quieres, tendrás que explicarte mejor.

Saludos.
Efectivamente lo que necesito es que se me listen los registros NO REPETIDOS. Lo que me propones me funciona, pero el procedimiento se me hace eterno, de hecho, creía que se me había colgado la aplicación al ejecutarlo directamente desde IB, por lo que parece implanteable su ejecución por medio de Delphi, ¿alguna idea de que puedo estar haciendo mal para que sea tan lento?

Muchas gracias,

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #6  
Antiguo 07-06-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Hola.

Los problemas de velocidad en una consulta, practicamente siempre se solucionan creando un/varios índice/s adecuado/s.

Cuando tienes una subconsulta (como este caso), tienes que prestar especial atención a crear un índice para optimizar esa subconsulta (puesto que se va a lanzar la subconsulta, una vez para cada registro de la consulta principal).

Así para una consulta tipo, la comentada :

select nombre
from Tabla EXT
where (select count(*) from Tabla INT where INT.nombre = EXT.nombre) = 1

Solo creando un índice para el campo nombre, vas a aumentar espectacularmente su tiempo de ejecución.

NOTA : Este caso es muy simple, en muchos casos vas a necesitar un índice múltiple para optimizar adecuadamente una consulta. Es decir para optimizar una consulta del tipo select .... where Campo1 = X and Campo2 = Y, debes crear un índice compuesto, con los campos Campo1 y Campo2.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #7  
Antiguo 07-06-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Cita:
Empezado por Giniromero
Lo que me propones me funciona, pero el procedimiento se me hace eterno, de hecho, creía que se me había colgado la aplicación al ejecutarlo directamente desde IB, por lo que parece implanteable su ejecución por medio de Delphi, ¿alguna idea de que puedo estar haciendo mal para que sea tan lento?
Por cierto, Delphi no tiene nada que ver con que la consulta/procedimiento sea lenta o no. Como has comentado también va lento directamente en IB. Es un problema de diseño de la consulta/Base de Datos, y no de Delphi.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 01:12:49.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi