Arquivos mdb (MS Access) sem ODBC

Trabalhar com arquivos MDB do Microsoft Access no Windows pode ser um tanto fácil via ODBC, mas o mesmo não é verdade em outros sistemas operacionais. Garantir a portabilidade do projeto ao se trabalhar com esse tipo de tecnologia é um desafio que vamos explorar nesse artigo.

A maioria do conteúdo que se encontra pela web tenta trabalhar com arquivos .mdb criando uma ponte JDBC-ODBC e embora você possa encontrar bons drivers ODBC, o único gratuito que encontrei para Linux foi o libmdbodbc (via repositório apt: apt-get install libmdbodbc mdbtools), porém o mesmo não suporta result set, impedindo o seu uso com o Talend/Java. Apesar disso, em conjunto com o pacote mdbtools essa é uma boa ferramenta para explorar arquivos mdb, permitindo executar queries, listar tabelas… tudo fora do Talend, claro.

Há também a possibilidade de obter drivers puramente JDBC, como o desenvolvido pela HXTT, porém esta não é uma solução gratuita. Você pode fazer o download de um trial por 30 dias, mas o result set das queries tem um limite de 1000 registros.

Assim sendo, utilizaremos um método não JDBC, tampouco ODBC, através da biblioteca Jackcess. Esta biblioteca contém uma série de funcionalidades que nos permite trabalhar com este tipo de tecnologia. Demonstrarei agora como utilizar algumas destas funcionalidades e ler o conteúdo de tabelas em arquivos access.

Primeiramente você deve ir até o site do projeto Jackcsess e realizar o download da biblioteca. Feito isso vamos carregar esta biblioteca em nosso job. Para isso utilizamos o componente tLibraryLoad, conforme na imagem abaixo:

Demonstração do componente tLibraryLoad

Observe que para carregar uma biblioteca que não está na listagem do componente, basca clicar no botão à direita da combo box e apontar para o arquivo com extensão .jar desejado. Além disso, observe também que temos três componentes tLibraryLoad neste job, isto se deve ao fato da biblioteca Jackcess possuir duas dependências: as bibliotecas commons-logging.jar e commons-lang-2.6.jar, ambas já existentes na listagem de bibliotecas do Talend.

Agora que já carregamos as bibliotecas necessárias, partiremos para a leitura dos dados do arquivo. Suponha que desejamos carregar estes dados em um Mysql. Utilizaremos então dois componentes: tJavaFlex e tMysqlOutput.

O componente tJavaFlex possui uma funcionalidade mesclada dos componentes tJava e tJavaRow. Através dele você pode trabalhar o código em três partes diferentes: Begin, Main e End. Mas antes que possamos compreender isto vamos definir o schema da tabela que pretendemos ler. Se você está em um ambiente Windows pode simplesmente abrir o Microsoft Access para obter os metadados da tabela, mas caso esteja em um ambiente Linux e tenha instalada a ferramenta mdbtools, pode executar o comando:

mdb-schema arquivo.mdb

Este comando irá listar os metadados de todas as tabelas existentes neste arquivo, e então você poderá utilizar o resultado deste comando para definir o schema do componente tJavaFlex.

Feito isso, vamos ao código que irá ler uma das tabelas e mapear o conteúdo obtido com as colunas definidas em nosso schema. Primeiramente, vamos importar as classes utilizadas, nós já carregamos as bibliotecas com os componentes tLibraryLoad, mas temos que dizer ao Java quais classes especificamente pretendemos utilizar destas bibliotecas. Para isso vá até o componente tJavaFlex e na aba Advanced:

Classes a serem importadas

Tendo importado as classes acima, vá até a aba Basic do componente tJavaFlex:

Esta aba será dividida basicamente em três partes: Start code, Main code e End code. Todo o código escrito dentro de Start code é executado uma única vez em um fluxo de dados: no início. Já o código escrito em Main code será executado linha a linha, permitindo que realizemos transformações ou meramente propaguemos dados obtidos. E por fim o código escrito em End code será executado uma única vez ao finalizar o fluxo de dados.

Esta abordagem nos permite definir no Start code o cabeçalho de um loop enquanto no Main code teremos basicamente o “corpo” do loop, onde estamos propagando o conteúdo das colunas obtidas para o fluxo “row3” que é aquele “levando” dados para o componente tMysqlOutput. Observe como no campo End code meramente fechamos o corpo do loop for com uma chave.

