CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS

Post Reply
User avatar
joseluisysturiz
Posts: 2024
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela
Contact:

CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS

Post by joseluisysturiz »

Saludos, estoy usando MYSQL y la clase TDolphin y se me presenta el siguiente caso, tengo 2 tablas, una donde tengo maestro de clientes, y otra donde hay movimientos de esos
clientes, cada cliente puede tener N cantidad de movimientos, el punto esta en lo siguiente, hago un select de la tabla de maestro de clientes que cumplan una condicion, y eso
esta fino y me filtra solo los que quiero, ahora necesito hacer un 2do. SELECT en la tabla de movimientos, pero que tenga los movimientos de cada uno de los clientes filtrado,
con un solo cliente no tengo problema, pero resulta que son varios clientes y es variante el codigo del cliente que es el que tengo relacionado como indice en la tabla de
movimientos, hice 2do while anidados y me hace el trabajo, pero la tabla de movimientos es bastante grande y cada vez que cambia de codigo de cliente, vuelve hacer el recorrido
de todos los registros de la tabla de movimientos, haciendose muy largo el proceso.

Mi pregunta, como hago un SELECT que solo tenga los movimientos de los clientes que esten filtrados en el SELECT de clientes.? solo traigo _ que necesito trabajar,
no todos los de las tablas.

Coloco lo que estoy haciendo y acepto sugerencias e ideas, gracias y saludos... :shock:

// VAR CON _ NECESARIOS EN EL QRY A CONSTRUIR...
cCamposINS := "numero, apellido1, nombre1, grupo, plazomeses, status, producto, mtocontratar, cuotamensual, licitaciones"

// QUERY INSC.CON FILTRO DE: GRUPO, STATUS(estado) Y BIEN ADQUIRIR
cQryINS := "SELECT " + cCamposINS + " FROM " + aTablas[1] + " WHERE grupo = '" + cGrupo + ;
"' AND cuotaspagadas > '" + ClipValue2SQL( 0 ) + ;
"' AND plazomeses = '" + ClipValue2SQL( nCol ) + "' ORDER BY numero ASC" // TABLA inscripcion

// ABRO LAS TABLAS incs Y p_cutas SEGUN FILTRO
TRY
oQryINS := TDolphinQry():New( cQryINS, oDatos:oConex )

CATCH oError
MSGALERT( oError:description + CRLF + CRLF +;
"Error Abriendo Tabla (" + aTablas[1] + "), Ejecucion de Sentencia: " +;
CRLF + CRLF + cQryINS, oDatos:cTitMsg )
RETURN( NIL )

END

// CAMPOS NECESARIOS PARA QRY CUOTAS
cCamposCuo := "num_insc, num_leyenda, fch_vence, fch_pago, mto_aporte"

cQryPCUO := "SELECT " + cCamposCuo + " FROM " + aTablas[2] + " ORDER BY num_insc, num_cuota ASC" // TABLA p_cuotas

TRY
oQryPCUO := TDolphinQry():New( cQryPCUO, oDatos:oConex )

CATCH oError
MSGALERT( oError:description + CRLF + CRLF +;
"Error Abriendo Tabla (" + aTablas[2] + "), Ejecucion de Sentencia: " +;
CRLF + CRLF + cQryPCUO, oDatos:cTitMsg )
RETURN( NIL )

END

// LEO INSC. DEL QRY FILTRADO PARA TOMAR NOMBRE Y No.INSC(contrato)
oQryINS:GOTOP()
DO WHILE !oQryINS:EOF()
nCantiINS ++ // CONTADOR DE INSC.COINCIDENTES
cNombre := ALLTRIM(oQryINS:apellido1) + " " + ALLTRIM(oQryINS:nombre1)
nCuotas := oQryINS:plazomeses // CANT.CUOTAS SEGUN GRUPO - ESTO ES LO MISMO QUE nCol

