Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Filtrar 2 tablas entre si (https://www.clubdelphi.com/foros/showthread.php?t=78610)

Lenny 03-05-2012 23:51:41

Filtrar 2 tablas entre si
 
Estimados, nuevamente necesito de vuestra solidaria ayuda, tengo una pequeña duda, normalmente cuando necesito filtrar 2 tablas entre si, siempre me a tocado según algún criterio en común, pero en este caso necesito a la inversa, tengo una lista de correos (DBGrid1) donde muestra todas las cuentas de correos inscritas y una lista 2 (DBGrid2) en donde solo muestra los destinatarios previamente ingresados con doble clic de la lista 1 (DBGrid1), la pregunta, de que manera puedo filtrar la lista 1 para que solo me muestre los correos que no están en la lista 2??? que la tabla 1 refleje los correos no ingresados en la tabla 2 mientras se agregan... Se entiende???
De antemano muchísimas gracias…

ecfisa 04-05-2012 00:12:34

Hola Lenny.
Cita:

de que manera puedo filtrar la lista 1 para que solo me muestre los correos que no están en la lista 2 ???
Probá con esta consulta:
Código SQL [-]
SELECT *     
FROM TABLA1 T1
WHERE NOT EXISTS (SELECT T2.ID FROM TABLA2 T2 WHERE T2.TABLA1_ID = T1.ID)

Saludos.

Lenny 05-05-2012 00:19:52

Gracias...
 
Gracias estimado, aunque me lio muchisimo con las consultas tratare de sacarlo adelante, igualmente si me puedes echar una mano de como usarlo te lo agradeceria bastante...

Utilizodelphi 2010, MySQL, Zeos 7.0.0...

ecfisa 05-05-2012 00:56:43

Hola Lenny.

Para brindarte una ayuda más concreta, sería bueno si nos pones los campos de las dos tablas (solo los relevantes no es necesario que los incluyas a todos). También es importante conocer mediante cuál campo se relacionan ambas tablas.

Saludos.

Lenny 05-05-2012 01:11:47

Dale, mira, te explico en detalle y lo mas resumido posible:

Tengo Delphi 2010, MySQL, Zeos 7.0.0.
Tengo 8 componentes, 2 DBGrid, 2 DataSource, 2 ZConnection, 2 ZTable...
Los cuales se llaman:
DBGrid1, DataSource1 = Correos, ZConnection1 = Correos_C, ZTable1 = Correos_T
DBGrid2, DataSource2 = CorreosNC, ZConnection2 = CorreosNC_C, ZTable2 = CorreosNC_T

La idea como les comentaba, es poder a travez de un boton o doble clic pasar los datos (en este caso correos y usuarios) a la otra tabla, lo hago de esta manera:

Código Delphi [-]
CorreosNC_T.Insert;
CorreosNC_T.FieldbyName('AREA').AsString := Correos_T.FieldbyName('AREA').AsString;
CorreosNC_T.FieldbyName('NOMBRE').AsString := Correos_T.FieldbyName('NOMBRE').AsString;
CorreosNC_T.FieldbyName('CORREO').AsString := Correos_T.FieldbyName('CORREO').AsString;
CorreosNC_T.Post;

Tonces, lo que necesito es que la Tabla1 salgan los correos que no estan en la Tabla2, ya que la Tabla1 es comunitaria. Se entiende???.

De antemano muchisimas gracias, por ak estare pendiente...

ecfisa 05-05-2012 06:22:48

Hola Lenny.

En realidad me refería a la estructura de las tablas, pero vamos a suponer que:

TABLA1
Cita:

ID (identificador)
CP1
CP2
TABLA2
Cita:

ID (identificador)
CP1
CP2
CP3
TABLA1_ID ( campo referencia a TABLA1 (en común) )
Algún campo en comun tendrán que tener por que si no sería imposible saber cuáles registros de la TABLA1 no están en la TABLA2. En este caso es: TABLA2.TABLA1_ID = TABLA1.ID.

Entonces para la TABLA1 y desde Delphi sería algo así:
Código Delphi [-]
...
  with TuQuery do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM TABLA1 T1 ');
    SQL.Add('WHERE NOT EXISTS ');
    SQL.Add('(SELECT T2.ID FROM TABLA2 WHERE T2.TABLA1_ID = T1.ID)');
    Open;
  end;
...
Es por eso que te pedía los nombres reales de campos y tablas; para evitarte las traducciones...

Saludos.

Lenny 05-05-2012 21:40:23

aps... sorry!!!
Seria asi:

Correos_T (ZTable1)
Usuario (identificador)
Area
Correo

CorreosNC_T (ZTable2)
Usuario (identificador)
Area
Correo

Esa seria la estructura de la tabla, gracias nuevamente!!!

ecfisa 06-05-2012 00:00:19

Hola Lenny.

Suponiendo que Correo es el campo en común (el que servirá para saber si está ingresado o no) creo que sería:
Código Delphi [-]
...
  with TuQuery do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM Correos_T T1 ');
    SQL.Add('WHERE NOT EXISTS ');
    SQL.Add('(SELECT T2.Usuario FROM CorreosNC_T WHERE T2.Correo = T1.Correo)');
    Open;
  end;
...

Saludos.

Lenny 06-05-2012 08:50:08

Estimado, gracias por la paciencia y ayuda...
Sorry, pero aun no me funciona, preciono el Button y no hace nada... te dejo como lo tengo:

Código Delphi [-]
 
begin
  with ZQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM Correos ');
    SQL.Add('WHERE NOT EXISTS ');
    SQL.Add('(SELECT CorreosNC.Correo FROM CorreosNC WHERE CorreosNC.Correo = Correos.Correo)');
    Open;
  end;
end;

Y este es el orden que tengo:

Correos_T (ZTable1), Nombre Tabla: Correos
Usuario
Area
Correo

CorreosNC_T (ZTable2), Nombre Tabla: CorreosNC
Usuario
Area
Correo

Y efectivamente el campo Correo es el comun en ambos, de antemano muchas gracias ante cualquier ayuda...

ecfisa 06-05-2012 23:48:54

Hola Lenny.

Entonces seguramente sea el campo Usuario el que identifica y por tanto sea común a ambas tablas, sobre el que debería realizarse la comparación.

Código SQL [-]
SELECT * FROM CORREOS_T T1
WHERE NOT EXISTS (SELECT T2.USUARIO FROM CORREOSNC_T T2 WHERE T2.USUARIO = T1.USUARIO)

Saludos.

Lenny 07-05-2012 02:13:55

Estimado, mil gracias por toda la ayuda, realmente quien cometia el error era yo, a pesar de llevar unoa añitos novateando con delphi nunca habia trabajado con consultas, ahora afortunadamente me vi obligado a hacerlo y me costo pero entendi, el error era que estaba con el ZTable en ves del ZQuery, o sea, hacia todo bien pero noe staba apuntando adonde devia y como. Funciono increiblemente bien!!! hace lo que necesito y estoy buscando referencias a consultas para seguir aprendiendo junto a ustedes quienes me han sacado de tantos apuros, nuevamente gracias!!!

Solo una pregunta, como para cerrar el tema, es mejor trabajarlo todo con consultas???
Tengo un par de programas pequeños que se trabajan local y a veces desde afuera de la red, todo impeque, pero al hacerlo con consulta los tiempos de respuesta mejoran??? eso y gracias nuevamente...

ecfisa 07-05-2012 03:33:31

Hola Lenny.

No conozco los componentes Zeos, pero en general la ventaja de los XQuerys sobre los XTables es que estas últimas traen todos los registros y en la consulta se puede seleccionar sólo los necesarios, disminuyendo así drásticamente el tráfico y los tiempos. En contrapartida las inserciones, modificaciones y borrados son mucho más simples de realizar con los XTables.

Revisá este enlace: Tipo de tablas en ZEOS: ¿TZQuery o TZTable? .

Los IBX por ejemplo, tienen el TIBDataSet, que conjuga los mejores aspectos de ambos componentes. Pero desconozco si Zeos tiene algo parecido.

Saludos.

Lenny 07-05-2012 05:34:54

Muchas gracias, he ledio el link y otros comentarios que he buscado en google, quede bastante mas claro aunque algo mareado sobre Query y Table, pero bue, tengo varios dias mas para estudiarlo a fondo, igualmente utilizo Zeos la version alpha de zeos 7.0.0 que datan del 2009 y no se ve mucho futuro en que saquen una version definitiva, y segun vi en algunos casos tiene errores relativamente graves... por lo cual, la ultima pregunta que hago para no desviarme mas del tema, sigo con Zeos??? concoes alguna apternativa a Zeos que sea igual o mejor que esta para trabajar con MySQL??? es una aplicacion que a futuro se piensa hacerla accesible via web, por eso MySQL y es parte de itras palicaciones pequeñas que se estan diseñando ocupando la misma base de datos, bueno, espero no estar abusando mas de la cuenta, nuevamente gracias!!!

ecfisa 07-05-2012 09:37:09

Hola Lenny.

Lamento no poder aconsejarte sobre los componentes más adecuados para MySQL ya que uso Firebird.

Pero lo que sí te aconsejo es que esta, tu última pregunta, la pongas como un nuevo hilo en el foro MySQL. El motivo de esta sugerencia, es por que ese foro es visitado por compañeros expertos en ese gestor de base de datos y te podrán asesorar mejor.

Saludos. :)


La franja horaria es GMT +2. Ahora son las 22:54:10.

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