EderX,
Dar um parpite...
A primeira parte da sua pergunta ("Qual seria a forma de avaliar se existe algum registro em um DB") me parece que não fecha com a segunda parte ("se ele esta zerado, nunca nada fui incluso nele")... Um DBF zerado não quer dizer que "nunca nada foi incluso nele": você pode ter primeiro incluido um registro, depois ter deletado esse registro e depois rodado o PACK. Ao final, o DBF estará novamente "virgem", zerado...
Outra coisa: a função LASTREC() retorna o número de registros do DBF (que ela pega do header do arquivo), não importando se há registros DELETADOS ou não. Por exemplo, se vc tem 1.000 registros e todos os 1.000 estão deletados, LASTEREC() retorna 1.000, mesmo que vc esteja com SET DELE ON...
Bão, imagino que vc queira de fato saber se, em um determinado momento, um DBF tem algum registro ativo. É isso? Se for, esquece a LASTREC(). Aliás, esta função pode até ser a primeira checagem (veja abaixo)...
Duas opções:
a) usar o comando COUNT, que é demorado para DBFs grandes: COUNT TO XPTO FOR !DELETED() guarda em XPTO o número de registros ativos encontrados, mas pra fazer isso ele varre o arquivo todo, registro por registro... Haja!
b) indexar o seu DBF por um campo lógico chamado por exemplo DELETA e, quando vc deletar um registro, mudar o valor desse campo de .F. para .T. Depois, de vc quiser saber se tem algum registro deletado, é só fazer SEEK .T. (veja abaixo). Isto é muito mais rápido... Isto considerando que vc, periodicamente, roda um PACK em seus DBF, pra não ficar guardando lixo à toa.
Um exemplo, resumindo a coisa:
Código: Selecionar todos
use pedidos excl new
inde on deleta to pedidos
set inde to pedidos
do whil .t.
if lastrec()=0 // DBF zerado
alert("DBF com ZERO registros")
exit
end
seek .t.
if found()
conta=1
do whil .t.
skip
if deleta=.t.
conta++
else
exit
endi
endd
alert("DBF tem "+str(lastrec())+" registros, sendo "+str(conta)+" deletados")
else
alert("DBF tem "+str(lastrec())+" registros, todos ativos")
endi
exit
endd
quit