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 los campos que necesito trabajar,
no todos los de las tablas.
Coloco lo que estoy haciendo y acepto sugerencias e ideas, gracias y saludos...
// VAR CON LOS CAMPOS 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