CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS
- 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
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...
// 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
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...
// 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!
Gracias a mi Dios ante todo!
- 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
Jose Luis,prueba a adaptar este codigo MySql.
Saludos.
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
Francisco J. Alegría P.
Chinandega, Nicaragua.
Fwxh1204-MySql-TMySql
Chinandega, Nicaragua.
Fwxh1204-MySql-TMySql
Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS
joseluisysturiz,
Haber si entendi, por ejemplo.
Cliente con campos
Cliente
Calle
Numero
Etc
Detalle de clientes
Cliente
Cargos
Abonos
Fecha
Etc
Espero te ayude.
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
William, Morales
Saludos
méxico.sureste
Saludos
méxico.sureste
- 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
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...
Dios no está muerto...
Gracias a mi Dios ante todo!
Gracias a mi Dios ante todo!
- 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
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.
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
Chinandega, Nicaragua.
Fwxh1204-MySql-TMySql
- 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
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...
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...
Dios no está muerto...
Gracias a mi Dios ante todo!
Gracias a mi Dios ante todo!
Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS
Jose Luiz,
Puedes crear indices en las tablas y en _ donde tu haces las busquedas.
Puedes crear indices en las tablas y en _ donde tu haces las busquedas.
Kleyber Derick
FWH / xHb / xDevStudio / SQLLIB
FWH / xHb / xDevStudio / SQLLIB
Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS
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...
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
Saludos
méxico.sureste
- 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
Hola William, tienes toda la razón. Hice _ pertinentes y funciona perfectamente. Gracias.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 _...
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.
Fwxh1204-MySql-TMySql
Chinandega, Nicaragua.
Fwxh1204-MySql-TMySql
- 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
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...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...
Uploaded with ImageShack.us
Dios no está muerto...
Gracias a mi Dios ante todo!
Gracias a mi Dios ante todo!
- 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
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)Saludos.
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
Francisco J. Alegría P.
Chinandega, Nicaragua.
Fwxh1204-MySql-TMySql
Chinandega, Nicaragua.
Fwxh1204-MySql-TMySql
-
- 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
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
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
Paco