Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Seleccionar primer registro con ADOQuery (https://www.clubdelphi.com/foros/showthread.php?t=84524)

radenf 30-10-2013 15:11:11

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

ecfisa 30-10-2013 17:12:41

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 :)

radenf 30-10-2013 18:28:17

Hola Daniel.
Un placer saludarte nuevamente y agradecerte tu siempre excelente ayuda.
Probaré los códigos y te cuento.
Saludos

radenf 30-10-2013 21:17:50

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 ¿? :confused:

Un abrazo

ecfisa 30-10-2013 21:43:33

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... :rolleyes: Tal vez te resulte mas sencillo enterderlo revisando el uso de los ALIAS.

Saludos :)

radenf 30-10-2013 22:28:06

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

Caral 31-10-2013 00:59:57

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

radenf 31-10-2013 01:21:05

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

radenf 02-11-2013 12:50:42

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


La franja horaria es GMT +2. Ahora son las 00:33: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