quinta-feira, 30 de setembro de 2010

Delphi XE (2011) + ZeosLib 7 + PostgreSQL 9.0

Hoje instalei o recem lançado Embarcadero RAD Studio XE e gostei do que encontrei nele. Também pretendo escrever algumas notas sobre essa versão nos próximos dias.
Há algum tempo eu escrevi um pequeno passo-a-passo de como instalar o pacote de componentes ZeosLib no Delphi 2010 (http://flovato.blogspot.com/2009/10/zeoslib-for-delphi-2010.html) e hoje volto novamente a esse assunto mas com uma abordagem levemente diferente.
Também, a poucas semanas atrás, tivemos o lançamento da versão 9.0 do PostgreSQL e fiquei curioso para saber o quanto essa nova versão é suportada pelo ZeosLib.


Download
A última versão oficial, estável e disponível do ZeosDBO é a versão 6.6.6 que foi lançada em 30 de Dezembro de 2009 e oferece suporte para o Delphi 5 até Delphi 2007 (Delphi 11).
A versão 7.0 já era ansiosamente aguardada pelo público que utilizava desde o Delphi 2009 devido ao suporte UNICODE e, ainda hoje, continua em desenvolvimento e sem data certa para lançamento.
No artigo anterior foi utilizado uma revision alfa do ZeosLib 7 e, da mesma forma, iremos utilizar a revision mais recente do branch testing para o Delphi 2011 (XE).

Faça o checkout do branch de teste do ZeosLib (svn://zeos.firmos.at/zeos/branches/testing) para um diretório qualquer.
Se seu client svn for de linha de comando, abra o prompt de comandos e desloque-se até o diretório onde deseja fazer o checkout e execute o comando:
svn checkout svn://zeos.firmos.at/zeos/branches/testing.

Caso tenha instalado o Tortoise ou qualquer outro client svn, o procedimento é ainda mais fácil.


Nesse artigo o diretório D:\Delphi\Componentes\ZeosDBO2011\ será o local escolhido para o checkout, sendo utilizado como diretório base. Assim, no caso de você escolher um caminho diferente, basta reajustar as configurações no passo-a-passo de instalação para esse novo caminho.

OBS: A revision utilizada durante a escrita desse artigo foi a r822.
Além disso, se tiver dúvidas de como realizar o checkout, há uma imensa quantidade de tutoriais que explicam detalhadamente esse tema (link de pesquisa).
Por último, há a possibilidade de você baixar diretamente do sourceforge (http://sourceforge.net/projects/zeoslib/files/Zeos%20Database%20Objects/), quando assim uma release for disponibilizada.

Se tudo estiver correto, o pacote irá apresentar uma estrutura de diretórios igual ou muito semelhante ao da imagem abaixo.


Instalando o Pacote

O procedimento de instalação é bastante simples:


1. Abra o IDE do Delphi com permissões de administrador. Apesar de não ser obrigatório, deixo como uma forte recomendação em decorrência de problemas que tive em outras ocasiões.

2. No IDE do Delphi, clique na opção "Open Project" no menu "File" e vá até o subdiretório "\packages\delphi15" do local onde o foi feito o checkout do ZeosLib. Lá, abra o grupo de projetos ZeosDbo.groupproj.
OBS: O "15" nesse path identifica a versão do Delphi que, nesse caso, refere-se ao Delphi XE. Caso esteja utilizando uma outra versão, deve-se abrir o grupo de projetos correspondente a essa versão (Delphi13 = Delphi 2009; Delphi14 = Delphi 2010; Delphi15 = Delphi XE; ...).

Uma segunda dica para aqueles que já possuem o ZeosDBO 7 instalado e querem atualizá-lo, recomendo que, antes de iniciar a instalação, remova a versão atual do IDE e, após isso, delete todos os arquivos criados no último build (.dcp, .dcu, .loca, .identcache, .dsk, .map e .bpl).
Esses últimos podem ser encontrados na pasta "build" (\packages\delphi15\build). Assim, certifique-se de que essa pasta não contenha arquivos.

3. Build todos os projetos (menu Project -> Build All Projects);

Se tudo estiver OK, o Delphi irá informar a ocorrência de muitos hints e warnings durante o build dos packages. Não se preocupe, por hora vamos considerar que essas notificações não representam problemas.


Entretanto, muito provavelmente será apresentar uma mensagem de erro informando não ter encontrado um determinado arquivo fonte (Exemplo: "... [DCC Fatal Error] ZCore.dpk(51): F1026 File not found: 'ZVariant.dcu' ...").
Para corrigir isto basta apenas localizar o respectivo arquivo mencionado na mensagem de erro a partir do subdiretório "src" no local onde o checkout foi feito e acrescentar o caminho completo no Libray Path do Delphi (Menu Tools -> Options -> Environment Options -> Delphi Options -> Library).

Para evitar essa e várias outras notificações informando não ter encontrado um arquivo específico, acrescente cada um dos subdiretórios presentes no diretório raíz do ZeosLib no Library Path, como é mostrado na imagem abaixo.


Garanta que todas essas sete entradas, destacadas na imagem acima, estejam presentes no Library Path do Delphi. Especialmente a última, porque a compilação não irá emitir uma mensagem de erro se tal entrada não estiver presente. Entretanto, contribuirá com um efeito indesejado na hora de instalar o pacote de componentes.

Observe que na definição dos paths eu utilizo "$(DelphiComponents)\".
Na minha estação de trabalho há uma variável de ambiente chamada DelphiComponents que tem a finalidade de referenciar o diretório onde todos os componentes/pacotes de terceiros estão localizados.
Isso facilita a migração e uso de versões diferentes de componentes sem que seja necessário a reconfiguração dos path nos projetos ou no IDE do Delphi.
Caso não tenha ou não queira adicionar essa variável de ambiente, apenas substitua "$(DelphiComponents)\" pelo path onde o ZeosDBO está localizado (que nesse artigo é  D:\Delphi\Componentes\ZeosDBO2011).


OBS: Se após acrescentar os diretórios na Library Path o Delphi continuar exibindo a mensagem de erro, basta fechá-lo e reabrí-lo. Não esqueça de reabrí-lo com permissões de administrador!



4. Instale o pacote de componentes selecionando a opção "Install" (no menu de contexto) do pacote "ZComponentDesign150.bpl";


Se ao tentar instalar o pacote "ZComponentDesign150.bpl" for apresentado uma mensagem de erro igual ao da imagem abaixo, isso significa que o Delphi não encontrou o arquivo .BPL específico.


A forma mais prática e rápida de corrigir esse problema é colocando o diretório onde tal .BPL está localizada no System Path.
Observe que ao ser buildado os pacotes do ZeosLib, será criado um diretório chamado build localizado no subdiretório ".\packages\delphi15".
Assim, basta acrescentar esse caminho (D:\Delphi\Componentes\ZeosDBO2011\packages\delphi15\build) na lista de diretórios da variável de ambiente "PATH".


OBS: Qualquer alteração nas variáveis de ambiente irá requerer fechar e abrir novamente o Delphi, para que as alterações tenham efeito.

Se ao tentar instalar o pacote "ZComponentDesign150.bpl" for apresentado uma mensagem de erro igual ou semelhante ao da imagem abaixo, muito provavelmente ocorreu um descuido na especificação dos path do ZeosDBO.

Classifico como descuido porque esse erro foi ocasionado quando estava tentando instalar o ZeosDBO que estava em um path diferente daquele referenciado no System Path e no Library Path (no IDE do Delphi).
Assim, garanta que todos os path apontem exatamente para o diretório onde o ZeosDB está localizado.

Se tudo correr bem o Delphi irá apresentar um dialog informando a lista dos componentes que foram instalados.


5. Validando a instalação do pacote
Opcionalmente, você pode confirmar se a instalação realmente está consistente verificando os pacotes de componentes instalados no Delphi.
Para isso acesse o menu Component -> Install Packages ... e localize a entrada "Zeos Database Components".


Muitos tem relatados que mesmo a instalação do pacote ter sido bem sucedida, o Delphi não mostra a paletta de componentes do ZeosDBO.
Isso ocorre porque algum dos passos acima foi pulado ou não realizado de forma correta. E, normalmente, a razão do problema reside em dois pontos:
1º. Esqueceu de acrescentar a pasta de build ($(DelphiComponents)\packages\delphi15\build) no Library Path;

2º. Não especificou a pasta de build do ZeosDBO no System Path;

Uma forma fácil de confirmar isso é digitar “set path” no prompt de comandos.
Observe que na imagem abaixo o caminho "D:\Delphi\Componentes\ZeosDBO2011\packages\delphi15\build" está presente.




Conexão com PostgreSQL 9.0
A primeira questão a ser verificada é se essa versão do ZeosDBO consegue, ao menos, conectar-se ao PostgreSQL.
Nesse ponto é assumido que você já tenha instalado o PostgreSQL 9.X.

Para esse teste básico, um novo projeto foi criado e um componente TZConnection foi dropado no formulário.
Observe na imagem ao lado que a conexão foi efetuada com sucesso sobre a própria base de dados do postgres (metadados).
Um ponto a ser destacado é que na lista de protocolos (propriedade Protocol) não há um item "postgresql-9", como esperado. Assim, a opção mais provável foi utilizar "postgresql-8".
Penso que com o tempo seja acrescentado uma opção exclusiva para a versão 9 do postgresql, já que essa introduz mudanças significativas.

A configuração do componente TZConnection no DFM é apresentado como:

  object ZConnection1: TZConnection
    Properties.Strings = (
      'codepage=UTF8'
      'client_encoding=UTF8')
    AutoCommit = False
    Connected = True
    Protocol = 'postgresql-8'
    HostName = '127.0.0.1'
    Port = 5432
    Database = 'postgres'
    User = 'postgres'
    Password = 'MinhaSenha'
    Left = 126
    Top = 16
  end

Após configurar o componente e alterar a propriedade Connected para True, pela primeira vez, uma notificação de erro igual ao da imagem abaixo foi apresentada.


Esse é um problema clássico que é resolvido de duas maneiras: 1) Copiando os devidos arquivos para a pasta do projeto; ou 2) Acrescentando o diretório onde tais arquivos se encontram no PATH do sistema.
Todas as DLLs estão localizados no subdiretório "bin" do diretório de instalação do PostgreSQL (provavelmente C:\Program Files\PostgreSQL\9.0\bin).


Como mostra a imagem acima, a solução escolhida foi acrescentar o diretório de instalação do PostgreSQL no Path do sistema para que não seja necessário ter que copiar novamente as DLLs para novos projetos que usem o ZeosDBO.
Após isso só foi necessário fechar e reabrir o Delphi e a conexão ocorreu como esperada.


Realizando consultas
Após uma conexão bem sucedida, realizei alguns testes com os componentes básicos para exibir os registros das tabelas.
Na imagem abaixo pode-se notar o componente DBGrid exibindo informações da tabela "information_schema.table".


Apesar de ter realizados alguns poucos testes básicos em modo de design, aparentemente os componentes estão funcionando bem. Não notei qualquer tipo de falha.
Para validar prováveis problemas de suportes que muitas vezes são observados em circunstâncias específicas ou após um bom tempo de uso, resolvi migrar todo um sistema desenvolvido no Delphi 2010 para o Delphi XE.
Esse sistema possui um framework de banco de dados baseado no ZeosDBO e, em teoria, buildar e executar esse sistema através do Delphi XE iria expor qualquer falta de suporte para com o PostgreSQL 9.0, já que esse framework faz uso moderado dos recurso/componentes do ZeosDBO e o sistema possui uma base de dados relativamente grande.


Migrando o sistema para o Delphi XE
Imaginei que seria mais trabalhoso, mas praticamente não foi preciso fazer muita coisa.
Ao abrir o grupo de projeto desse sistema que foi criado no Delphi 2010, o Delphi XE nem mesmo realizou qualquer tipo de conversão de formato.
O único trabalho que tive foi substituir, na cláusula require dos projetos a referência de alguns pacotes de componentes de terceiros (por exemplo: substituir tms2010 por tms2011). O que não custou mais do que 30 minutos.
Só encontrei problemas com alguns pacotes de terceiros que estavam sendo utilizados. Entretanto, para todos já havia uma versão mais recente que suportavam o Delphi XE. Assim, o trabalho real foi instalar as versões novas desses pacotes, com exceção de um deles que necessitou alguma intervenção manual.

Bom, aqui o que nos interessa é a suporte do ZeosDBO ao PostgreSQL 9.0 e em relação a isso surpreendentemente não foi necessário modificar uma linha se quer do framework de banco de dados (esse framework foi criado em 2008 com a ainda recente versão 6.6.4 do ZeosDBO!). O sistema foi buildado 100% sem qualquer problema (apenas alguns poucos hints).
O foco desse post não é a migração de sistemas para o Delphi XE, mas a experiência foi muito positiva. E encorajo qualquer um que use o Delphi 2010 para fazer esse upgrade.
Inicialmente fiquei pensando que era bom demais para ser verdade e que bastaria rodar o sistema para as cores de cabeça aparecerem. Para minha felicidade, o software executou normalmente passando com sucesso em todos os testes automatizados.


Conclusão
Tenho a total consciência que por mais amplo que seja a utilização dos componentes e das funcionalidades do ZeosDBO nesse framework de banco de dados, é precipitado concluir que a versão alfa da versão 7.0 seja totalmente compatível com o PostgreSQL 9.X, mas sinto-me tranquilo para incentivar a qualquer um que já esteja pensando em fazer algum tipo de migração/upgrade parecido para que o faça.

24 comentários:

Elton Pereira disse...

Muito o post!!!

Apenas uma coisa a acrescentar ao utilizar o Zeos conectando ao PostgreSQL:

- Na propriedade PROPERTIES acrescentar as seguintes linhas:
codepage=UTF8
client_encoding=UTF8

Isso fará com o que Zeos reconheça caracteres especiais e acentos. Caso contrário, ele os exibirá de forma incorreta\distorcida.

Paulo disse...

EPR
Referente ao seu comentario:
- Na propriedade PROPERTIES acrescentar as seguintes linhas:
codepage=UTF8
client_encoding=UTF8
Estou desenvolvendo em Delphi 2010 com ZEOS 7. O PG 8.4 (ou 9) será armazenado no Linux: neste caso como configurar o PG (com UTF8) e o ZEOS quanto 'locale', 'client_encoding'?

Boris disse...

Olá,

Executei os procedimentos listados no seu texto. Ao término recebi a confirmação de instalação com sucesso, mas os componentes não aparecem na paleta.

Ao tentar editar recebo a informação de que a bpl zcomponentdesign150.bpl não foi encontrada.

Nota: Atualizei o path do windows e reiniciei tanto o windows quanto o Delphi.

Uso Windows7, DelphiXE, Zeos revisão 835.

Um abraço.

Unknown disse...

Caro, Fabius Lovato, tentei instalar o zeos 6.6.6 conforme seu artigo, mais encontrei um problema ao dar um Build All Projects. Ele para aqui: ZPlainSqLite3.sqlite_open(PAnsiChar(AnsiToUTF8(FileNameString)), Result0)

E mostra as seguntes mensagens de erro do compilador:
[DCC Error] ZPlainSqLiteDriver.pas(839): E2010 Incompatible types: 'PWideChar' and 'PAnsiChar'
[DCC Fatal Error] ZPlain.dpk(403): F2063 Could not compile used unit '..\..\src\plain\ZPlainSqLiteDriver.pas'
[DCC Fatal Error] ZComponentDesign.dpk(36): E2202 Required package 'ZPlain' not found

Poderia me ajudar?

Elton Pereira disse...

Paulo, quanto à sua dúvida...

Quando você for criar o banco, já deve colocar o CHARSET para UTF8 e, nas tabelas, o client-encoding para UTF8 também.

Unknown disse...

Caro Fabius,
instalei no meu Delphi 7 e PostgreSQL 8.1,
mas os carateres com acento não aparecem corretamente.
Claro que coloquei em Properties os valores mencionados.

Será da versão do Delphi?

Obrigado.

Cumps.
Jorge

Pixel Perfect Beauties disse...

EPR, obrigado pela dica, me salvou :D

Ítalo Oliveira disse...

Bem pessoal..irei passa uma forma que conseguir instalar o zeos rÁpido e sem problemas

1° cria uma pasta no diretório "lib" caso do delphi xe. exemplo
"pasta Zeos"

2° copie todos arquivos do zeos para essa pasta e abra o delphi xe, navegue até Packages\delphi15 e selecione sergurando o ctlrl todos e somente os arquivos de extensão "DPROJ" ou "DPK" e manda excutar(compilar) todos de uma vez só, no delphi xe ira aparece erros ..deixa pra lá.
3°vá Menu Tools -> Options -> Environment Options -> Delphi Options -> Library).e indique os diretórios da pasta Src, na pasta Zeos que você criou no diretório lib do delphi xe de um por um, pronto!!!