// LLENO ARRAY UNA SOLA DIMENSION CON DATOS DE TABLA insc Y LUEGO AGREGO cuotas
// 1RA.COL.INSC(contrato)
AADD( aReg, oQryINS:numero )
// 2DA.COL.NOMBRE CLIENTE
AADD( aReg, cNombre )
// 3RA.COL.CHECK LIST - INICIALIZO TODAS LAS CUOTAS EN CERO 0(.f.) POR DEFECTO PARA SU ADJUDICACION
AADD( aReg, 0 )
// 4TA.COL.GRUPO
AADD( aReg, oQryINS:grupo )
// 5TA.COL.MESES(cantidad de cuotas)
AADD( aReg, oQryINS:plazomeses )
// 6TA.COL.STATUS(estado)
AADD( aReg, oQryINS:status )
// 7MA.COL.PRODCUTO(bien adquirir)
AADD( aReg, oQryINS:producto )
// 8VA.COL.MTO.CONTRATADO
AADD( aReg, oQryINS:mtocontratar )
// 9NA.COL.MTO.CUOTA(aporte mensual)
AADD( aReg, oQryINS:cuotamensual )
// 10MA.COL.CANTIDAD LICITACIONES OFRECIDAS
AADD( aReg, oQryINS:licitaciones )
// FIN LLENO ARRAY UNA SOLA DIMENSION CON DATOS DE TABLA insc Y LUEGO AGREGO cuotas

// AHORA LEO CUOTAS IGUAL A LA INSC.Y AGREGO A aReg PARA COMPLETAR REGISTRO
oQryPCUO:GOTOP()
DO WHILE !oQryPCUO:EOF() // LEO CUOTAS COMPARANDOLAS CON INS. Y LLENO ARRAY
IF oQryPCUO:num_insc == oQryINS:numero

AADD( aReg ,;
IF( oQryPCUO:num_leyenda == 0 .and. oQryPCUO:fch_vence < DATE(), 9, oQryPCUO:num_leyenda ) )

ENDIF

// SUMO COBRADO CUOTAS DEL MES DE TODOS LAS INSC. POR INSC.FILTRADAS
IF MONTH( oQryPCUO:fch_pago ) == MONTH( DATE() ) .AND. ;
YEAR( oQryPCUO:fch_pago ) == YEAR( DATE() ) .AND. ;
oQryPCUO:num_insc == oQryINS:numero

aVar[5] := aVar[5] + oQryPCUO:mto_aporte // SUMO COBRADO CUOTAS DEL MES

ENDIF

oQryPCUO:SKIP()

ENDDO

AADD( aDatos, aReg ) // LLENO aDatos PARA EL xBROWSE
aReg := {} // LIMPIO ARRAY DE INSC.

oQryINS:SKIP()

ENDDO
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS

Post by FranciscoA »

Jose Luis,prueba a adaptar este codigo MySql.

Code: Select all

SELECT Codigo,nombre,fecha,debe,haber FROM transacc  
WHERE codigo IN
    (SELECT codigo FROM catalogo
     WHERE codigo='1210004099' OR codigo='1210003099') ;   //aqui tu condicion
 
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
User avatar
wmormar
Posts: 1050
Joined: Fri Oct 07, 2005 10:41 pm
Location: México
Contact:

Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS

Post by wmormar »

joseluisysturiz,

Haber si entendi, por ejemplo.

Cliente con campos
Cliente
Calle
Numero
Etc

Detalle de clientes
Cliente
Cargos
Abonos
Fecha
Etc

Code: Select all

SELECT a.cliente, a.calle, a.numero, b.cargo, b.abono, b.fecha FROM clientes AS a INNER JOIN detalle_clientes AS b ON b.cliente=a.cliente WHERE b.fecha = 20121111 ORDER BY a.cliente, b.fecha
Espero te ayude.
William, Morales
Saludos

méxico.sureste
User avatar
joseluisysturiz
Posts: 2024
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela
Contact:

Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS

Post by joseluisysturiz »

Francisco, esa idea fuera buena si los codigos fuesen fijos y limitados, pero el select de clientes varia en cantidad de clientes y diferentes codigos dependiendo del filtro que haya hecho el usuario, por eso es que use los do while !eof() para que en base a el recorrido que voy haciendo, voy buscando los movimientos en la tabla movimientos del cliente seleccionado en su momento, por eso no puedo usar .or., igual por alli va la idea, gracias...saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS

Post by FranciscoA »

Jose Luis:
WHERE codigo='1210004099' OR codigo='1210003099') ; //aqui tu condicion
Es solo un ejemplo; es aqui donde vas a poner la condicion de filtrado de tu tabla de clientes, sobre cuyo filtro se mostrarán los datos de tu tabla de transacciones de clientes. Es decir, solo se mostrarán las transacc de los clientes filtrados en tu tabla clientes.

Por otro lado, el codigo de William trabaja excelente, mas veloz que el mío (ya lo probé), pero parece que no contiene la condicion de filtrado en la tabla de clientes, de la que hablas. Disculpame William si estoy equivocado.

Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
User avatar
joseluisysturiz
Posts: 2024
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela
Contact:

Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS

