Arquivo DBF ler field memo

24 respostas
J

Galera tenho um arquivo CLIENTES.DBF e preciso ler esse arquivo e mostrar numa tabela.
Estou usando o javaDBF que lê tranquilo, porém, o DBF tem os campos chamados memo, que eu acho que são indices para outros arquivos .DBF…
Quando eu chamo um arquivo:

InputStream inputStream = new FileInputStream( args[ 0]); DBFReader reader = new DBFReader( inputStream);

ele carrega o .DBF, mas ao encontrar um campo memo, ele da erro.

Alguém pode me ajudar a solucionar esse problema?

24 Respostas

E

http://sarovar.org/docman/view.php/32/23/javadbf-tutorial.html

Ou seja: use outra biblioteca.

J

o problema que a única free que encontrei foi essa, o resto lê só até mil registros ou é só por 30 dias ;(

J

já tentou http://dans-dbf-lib.sourceforge.net/ essa?

J

será que é free? oO

J

Na home já falando isso ~> “[…] DANS is making this library available under the GNU Public Licence.”

J

se essa biblioteca tratar campos memos, vai salvar a minha pele! hahaha Vou verificar como funciona, depois dou um feedback aqui

J

Dá sim… da uma olhada na parte de uso e exemplos >> http://dans-dbf-lib.sourceforge.net/usage.html

J

ela é bem diferente do javaDBF, estou vendo os parâmetros, não é tão simples ler o arquivo ;x

J

dou por encerrada minha tentativa de ler campo memo de arquivo .dbf com java. :frowning:

J

Deu algum erro? qual?

J

no DANS DBF dispara um erro que não pode contar o numero de fields do arquivo .dbf
e no XBaseJ:

org.xBaseJ.xBaseJException: Wrong Version 48

at org.xBaseJ.DBF.openDBF(DBF.java:363)

at org.xBaseJ.DBF.(DBF.java:221)

algum problema de compatibilidade com o arquivo .DBF

e no javaDBF, não le o field memo

;~

J

posta seu código usando o DANS DBF…

J

é o exemplo do site:

package dans;

import java.io.File;
import java.io.IOException;
import nl.knaw.dans.common.dbflib.CorruptedTableException;
import nl.knaw.dans.common.dbflib.IfNonExistent;
import nl.knaw.dans.common.dbflib.Table;

/**
 *
 * @author WinXP
 */
public class Dans {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException, CorruptedTableException {
        Table table = new Table(new File("F:\\CLIENTES.DBF"));

        try {
            table.open(IfNonExistent.ERROR);

            // ... do your stuff

        } finally {
            table.close();  // don't forget to close it!
        }
    }
}

erro:

run:
Exception in thread "main" nl.knaw.dans.common.dbflib.CorruptedTableException: Number of field descriptions in file could not be calculated.
	at nl.knaw.dans.common.dbflib.DbfHeader.getFieldCount(DbfHeader.java:181)
	at nl.knaw.dans.common.dbflib.DbfHeader.readAll(DbfHeader.java:131)
	at nl.knaw.dans.common.dbflib.Table.open(Table.java:275)
	at dans.Dans.main(Dans.java:27)
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 2 segundos)
J

na hora de abrir pelo table.open(IfNonExistent.ERROR); ele dispara o erro, o engraçado que pelo javaDBF abre normal, apenas não le quando chega no campo memo

J

O arquivo DBT tem que estar no mesmo diretório do DBF… caso não tenha abra o arquivo com o open office ou libre office faça uma alteração no conteúdo do arquivo em seguida desfaça a modificação e manda
salvar o arquivo que será gerado um arquivo DBT;;

J

graças ao jweibe meu problemas foram resolvidos, grande dbfman! aushasuasuh valew

L

OI Pessoal. Sei que o problema já foi resolvido mas fiz o mesmo aqui mas estou tendo um problema ao criar o objeto table. Diz que o contrutor está indefinido e eu não estou sabendo consertar. Sou muito iniciante em java mas estou precisando fazer conexão com o dbf. Segue abaixo o código.

package comunicacao;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;

import nl.knaw.dans.common.dbflib.*;


import com.lowagie.text.Document;
import com.lowagie.text.Table;

import exception.XmlInvalidoException;

public class InserirDbf {
	
	
	
