Buscar

Banco de dados via web

Código

Banco de Dados via Web  

Para a criação de aplicações Web, o Delphi oferece a tecnologia WebBroker, criada no Delphi 3 e aperfeiçoada nas versões 4 e 5. Com a tecnologia WebBroker, que compreende um conjunto de componentes e classes especializados para aplicativos Web seguindo os padrões CGI, WinCGI, NSAPI e ISAPI. E mais: toda a infra-estrutura do Delphi pode ser utilizada nesses aplicativos. Você não precisa aprender outra linguagem para programar para a internet!

     Elementos de um aplicativo Web

     Um aplicativo Web no Delphi é formado pelos seguintes elementos principais:

     WebModule: O WebModule é um descendente do DataModule, com recursos adicionais para a integração com servidores Web. No WebModule, podem ser adicionados quaisquer componentes não-visuais do Delphi, incluindo, por exemplo, todos os componentes da paleta Data Acess.

     Action Items: Os Action Items são criados dentro do WebModule. O código associado aos Action Items gera o código HTML, retornado pelo servidor.

     PageProducer: Os PageProducers (“produtos de páginas”) são componentes especializados para a geração automática de código HTML a partir de tabelas de banco de dados, consultas SQL e arquivos HTML. Neste artigo apresentaremos os produtores de páginas mais usados: o PageProducer e o DataSetTableProducer.

     O PageProducer

     O Componente PageProducer se baseia em uma String – ou um arquivo – com código HTML e tags transparentes. Esse String ou arquivo é chamado de template HTML. Os tags transparentes são tags especiais, com o seguinte formato:

     <#Nome param1=valor1 param2=valor2 param3=valor3 ...>

     O símbolo “jogo da velha” no inicio do tag faz com que o tag seja ignorado pelos browsers (daí o nome “tag transparente”). Para o componente PageProducer, no entanto, os tags transparentes têm um significado especial. Durante a geração do HTML pelo componente, esses tags são substituídos por comandos HTML comuns. Os comandos HTML usados na substituição são definidos pelo programador no evento OnHTMLTag.

     As principais propriedades do PageProducer estão descritas abaixo:

     HTMLDoc: A propriedade HTMLDoc contém comandos HTML e os tags transparentes a serem processados pelo PageProducer. Essa propriedade é do tipo TStrings e pode ser alterada diretamente no Delphi.

     As propriedades HTMLDoc e HTMLFile são mutuamente exclusivas: a alteração de uma delas automaticamente cancela a outra.

     HTMLFile: A propriedade HTMLFile especifica um arquivo com os comandos HTML e tags a transparentes a serem processados pelo PageProducer.

     Esta propriedade permite que um arquivo seja utilizado como base para a geração do HTML. A grande vantagem é que esse arquivo pode ser criado com editores de HTML especializados, como o Microsoft FrontPage ou o Macromedia Dreamweaver.

     Content: O método Content lê o código HTML na propriedade HTMLDoc ou nos arquivos HTMLFile, e gera o HTML final, com os tags transparentes substituídos.

     Evento OnHTMLTag

     O componente PageProducer apresenta apenas um evento: o evento OnHTMLTag. É nesse evento que é definido o código HTML usado para substituir os tags transparentes lidos pelo PageProducer. O evento é chamado uma vez para cada tag transparente encontrado.

     OnHTMLTag recebe vários parâmetros importantes. Veja quais são, no seguinte código básico do evento.

     Procedure TwebModule1.pageProducer1HTMLTag(Sender: Tobject; Tag: Ttag; const      TagString:String; TagParams: Tstring; var ReplaceText: String);
     Begin

     end;

     O parâmetro TagString recebe o nome do tag transparente. Para o tag transparente <#data> por exemplo, TagString seria “data”. O texto no parâmetro TagString deve ser verificado pelo programa, para determinar o código HTML a ser usado para a substituição do tag transparente.

     O parâmetro ReplaceText é passado por referencia para o código do evento OnHTMLTag. É inicialmente um String vazio. Dentro do código para evento, ReplaceText deve receber um String com o código HTML usado para substituir o tag transparente.

     Em TagParams são armazenados os parâmetros do tag transparente. Os parâmetros são armazenados na forma Nome=Valor e podem ser acessados usando as propriedades Names e Values. Por exemplo, para o tag:

     <#calendário ano=2001 mês=12>

     Teríamos o seguinte: TagParams.Names[0] = ‘mês’
     TagParams.Names[1] = ‘ano’
     TagParams.Values[‘ano’] = ‘1999
     TagParams.Values[‘mês’] = ‘12

     Caso o tag transparente não apresente parâmetros, os valores retornados para Values e Names serão Strings vazios.

     O DataSetTableProducer

     O componente DataSetTableProducer se especializa na produção de tabelas HTML a partir de tabelas de bancos de dados ou consultas SQL.

     O uso do componente é simples basta conectá-lo a um componente Table (ou outro DataSet), e definir a formatação desejada. A tabela HTML gerada pelo componente pode ser obtida, chamando o método Content. Como para o componente PageProducer, este método retorna um String com o código HTML gerado. As principais propriedades do componente DataSetTableProducer estão detalhadas abaixo:

     Columns: É a propriedade mais importante para a formatação da tabela HTML. Aqui se pode definir cores de fundo, alinhamentos e formatos numéricos, além de várias outras opções de formatação.

     DataSet: O DataSet (TTable, TQuery, etc.), associado ao DataSetTableProducer.

     Footer: O código HTML exibido do corpo da tabela HTML. O código pode conter tags transparentes para permitir a geração automática de código HTML por produtores de página.

     Header: O código HTML exibido antes do corpo da tabela HTML. Quando a tabela é gerada , o componente DataSetTAbleProducer gera primeiro o código definido na propriedade Header, depois o corpo da tabela e em seguida o código definido na propriedade Footer.

     MaxRows: O número máximo de linhas geradas para a tabela HTML. Mesmo que o DataSet contenha mais registros que o número especificado em MaxRows, apenas MaxRows registros serão gerados para a tabela HTML. A idéia é evitar que as tabelas imensas, com milhares de registros sejam geradas automaticamente. Isso, no entanto obriga o usuário a alterar o valor de MaxRows em tempo de execução, ou a definir um número alto para essa propriedade. O valor padrão para MaxRows é 20.


     Um Navegador de Banco de Dados

     Criaremos agora um aplicativo Web completo, fazendo uso de componentes de acesso a dados e produtores de páginas HTML. O nosso aplicativo permitirá visualizar todas as tabelas de um banco de dados através da Internet.

     Etapa 1: Preparação

     Vamos começar criando o aplicativo Web e acrescentando todos os componentes necessários. Crie um novo aplicativo Web (use File | New > Web Serve Application), na próxima tela escolha o tipo Cgi Stand-alone Executable.

     Adicione ao WebModule criado os seguintes componentes: Database, Session, Table (paleta Data Access), PageProducer e DataSetTableProducer (paleta Internet). Veja deverá ficar o WebModule:
     


     

     Para o Database altere as propriedades DatabaseName para “Banco”, AliasName para “DBDEMOS” e LoginPrompt para “False”.

     Para o Session altere a propriedade AutoSessionName para “True”. O componente Session garante que não haja problema de concorrência no acesso ao banco.

     Para o Table, altere a a propriedade DatabaseName para “Banco”, TableName para “country.db” e Active para “True”.

     Ligue o DataSetTableProducer ao Table, alterando a sua propriedade DataSet.

     Salve o aplicativo em uma nova pasta chamada “NavBancos”. Chame a Unit do WebModule de “UnPrincipal.pas” e o arquivo de projeto de “NavBancos.dpr”.

     Etapa 2: O Formulário HTML e os Action Items

     Nesta etapa, criaremos o formulário HTML que será a interface gráfica do nosso aplicativo. Criaremos também os action items dentro do WebModule. Em um editor de texto qualquer (até no próprio Delphi), crie o arquivo HTML mostrado na figura abaixo.
     



   

     Note que as URLs (endereços Internet) especificadas começam com http://localhost/. Este é o endereço padrão para um servidor local. Salve o arquivo com “NavBancos.html” no mesmo diretório do aplicativo.

     A figura abaixo mostra como esse arquivo aparece no Browser.

   


   

     O arquivo HTML no Browser: Note que há dois “compartimentos”. Na parte esquerda será exibida a lista de tabelas; na direita serão mostrados os dados da tabela escolhida. A lista de tabelas será gerada pelo PageProducer e os dados da tabela pelo DataSetTableProducer.

     Selecione e copie todo o código do arquivo HTML e cole o texto na propriedade HTMLDoc do PageProducer.

     Clique duas vezes no WebModule e adicione dois action items. Chame-os de “ItemPadrao” e “Item AlteraTabela”. Altere a propriedade Default do action item “Item Padrão” para True. Altere também a propriedade PathInfo. Veja a figura abaixo:

   



     

     Etapa 3: Formatação da tabela HTML

     Vamos agora alterar algumas propriedades do DataSetTableProducer para que a tabela HTML gerada seja formatada de maneira adequada.

     Dê um duplo clique no componente DataSetTableProducer. Isso mostra um editor de propriedade Columns, com uma amostra da tabela HTML que será gerada. Figura abaixo mostra essa tela:    

   



   

     Altere a propriedade Border para "1" e a propriedade BgColor para “White”. Isso termina a alteração da propriedade Columns. Você pode fechar o editor de propriedades e “setar” a propriedade Active do Table para “False”.

     Vamos agora definir alguns formatos avançados para a tabela, que não podem ser definidos simplesmente através de propriedades.

     Para isso precisamos adicionar código ao evento OnFormatCell. Esse evento é chamado durante a geração da tabela HTML (depois da chamada do método Content), para cada célula gerada. Com esse evento, é possível formatar celular de acordo com o seu conteúdo ou posição na tabela.

     O evento OnFormatCell recebe vários parâmetros, com detalhes sobre a célula que está sendo gerada. Os parâmetros são passados por referencia; por isso podem ser alterados dentro do código do evento, para definir formatos especiasi, célula a célula. Veja quais são os parâmetros:

     CellRow e CellColumn: o número de linha e da coluna da célula.

     BgColor: a cor de fundo da célula.

     Align: o alinhamento da célula.

     CustomAttrs: atributos personalizados de formatação.

     CellData: o conteúdo da célula convertido para String.

     Para o nosso exemplo, queremos que a primeira linha apareça com uma cor diferente e que o restante das linhas tenham cores alternadas. O código necessário para o vento OnFormatCell do DataSetTableProducer é mostrado abaixo:

     // Este evento é chamado quando uma celula é gerada na tabela HTML
     procedure TWebModule1.DataSetTableProducer1FormatCell(Sender: TObject; CellRow, CellColumn: integer; var BgColor: THTMLBgColor; var Align: THTMLAlign; var VAlign: THTMLVAlign; var CustomAttrs, CellData: String);
     begin
       if CellRow = 0 then
       begin
         BgColor:= 'Navy';
         Align:= haLeft;
         CellData:='<font color="white">' + CellData + '</font>';
       end
       // Alterar cor das linhas pares para cinza claro
       else if CellRow mod 2 = 0 then
         BgColor:='Silver';
     end;

     Etapa 4: O código dos eventos

     O próximo passo é criar o código para os eventos dos componentes PageProducer e DataSetTableProducer e para os action items.

     Para o PageProducer, no evento OnHTMLTag, precisamos substituir os dois tags transparentes. Veja o código do evento OnHTMLTag do PageProducer:

     // Este evento é chamdo quando um tag transparente é encontrado
     procedure TWebModule1.PageProducer1HTMLTag(Sender: TObject; Tag: TTag; const TagString: String; TagParams: TStrings; var ReplaceText: String);
     var
       i, NumTabelas: integer;
       ListaTabelas: TStringList;
     begin
       // Substituir a tag <#ListaTabelas>
       if TagString = 'ListaTabelas' then
       begin
         // Ler os nomes e colocá-los em uma lista
         ListaTabelas := TStringList.Create;
         Session1.GetTableNames(Database1.AliasName, '*.*', True, False, ListaTabelas);
         NumTabelas := ListaTabelas.Count;
         // Gerar a lista de tabelas
         ReplaceText:= '<select name="NomeTabela" size=' + IntToStr(NumTabelas) + '>';
         For i := 0 to NumTabelas -1 do
         begin
           //Gerar item selecionado para a tabela atual
           if TabelaAtual = ListaTabelas[i] then
             ReplaceText:= ReplaceText + '<option selected>' + ListaTabelas[i]
           else
             ReplaceText:= ReplaceText + '<option>' + ListaTabelas[i];
         end;
         ReplaceText:= ReplaceText + '</select>';
         ListaTabelas.Free;
       end
       // Substituir a tag <#DadosTabela>
       else if TagString = 'DadosTabela' then
       begin
         // Usar o DataSetTableProducer para gerar uma tabela html a partir da tabela atual
         Table1.open;
         // Ajustar o número de linhas da tabela html para que todos os registros sejam gerados
         DataSetTableProducer1.MaxRows := Table1.RecordCount;
         // Fazer a substituição da tag transparente
         ReplaceText:= '<h3> Tabela: ' + TabelaAtual + '</h3>' + DataSetTableProducer1.Content;
         Table1.close;
       end;
     end;

     Obs: Deve-se incluir a variável “TabelaAtual” do tipo String, na seção “Public”.

     Precisamos também definir o código para os eventos OnAction de cada um dos dois action items. Veja detalhes sobre quando é chamado e o que faz cada um:

     ItemPadrao: Chamado quando o aplicativo (NavBancos.exe) é carregado. Aqui inicializamos algumas variáveis e geramos a pagina inicial, com a lista de tabelas pronta. A página completa é gerada chamando o método Content do PageProducer. Vejamos como fica o código:

     // Evento chamado quando o aplicativo é carregado
     procedure TWebModule1.WebModule1ItemPadraoAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
     begin
       try
         // Definir a primeira tabela que será apresentada
         TabelaAtual := 'country.db' ;
         // Usar o PageProducer para preparar a página inicial
         Response.content := PageProducer1.Content;
       Except
         // Retornar uma mensagem de erro caso haja alguma exceção
       on e: Exception do
         Response.Content := 'Erro! ' + e.Message;
       end;
     end;


     ItemAlteraTabela: Chamado quando o usuário escolhe uma tabela da lista de tabelas e clica no botão “Ver Tabela”. O código verifica se alguma tabela foi selecionada e, caso positivo, altera a tabela atual e gera o código HTML de novo, usando o PageProducer. Vejamos o código:

     // Evento chamado quando o usuário entra na tabela
     procedure TWebModule1.WebModule1ItemAlteraTabelaAction(Sender: TObject; Request:      TWebRequest; Response: TWebResponse; var Handled: Boolean);
     Var
       TabelaSelecionada : String;
     begin
       // Ler o nome da tabela selecionada
       TabelaSelecionada := Request.ContentFields.Values['NomeTabela'];
       if TabelaSelecionada <> '' then
         TabelaAtual := TabelaSelecionada;
       Table1.Close;
       Table1.TableName := TabelaAtual;
       // Usar o PageProducer para gerar o HTML depois da mudança de tabela
       Response.Content := PageProducer1.Content;
     end;

     Isso fecha o nosso exemplo. Para testar o aplicativo, crie uma pasta virtual no servidor Web (PWS) com o nome “NavBancos”, criada anteriormente. Ative as permissões de execução (opção “Executar”) da nova pasta virtual (veja um exemplo na figura abaixo).
 



 

     Depois salve o projeto e compile-o, depois chame-o usando a seguinte URL: http://localhost/NavBancos/NavBancos.exe. A página inicial gerada pelo aplicativo é mostrada na figura. abaixo:
 

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Banco de dados
Adicionada dia: 20/07/05
Por: Joaquim Estevam De Araujo Neto
Visualizada: 14444 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009