4° vá na pasta Packages\delphi15\build do Zeos e copie todos e somente os arquivos com extensão "bpl"que foram gerado na compilação para a pasta pasta bin do delphi xe.

5° abra o delphi xe e vá em Component e escolha a opção Instal Packages... logo depois vá em add e va até no diretório que você criou com nome Zeos na pasta lib do delphi xe. o diretório é:Packages\delphi15\build e escolha o arquivo de extensão "bpl" chamado:"ZComponentDesign150.bpl"

PRONTO TUDO ESTARÁ INSTALADO E FUNCIONANDO BEM!!!!

Љубомир Ђокић disse...

Worked like a charm.
For those using MySql and UTF-8, put OnAfterConnect of TZConnection:

procedure Trdm.ZConnection1AfterConnect(Sender: TObject);
var qryUpit:TZQuery;
begin
qryUpit := TZQuery.Create(nil);
qryUpit.Connection := ZConnection1;
qryUpit.SQL.Add('SET NAMES utf8');
qryUpit.ExecSQL();
qryUpit.SQL.Clear;
qryUpit.SQL.Add('SET CHARACTER SET utf8');
qryUpit.ExecSQL();
qryUpit.SQL.Clear;
qryUpit.SQL.Add('SET character_set_client=utf8');
qryUpit.ExecSQL();
qryUpit.SQL.Clear;
qryUpit.SQL.Add('SET character_set_connection=utf8');
qryUpit.ExecSQL();
qryUpit.Free;
end;

