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.