Qual o limite do dbf??

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

carlos_dornelas
Usuário Nível 3
Usuário Nível 3
Mensagens: 400
Registrado em: 25 Ago 2004 21:54

Qual o limite do dbf??

Mensagem por carlos_dornelas »

Pessoal, qual o limite de campos que posso incluir em um .dbf? Tentei criar uma base, cfe. abaixo, com 2300 campos, mas o programa aborta com aquela mensagem do windows xp (o programa xx encontrou um problema e precisa ser fechado)? Alguém pode dar uma luz?

functio criaarq()

release aq1
close all
aq1:={}
for k=1 to 2300
l=alltrim(str(k))
z='d'+l
aadd(aq1,{z,'C',3,0})
next

alert('vou tentar criar a base')
dbcreate('ars',aq1)
close all

alert('nao chega aqui')
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Tá. Só queria saber pra quê um dbf com 2300 campos.

O DBF guarda a estrutura no início dele. Uma estrutura muito grande vai estufar o dbf.
O DBU-Clipper não vai exibir todos os campos desse DBF.
No DBU-XHarbour exibiu arquivos com muitos campos, mas não chegou ainda a um limite.

Se é uma necessidade, talvez seja melhor estudar melhor esse seu DBF.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Mensagem por MARCELOG »

Vou até conferir,
mas com 99% de certeza são 255 campos.

MarceloG
Avatar do usuário
rmg
Usuário Nível 1
Usuário Nível 1
Mensagens: 27
Registrado em: 02 Mar 2006 11:54
Localização: Ipanema/MG

Bem...

Mensagem por rmg »

Primeira coisa, porque um dbf com 2300 campos? Isso é inviável. Realmente nunca vi uma tabela, em banco nenhum com 2300 campos.

E quanto a quantidade de campos que um dbf suporta, isso é variável... Não dá para se definir ao certo. Fiz alguns testes aqui e o resultado foi o seguinte:

- Máquina servidor linux debian, compilando com xHarbour 0.99.60
O máximo de campos que consegui criar em um DBF foi 2096 campos. A partir deste número já apresenta falha de segmentação (core dumped).

- Máquina estação Windows XP, compilando com Clipper 5.3+Blinker
O máximo de campos que consegui criar em um DBF e abrir com a função browse() foi de 318 campos. Acima desta quantidade, consegui exibir somente utilizando o dbedit(). Mesmo assim, acima de 1793 campos tb dá erro de falta de memória.

Só que o que temos que observar é que fiz estes testes utilizando a estrutura informada pelo nosso amigo carlos_dornelas, ou seja, campos Caractere de 3 posições. Mas se eu colocasse por exemplo na estrutura para criar todos os campos com Caractere de 1, com certeza iria poder criar muito mais campos e se tivesse especificado por exemplo a estrutura com os campos Caratere de 100, por exemplo, com certeza iria poder criar MUUUUITO menos campos.

Em resumo, a quantidade de campos no DBF é muito relativa, sempre levando em conta a estrutura da tabela e o tamanho dos campos que nele estão.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Pelo que percebo, lendo o código do colega, ele quis apenas TESTAR a criação de um DBF com uma quantidade PROPROSITALMENTE exagerada de campos.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
carlos_dornelas
Usuário Nível 3
Usuário Nível 3
Mensagens: 400
Registrado em: 25 Ago 2004 21:54

Mensagem por carlos_dornelas »

É isso aí pessoal! Valeu pelos comentários. Maligno, acertou na mosca!

[]s

Antonio
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Hehehehe!!!

Essa eu não sabia, 1783 campos em um DBF!!!!!

Eu ja vi muita gente criar arquivos que armazenam parâmetros nessa lógica, um campo pra cada configuração, por exemplo impressoras, cores do sistema, etc etc...

Eu prefiro usar dois campos somente, tipo CHAVE e VALOR, pois ja que vou ter que lembrar o nome do campo mesmo, ja dou logo um seek nele, mas tem a desvantagem de ficar tudo com o mesmo tipo e tamanho.

Agora, se não for pra casos como esse, não vejo o porque de tanto campo em um arquivo. Só vale como teste de stress mesmo... hehe

Quanto ao xHarbour ele melhorou mesmo um pouco o acesso a DBF, entre outras coisas acabou com o limite de 8 caracteres no nome do arquivo e principalmente no nome campo, isso é realmete bom, por que um grande sacrificio para o clippeiro sempre foi ficar criando campos com 8 letras... Bem, na verdade não foi xharbour em si, mas o acesso direto pelo Windows que possibilitou isso.

Pra aeste casos, o DBU lê a estrutura mas quebra o nome se vc salvar por ele. O DClip me parece que lê e salva certo...

Falou!!
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
rmg
Usuário Nível 1
Usuário Nível 1
Mensagens: 27
Registrado em: 02 Mar 2006 11:54
Localização: Ipanema/MG

É...

Mensagem por rmg »

Como nosso amigo carlos_dornelas citou acima, ele queria simplesmente saber o máximo de campos que um dbf suportava, e explicou que não é um caso de uso, que foi somente para tirar dúvidas mesmo.
entre outras coisas acabou com o limite de 8 caracteres no nome do arquivo e principalmente no nome campo
Quanto ao nome do arquivo poder ser acima de 8 caracteres OK, mas "principalmente o nome do campo", não sei não, creio que ainda são 10 caracteres para o nome do campo no dbf. Os amigos do fórum me corrijam por favor, se eu estiver errado, mas creio que se colocarmos o nome do campo com mais de 10 caracteres, tipo: nome_campo01, nome_campo02, nome_campo03...etc. Exemplo:


