Como testar a quantidade de registos num DBF

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

lapinha
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 29 Dez 2007 22:01
Localização: Portugal

Como testar a quantidade de registos num DBF

Mensagem por lapinha »

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
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Bem vindo ao Forum,
use o SET DELETED ON|OFF

SET DELETED OFF // VAI CONTAR OS REGISTROS MARCOS PARA DELETAR
SET DELETED ON // VAI IGNORAR OS REGISTROS MARCOS PARA DELETAR

ou de PACK em seu DBF.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

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...
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Mensagem por ANDRIL »

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)
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

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.
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Mensagem por ANDRIL »

Realmete Eolo, agora que pude testar em casa nao deu certo. Favor desconsiderar meu poste anterior.

Valeu Eolo,

Ate+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Essa eu não conhecia, poderia comentar mais a respeito ?
*- comando abaixo para desconsiderar a indexacao temporariamente
set orde to 0
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

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.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

E para .CDX pode se usar tmb. OrdSetFocus() e OrdBagName().
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
TerraSoftware
Usuário Nível 3
Usuário Nível 3
Mensagens: 353
Registrado em: 28 Jul 2004 13:14
Localização: Cianorte-PR
Contato:

Mensagem por TerraSoftware »

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

www.sisterra.com.br
xHarbour 1.0.0 - Bcc 6.3 - Gtwvw/Hwgui
DbfCdx/MySql
Responder