HOME      QUASI-BLOG        CONTATO         
 
 
 


Meu Primeiro Site ASP parte 3   retornar

Parte 1        Parte 2         Parte  3        Parte  4    Versão Impressa

Meu primeiro site ASP

Nosso Objetivo :  Construir uma pequena aplicação ASP com acesso a uma base de dados Access

Antes de prosseguirmos tornando o nosso código cada vez mais completo, complexo e real quero tentar reduzir o efeito “macarrônico” de misturar lógica e apresentação numa mesma página com o uso de FUNCTIONS e SUBROTINAS. 

Usando SUBROTINAS e FUNÇÕES é possível obter um código mais fácil de manter e de estruturar o nossos algoritmos.

Primeiro, vamos abordar a questão de usar tabelas para organizar o nosso visual, sabemos que precisamos ter uma TAG de abertura <TABLE> e uma de fechamento </TABLE>  e que entre elas fica a nossa apresentação. Sabemos que queremos ter uma cabeçalho interessante que se repete em todas páginas de nosso site e se ficarmos usando

<tr><td>

<img src="images/graficaonline_01.gif">

</td>

</tr>

 

 

Imagina o trabalho que teremos se depois de estarmos com 50 páginas prontas resolvermos mudar o nome da figura, ou nome diretório, ou ambos. O Dreamweaver resolve isso facilmente, no caso mudança de nome, mas as modificações pode ser bem mais complexas do que simplesmente mudar o nome da figura, você pode quere por exemplo acrescetar uma linha ao cabeçalho e nela colocar um menu horizontal, e agora ?  em 50 páginas, dói né ?

Em pretendo resolver usando subrotinas e include. Com a subrotina eu do mais clareza ao meu código com o include eu permito que as minhas subrotinas ou trechos de códigos possam ser incluidos nas 50 páginas, basta então alterar o include que todas as páginas se alteram automáticamente.

Mas nessas páginas de LISTAR algo no que elas se resumem ?

a)     conectar ao banco de dados

b)     executar um sql e recuperar um recordset

c)      imprimir um cabeçaho da página

d)     imprimir todas as linhas do recordset dentro de linhas de tabela

e)     e eventualmente imprimir um rodapé ( o que não fizemos até agora )

Vamos tentar agora gerar uma nova ListaEmpresa.asp segundo esse modelo

Será a nossa ListaEmpresa2.asp


<%  'ListaEmpresa2.asp

         ' recupera lista de empresas que pertencem a uma área

             ' codEmpresa, Empresa, Estado

             '

         'o nosso programa se resume a uma série de chamadas a sub-rotinas aonde a lógica do queremos

             ' fazer fica muito mais evidente

             ' Para podermos citar as variáveis entre sub-rotina devemo declará-las com o comando DIM

             Dim objConn, rs

             ' recupera o valor da areaID

             Areaid  = Cint(Request.QueryString("area"))

             recuperaDados()

             exibeCabecalho()

             listaDados()

             exibeRodape()

         encerraConexao()

'

'* SUB-ROTINAS ***********************************************************

'          

Sub recuperaDados()

                         'cria objeto ASP de conexão

                 Set objConn = server.createobject("ADODB.Connection")

                     'cria string de conexão específica para um determinado banco de dados

                 strConn = "DBQ=" & server.mappath("graficasonline.mdb") & ";Driver={Microsoft Access Driver (*.mdb)}"

                        'conecta ao banco de dados

                objConn.open strConn,3,3

                                               'cria o recordset para executar uma consulta e retornar com os dados obtidos

                        Set rs= Server.CreateObject("ADODB.Recordset")

                        ' texto do comando sql a ser executado  

                        sql = "SELECT EmpresaID, Empresa,Estado FROM Empresa WHERE AreaID = " &_

                                 AreaId & " ORDER BY Empresa"

                        ' executa a consulta

                rs.Open sql, strConn, 3, 3

End Sub

Sub listaDados()

                         'testa se foi ao final do arquivo sem encontrar nada e para

             if ( rs.eof ) then

                         %>

                         <tr>

                        <td>

                 Não existem empresas cadastradas nesse área! <p>

                         <a href="ListaAreas2.asp">retornar</a>

                        </td>

                        </tr>

                         <%

                         else  ' existem registros logo vamos listá-los

                        'enquanto houver registros

                        do while not rs.eof

