Como testar a quantidade de registos num DBF
Moderador: Moderadores
Como testar a quantidade de registos num DBF
Caros amigos. Desejo desde já um Feliz Natal e um Próspero Ano Novo para todos.
A minha dúvida é a seguinte:
Estou tentando saber qual o valor da quantidade de registos no meu DBF.
Por exemplo: Uso o lastrec(), recc() e recno(). Só que o valor de retorno destes comandos não está certo com a realidade. Li sobre estes comandos e explicam que os registos deletados também contam.
Como faço para obter o nº certo de registos.
Agradeço desde já a vossa atenção para o meu problema
Saudações.
Carlos Lapa
A minha dúvida é a seguinte:
Estou tentando saber qual o valor da quantidade de registos no meu DBF.
Por exemplo: Uso o lastrec(), recc() e recno(). Só que o valor de retorno destes comandos não está certo com a realidade. Li sobre estes comandos e explicam que os registos deletados também contam.
Como faço para obter o nº certo de registos.
Agradeço desde já a vossa atenção para o meu problema
Saudações.
Carlos Lapa
O pá! Grande Lapinha, bem vindo ao Forum!
A função LASTREC(), que é igual à RECCOUNT(), mostra a quantidade total de registros, não importa se deletados ou não. Para separar, use o seguinte:
COUNT to var1 for deleted() // guarda número de deletados em var1
COUNT to var1 for !deleted() // guarda número de não deletados em var1
Um problema: se o DBF for muito grande, essa contagem pode demorar bastante, isto porque o comando COUNT vai examinar registro por registro, do começo até o fim do arquivo...
A função LASTREC(), que é igual à RECCOUNT(), mostra a quantidade total de registros, não importa se deletados ou não. Para separar, use o seguinte:
COUNT to var1 for deleted() // guarda número de deletados em var1
COUNT to var1 for !deleted() // guarda número de não deletados em var1
Um problema: se o DBF for muito grande, essa contagem pode demorar bastante, isto porque o comando COUNT vai examinar registro por registro, do começo até o fim do arquivo...
Vc tbem podera tentar dessa forma para ver se resolve inclusive em bases grandes de dados.
*-abrindo o dbf
use meudbf
*-abra os indices se acaso tiver
index meucampo to meudbf
*- para nao constar os eliminados
Set dele on
? myreccount()
*- para saber todos inclusive os eliminados
Set dele off
? myreccount()
close
Não testei, mais acho q deva funcionar ou precise de um pequeno ajuste.
Ate+
FUNCTION myreccount()
local chave,recatual
*- guarda os ponteiros de indexacao e recno atual
chave=indexord()
recatual=recno()
*- comando abaixo para desconsiderar a indexacao temporariamente
set orde to 0
*- localiza o primeiro registro
go top
n_inicio=recno()
*- localiza o ultimo registro
go bottom
n_final=recno()
if eof().or.bof()
return 0
endif
*- se o dbf tiver campo indexado volta a indexacao anterior
if !empty(chave)
set orde to chave
endif
go recatual
*- faz a checagem sobre a numeracao e retorna o valor
return if(n_inicio=n_final,1,(n_final-n_inicio)+1)
*-abrindo o dbf
use meudbf
*-abra os indices se acaso tiver
index meucampo to meudbf
*- para nao constar os eliminados
Set dele on
? myreccount()
*- para saber todos inclusive os eliminados
Set dele off
? myreccount()
close
Não testei, mais acho q deva funcionar ou precise de um pequeno ajuste.
Ate+
FUNCTION myreccount()
local chave,recatual
*- guarda os ponteiros de indexacao e recno atual
chave=indexord()
recatual=recno()
*- comando abaixo para desconsiderar a indexacao temporariamente
set orde to 0
*- localiza o primeiro registro
go top
n_inicio=recno()
*- localiza o ultimo registro
go bottom
n_final=recno()
if eof().or.bof()
return 0
endif
*- se o dbf tiver campo indexado volta a indexacao anterior
if !empty(chave)
set orde to chave
endif
go recatual
*- faz a checagem sobre a numeracao e retorna o valor
return if(n_inicio=n_final,1,(n_final-n_inicio)+1)
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Andril, assim não funciona.
O GO TOP e o GO BOTT só resolvem se respectivamente o(s) primeiro(s) ou o(s) último(s) registros estiverem deletados. Exemplo: se vc tem 1.000 registros e deleta o número 1.000, um GO BOTT faz ir pro registro 999 se SET DELE ON. Mas, se vc tem 1.000 registros e deleta o registro 999, um GO BOTT faz ir pro registro 1.000, mesmo com o SET DELE ON...
Faça o teste.
O GO TOP e o GO BOTT só resolvem se respectivamente o(s) primeiro(s) ou o(s) último(s) registros estiverem deletados. Exemplo: se vc tem 1.000 registros e deleta o número 1.000, um GO BOTT faz ir pro registro 999 se SET DELE ON. Mas, se vc tem 1.000 registros e deleta o registro 999, um GO BOTT faz ir pro registro 1.000, mesmo com o SET DELE ON...
Faça o teste.
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
SET ORDE TO 0 ou simplesmente SET ORDE TO mostra os registros na ordem natural (de gravação), SEM fechar os índices que tiverem sido abertos com o DBF. Mesmo com esta opção, qualquer alteração no DBF será refletida em todos os índices abertos.
Se vc tiver um DBF indexado e der um GO BOTT, o ponteiro vai para o último registro RELATIVO. Sem indexação, o ponteiro vai para o último registro FÍSICO. O comando, então, pode ser útil se vc precisar saber qual o último registro APPENDado no arquivo...
Por ex.: o nome "ZOROASTRO", gravado no recno()=1, vai aparecer no GO BOTT quando o arquivo estiver indexado por NOME e aparecer no GO TOP quando estiver sem indexação.
Se vc tiver um DBF indexado e der um GO BOTT, o ponteiro vai para o último registro RELATIVO. Sem indexação, o ponteiro vai para o último registro FÍSICO. O comando, então, pode ser útil se vc precisar saber qual o último registro APPENDado no arquivo...
Por ex.: o nome "ZOROASTRO", gravado no recno()=1, vai aparecer no GO BOTT quando o arquivo estiver indexado por NOME e aparecer no GO TOP quando estiver sem indexação.
-
TerraSoftware
- Usuário Nível 3

- Mensagens: 353
- Registrado em: 28 Jul 2004 13:14
- Localização: Cianorte-PR
- Contato:
Demora mais resolve:
Código: Selecionar todos
set deleted on
select nomedatabela
set order to qualqueruma
go top
regis:=0
do while ! eof()
regis++
skip
enddo


