FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS
Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM
CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS
Posted: 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!
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS
Posted: Sun Nov 11, 2012 04:51 PM
Jose Luis,prueba a adaptar este codigo MySql.
Code (fw): Select all Collapse
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
Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM
Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS
Posted: Sun Nov 11, 2012 05:00 PM
joseluisysturiz,

Haber si entendi, por ejemplo.

Cliente con campos
Cliente
Calle
Numero
Etc

Detalle de clientes
Cliente
Cargos
Abonos
Fecha
Etc

Code (fw): Select all Collapse
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
Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM
Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS
Posted: Sun Nov 11, 2012 05: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!
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS
Posted: Sun Nov 11, 2012 05: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
Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM
Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS
Posted: Sun Nov 11, 2012 05: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!
Posts: 581
Joined: Tue Oct 11, 2005 11:28 AM
Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS
Posted: Sun Nov 11, 2012 06: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
Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM
Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS
Posted: Mon Nov 12, 2012 06: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
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS
Posted: 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
Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM
Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS
Posted: Mon Nov 12, 2012 01: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...



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



Gracias a mi Dios ante todo!
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS
Posted: Mon Nov 12, 2012 01: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 (fw): Select all Collapse
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
Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
Re: CREAR SELECT CON DATOS DE OTRO SELECT O SELECT ANIDADOS
Posted: Mon Nov 12, 2012 03: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

Continue the discussion