Página 1 de 1
Quantidade de registros...
Enviado: 10 Fev 2010 10:54
por carlos_dornelas
Prezados, como obter a quantidade de registros de um dbf sem que ele esteja aberto? É possível?
Grsto
Antonio Carlos
Re: Quantidade de registros...
Enviado: 10 Fev 2010 12:47
por gvc
De imediato, pelo clipper não tem como, pois essa informação esta dentro do arquivo.
Não dá para calcular, pois os campos normalmente tem tamanhos e quantidades diferentes em cada dbf.
O DBase mostrava isso, mas ele abria o arquivo para ler essa informação.
A não ser que haja alguma ferramenta/função/biblioteca que eu desconheça.
Re: Quantidade de registros...
Enviado: 10 Fev 2010 15:51
por rochinha
Amiguinho,
Porque voce não cria uma tabela estatistica?
Esta tabela conteria o nome do .DBF e quantidade de registros totais e deletados.
Cada vez que entrar em seu sistema voce atualiza esta tabela com a quantidade de cada um.
Caso queira ir mais a fundo voce deverá consultar via comandos de baixo nivel os bytes de 4 a 7 que informam o numero de registros existentes na tabela
0 - 1 byte - dBASE III version number (03H without a .DBT file) (83H with a .DBT file)
1-3 - 3 bytes - date of last update (YY MM DD) in binary format
4-7 - 32 bit - number number of records in data file
8-9 - 16 bit - number length of header structure
10-11 - 16 bit - number length of the record
12-31 - 20 bytes - reserved bytes (version 1.00)
32-n - 32 bytes - each field descriptor array (see below)
Re: Quantidade de registros...
Enviado: 10 Fev 2010 23:20
por carlos_dornelas
Obrigado Gvc pela atenção!
Rochinha, teria como obter os bytes 4 a 7 sem ter que usar o fopen? Eu já havia pensado em manter uma estatística via variáveis, mas acho que vopu tentar implentar uma matriz estatística.
Grato
Antonio Carlos
Re: Quantidade de registros...
Enviado: 11 Fev 2010 11:51
por rochinha
Amiguinho,
Para obter informações das tabelas voce terá de abri-las de qualquer forma, seja por USE o FOpen()
Eu sugiro o USE e um Recco() sendo que voce terá de verificar se o SET DELETE ON/OFF influencia no resultado da contagem e se for o caso efetuar PACK.
Re: Quantidade de registros...
Enviado: 11 Fev 2010 13:09
por gvc
[Rochinha]
Somente para testar os meus parcos conhecimentos:
O Reccount() retorna a quantidade de registros do arquivo, contando com os marcados como apagados.
O SET DELETED ON faz com que a leitura de registro não mostre os marcados como apagados. Isso vai influenciar a contagem de registros ativos se o sistema "correr" os registros.
A contagem assim e o RECCOUNT() só serão iguais se não tiver nenhum registro marcado como apagado.
Isso normalmente acontece em arquivos "novos" ou depois de rodar o PACK no arquivo.
?Errei algo no comentário?
O problema da tabela estátistica é que se alguma outra aplicação abrir e manipular o arquivo, a tabela em questão estará errada.
Re: Quantidade de registros...
Enviado: 12 Fev 2010 01:32
por rochinha
Amiguinhos,
GVC
Voce não esta errado.
Fiz um pequeno teste no qual pude verificar que o SET DELETE não influencia mesmo em nada a não ser visualmente.
Portanto se recuperarmos as informações do .DBF via FOpen() obteremos somente o total de registros.
Eis o codigo do teste e a sugestão de se obter estas informações via USE em uma rotina no inicio da abertura de seu aplicativo e armazena-la em uma tabela.
Código: Selecionar todos
/*
*
* Refaz estrutura do arquivo NATUREZA
*
*/
#define CRLF chr(13)+chr(10)
function main
//
Request DBFCDX
RddRegister('DBFCDX',1)
RddSetDefault('DBFCDX')
Request OrdKeyNo
Request OrdKeyCount
dbCloseAll()
erase( "teste.dbf" )
ESTRU_DBF := { { "IDTESTE" , "N", 2, 0 } , ;
{ "TESTE" , "C", 10, 0 } }
dbcreate( "TESTE", ESTRU_DBF )
use teste exclusive new
for i = 1 to 99
dbAppend()
teste->idteste := i
teste->teste := "TESTE "+alltrim(str(i))
next
MsgStop( "Passo 1 - Registros: "+str(recco()) )
dbGotop()
go 40; dbDelete()
go 50; dbDelete()
go 51; dbDelete()
go 52; dbDelete()
go 64; dbDelete()
go 73; dbDelete()
go 75; dbDelete()
go 79; dbDelete()
go 84; dbDelete()
MsgStop( "Passo 2 - Registros: "+str(recco()) )
Set Delete On
dbGotop()
MsgStop( "Passo 3 - Registros: "+str(recco()) )
Set Delete Off
Set Filter to idteste > 10 .and. idteste < 30
dbGotop()
MsgStop( "Passo 3 - Registros: "+str(recco()) )
Set Filter to idteste > 40 .and. idteste < 60
dbGotop()
MsgStop( "Passo 4 - Registros: "+str(recco()) )
Set Filter to deleted()
dbGotop()
MsgStop( "Passo 5 - Registros: "+str(recco()) )
Set Delete Off
Set Filter to
nDeletadosSIM := 0
nDeletadosNAO := 0
dbGotop()
do while .not. eof()
nDeletadosSIM := nDeletadosSIM + iif( deleted(), 1, 0 )
nDeletadosNAO := nDeletadosNAO + iif( deleted(), 0, 1 )
skip
enddo
dbGotop()
MsgStop( "Passo 6 - Registros: " + ;
CRLF+"Deletados(SIM) :" + str(nDeletadosSIM) + ;
CRLF+"Deletados(NAO) :" + str(nDeletadosNAO) )
dbCloseAll()
return .t.
function MsgStop( texto )
? texto
return nil
O que se tem de repensar é:
Aplicativo extra sistema abrindo sua bases de dados para manipulação? isso é perigoso. Somente seu sistema pode abrir as tabelas em modo completo, outras aplicações só poderão abrir em modo restrito, senão o controle vai pro espaço.
Re: Quantidade de registros...
Enviado: 12 Fev 2010 12:24
por gvc
[rochinha]
Sim. Eu sei que outro aplicativo não deveria acessar as bases de dados, mas não tem como garantir que não serão abertos via dbu ou algo assim. Roda um pack e a contagem do arquivo já era.
Mas vamos simplificar. Eu fiquei curioso sobre o motivo do colega [carlos_dornelas] querer saber a quantidade de registros sem abrir o arquivo.
Com qq aplicativo, será necessário abrir o arquivo para ler as informações de controle dele, mesmo que usando baixo nível.
Não dá para saber a quantidade de registros usando o tamanho em bytes. Lembrando que o DBF tb tem um caracter apontador de final de arquivo.
Re: Quantidade de registros...
Enviado: 13 Fev 2010 00:17
por rochinha
Amiguinho,
Talvez o que ele queira é saber se algum registro ou a tabela teve seu dados manipulados às escondidas.
Ou talvez algum teste CRC ou coisa do tipo pode dar mais segurança.
Re: Quantidade de registros...
Enviado: 13 Fev 2010 13:50
por carlos_dornelas
Amigos, eu preciso controlar o tamanho das bases para evitar que o usuário troque as bases e utilize o programa para controlar operaçoes de mais de um usuário. Já resolvi o problema. Se tivéssemos uma forma de autenticar os .dbs de alguma forma, seria muito útil.
Antonio Carlos
Re: Quantidade de registros...
Enviado: 13 Fev 2010 16:59
por rochinha
Amiguinho,
Eu parei de acompanhar o projeto WAPI porque fiquie muito tempo sem acessar o forum e agora vejo que esta num patamar muito acima da linha de raciocionio que eu vinha acompanhando.
Mas se voce der uma verificada, talvez encontre algo a respeito.
Re: Quantidade de registros...
Enviado: 13 Fev 2010 22:52
por gvc
HB_MD5File()
Calculates a message digest for a file using the MD5 algorithm.
Vc pode usar isto então para validar alguns arquivos de controle do seu sistema.