DBF RecCount()

78 views
Skip to first unread message

Victor Casajuana Mas

unread,
Jun 3, 2021, 6:16:55 AM6/3/21
to ADO Harbour
Hola.

Si aplico un RecCount() directamente al dbf Alias->( RecCount() ) Me devuelve el número de registros de la tabla incluyendo los marcados como Deleted()

He mirado de donde saca la info RecCount() y la función dbinfo() no veo que devuelva al número de registros del DBF, en dbinfo.ch tampoco he visto una constante que lo indique.

Mi pregunta es, RecCount() recorre toda la tabla contando los registros cada vez? y ampliando la consulta, saben si hay forma de saber los registros que no estén borrados en un DBF sin tener que recorrer la tabla?

Estoy intentando montar una paginación en un DBF y necesito saber el número de registros sin borrar pero para optimizarlo bien que no tuviese que recorrer cada vez toda la tabla.

Gracias de antemano!!

hherrera

unread,
Jun 3, 2021, 12:42:31 PM6/3/21
to ADO Harbour
Haz probado usar el set deleted on y  el set deleted off 
antes de hacer el reccount()

Victor Casajuana Mas

unread,
Jun 3, 2021, 12:53:20 PM6/3/21
to ADO Harbour
Sí, el siguiente ejemplo me muestra 5 en todas las salidas:

Function Main()

    Local cAlias := 'test'

    REQUEST DBFCDX
    RDDSETDEFAULT ("DBFCDX")

    DbCreate( 'test', { {'CODIGO', 'N', 3, 0}} , 'DBFCDX', .t., cAlias )

    (cAlias)->(DbAppend())
    (cAlias)->CODIGO := 10
    (cAlias)->(DbAppend())
    (cAlias)->CODIGO := 20
    (cAlias)->(DbAppend())
    (cAlias)->CODIGO := 30
    (cAlias)->(DbAppend())
    (cAlias)->CODIGO := 40
    (cAlias)->(DbAppend())
    (cAlias)->CODIGO := 50

    (cAlias)->(DbGoBottom())
    ?(cAlias)->(Recno())

    (cAlias)->(DbGoTop())
    (cAlias)->(DbDelete())
    (cAlias)->(DbGoBottom())
    SET DELETED ON
    ?(cAlias)->(Recno()),(cAlias)->(RecCount())
    SET DELETED OFF
    ?(cAlias)->(Recno()),(cAlias)->(RecCount())

Return ( Nil )

David Field

unread,
Jun 3, 2021, 5:24:06 PM6/3/21
to ADO Harbour
Hola Victor,

Esta pregunta sería mejor contestada en el foro de 

A lo que veo en la documentación:
xHarbour Language Reference Guide (Version 1.1) - RecCount() Description

RecCount() is identical with LastRec(). Refer to LastRec() for a description. 

  • RecCount()  nRecords
    (It is internally translated into Lastrec(). So, prefer to use LastRec() instead).

Puedes ver el efecto de SET DELETED ON en Clipper Reference Guide · Clipper 5.3 (harbour.github.io)

Saludos,
David Field

PD. Yo también recordaba que RecCount() honraba SET DELETED pero al parecer esto ya no es o estoy equivocado.

jga...@wados.cl

unread,
Jun 3, 2021, 10:37:38 PM6/3/21
to ADO Harbour
La estructura del archivo .dbf no tiene esa información:

Mira:    Estructura de archivo DBF (whitetown.com)

Lo que puedes hacer es un SUM 1 TO nBorrados  ALL FOR DELETE()  si esto es de vez en cuando y pocos registros puede ser tu solución, sino puedes obtener los registros eliminados y:

- Mantener un archivo aparte para ese archivos o para mas que tenga la cantidad de registros eliminados y mantener ese dato actualizado con cada DELETE()

- Tener en el 1 registro aprovechando un campo numerico con los eliminados
  Ejemplo,  si tienes:
  Vehiculo  Chr 40
   Patente  Chr 8
   Kilometraje  N  6  

   SI BorrarRegistroVehiculo
        DELETE()
        DBGOTO( 1  )
        ++Kilometraje
    END SI

     Incluso el registro 1 puede estar DELETED() y en caso de hacer un DBPACK() :
     DBGOTO(1)
    RECALL
    DBPACK()
     DBGOTO(1)
     DELETE()


Espero algo te sirva.

Saludos,

Jorge


Victor Casajuana Mas

unread,
Jun 4, 2021, 3:26:15 AM6/4/21
to ADO Harbour
David, muchas gracias por tu buena explicación, es verdad que lo podía poner en el grupo de Harbour pero pensaba que este sería más correcto porque trataba sobre tablas y datos. Lo tendré en cuenta para la próxima vez.

Jorge, buena idea la que me planteas la tendré en cuenta.

Por cierto, viendo el link que me has pasado, no sabía la existencia del tipo de dato MONETARIO, alguien lo ha utilizado? lo he probado creando una tabla pero me da error de tipo de datos cuando le asigno un valor numérico...

Salud!

David Field

unread,
Jun 4, 2021, 1:30:55 PM6/4/21
to ADO Harbour
Víctor, eres bienvenido a postear cualquier tipo de pregunta en este grupo, la idea es tratar de ayudar.
Solo ofrecí los otros grupos por que pudiera ser que hubiera algún error en RecCount(), que como comento en mi postdata, también yo pensé que honraba SET DELETED.

Saludos,
David Field

CV

unread,
Jun 4, 2021, 5:21:52 PM6/4/21
to ADO Harbour
Si hablas de una base dbase, crearía un índice con una cláusula FOR:

Index on RECNO() for DELETED()

Seleccionas ese índice físico (o tag si fuese el caso) y usas ORDKEYCOUNT() o sin seleccionar el índice (siempre que esté abierto), ORDKEYCOUNT(nIndice).
Luego haces la cuenta: LASTREC() - ORDKEYCOUNT(nIndice)
Si es un archivo de gran tamaño (gran cantidad de registros), convendrá que sea parte de tu definición de índices en el sistema.
Sino, crearlo al momento de necesitarlo con la opción TEMPORARY.

Saludos!
--
Claudio Voskian
Buenos Aires - Argentina

Victor Casajuana Mas

unread,
Jun 5, 2021, 2:07:31 AM6/5/21
to ADO Harbour
Claudio esta opción me parece muy correcta, posiblemente sea la que utilice, Salud!
Reply all
Reply to author
Forward
0 new messages