Post by joseluisysturiz »

Willian, doy un ejemplo de los datos que pueden suceder, ya que no es sobre un solo registro sino de varios clientes:

Ejemplo, en el select de cliente basado en un filtro obtuve:

ccod_cliente nombre
001 cliente 1
002 cliente 2
003 cliente 3
etc, etc, etc

ahora en un select de movimientos necesitos, todos los movimientos que correspondan a los codigo de clientes 001, 002, 003, etc, donde cada cliente puede tener N cantidad de movimientos, por eso es que hice los DO WHILE anidados pero el detalle esta que por cada cliente hago el recorrido de toda la tabla de movimientos y eso me hace el proceso muy lento...saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
Kleyber
Posts: 581
Joined: Tue Oct 11, 2005 11:28 am
Location: São Luiz, Brasil

Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS

Post by Kleyber »

Jose Luiz,

Puedes crear indices en las tablas y en _ donde tu haces las busquedas.
Kleyber Derick

FWH / xHb / xDevStudio / SQLLIB
User avatar
wmormar
Posts: 1050
Joined: Fri Oct 07, 2005 10:41 pm
Location: México
Contact:

Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS

Post by wmormar »

FranciscoA,

El condicional lo puedes aplicar segun tus necesidades, me refiero puedes filtar por detalle y tambien por el maestro de catalogos. Es cuestion de jugarle con _...

joseluisysturiz,

Efectivamente puedes hacer lo que requieres segun lo comentado en los post, pero, no he entendido bien la idea, aunque una consulta "relacionada" se puede hacer perfectamente en SQL...
William, Morales
Saludos

méxico.sureste
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS

Post by FranciscoA »

wmormar wrote:FranciscoA,
El condicional lo puedes aplicar segun tus necesidades, me refiero puedes filtar por detalle y tambien por el maestro de catalogos. Es cuestion de jugarle con _...
Hola William, tienes toda la razón. Hice _ pertinentes y funciona perfectamente. Gracias.
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
User avatar
joseluisysturiz
Posts: 2024
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela
Contact:

Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS

Post by joseluisysturiz »

wmormar wrote:FranciscoA,

El condicional lo puedes aplicar segun tus necesidades, me refiero puedes filtar por detalle y tambien por el maestro de catalogos. Es cuestion de jugarle con _...

joseluisysturiz,
Efectivamente puedes hacer lo que requieres segun lo comentado en los post, pero, no he entendido bien la idea, aunque una consulta "relacionada" se puede hacer perfectamente en SQL...
Saludos Willian, disculpa no habia respondido, anoche me senti mal y no hice mas nada hasta ahortia que reviso el foro, no he probado lo de la consulta relacionada ni lo que uds me sugirieron, mi idea es lo siguiente, con los detalles que filtro creo un array que cada registro contiene _ del maestro de cliente y todos los registros de pago de ese cliente y luego esa array lo deposito en un xbrowse para hacer un cronograma de pago de cada cliente y asi saber que debe y que no, adjunto la imagen de mi resultado, ya que por los momentos con los do while anidados funciona, pero tarda demasiado, saludos...

Image

Uploaded with ImageShack.us
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS

Post by FranciscoA »

Jose Luis.
He creado esta consulta, basada en el ejemplo de William, que deberia funcionar. Solo agregale las ' ,", + y ; donde correspondan, y las adaptaciones que estimes necesarias. (Es solo un codigo ejemplo)

Code: Select all

SELECT a.numero, a.apellido1, a.nombre1, a.grupo, a.plazomeses, a.status, a.producto, a.mtocontratar, a.cuotamensual, a.licitaciones,b.num_insc, b.num_leyenda, b.fch_vence, b.fch_pago, b.mto_aporte  FROM  aTablas[1] AS a
INNER JOIN  aTablas[2] AS b ON b.num_insc=a.numero
WHERE a.grupo = cGrupo  AND a.cuotaspagadas > ClipValue2SQL( 0) AND a.plazomeses =  ClipValue2SQL( nCol)
ORDER BY a.numero ASC
 
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS

Post by Francisco Horta »

jose luis
prueba asi
SELECT id,campo1,campo2,campo3,campo4 FROM movimientos WHERE id IN (SELECT id,campo1,campo2 FROM clientes WHERE "tu condicion filtrado de cliente ")
asi te debe funciionar sin problemas
saludos
paco
____________________
Paco
Post Reply