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 “
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 ...