a_arq:={}
for i=1 to 10
aadd(a_arq,{"nome_campo"+strzero(i,2),'C',10})
next
dbcreate('teste',a_arq)


Você até vai criar a estrutura do dbf, mas no final das contas, todos os campos terão o mesmo nome, ou seja, nome_campo (com 10 caracteres).
Se você especificar no seu programa teste->nome_campo01 não será encontrado, pois não existe este campo na tabela, e sim somente campos com nome "nome_campo".

Se eu estiver errado, por favor me corrijam.

Abraço.
Renato Martins
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Re: É...

Mensagem por Stanis Luksys »

rmg escreveu:
entre outras coisas acabou com o limite de 8 caracteres no nome do arquivo e principalmente no nome campo
Você até vai criar a estrutura do dbf, mas no final das contas, todos os campos terão o mesmo nome, ou seja, nome_campo (com 10 caracteres).
Se você especificar no seu programa teste->nome_campo01 não será encontrado, pois não existe este campo na tabela, e sim somente campos com nome "nome_campo".

Se eu estiver errado, por favor me corrijam.

Abraço.
Renato Martins
Sim, está errado, ele acessa sim, pelo programa, o campo de nome nome_campo_01 e não "confunde" com o nome_campo_02, como foi mencionado.
rmg escreveu:Você até vai criar a estrutura do dbf, mas no final das contas, todos os campos terão o mesmo nome, ou seja, nome_campo (com 10 caracteres).
Isso muito provavelmente acarretaria em erro em tempo de execução, não se pode ter dois campos com o mesmo nome em um DBF.

Para confirmar o que foi dito basta abrir no MS-Excel e verá o nome dos campos exatamente como foi criado pela função dbCreate(), tenho hoje campos com nome de até 20 caracteres lendo normalmente, por exemplo "impressora_padrão" e "impressora_auxiliar", e note que os nomes são muito parecidos entre sí no seu início. (isso quando não uso o esquema "chave valor" que mencionei acima)

Eu particularmente gosto de reler meu código e saber de cara o que são as variáveis e tudo mais, então tenho o costume de usar nomes longos em tudo, EX: VariavelQueFazTalCoisa := 0. Mas aí já pessoal... hehehe

Falou!!!
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
rmg
Usuário Nível 1
Usuário Nível 1
Mensagens: 27
Registrado em: 02 Mar 2006 11:54
Localização: Ipanema/MG

bom dia

Mensagem por rmg »

Amigo Stanis,

Gostaria de sabe como está criando a estrutura dos seus dbfs, porque se formos criar com a dbcreate, como mostrei no exemplo, ele vai gerar campos no dbf somente com 10 caracteres sim.

E não vai dar erro em tempo de execução, pois mesmo tendo 200 campos com o mesmo nome no dbf, ele vai entender que é somente um, ou seja, vai gravar ou alterar valores em todos os campos como se fosse único.

Gostaria de lembrar que fiz testes utilizando Clipper 5.3 e também testes utilizando o xHarbour 0.99.60 no Linux.

Qualquer um, gero o dbf como no exemplo que citei e todos vão gerar os campos somente com 10 caracteres, utilizando a função dbcreate().

E se abrirmos o arquivo no Excel, ou DBU, ou DBase ou qualquer outro programa para edição de DBF, vamos ver todos os campos COM 10 CARACTERES.

Como vc cria a estrutura de seus DBFs? Confesso que nunca tinha tentado antes criar nome de campos DBF com mais de 10 posições, mas quando surgiu este tópico, fui tentar para ver a veracidade do fato, mas realmente nos testes que fiz não ocorreu como nosso amigo Stanis mencionou.

Abraço.
Renato Martins Gomes
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Hehehe,

Eu crio usando a função dbCreate() mesmo. Tanto no xhb 96 como 97. talvez você esteja com algum problema na sua versão, procure utilizar a mais recente do CVS. No linux também funciona normalmente.


Se não acredita te envio o DBF e você abre no Excel e comprova.

Falou maninho.
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
rmg
Usuário Nível 1
Usuário Nível 1
Mensagens: 27
Registrado em: 02 Mar 2006 11:54
Localização: Ipanema/MG

Olá

Mensagem por rmg »

Caro amigo Stanis,

Em momento algum duvidei de você.
Como já citei acima, é que nunca tinha nem ao menos tentado criar um dbf contendo nome de campos com mais de 10 caracteres.

O que falei foi que quando vi sua citação, fui fazer os testes e comigo não deu certo. Realmente os dbf´s que criei aqui tanto no xHarbour quanto no Clipper ficaram com 10 caracteres nos nomes dos campos.

Mas se vc falou q cria, é pq cria mesmo. Vou continuar tentando. rsrsrs

Abraço.
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Opa,

Talvez o problema no seu caso aí seja o uso das macros.

Tente na mão mesmo, tipo assim:

Código: Selecionar todos

aDBF := {}
AAdd( aDBF, { "nome_grande_do_campo","C",30,0 } )
dbCreate( "teste.dbf", aDBF )
Falou!
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
edmarfrazao
Usuário Nível 3
Usuário Nível 3
Mensagens: 185
Registrado em: 06 Dez 2005 11:16

Mensagem por edmarfrazao »

Tive um problema com dbf.

tinha uma rotina que alterava a estrutura e criava novos campos

mandei criar um novo dbf com 02 campos iguais.

O DBF aceitou normalmente.


Alguem sabe se tem como fazer o dbf recusar a criarção com dois campos iguais?
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Alguem sabe se tem como fazer o dbf recusar a criarção com dois campos iguais?
Tche, seu caso acho que seria uma questão de Logica ???? acho que vc pode impedir isso antes da Criação do DBF !!!

Abraços
Leonardo Machado
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder