Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Unir dos TADOQuery en uno solo (https://www.clubdelphi.com/foros/showthread.php?t=64764)

saldanaluis 17-04-2009 16:17:32

Unir dos TADOQuery en uno solo
 
Compañeros del Foro.
Espero me puedan ayudar a resolver esta situación, la cual se me ocurrió al tratar de simplificar la programación de la aplicación en Delphi 7.
Resulta que en este momento tengo dos TADOQuery, que seleccionan por medio de SELECT a la misma tabla (MSSQL 2000) cada uno un conjunto diferente de registros, en donde es posible que un mismo registro este en ambos TADOQuery.
Requiero recorrer ambos conjuntos de registros en un orden especifico, para lo cual requeriría ir controlando si el registro del TADOQuery-1 es mayor al registro del TADOQuery-2, para leer entonces el TADOQuery-2 y procesar su información, o viceversa.
Lo que se me ocurrió fue ver si hay la posibilidad de unir ambos conjuntos de registros en uno solo, clasificarlo en el orden requerido e ir procesando solamente un solo conjunto de registros, en lugar de ir procesando dos, controlando la lectura de ambos en el orden necesario.
Por lo tanto, mi duda especifica es: ¿Existe la manera de unir dos conjuntos de registros de dos TADOQuery que tienen la misma estructura en uno solo?
Espero que me haya podido explicar, dado que he batallado para tratar de poner claro mi escenario.
Gracias de antemano a todos por sus respuestas y sugerencias.
:)

ElDioni 17-04-2009 16:30:35

Hola,
Creo que no he acabado de entender lo que pides, porque no haces en una sola consulta las dos condiciones, ahora no se si me explico bien yo, quiero decir que si una consulta es:
Código SQL [-]
SELECT * FROM clientes WHERE plobacion='Albacete'
y la otra es:
Código SQL [-]
SELECT * FROM clientes WHERE poblacion='Murcia'
porque no pones en un sola lo siguiente:
Código SQL [-]
SELECT * FROM clientes WHERE poblacion='Albacete' OR poblacion='Murcia'
Lo ordenas por donde quieras y vas rescatando los datos que te hacen falta, es un ejemplo un poco simple y tal vez yo no he terminado de entender lo que pretendes, espero te sirva de algo, sino es así da un poco más de información, como por ejemplo algo de codigo de esas consultas.
Un saludo.

Caro 17-04-2009 16:33:51

Hola saldanaluis, puedes utilizar un UNION para unir las sentencias SQL que tienes en tus dos AdoQuery.

Esta parte no he entendido, que es lo que exactamente quieres hacer.

Cita:

Empezado por saldanaluis (Mensaje 345328)
Requiero recorrer ambos conjuntos de registros en un orden especifico, para lo cual requeriría ir controlando si el registro del TADOQuery-1 es mayor al registro del TADOQuery-2, para leer entonces el TADOQuery-2 y procesar su información, o viceversa.

Saluditos

saldanaluis 17-04-2009 17:22:13

Algo similar a eso sería, solo que el "where" tendría condiciones diferentes: ejemplo
WHERE poblacion = 'Murcia' (TADOQuery-1)
WHERE Tipo_Cliente = 'BASE' (TADOQuery-2)
Como podrás ver, va a haber registros iguales en ambos TADOQuery.
Al hacerlo en un solo TADOQuery, requiero que los clientes de Murcia tipo BASE tengan dos registros, uno por ser de Murcia, y el otro por ser tipo BASE, e identificar cada registro de alguna manera, debido a que si se seleccionó por ser de Murcia, se toman ciertos criterios de evaluación, y si se seleccionó por ser tipo BASE, se toman otros criterios de evaluación. Por eso es que quería saber si ambos conjuntos de registros seleccionados se podían unir en uno solo.
(Creo que no soy bueno para explicar este tipo de situaciones, o no he tenido el contacto suficiente con este foro para aprender a explicar mis requerimientos)
Les agradezco sus sugerencias y respuestas.

saldanaluis 17-04-2009 17:31:21

