acerca de Distinct en cursor

99 views
Skip to first unread message

Saul Piña Hernandez

unread,
Jun 5, 2013, 1:27:36 PM6/5/13
to publice...@googlegroups.com
Saludos!

Estoy tratando de crear un cursor con Distinct pero cuando agrego mas de 3 columnas ya no me respeta el distinct, como podria lograrlo, esto es lo que llevo:

SELECT distinct nota, importe, pdesc as porc_desc, anticipo, total as total_nota FROM entradas WHERE anticipo>0 AND fecha=>Thisform.text2.value AND fecha=<thisform.text3.value AND ALLTRIM(usuario)=ALLTRIM(thisform.c1.Value) INTO CURSOR canticipo NOFILTER
    IF RECCOUNT()>0
    SELECT canticipo
    BROWSE
                SUM(canticipo.anticipo) to tant
                CLEAR
                Thisform.Refresh
                thisform.t11.Value=tant
                thisform.Refresh
    ENDIF


Gracias!

Fernando D. Bozzo

unread,
Jun 5, 2013, 3:13:49 PM6/5/13
to publice...@googlegroups.com
Hola Saúl:

El distinct, supongo que ya lo sabrás, se aplica a la fila completa, o sea, a la suma de todos los campos.

Por ejemplo, si tenés estos datos:

 nota, importe, pdesc  , anticipo, total_nota
"nt1", 123.45 , "desc1", 333.4   , 5555.34
"nt1", 123.45 , "desc1", 333.4   , 5555.35
"nt1", 123.45 , "desc1", 333.4   , 5555.36

Como ves, cambia solo un decimal de la última columna; en este caso un select distinct te devolvería los 3 registros, por esa diferencia en un campo.
Para que te devuelva más registros, descartará solamente los duplicados exactos, o sea, donde se repitan los valores en todos los campos del registro.

¿Podrías poner los registros que te salen repetidos?

Algunas observaciones más:

1) Usar referencias a THISFORM dentro de un SQL no es buena práctica y puede darte problemas, es mejor definir una variable privada o local en su lugar.

2) Usar ALLTRIM() en los campos en general impide que puedas optimizar la consulta para utilizar Rushmore, es mejor usar el campo entero o algo como esto:

LOCAL ldAnticipo, ldFecha1, ldFecha2, lcUsuario
ldAnticipo
ldFecha1  =
Thisform.text2.value
ldFecha2  =
thisform.text3.value
lcUsuario
=
PADR(thisform.c1.Value, FSIZE("usuario", "entradas") )

SELECT distinct nota
, importe, pdesc as porc_desc, anticipo, total as total_nota ;
   FROM entradas ;
   WHERE anticipo
> 0 AND fecha BETWEEN ldFecha1 AND ldFecha2 ;
   AND
usuario = lcUsuario ;
   INTO CURSOR canticipo NOFILTER

Esta consulta luego queda optimizada con un indice por fecha, otro por usuario y otro por anticipo


Saludos.-


Saul Piña Hernandez

unread,
Jun 6, 2013, 10:07:33 AM6/6/13
to publice...@googlegroups.com
Gracias Fernando!

Mas claro ni el agua, voy a cambiar las consultas...

Saul Piña Hernandez

unread,
Jun 10, 2013, 10:55:47 AM6/10/13
to publice...@googlegroups.com
Saludos!

y gracias de nuevo, me sirvió para mejorar el codigo,


buen dia fernando!
Reply all
Reply to author
Forward
0 new messages