%>

                        <tr>

                        <td>

                        <!-- exibindo um valor do ambiente VBScripp/Asp dentro do HTML  -->

                        <%= rs("EmpresaID") %>   <%= rs("empresa") %>  <%= rs("estado") %>  </A>

                        </td>

                        </tr>

<%       

                             ' procura o próximo

                             rs.movenext 

                    loop

             end if

End Sub

Sub encerraConexao()

'importante .. fechar conexao e destruir objetos               

set rs= nothing

objConn.close

set objConn = nothing

End Sub

Sub exibeCabecalho

%>

<HTML>

<HEAD>

<TITLE>graficas</TITLE>

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">

</HEAD>

<BODY BGCOLOR=#FFFFFF>

<table border=1 align="center">

<tr><td>

<img src="images/graficaonline_01.gif">

</td>

</tr>

<%

End Sub

Sub exibeRodape

%>

</TABLE>

</BODY>

</HTML>

<%

End Sub

%>     

 

Ficou faltando um botão de retorno para a tela anterior e aqui podemos usar um pouco de JavaScript para indicar ao navegador como fazer isso, basta criar um link com o seguinte formato :

<a href=’Javascript:history.go(-1)’>retornar </a>

Vou colocar isso na subrotina de rodapé, acrescento uma nova linha a tabela e coloco o comando lá :

Sub exibeRodape

%>

<tr>

<td>

            <a href=’Javascript:history.go(-1)’>retornar </a>

</td>

</tr>

</TABLE>

</BODY>

</HTML>

 

<%

End Sub

Vejam que funciona

 

Em paralelo para não perder o que já fizemos e ainda incluir as novidades, estou alterando a ListaArea.asp para ListaArea2.asp e fazendo com que a mesma aponte para ListaEmpresa2.asp

Veja que o programa se comporta as mil maravilhas mesmo com as subrotinas.

E o mais legal fiz alteração na APRESENTAÇÃO da página e não mexi na lógica do programa, isso é bom! -)

Já separamos melhor a lógica da página da sua apresentação mas ainda não resolvemos a questão de termos 50 páginas baseadas num mesmo cabeçalho e rodapé e como alterá-las de uma vez só.

O que vamos fazer ?

Vamos salvar a rotina de cabeçalho e de rodapé em um arquivo em separado e vamos acrescentar esse arquivo em tempo de execução através da diretiva INCLUDE.

Primeiro crio um arquivo  SUBROTINAS.asp e coloco lá as rotinas que quero sem esquecer de retirar as rotinas do arquivo original.

O Arquivo de Subrotinas

<%

' Arquivo de subrotinas a ser incluído em rotinas do sistema

Sub exibeCabecalho

%>

<HTML>

<HEAD>

<TITLE>graficas</TITLE>

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">

</HEAD>

<BODY BGCOLOR=#FFFFFF>

<table border=1 align="center">

<tr><td>

<img src="images/graficaonline_01.gif">

</td>

</tr>

<%

End Sub

Sub exibeRodape

%>

<tr>

<td>

            <a href='Javascript:history.go(-1)'>Retornar </a>

</td>

</tr>

</TABLE>

</BODY>

</HTML>

<%

End Sub

%>

E o listaEmpresa2.asp sem as mesmas mas com o comando include logo no início do arquivo

<!--#include file="subrotinas.asp" -->

<%  'ListaEmpresa2.asp

         ' recupera lista de empresas que pertencem a uma área

             ' codEmpresa, Empresa, Estado

             '

         'o nosso programa se resume a uma série de chamadas a sub-rotinas aonde a lógica do queremos

             ' fazer fica muito mais evidente

             ' Para podermos citar as variáveis entre sub-rotina devemo declará-las com o comando DIM

             Dim objConn, rs

             ' recupera o valor da areaID

             Areaid  = Cint(Request.QueryString("area"))

             recuperaDados()

             exibeCabecalho()

             listaDados()

             exibeRodape()

         encerraConexao()

'

'* SUB-ROTINAS ***********************************************************

'          

