Esse artigo faz parte da revista Clube Delphi Edição 68. Clique aqui para ler todos os artigos desta edição

so-bidi-font-size: 12.0pt">Configuração/seleção da conexão com o banco de dados;

·                Seleção do tipo do relatório a ser montado;

·                Seleção da tabela do banco de dados;

·                Seleção dos campos da tabela especificada;

·                Definição dos filtros a serem aplicados na tabela especificada;

·                Seleção dos campos que serão utilizados na ordenação dos dados;

·                Visualização dos dados e da instrução SQL gerada;

·                Seleção da tecnologia a ser utilizada na geração do relatório e impressão do mesmo.

 

A idéia principal na criação desse assistente é torná-lo o mais genérico e flexível possível. Para que essas características sejam possíveis, utilizaremos o dbExpress e seus métodos de acesso a metadados do banco de dados.

 

Criando o assistente

Abra o Delphi 7 e inicie uma nova aplicação (File>New>Application). Altere o nome do formulário para “FrmAssistente” e salve sua unit como “untFrmAssistente.pas”. Para o arquivo de projeto dê o nome de “DynamicReport”. Adicione alguns componentes visuais e configure-os de acordo com a Figura 1.

 

Figura 1. Layout do assistente de geração de relatórios em tempo de design

 

Altere a propriedade tag do botão btnVoltar para “–1” e do botão btnAvancar para “1”. Utilizaremos essa propriedade para controlar a navegação entre as páginas do Notebook. Selecione o Notebook e através de sua propriedade Pages adicione nove páginas no componente (dê o nome que desejar às páginas).

 

Nota: Para selecionar uma página específica em tempo de design, utilize a propriedade ActivePage.

 

Utilizaremos a primeira página para adicionar uma mensagem de boas-vindas ao usuário. Adicione um Label à página e entre com uma mensagem de boas-vindas de acordo com sua preferência. Na segunda página mostraremos os drivers e conexões disponíveis nos arquivos de configuração do dbExpress, para que o usuário possa selecionar e configurar sua própria conexão com o banco de dados de sua preferência.

O Delphi armazena os drivers e conexões do dbExpress em dois arquivos INI (dbxdrivers.ini e dbxconnections.ini). Para localizar esses arquivos na máquina, faremos a leitura de duas chaves de registro, que armazenam o path de cada arquivo. Declare as units Registry e IniFiles no uses da unit do formulário. Na seção private da unit declare duas variáveis (do tipo string) de nome “drivers” e “conexoes”.

Utilizaremos essas variáveis para armazenar o caminho dos arquivos INI utilizados pelo dbExpress. Adicione na segunda página do Notebook dois ComboBoxes. Utilizaremos esses componentes para listar os drivers e conexões disponíveis nos arquivos INI do dbExpress. Altere os nomes dos ComboBoxes para “cbDriver” e “cbConexao”. Crie um método chamado “CarregarConfConexoes” e implemente-o como mostra o código da Listagem 1.

 

Listagem 1. Método CarregarConfConexoes

procedure TFrmAssistente.CarregarConfConexoes;

const

  chave = 'Software\Borland\DBExpress';

var

  registro: TRegistry;

  arqINI: TIniFile;

begin

  registro := TRegistry.Create;

  try

    with registro do

    begin

      if OpenKey(chave, False) then

      begin

        if ValueExists('Driver Registry File') then

          drivers := ReadString(

            'Driver Registry File');

        if ValueExists('Connection Registry File') then

          conexoes := ReadString(

            'Connection Registry File');

      end;

    end;

  finally

    registro.CloseKey;

    registro.Free;

  end;

  if (drivers <> '') and (conexoes <> '') then

  begin

    arqINI := TIniFile.Create(drivers);

    try

      arqINI.ReadSection('Installed Drivers',

        cbDriver.Items);

    finally

      arqINI.Free;

    end;

  end;

end;

 

Carregando os drivers e conexões

Através do método anterior, fazemos a leitura do registro do Windows para capturar o caminho dos arquivos INI e através do ReadSection  da classe TIniFile carregamos todos os drivers disponíveis no arquivo dbxdrivers.ini no cbDriver. No evento OnCreate do formulário faça a chamada ao método. Selecione o cbDriver e para seu evento OnChange digite o código da Listagem 2.

Através do evento OnChange carregamos o cbConexao com as conexões disponíveis para o driver selecionado pelo usuário no cbDriver. Adicione ainda na segunda página um ValueListEditor (Additional) para que possamos listar os parâmetros da conexão especificada no cbConexao de acordo com o driver selecionado pelo usuário.

Altere o nome do componente para “vleParametros”. Utilizando a propriedade TitleCaptions adicione os valores “Chave” e “Valor” para que os mesmos sejam utilizados nos títulos das duas colunas disponíveis no componente. Selecione o cbConexao e para seu evento OnChange digite o código da Listagem 3.

Através do ReadSectionValues da classe TIniFile carregamos para dentro do ValueListEditor todos os parâmetros disponíveis para a conexão especificada no cbConexao. Caso haja necessidade de alterar qualquer um dos parâmetros da conexão, o usuário poderá fazê-lo diretamente através do ValueListEditor. Adicione um DataModule a aplicação (File>New>Data Module) e altere seu nome para “DMAssistente”. Salve sua unit como “untDMAssistente.pas”.

Utilizaremos esse DataModule para armazenar os componentes de acesso a dados usados pelo assistente. Adicione um SQLConnection (dbExpress) e altere seu nome para “conexao”. Para finalizar a segunda página do assistente, vamos adicionar um botão (BitBtn) para que o usuário possa testar a conexão com o banco de dados.

Altere o nome do botão para “btnTestarConexao” e para sua propriedade Caption digite “Testar Conexão”. No evento OnClick adicione o código da Listagem 4. Através do arquivo dbxdrivers.ini configuramos as propriedades do SQLConnection de acordo com o driver e conexão selecionados pelo usuário.

Dentro de um bloco try..except tentamos fazer a conexão com o banco de dados, onde, caso ela seja efetuada, utilizamos o método GetTableNames para carregar a lista de tabelas do banco para dentro de um ComboBox (cbTabelas).

 

Listagem 2. Evento OnChange do cbDriver

procedure TFrmAssistente.cbDriverChange(Sender: TObject);

var ...

Quer ler esse conteúdo completo? Tenha acesso completo