Thanks Fabius

Luis disse...

Perfeito

Diferente dos outros posts, este resolve a maior parte dos problemas.
Mto bom!

Alessandro disse...

Para quem esta com problema de não aparecer os componentes na palete eu também tive esse problema e resolvi atravéz de variavel de ambiente!
eu não utiliza, apenas apontava o caminho no path porém se não fizer usando as variáveis de ambiente não rola...

aninha_1738 disse...

Parabéns, Fabius, teu post está excelente, muito bom!!
Estou com problema com Zeos no Delphi 2011 de não aparecer os componentes na palete, eu fiz iqual a sua instalaçao e nada...
me ajuda, seria bug no zeos ?

Anônimo disse...

PARABÉNS PELO POST !!!

Cara muito obrigado por compartilhar, grande Abraço!

Unknown disse...

Ola estou com problema de não aparecer os componentes na palete de componentes como faco para resolver este problema ou como usar a variavel ao em vez de apontar..

Hugo disse...

cara... na hora em que vo build all projects ele compila tds blz exeto o componentdesign150 (uso delphi xe), da erro com uma variavel nao declarada chamada TZPgEventAlerter que está declarada sim.. e se excluo o ZComponentDesign150.bpl, ele não aparece a opçao de instalar no ZComponent150.bpl