Sub recuperaDados()

                         'cria objeto ASP de conexão

                 Set objConn = server.createobject("ADODB.Connection")

                     'cria string de conexão específica para um determinado banco de dados

                 strConn = "DBQ=" & server.mappath("graficasonline.mdb") & ";Driver={Microsoft Access Driver (*.mdb)}"

                        'conecta ao banco de dados

                objConn.open strConn,3,3

                                               'cria o recordset para executar uma consulta e retornar com os dados obtidos

                        Set rs= Server.CreateObject("ADODB.Recordset")

                        ' texto do comando sql a ser executado  

                        sql = "SELECT EmpresaID, Empresa,Estado FROM Empresa WHERE AreaID = " &_

                                 AreaId & " ORDER BY Empresa"

                        ' executa a consulta

                rs.Open sql, strConn, 3, 3

End Sub

Sub listaDados()

                         'testa se foi ao final do arquivo sem encontrar nada e para

             if ( rs.eof ) then

                         %>

                         <tr>

                        <td>

                 Não existem empresas cadastradas nesse área! <p>

                         <a href="ListaAreas2.asp">retornar</a>

                        </td>

                        </tr>

                         <%

                         else  ' existem registros logo vamos listá-los

                        'enquanto houver registros

                        do while not rs.eof

%>

                        <tr>

                        <td>

                        <!-- exibindo um valor do ambiente VBScripp/Asp dentro do HTML  -->

                        <%= rs("EmpresaID") %>   <%= rs("empresa") %>  <%= rs("estado") %>  </A>

                        </td>

                        </tr>

<%       

                             ' procura o próximo

                             rs.movenext 

                    loop

             end if

End Sub

Sub encerraConexao()

'importante .. fechar conexao e destruir objetos               

set rs= nothing

objConn.close

set objConn = nothing

End Sub

%>

Agora sim eu consegui um relativamente grau de independência, se todas as minhas rotinas forem estruturadas assim, basta que editemos o cabeçalho e o rodapé que todas mudarão de acordo.

Claro que isso é uma meia verdade, pois se alterarmos a estrutura de apresentação da página para não se apoiar mais em TABELAS, as rotinas de exibir resultados teriam que ser alteradas tambem. Por isso que um bom planejamento de arquitetura do projeto web é indispensável e pode salvar muito tempo no futuro.

Mas essas não é a única questão que devemos nos preocupar com as nossas rotinas, ROBUSTEZ é outra, serão as nossas rotinas a prova de falhas?, a prova de valores informados incorretamente ?

Até agora tudo está muito correto, mas se houver algum engano ? se a rotina ListaEmpresa for acessada assim ?  

www.meusite.com.br/listaEmpresa.asp?area=XYZK

vai acontecer um errro porque esperamos um número e foi passado uma string e se for chamado sem parâmetro algum assim :

www.meusite.com.br/listaEmpresa.asp

o valor de área ficará indefinido e novamemte ListaEmpresa não irá ser executada corretamente e um erro irá acontecer. Lembre-se dos conceitos de Engenharia de Software que ROBUSTEZ é um dos fatores de qualidade de um softeware e está associado a capacidade do mesmo facer face a entrada erradas e não previstas, para previnir isso teremos que testar o valor da área passada e tomar decisões sobre como a nossa rotina irá se comportar, ok ?

Para fins de nosso exemplo eu vou assumir o seguinte :

 

ListaEmpresa.asp só deverpa ser executada se algum valor númerico de area for passado caso contrário uma mensagem de erro deverá ser exibida,  e quais são essas possibildades :

1.     O valor de área não foi passado é nulo,

2.     O valor de área foi passado mas não é um número inteiro,

3.     O valor de área foi passado é um inteiro mas não existe área alguma que corresponda a esse número,

Correto, Sim?  Não?

Rotinas robustas devem ser uma meta enquanto desenvolvemos sistemas, não devemos esperar que os dados fornecidos sejam sempre corretos sob pena de assisitir ao nosso sistema falhar de forma vergonhosa. -)

Então como exercício, tentem fazer testes sobre os valores passados na querystring antes da mesma ser usado na string sql.

Nosso Objetivo :  Construir uma pequena aplicação ASP com acesso a uma base de dados Access

Parte 1        Parte 2         Parte  3        Parte  4