Na “Parte 1” mostrei como criar a “Stored
Procedure”, a “function” dentro do Visual Basic 6.0 e por final a página ASP
3.0 responsável por enviar os parâmetros esperados pelos outros dois
componentes. Para maiores detalhes, acesso link abaixo:
http://www.aspneti.com/visualizar/downloadArtigo.aspx?ch_artigos=269
Nesta “Parte 2”, tenho o objetivo de ensinar
e mostrar como funciona a parte de “pesquisa” na mesma página criada
anteriormente, ou seja, o usuário mandará os parâmetros pela página, a página
ASP 3.0 chamará o componente Visual Basic 6.0 e por final chamará a “Stored
Procedure” para buscar os resultados. Os resultados retornados serão
transformados em ARRAY e mostrados dentro da página ASP 3.0. Os parâmetros
enviados vão direto da página até chegar na “Stored Procedure”; esse
procedimento será mostrado claramente no decorrer do documento.
O primeiro passo seria criar o banco de
dados, mas como na “Parte 1”
já foi criado, passaremos para a criação da Stored Procedure. No fornecedor, os
dois campos que podem ser pesquisados ou digitados dados para a busca são: NOME
e CNPJ. (Referência 2.1)
|
set
ANSI_NULLS ON
set
QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[PRJSP099_SELECIONAR_FORNECEDOR]
@FOR_NOME AS NVARCHAR(100),
@FOR_CNPJ AS NVARCHAR(14)
AS
DECLARE
@SQL AS
VARCHAR(4000)
SET @SQL
= ' SELECT
FOR_NU_SEQUENCIAL,
FOR_NOME,
FOR_CNPJ,
FOR_OPTANTE_SIMPLES,
FOR_IE,
FOR_TELEFONE,
FOR_TELEFONE1,
FOR_FAX,
FOR_CONTATO,
FOR_ENDERECO,
FOR_BAIRRO,
FOR_CIDADE,
FOR_ESTADO,
FOR_CEP,
FOR_BANCO,
FOR_AGENCIA,
FOR_CONTA,
FOR_EMAIL
FROM
CPETB042_FORNECEDOR
WHERE 1=1 '
IF (@FOR_NOME IS NOT NULL)
BEGIN
SET
@SQL = @SQL +
' AND FOR_NOME = "' + CONVERT(VARCHAR, @FOR_NOME) + '"'
END
IF (@FOR_CNPJ IS NOT NULL)
BEGIN
SET
@SQL = @SQL +
' AND FOR_CNPJ = "' + CONVERT(VARCHAR, @FOR_CNPJ) + '"'
END
EXECUTE(@SQL)
|
Referência: 2.1
Explicação:
A “Stored Procedure” foi criada com o
nome “PRJSP099_SELECIONAR_FORNECEDOR” esperando dois parâmetros de
entrada. Um do tipo NVARCHAR(100) e outro do tipo NVARCHAR(14), os números
entre parêntese é a capacidade de caracteres esperados, ou seja, o limite de
caracteres esperados. (Referência 2.2)
|
CREATE PROCEDURE [dbo].[PRJSP099_SELECIONAR_FORNECEDOR]
@FOR_NOME AS NVARCHAR(100),
@FOR_CNPJ AS NVARCHAR(14)
|
Referência: 2.2
No decorrer da “Stored Procedure”
declarei algumas variáveis para armazenamento e criei um select dinâmico
armazenando o resultado na “@SQL”. Verifico se o primeiro parâmetro não veio
NULL usando a condição IF (@FOR_NOME IS NOT NULL) para atribuir mais uma
condição no select armazenado anteriormente. Fiz da mesma forma para o segundo
parâmetro e no final mando executar o “@SQL”.
Com a
procedure criada, passo agora para a classe dentro do Visual Basic 6.0 chamada
“clsFornecedor.cls”, criei uma “function” com o nome “SelectionFornecedor”
passando dois parâmetros e retornando um valor do tipo “Variant”, ou seja, um
array para quando se trabalha com Visual Basic 6.0. (Referência 2.3)
|
Public Function SelecionarFornecedor(ByVal FOR_NOME
As String, _
ByVal
FOR_CNPJ As String) As Variant
Static sSql As String
Static vRetorno As Variant
Static bConexao As Boolean
On Error GoTo error
bConexao =
AbreConexao("open")
If
bConexao Then
sSql =
"PRJSP099_SELECIONAR_FORNECEDOR " & _
IIf(FOR_NOME =
"", "NULL", "'" & FOR_NOME &
"'") & ", " & _
IIf(FOR_CNPJ = "", "NULL",
"'" & FOR_CNPJ & "'") & " "
vRetorno = ExecutaSQLArray(sSql)
End If
error:
If Err.Number
<> 0 Then
GerarLog "SelecionarFornecedor", DescricaoErro(1)
End If
SelecionarFornecedor
= vRetorno
If bConexao Then
AbreConexao "close"
End If
End Function
|
Referência: 2.2
Explicação:
Analisando a assinatura do método:
(Referência 2.3)
|
Public Function SelecionarFornecedor(ByVal FOR_NOME
As String, _
ByVal
FOR_CNPJ As String) As Variant
|
Referência: 2.3
O
método é público, espera dois parâmetros do tipo String, o primeiro chamado
FOR_NOME e o Segundo FOR_CNPJ e no final retornará valores do tipo VARIANT.
Seguindo ainda com a análise, declarei algumas variáveis e coloquei o
tratamento de erro. Dentro do tratamento, chamei a função chamada “AbreConexao”
informando o valor significativo ao abrir a conexão com o banco de dados.
(Referência 2.4)
|
Static sSql As String
Static vRetorno As Variant
Static bConexao As Boolean
On Error GoTo error
bConexao =
AbreConexao("open")
|
Referência: 2.4
Após abrir o banco de dados, verifico
se a variável declarada está true e na linha abaixo chamo a stored procedure
passando os parâmetros recebidos. Utilizo a condição “IIF” que verifica se o
parâmetro está vazio, caso sim, o mesmo atribui o valor “NULL” enviado a
procedure. Lembre-se que foi feita uma verificação em relação NOT NULL
anteriormente na camada de dados. Essa verificação dentro da “function” fiz
para os dois parâmetros. (Referência 2.5).
|
If bConexao
Then
sSql = "PRJSP099_SELECIONAR_FORNECEDOR
" & _
IIf(FOR_NOME =
"", "NULL", "'" & FOR_NOME &
"'") & ", " & _
IIf(FOR_CNPJ =
"", "NULL", "'" & FOR_CNPJ &
"'") & " "
vRetorno
= ExecutaSQLArray(sSql)
End If
|
Referência: 2.5
Toda verificação é feita, verifico se
há algum erro, e retorno o valor para o objeto que chamou. (Referência 2.6)
|
error:
If
Err.Number <> 0 Then
GerarLog "SelecionarFornecedor", DescricaoErro(1)
End If
SelecionarFornecedor = vRetorno
If bConexao
Then
AbreConexao
"close"
End If
|
Referência: 2.6
Depois de criado a parte de dados e a
parte de negócio, basta criar a apresentação, ou seja, a página ASP 3.0.
(Referência 2.7)

