Parte 1 Parte 2 Parte 3 Parte 4 
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