Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-10-2013
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Seleccionar primer registro con ADOQuery

Hola amigos:
Nuevamente solicito su inestimable ayuda para resolver un problema que me trae complicado.
En una BD Access tengo dos tablas:

TABLASERIES : STUDYUID, SERIESUID
TABLAIMAGES: STUDYUID, SERIESUID, INSTANCEUID

Los campos STUDYUID y SERIESUID son comunes. Lo que necesito es obtener el primer registro del campo INSTANCEUID para cada una de las SERIESUID.
He utilizado el siguiente código, pero sólo me devuelve 1 registro (INSTANCEUID) a pesar de que existan varias SERIESUID :

Código Delphi [-]
begin
ListBox2.Items.Clear;
ADOQuery8.Close;
ADOQuery8.SQL.Clear;
ADOQuery8.Sql.text:='select SERIESUID from TABLASERIES where STUDYUID like '+QuotedStr(DBEditID.Text+'%') ;
ADOQuery8.Open;
ADOQuery8.First;
while not ADOQuery8.Eof do
begin
ADOQuery6.Close;
ADOQuery6.SQL.Clear;
ADOQuery6.Sql.text:='select first(INSTANCEUID) from TABLAIMAGES where SERIESUID like '+QuotedStr(ADOQuery8.FieldValues['SERIESUID']+'%') ;
ADOQuery6.Open;
ListBox2.Items.Add(ADOQuery6.FieldByName('INSTANCEUID').AsString);
ADOQuery8.Next;
end;
end;

Cualquier ayuda es bien recibida.
Saludos y muchas gracias
Responder Con Cita
  #2  
Antiguo 30-10-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Ivan.
Cita:
Lo que necesito es obtener el primer registro del campo INSTANCEUID para cada una de las SERIESUID
Si se trata de obtener el primer INSTANCEUID de todas y cada una de las SERIESUID de la tabla TABLAIMAGES, en Firebird la consulta sería :
Código SQL [-]
SELECT DISTINCT T1.SERIESUID,
    (SELECT FIRST 1 T2.INSTANCEUID FROM TABLAIMAGES T2 WHERE T2.SERIESUID = T1.SERIESUID)
FROM TABLAIMAGES T1
No tengo manera de probar en Access ya que no lo uso, pero por lo que veo de tu sintáxis creo que sería algo como:
Código SQL [-]
SELECT DISTINCT T1.SERIESUID,
    (SELECT FIRST (T2.INSTANCEUID) FROM TABLAIMAGES T2 WHERE T2.SERIESUID = T1.SERIESUID)
FROM TABLAIMAGES T1

En Delphi:
Código Delphi [-]
  with tuADOQuery do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT DISTINCT T1.SERIESUID,');
    SQL.Add('(SELECT FIRST (T2.INSTANCEUID) FROM TABLAIMAGES T2 WHERE T2.SERIESUID = T1.SERIESUID)');
    SQL.Add('FROM TABLAIMAGES T1');
    Open;
  end;


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 30-10-2013
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Hola Daniel.
Un placer saludarte nuevamente y agradecerte tu siempre excelente ayuda.
Probaré los códigos y te cuento.
Saludos
Responder Con Cita
  #4  
Antiguo 30-10-2013
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Muchas gracias Daniel.
Por lo que veo yo andaba más perdido que otras veces.
El código final que funciona como lo que necesitaba es :

Código Delphi [-]
begin
ListBox2.Items.Clear;
with ADOQuery6 do
begin
ADOQuery6.Close;
ADOQuery6.SQL.Clear;
ADOQuery6.SQL.Add('Select distinct T1.SERIESUID');
ADOQuery6.SQL.Add('(Select first(T2.INSTANCEUID) from IMAGES T2 where T2.SERIESUID = T1.SERIESUID)');
ADOQuery6.SQL.Add('from IMAGES T1');
ADOQuery6.SQL.Add('where STUDYUID like '+QuotedStr(DBEditID.Text+'%'));
ADOQuery6.Open;
ADOQuery6.First;
while not ADOQuery6.Eof do
begin
ListBox2.Items.Add(ADOQuery6.FieldByName('Expr1000').AsString);
ADOQuery6.Next;
end;
end;
end;

Mi conocimiento de Sql es bastante pobre y en este código hay cosas que no comprendo y que van en contra de mis estandares, como el hecho de que la claúsula lleve 2 from y 2 where ¿?

Un abrazo
Responder Con Cita
  #5  
Antiguo 30-10-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Iván.

El código dice mas o menos:
Cita:
Seleccioname cada uno de los distintos ALIAS_1.SERIESUID y para cada uno,
(Seleccioname el primer ALIAS_2.INSTANCEUID desde TABLAIMAGES ALIAS_2 donde ALIAS_2.SERIESUID sea igual a ALIAS_1.SERIESUID)
desde TABLAIMAGES ALIAS_1
Es decir que para cada INSTANCEUID, ejecuta el SELECT entre paréntesis, que es el encargado de seleccionar el primer INSTANCEUID que cumpla la condición: ALIAS_2.SERIESUID igual a ALIAS_1.SERIESUID.

Espero no haberte embrollado más con la explicación... Tal vez te resulte mas sencillo enterderlo revisando el uso de los ALIAS.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 30-10-2013 a las 22:46:55.
Responder Con Cita
  #6  
Antiguo 30-10-2013
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Muchas gracias por tus explicaciones.
Me voy a entretener leyendo en el link que me enviaste y a lo mejor aprendo algo de Sql.

Saludos y gracias
Responder Con Cita
  #7  
Antiguo 31-10-2013
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Access tiene un muy buen generador de consultas que genera el sql necesario.
La ventaja de usarlo es que la consulta sera exacta a lo que necesites y simplemente la copias en delphi para usarla.
Access usa mucho el distinctrow que no existe en otras bd y genera una distinccion de linea muy interesante.
Saludos
__________________
Siempre Novato
Responder Con Cita
  #8  
Antiguo 31-10-2013
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Muchas gracias por tu aporte Caral.
Ya he usado antes el generador de consultas de Access para otras consultas que para mí fueron más entendibles, pero en este caso me quebré la cabeza varios días antes de consultar al foro ya que no logré dar con la solución.

Saludos
Responder Con Cita
  #9  
Antiguo 02-11-2013
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Con la ayuda de ecfisa y la sugerencia de Caral finalmente simplifiqué el código, que adjunto por si alguien pudiera necesitarlo:

Código Delphi [-]
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Select distinct SERIESUID, First (IMAGE_PATH) as ImagePath from IMAGES where STUDYUID like'
+ QuotedStr(DBEditID.Text+'%')+ 'group by SERIESUID');
ADOQuery1.Open;

Muchas gracias a todos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Primer registro y ultimo registro Jose Roman OOP 4 26-07-2012 20:29:11
Seleccionar primer registro en la Clausula WHERE para Actualizar Valor. Adrian Murua MySQL 3 28-05-2012 23:52:14
Seleccionar primer y ultimo registro Jose Roman Firebird e Interbase 14 19-08-2008 21:35:46
Primer registro de un ClientDataSet?? Berto2003 Varios 4 13-03-2007 18:24:49
Primer Registro alcides Varios 5 04-05-2005 18:34:37


La franja horaria es GMT +2. Ahora son las 03:46:35.


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