Além disso, no campo Start code criamos um objeto do tipo Table que recebe o resultado do método getTable, que por sua vez foi executado em um objeto do tipo Database obtido através do método Database.open(). Este objeto do tipo Table é o que nos permite executar um loop e obter os campos desejados de cada registro da tabela especificada, conforme você pode notar na declaração do loop for e no campo Main code.

Esta foi uma breve solução, você pode obter muito mais com a biblioteca Jackcess, existe uma boa documentação da API aqui.

Até a próxima.

Anúncios

Primeiro job: Arquivo delimitado para MySQL

Neste artigo você aprenderá a:

  1. Criar um repositório local;
  2. Criar um projeto;
  3. Criar um job;
  4. Definir Metadados e Conexões com bancos de dados;
  5. Carregar os dados de um arquivo de texto em um banco de dados;

Introdução

Requisito: Antes de começar, você irá precisar deste arquivo, que será a origem de nossos dados.

Como já foi demonstrado neste artigo, é possível importar um projeto de demonstração a partir da janela de projetos, porém hoje iremos criar nosso projeto do zero e então o nosso primeiro Job.

Após efetuar o download da ferramenta, não será necessária a instalação, apenas descompacte na raiz do disco (o caminho curto fará diferença). Dentro do diretório do Talend, há diversas opções de binários para diversos sistemas e arquiteturas, e para cada um destes binários há um arquivo .ini, onde são configuradas as opções de memória da JVM.

Para o Windows há três executáveis: x86, x86_64 e WPF. O WPF é um subsistema para renderização de interface gráfica que utiliza DirectX que está para o Windows assim como o GTK está para Linux, porém não recomendo sua utilização pois ele ainda está em fase de portabilização no Eclipse sendo apenas uma herança para o Talend.

Para Linux há também três alternativas: x86, x86_64 e PPC (power pc) e todas utilizam o GTK.

Escolha o binário de acordo com a arquitetura de seu processador para que possamos partir para a criação de nosso projeto.

Nota: Você deve ter notado a forte ligação entre o Talend e o Eclipse, acontece que o Talend é desenvolvido como um plugin para o Eclipse, porém não é possível obtê-lo à parte.

Criando um repositório local

Então iremos criar um primeiro projeto em branco, mas antes disso é necessário criar um repositório onde serão armazenados nossos projetos.

As versões gratuitas permitem apenas a criação de repositórios locais, portanto no campo Workspace defina o diretório onde seus projetos serão armazenados, dê um nome a seu repositório e defina um e-mail válido.

Criando um projeto

Após criado o repositório, na tela de projetos poderemos criar um projeto selecionando a opção “Create a new local project” e “Go!“. Dê um nome a seu projeto, adicione uma descrição ao mesmo caso queira e escolha a linguagem utilizada (java ou perl), em nossos tutoriais utilizaremos a linguagem java. Feito isso clique em “Finish” e depois abra o projeto.

Nota: Ao abrir seu primeiro projeto o Talend provavelmente irá pedir seu e-mail, isto é opcional caso deseje obter newsletters sobre a ferramenta.

Criando um Job

A primeira tela a ser exibida na suite é a de boas vindas, feche-a e na próxima janela você terá à sua esquerda o repositório de seu projeto.

Nota: Uma caixa de diálogo com a informação Generation Engine irá aparecer, é recomendável que você aguarde a conclusão, se quiser clique em Run in background mas não cancele este processo.

Dentro de repositório, clique com o botão direito em Job Designs e selecione a opção Create Job. Um assistente irá surgir onde você poderá atribuir nome, propósito, descrição, versão e status ao novo job.

Ao concluir a criação do job, no centro de sua tela, na seção conhecida como Design Workspace um novo job em branco irá surgir.

Definindo Metadados

Arquivo

Para realizarmos a carga de nosso arquivo de texto em um banco de dados, precisamos primeiramente definir os metadados de nosso arquivo e nosso banco de dados.

Dentro do repositório, expanda a seção Metadata, lá você verá os metadados do projeto separados por tipo.

Primeiro vamos definir os metadados de nosso arquivo, por se tratar de um arquivo de texto delimitado por ponto e vírgula, clique com o botão direito em File Delimited e selecione a opção Create file delimited. No assistente que se abrir, dê um nome para o arquivo e clique em Next. Na próxima janela defina o caminho para o arquivo e sua codificação.