A tela criada (Referência 2.7) mostra circulados
os dois campos que podem ou não serem preenchidos pelo usuário e em seguida
clicar no botão “PESQUISAR” logo abaixo no final da página. O HTML da página
foi mostrado no passo anterior. Mostrarei a parte de pesquisa e acesso ao
objeto criado.
Na
parte HTML, especificamente no botão PESQUISAR chamo uma function criada em
JAVASCRIPT. (Referência 2.8)
|
<input
type="button" onClick="pesquisar();" title="Clique aqui para
Pesquisar" name="btnPesquisar" value="Pesquisar">
|
Referência: 2.8
No atributo “onClick” do input existe
uma chamada para a function “pesquisar();” cujo não recebe qualquer parâmetro.
No passo passado foi falado que o form está com o atributo action para a mesma
página, ou seja, os valores preenchidos são pegos e tratados na mesma página.
(Referência 2.9)
|
<script>
function pesquisar() {
document.form.action =
"frmManterFornecedor.asp?sAcao=Pesquisar";
document.form.submit();
}
</script>
|
Referência: 2.9
A function (Referência 2.9) apenas
atribui a ação da página para ela própria passando um parâmetro chamado “sAcao”
com o valor “Pesquisar”. Após a atribuição, é chamado o comando de submit. No
começo da página ASP 3.0, foram declaradas constantes e variáveis para serem
enviadas, ou seja, cada campo digitado será pego pelo request. (Referência 2.10)
|
<%
CONST FOR_NU_SEQUENCIAL = 0
CONST FOR_NOME =
1
CONST FOR_CNPJ =
2
CONST FOR_OPTANTE_SIMPLES = 3
CONST FOR_IE =
4
CONST FOR_TELEFONE =
5
CONST FOR_TELEFONE1 =
6
CONST FOR_FAX =
7
CONST FOR_CONTATO =
8
CONST FOR_ENDERECO =
9
CONST
FOR_BAIRRO = 10
CONST
FOR_CIDADE = 11
CONST
FOR_ESTADO =
12
CONST FOR_CEP =
13
CONST FOR_BANCO =
14
CONST FOR_AGENCIA =
15
CONST FOR_CONTA =
16
CONST FOR_EMAIL =
17
dim sAcao
dim iCont
'###############
declaracao
dim cmbEstado
dim txtCNPJ
dim txtNome
dim
txtInscricaoEstadual
dim txtEndereco
dim txtBairro
dim txtCidade
dim txtCEP
dim
txtTelefone1
dim
txtTelefone2
dim txtFax
dim txtEmail
dim txtNuBanco
dim
txtNuAgencia
dim txtNuConta
dim txtContato
dim rdOptante
dim
hdNuSequencial
dim oFornecedor
dim vFornecedor
dim bFornecedor
'################
pegando valores
txtNuConta =
Request("txtNuConta")
cmbEstado =
Request("cmbEstado")
txtCNPJ =
Request("txtCNPJ")
txtNome =
Request("txtNome")
txtInscricaoEstadual
= Request("txtInscricaoEstadual")
txtEndereco =
Request("txtEndereco")
txtBairro =
Request("txtBairro")
txtCidade =
Request("txtCidade")
txtCEP =
Request("txtCEP")
txtTelefone1 =
Request("txtTelefone1")
txtTelefone2 =
Request("txtTelefone2")
txtFax =
Request("txtFax")
txtEmail =
Request("txtEmail")
txtNuBanco =
Request("txtNuBanco")
txtNuAgencia =
Request("txtNuAgencia")
txtNuConta = Request("txtNuConta")
txtContato =
Request("txtContato")
rdOptante =
Request("rdOptante")
txtContato =
Request("txtContato")
hdNuSequencial =
Request("hdNuSequencial")
sAcao =
Request("sAcao")
set oFornecedor
= Server.CreateObject("CPETabelas.clsFornecedor")
if sAcao =
"Pesquisar" then
vFornecedor =
oFornecedor.SelecionarFornecedor(txtNome, txtCNPJ)
end if
%>
|
Referência: 2.10
Explicação:
No começo do código, adicionei algumas
constantes com seus respectivos valores, estes valores serão usados para
mostrar o relatório gerado; ou seja; para não utilizar números utilizo
constante. Os números atribuídos é a posição retornada do select da “stored
procedure” com seus respectivos campos. Mais abaixo, pego todos os dados
utilizando o Request explicado no passo anterior.
|
set oFornecedor
= Server.CreateObject("CPETabelas.clsFornecedor")
|
Referência: 2.11
Atribuo a variável “oFornecedor” o
server.createObject que significa fazer a comunicação entre o componente gerado
anteriormente pelo Visual Basic 6.0. Após criar a dll, registrei os componentes
dentro do COM PLUS. Caso não haja nenhum erro, a variável “oFornecedor” estará
disponível para uso e todas as functions públicas.
|
if sAcao =
"Pesquisar" then
vFornecedor =
oFornecedor.SelecionarFornecedor(txtNome, txtCNPJ)
end if
|
Referência: 2.12
Logo abaixo, verifico se variável
“sAcao” é igual ao valor “Pesquisar” caso seja, atribuo ao meu vetor o objeto
criado chamando a function SelectionFornecedor passando o nome e o cnpj que são
os campos da tela e pegos pelo Request. Com o vetor preenchido, poderei
utilizá-lo mais abaixo mostrando ao usuário os campos retornados.
No próximo exemplo mostrado abaixo é
uma interação entre o HTML e ASP 3.0 para mostrar um verdadeiro retorno ao
usuário final ou do sistema. (Referência 2.13).
|
<%
if
IsArray(vFornecedor) then
%>
<table CELLSPACING="1"
cellpadding="0" class="formulario" WIDTH="90%"
title="Dados do Afastamento Cadastrado">
<tr>
<th >CNPJ</th>
<th width="" >Nome</th>
<th width="" ><b>Telefone</b></th>
<th width=""><b>Telefone
1</b></th>
<th
width=""><b>Fax</b></th>
<th
width=""><b>E-mail</b></th>
</tr>
<%
if
IsArray(vFornecedor) then
for
iCont=0 to UBound(vFornecedor, 2)
%>
<tr
align="center">
<td>
<%
if Trim(vFornecedor(FOR_CNPJ, icont)) <> "" then
Response.Write vFornecedor(FOR_CNPJ,
icont)
else
Response.Write "-" end if
%>
</td>
<td title="<%=vFornecedor(FOR_NOME,
icont)%>">
<%
if Trim(vFornecedor(FOR_NOME, icont)) <> "" then
Response.Write
mid(vFornecedor(FOR_NOME, icont),1,10)
else
Response.Write
"-"
end
if
%>
</td>
<td>
<%
if
Trim(vFornecedor(FOR_TELEFONE, icont)) <> "" then
Response.Write vFornecedor(FOR_TELEFONE, icont)
else
Response.Write
"-"
end
if
%>
</td>
<td
>
<%
if
Trim(vFornecedor(FOR_TELEFONE1, icont)) <> "" then
Response.Write (vFornecedor(FOR_TELEFONE1, icont)
else
Response.Write
"-"
end
if
%>
</td>
<td>
<%
if
Trim(vFornecedor(FOR_FAX, icont)) <> "" then
Response.Write
vFornecedor(FOR_FAX, icont)
else
Response.Write
"-"
end
if
%>
</td>
<td>
<%
if
Trim(vFornecedor(FOR_EMAIL, icont)) <> "" then
Response.Write
vFornecedor(FOR_EMAIL, icont)
else
Response.Write
"-"
end
if
%>
</td>
</tr>
<%
next
else
%>
<tr align="center"><td
colspan="10"><b>Nenhum registro
encontrado</b></td></tr>
<%
end if
%>
</table>
<%
end if
%>
|
Referência: 2.13
Explicação:
Essa interação do ASP 3.0 e HTML é
simples e fácil. O primeiro de tudo no código, verifico se o meu vetor é um
array. Caso não seja, o sistema mostrará uma mensagem informando ao usuário que
não retornou registro. (Referência 2.14)
|
<%
if IsArray(vFornecedor) then
%>
|
Referência: 2.14
Após a verificação, montei o cabeçalho
do relatório ao usuário. Essa parte do relatório foi criada mais abaixo da
página, ou seja, no final da página ASP 3.0. (Referência 2.15)
|
<tr>
<th >CNPJ</th>
<th width="" >Nome</th>
<th width=""
><b>Telefone</b></th>
<th width=""><b>Telefone
1</b></th>
<th
width=""><b>Fax</b></th>
<th
width=""><b>E-mail</b></th>
</tr>
|
Referência: 2.15
Montei o cabeçalho do relatório, agora
falta apenas montar o corpo. Para a montagem, irei fazer um “for” no vetor,
lembre-se que esse vetor possui um array bidimensional dentro dele. Dessa forma,
utilizarei o UBOUND do “for”. E em seguida, utilizarei o Response.Write para mostrar
os valores dentro das “tr”s montadas. (Referência 2.16)
|
<%
for
iCont=0 to UBound(vFornecedor, 2)
%>
<tr
align="center">
<td>
<%
if
Trim(vFornecedor(FOR_CNPJ, icont)) <> "" then
Response.Write vFornecedor(FOR_CNPJ,
icont)
else
Response.Write
"-"
end
if
%>
</td>
</tr>
<tr>
<td>
‘aqui coloco outros campos
que gostaria de mostrar ao usuário
</td>
</tr>
<%
next
%>
|
Referência: 2.16
Faço um “for” de ICount para
UBound(vetor, 2). Dentro do “for”, montei as “tr”s não esquecendo de verificar
se o resultado do vetor é diferente de vazio para mostrá-lo utilizando o
Response.Write. Note que utilizei dentro do vetor a constante “FOR_CNPJ”, a
mesma foi declarada logo acima com um número, esse número que está sendo usado
para a verificação. Caso não possua valor neste campo, o mesmo mostrará apenas
um traço. Isso eu fiz para todos os campos que gostaria de mostrar ao usuário.
Em seguida, utilizei a página clicando
no botão PESQUISAR. Note que o mesmo trouxe resultados mostrados na tela. (Referência
2.17)

Note que a parte circulada é todo
resultado mostrado dentro do sistema.
Bom, fico por
aqui, qualquer dúvida favor entrar em contato pelo e-mail mauricio@aspneti.com. Espero ter ajudado
de alguma forma.
Mauricio Junior
www.aspneti.com
www.mauriciojunior.org