Lacy disse...

Thanks Fabius, you solved my character encoding problem! :)

Marcos Silva disse...

Excelente post, bem minucioso, acredito se o unico post que realmente ajude na instalação do Zeos. Parabens e valeu!!!!!

Bill disse...

Olá, eu instalei o zeos 7 no delphi xe2 e deu muito trabalho pois os pacotes estavam com muitos erros. Mas o meu problema é o seguinte: estou tentando conectar com o Postgresql 9, utilizando o protocolo 8 e da o erro: Unsupported protocol: postgresql-8. Alguem teve esse mesmo problema e conseguiu resolve-lo. Não quero ter que utilizar a versão 8 do postgresql.

Agradeço desde já.

jccordeiro@globo.com disse...

Instalei no XE2 e deu td certo .. vlw Fabius ... Abçs

Anônimo disse...

Look here:

http://zeos.firmos.at/viewtopic.php?t=3427

all charcter-problems are solved...

Best regards,

EgonHugeist Zeos Dev Team

jimerson disse...

Boa noite pessoal.
Uso o Postgresql9 com ZeusLib 7... já copiei todas as dlls da pasta bin do postgresql para a pasta do projeto, setei a variável de ambiente apontando para a a pasta bom do postgre e tb nao funcionou. Reparei q a versão 9 do postgre nao possui a ddl libpq81.dll. acredito que seja por isso q nao funcione.

alguém tem alguma idéa pra resolver o problema?
Grato. boa noite

Anônimo disse...

Also the XE2 issues are solved.

An advice:
use TZConnection.ClientCodePage := 'UTF8' for example. It is equal to 'set names=utf8'.

EgonHugeist

ZeosDevTeam

Anônimo disse...

Cara eu já estava inquieto que não esta conseguindo instalado do XE3, foi quando vi que vc disse pra rodar o Delphi como administrador.... BATATA.... Deposi de rodar como administrador instalou normal sem minimo de trabalho. Obrigado e apesar de ser meio antigo o post ajudou muito...

Unknown disse...

Olá, vocês não tem tido problema com o caracter "\" no meio de um campo texto qualquer.

Tipo a frase "OBSERVAÇÃO TESTE \ QUALQUER COISA", quando colocada em um campo texto qualquer no sistema e dado um post, quando fecho a tela e carrego novamente o registro, a barra foi transformada em \134, tipo: "OBSERVAÇÃO TESTE \134 QUALQUER COISA"

Uso postgre 9.1, delphi xe2 e campos DBEdit normais do Delphi.

Desde já agradeço,

Leandro