Na próxima etapa poderemos definir detalhes sobre a estrutura de nosso arquivo, como caracteres separadores de campos e linhas, linhas a saltar no início ou fim do arquivo ou mesmo limitar o número de linhas a serem lidas. Para o nosso arquivo, iremos definir um salto de 5 linhas iniciais, pois são comentários no cabeçalho do arquivo. Além disso, iremos marcar a opção Set heading row as column names para que a primeira linha após as 5 primeiras ignoradas seja considerada como nome das colunas.

A próxima etapa é onde definiremos os nomes das colunas, chaves primárias, tamanho, precisão e tipo de dado dos campos de nosso arquivo. Como estamos definindo metadados para um arquivo de texto, o tamanho, precisão ou chave primária não farão diferença, mas é interessante definir, pois poderemos herdar estas informações para componentes de saída.

Nota 1: O assistente varre as primeiras 10 linhas do arquivo para tentar detectar o tamanho dos campos, mas é importante você se certificar destes tamanhos, pois como são apenas as 10 primeiras linhas, você pode obter erros como o seguinte:

Data truncation: Data too long for column ‘RegTime’ at row 54

Observe que o erro ocorreu na linha 54, impossível que o assistente detectasse previamente o tamanho do campo. Este é um erro que você irá obter neste arquivo de exemplo caso deixe os tamanhos conforme o assistente detectar. Portanto configure o tamanho dos campos conforme na imagem anterior.

Nota 2: Para campos do tipo Date, você deve definir um padrão para a data conforme ela está disposta no arquivo, como você pode verificar na imagem anterior. Para mais informações use esta página.

Agora que já definimos os metadados de nosso arquivo, vamos definir os metadados de nossa conexão com o banco de dados.

Banco de Dados

Neste exemplo iremos utilizar o MySQL. Ainda na seção Metadata, clique com o botão direito em Db Connections e selecione a opção Create Connection. No assistente que se abrir defina o nome da conexão e salte para a próxima etapa.

Nesta etapa você definirá o tipo do banco de dados e os detalhes da conexão. Em Db Type selecione MySQL para que as outras opções sejam disponibilizadas e então defina os metadados de sua conexão conforme na imagem.

Clique em Check para verificar se os detalhes estão corretos e caso sim clique em Finish.

Como iremos utilizar esta conexão apenas como saída, não será necessária a definição de metadados de tabelas.

Carregando os dados

Esta etapa é extremamente difícil e é importante que você preste muita atenção.

Passo1: Clique, segure e arraste os dois itens criados em Metadata para a área do Design Workspace. Você pode selecionar vários itens utilizando a tecla Ctrl e arrastar de uma só vez.

Para cada item arrastado, uma janela irá surgir lhe perguntando que tipo de componente você deseja criar a partir desse item.

Para o arquivo delimitado, selecione tFileInputDelimited e para o mysql selecione tMysqlOutput. Observe que cada componente criado nesta área possui um visual diferente.

Passo 2: Agora clique e segure com o botão direito no componente tFileInputDelimited e arraste até o componente tMysqlOutput.

Selecione o componente tMysqlOutput. Veja que na parte inferior da suite você possui algumas visões. Clique na aba Component.

Nesta aba você pode definir várias opções para o componente, mas como estamos herdando as opções do repositório, não será necessária muita configuração.

Vá até o campo Table e dê um nome à tabela destino, por exemplo, “cliente”. Logo abaixo você verá as caixas Action on Table e Action on Data.

Em Action on Table você pode definir se o job irá criar a tabela, se ele irá truncar quaisquer dados existentes ou se ele deverá realizar um drop a cada execução. Selecione a opção Drop if exists and create para que ele exclua a tabela e crie novamente a cada execução.

Nota: A ação “Default” é não fazer nada, ou seja, a tabela deverá existir antes da execução do job.

Em Action on Data você define a ação com os dados, ou seja, se o job deverá realizar exclusões, atualizações ou inserções de dados.

Nota: Há duas opções que parecem redundantes: Insert or Update e Update or Insert, a diferença entre estas opções é performática: caso você saiba que seu job irá executar mais inserts do que updates, você deve selecionar a opção Insert or Update, para que ele primeiro realize os inserts e depois os updates. Caso saiba que ele vai realizar mais updates, então Update or Insert.

Executando o job

Clique na aba Run e depois no botão Run. Você também pode utilizar a tecla F6.

Conclusão

Neste artigo foi demonstrado como o Talend facilita nas tarefas básicas como criação de metadados, possibilitando que você se dedique mais ao que realmente importa.