	public void inserirDbf(Document xml)throws XmlInvalidoException,IOException, CorruptedTableException{
		Table table = new Table(new File("C:\\NOTA.DBF"));
		try
		 {
		     table.open(IfNonExistent.ERROR);

		     // ...  do your stuff
		     
		     
		 }
		 finally
		 {
		     table.close(); // don't forget to close it!
		 }
		
		return ;
	}
	
}
L

o erro fica em

Table table = new Table(new File("C:\\NOTA.DBF"));

esquece o return :lol:

J

Lucas tente algo como.

Table table = new Table(new File("./contato.dbf"), "UTF-8");
		
try {
	table.open(IfNonExistent.CREATE);
} catch (CorruptedTableException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();
} finally {
	try {
		table.close();
	} catch (IOException e) {
		e.printStackTrace();
	}
}
L
public class InserirDbf {
	
	
import java.io.File;
import java.io.IOException;
import java.util.HashMap;

import nl.knaw.dans.common.dbflib.*;


import com.lowagie.text.Document;
import com.lowagie.text.Table;

import exception.XmlInvalidoException;

public class InserirDbf {

		
	public void inserirDbf(Document xml)throws XmlInvalidoException,IOException, CorruptedTableException{
	    Table table = new Table(new File("./NOTA.DBF"), "UTF-8");  
        
	    try {  
	        table.open(IfNonExistent.CREATE);  
	    } catch (CorruptedTableException e) {  
	        e.printStackTrace();  
	    } catch (IOException e) {  
	        e.printStackTrace();  
	    } finally {  
	        try {  
	            table.close();  
	        } catch (IOException e) {  
	            e.printStackTrace();  
	        }  
	    }  
	}  
}

Seguinte eu fiz o que você falou mas pessiste o erro (The constructor Table(File, String) is undefined)

J

Cara posa a stack que gera no console do eclipse completa.
Qual versão da lib você ta usando?

Fiz esse exemplo aqui.

public static void main(String[] args) {
		Database database = new Database(new File("./"), Version.DBASE_5);
		List<Field> fields = new ArrayList<Field>();
		fields.add(new Field("ID", Type.CHARACTER, 100));
		fields.add(new Field("NOME", Type.CHARACTER, 100));
		fields.add(new Field("TELEFONE", Type.CHARACTER, 100));
		fields.add(new Field("EMAIL", Type.CHARACTER, 100));
		
		Table table = null; 
		
		try {
			table = database.addTable("CONTATO.DBF", fields);
			table.open(IfNonExistent.CREATE);
			
			Map<String, Value> record = new HashMap<String, Value>(4);
			record.put("ID", new StringValue(UUID.randomUUID().toString()));
			record.put("NOME", new StringValue("José"));
			record.put("TELEFONE", new StringValue("+55 [telefone removido]"));
			record.put("EMAIL", new StringValue("[email removido]"));
			
			table.addRecord(new Record(record));
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				table.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

Esse exemplo foi feito usando a versão beta-10.
http://sourceforge.net/projects/dans-dbf-lib/files/dans-dbf-lib/beta-10/

L

O metodo não ta completo ainda por isso joguei ele no main e deu isso. A minha versão é a 10 beta. Esse é o erro do console.

[color=red]Exception in thread “main” java.lang.Error: Unresolved compilation problems:
The constructor Table(File, String) is undefined
The method open(IfNonExistent) is undefined for the type Table
The method close() is undefined for the type Table

at comunicacao.InsereDbf.insereDbf(InsereDbf.java:22)
at gui.Main.<init>(Main.java:84)
at gui.Main.main(Main.java:445)

[/color]

J

Cara quando acontecer esse tipo de erro procure o javadoc da lib que estais usando.
Dans DBF -> http://dans-dbf-lib.sourceforge.net/apidocs/index.html
Se você ver no javadoc da classe Table veras que o construtor existe sim…
Porém se você observar os import’s da sua classe veras que você importou a classe errada… veja.

import com.lowagie.text.Table; // essa é a sua importação

correto

import nl.knaw.dans.common.dbflib.Table;

Agora tente algo como.

nl.knaw.dans.common.dbflib.Table table = new nl.knaw.dans.common.dbflib.Table(new File("./NOTA.DBF"), "UTF-8");
L

Muito obrigado Jweibe me ajudou muito. Desculpe a falta de experiência. Valeu cara!

Criado 15 de janeiro de 2013
Ultima resposta 6 de mar. de 2013
Respostas 24
Participantes 4