CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS

CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS

Postby joseluisysturiz » Sat Nov 10, 2012 11:07 pm

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... :shock:

// 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
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

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

Postby FranciscoA » Sun Nov 11, 2012 4:51 pm

Jose Luis,prueba a adaptar este codigo MySql.
Code: Select all  Expand view  RUN
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.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

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

Postby wmormar » Sun Nov 11, 2012 5:00 pm

joseluisysturiz,

Haber si entendi, por ejemplo.

Cliente con campos
Cliente
Calle
Numero
Etc

Detalle de clientes
Cliente
Cargos
Abonos
Fecha
Etc

Code: Select all  Expand view  RUN
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
wmormar
 
Posts: 1074
Joined: Fri Oct 07, 2005 10:41 pm
Location: México

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

Postby joseluisysturiz » Sun Nov 11, 2012 5:06 pm

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
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

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

Postby FranciscoA » Sun Nov 11, 2012 5:35 pm

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.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

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

Postby joseluisysturiz » Sun Nov 11, 2012 5:41 pm

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
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

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

Postby Kleyber » Sun Nov 11, 2012 6:26 pm

Jose Luiz,

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

FWH / xHb / xDevStudio / SQLLIB
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

Postby wmormar » Mon Nov 12, 2012 6:20 am

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 los campos...

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
wmormar
 
Posts: 1074
Joined: Fri Oct 07, 2005 10:41 pm
Location: México

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

Postby FranciscoA » Mon Nov 12, 2012 12:26 pm

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 los campos...


Hola William, tienes toda la razón. Hice los cambios pertinentes y funciona perfectamente. Gracias.
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

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

Postby joseluisysturiz » Mon Nov 12, 2012 1:07 pm

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 los campos...

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 algunos campos 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
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

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

Postby FranciscoA » Mon Nov 12, 2012 1:12 pm

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  Expand view  RUN
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.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

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

Postby Francisco Horta » Mon Nov 12, 2012 3:57 pm

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
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 62 guests