Cantidad de registros de un cursor ???

4,405 views
Skip to first unread message

Miguel Angel

unread,
Aug 31, 2012, 8:28:00 AM8/31/12
to publice...@googlegroups.com
Hola.

Tengo un problema al contar la ctd de registros de un cursor que inicialmete tiene 10 registros, le borro 3 y el RECCOUNT(cursor) sigue informando que tiene 10 registros. La única solución que he encontrado es recorrerlo con el SCAN ... ENDSCAN y contarlos, pero esto no es lo más adecuado en eficiencia:

FUNCTION CursorCtd(c AS Cursor)
        LOCAL p AS Integer, ctd AS Integer
        p=RECCOUNT(c)
        GOTO RECORD 1 IN &c
       
        ctd=0
        SCAN
            ctd=ctd+1
        ENDSCAN
       
        IF p>ctd && aprovecho para posicionar bien el cursor.
                GOTO RECORD ctd IN &c
        ELSE
                GOTO RECORD p IN &c
        ENDIF
       
        RETURN ctd
ENDFUNC

¿No hay otra forma de saber la cantidad real de registros en el cursor?.

Muchas gracias por la ayuda.
Saludos.

Claudio Luna

unread,
Aug 31, 2012, 8:33:05 AM8/31/12
to publice...@googlegroups.com
Miguel Angel,

Podes usar algo como :
select tutabla
COUNT TO tuvariable FOR NOT DELETED()

saludos 

Claudio

--
 
 
 

Luis Maria Guayan

unread,
Aug 31, 2012, 8:42:53 AM8/31/12
to publice...@googlegroups.com
RECCOUNT() retorna la cantidad física de registros sin tener en cuenta los registros marcados para eliminación

Deberías utilizar COUNT con el filtro NOT DELETED() o tener en cuenta la configuración de SET DELETED ON


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

--
 
 
 

Miguel Angel

unread,
Aug 31, 2012, 11:47:30 AM8/31/12
to publice...@googlegroups.com
Gracias, lo que comentáis funciona correctamente.

Se me ocurrió otra (por si alguien busca esto es un futuro): emplear el SELECT COUNT(*) FROM cursor ...

En ambos casos el problema es que se mueve la posición del registros seleccionado en el cursor. Pero basta con saber cual en antes de proceder al cálculo.

Un saludo.

Victor Espina

unread,
Aug 31, 2012, 11:50:13 AM8/31/12
to publice...@googlegroups.com
El "SELECT COUNT(*)  FROM tabla" no afecta la posicion del registro actual en la tabla origen.

Victor Espina

Walter R. Ojeda Valiente

unread,
Aug 31, 2012, 10:20:28 PM8/31/12
to publice...@googlegroups.com
SELECT COUNT(*) funciona pero no se recomienda porque realiza un recorrido secuencial de la tabla y eso consume mucho tiempo.

Saludos.

Walter.




Date: Fri, 31 Aug 2012 08:47:30 -0700
From: migue...@gmail.com
To: publice...@googlegroups.com
Subject: [vfp] Re: Cantidad de registros de un cursor ???
--
 
 
 

Victor Espina

unread,
Aug 31, 2012, 10:48:57 PM8/31/12
to publice...@googlegroups.com
Walter, pero COUNT tambien hara lo mismo... conoces alguna otra forma de conocer el total de registros de una tabla o cursor que contiene registros borrados y que sea mas eficiente que COUNT o SELECT COUNT(*) ?

Saludos

Victor Espina

Victor Espina

unread,
Aug 31, 2012, 11:03:10 PM8/31/12
to publice...@googlegroups.com
De hecho, acabo de hacer la prueba con una tabla que tiene 2 MM de registros, y el SELECT COUNT(*) tardo apenas 1.3seg en hacer el calculo.  Claro, esto es localmente; en una tabla remota seguramente tardara mas, pero aun asi estoy seguro de que estariamos hablando de un tiempo mas que razonable.

Saludos

Victor Espina

Walter R. Ojeda Valiente

unread,
Aug 31, 2012, 11:10:03 PM8/31/12
to publice...@googlegroups.com
Víctor, en una tabla local o en un cursor (que también es local) no habría generalmente problemas por más grandes que sean, se obtendrá el resultado muy rápido. Pero la cuestión cambia mucho cuando la consulta debe hacerse a una tabla que está en el Servidor y la red tiene mucho tráfico, allí sí se notará la lentitud, por eso hay que evitar usar algoritmos que requieran conocer la cantidad de filas de la tabla.

Saludos.

Walter.





Date: Fri, 31 Aug 2012 19:48:57 -0700
From: vesp...@gmail.com
To: publice...@googlegroups.com
Subject: Re: [vfp] Re: Cantidad de registros de un cursor ???
--
 
 
 

Victor Espina

unread,
Aug 31, 2012, 11:14:45 PM8/31/12
to publice...@googlegroups.com
En eso tienes toda la razon. Independiente de que tan rapido pueda llegar a ser un COUNT en una tabla remota, es MALA idea forzar toda una tabla por la red solo para conocer el total de registros, sea con DBFs, Sql Server, MySQL, etc.

Saludos

Victor Espina

Carlos Miguel FARIAS

unread,
Sep 1, 2012, 9:03:03 AM9/1/12
to publice...@googlegroups.com
En el caso de los SGBD, es distinto, porque a la red no lo afecta, la lectura y evaluación se hace en el servidor.
Eso si, si muchos usuarios peticionan esa consulta permanentemente, resultará en una carga para el servidor notoria, aunque haga prefetch en memoria.
Saludos: Miguel, La Pampa (RA)

--
 
 
 

Reply all
Reply to author
Forward
0 new messages