Lo que me refiero al mencionar que requiero recorrer ambos conjuntos de registros en un orden especifico, es que clasifico (SORT) ambos TADOQuery por Vendedor, Tipo_Cliente y Codigo_Cliente. Voy recorriendo ambos TADOQuery pero requiero hacer subtotales por Tipo_Cliente y por Vendedor, por lo que voy avanzando en ambos TADOQuery de acuerdo al orden de clasificación, y poder saber si un cierto cliente estuvo en ambos TADOQuery, saber que ya se recorrieron los registros de cierto Tipo_Cliente en ambos Query y reportar el subtotal por dicho Tipo_Cliente, así mismo por Vendedor.
Voy a tratar de poner en claro mis ideas para poder explicar mejor mi situación.
De cualquier manera agradezco sus sugerencias.

Caro 17-04-2009 17:39:32

Cita:

Empezado por saldanaluis (Mensaje 345341)
se toman ciertos criterios de evaluación, y si se seleccionó por ser tipo BASE, se toman otros criterios de evaluación. Por eso es que quería saber si ambos conjuntos de registros seleccionados se podían unir en uno solo.

Hola de nuevo, si quieres unir, puedes hacerlo con UNION

Código SQL [-]
SELECT * FROM clientes WHERE plobacion='Albacete'
UNION
SELECT * FROM clientes WHERE poblacion='Murcia'

Saluditos

Caro 17-04-2009 17:46:50

Cita:

Empezado por saldanaluis (Mensaje 345344)
Voy a tratar de poner en claro mis ideas para poder explicar mejor mi situación.

Ok, me parece bien, si puedes pones algunos registros de prueba y el resultado que quieres obtener sobre eso, talvez lo que necesites se pueda resolver con una sola consulta, ademas que así entenderemos mejor tu problema.

Saluditos

nuk3zito 17-04-2009 19:28:42

Un tipo de join que nos ofrece SQL Server y que yo pensaba que era totalmente inutil talvez aplique en tu situación.

¿Haz utilizado el full outer join ?

Con esto, obtendrás ambos universos completitos, pero los registros que están en ambos universos no se verán duplicados.

Espero te sirva porque no se realmente que necesitas.

Saludos.

saldanaluis 18-04-2009 01:48:19

Cita:

Empezado por Caro (Mensaje 345347)
Hola de nuevo, si quieres unir, puedes hacerlo con UNION


Código SQL [-]
SELECT * FROM clientes WHERE plobacion='Albacete'
UNION
SELECT * FROM clientes WHERE poblacion='Murcia'





Saluditos

Disculpa, pero esto lo estoy probando en el SQL Query Analyzer y no me reconoce la palabra union entre los dos select. Mi versión de SQL es MSSQL 2000. ¿Pudiera ser eso?

nuk3zito 18-04-2009 01:51:22

Cita:

Empezado por saldanaluis (Mensaje 345388)
Disculpa, pero esto lo estoy probando en el SQL Query Analyzer y no me reconoce la palabra union entre los dos select. Mi versión de SQL es MSSQL 2000. ¿Pudiera ser eso?

Es rarísimo tu caso... ¿puedes poner exactamente el mismo código que te está generando el error?

El union si lo acepta el SQL Server 2000

saldanaluis 21-04-2009 15:49:35

Así es. En efecto. Ya me lo tomó. Lo que pasa es que yo tenía un 'ORDER BY' en el primer 'SELECT' antes del 'UNION'. Lo quité y puse el 'ORDER BY' al final de todo, y si me lo toma.
Está más o menos asi:
SELECT X,Y,Z FROM TBL
WHERE Y....
UNION
SELECT X,Y,Z FROM TBL
WHERE Z....
ORDER BY Z,X

Gracias a todos por sus respuestas. Han sido de gran utilidad. No hay duda de que aqui en el foro hay gente con amplio conocimiento de muchos temas, y que están dispuestos a compartirlo con personas como uno que tiene muchas preguntas.

Los voy a seguir molestando con mis preguntas.

Saludos...


La franja horaria es GMT +2. Ahora son las 22:44:33.

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