USUÁRIO:      SENHA:        SALVAR LOGIN ?    Adicione o VBWEB na sua lista de favoritos   Fale conosco 

 

  Dicas

  ASP - Active Server Page    (Miscelâneas)

Título da Dica:  Uso de 2 Combos Ligadas Entre Si
Postada em 23/10/2003 por ^HEAVY-METAL^            
Escrevo este artigo, pois sei que todos aqueles que estão a começar precisam de algo parecido com aquilo que aqui escrevo. A ideia é ter 2 Combo boxes, em que a segunda é carregada com dados consoante a escolha feita na primeira Combo. Normalmente a solução mais rápida seria o uso de JavaScript, mas se tivermos muitos dados isso torna-se muito pesado, poruqe o uso desde Scripting obriga o carregamento prévio de tudo o que estiver em Base de Dados, enquanto com a solução em ASP (esta que vou explicar) os dados só são puxados por pedido, e assim a performance final, para grandes soluções fica a beneficiar. O que falha claro, é o facto de ter de ser feito um refresh á página por cada vez que é feita uma nova escolha na primeira combo, mas que julgo ser suportável, pelo menos para mim é.

A BASE DE DADOS :
A base de dados que uso, é novamente em MSAccess, que serve como exemplo e julgo ser de mais fácil acesso, para quem programa nesta linguagem.
Uso 2 tabelas, muito simples com os seguintes esquemas :
Tabela : Combo1

id_combo1 AutoNumber
nome_combo1 Text

Tabela : Combo2

id_combo2 AutoNumber
id_combo1 Number
nome_combo2 Text

A segunda Tabela como é 'filha' da primeira, cada linha de informação tem de ter a referência do 'pai' da tabela Combo1. e assim quando escolhemos a informação da Combo1, podemos ir á segunda buscar a informação referente com o id da primeira.


Este único ficheiro para o efeito, tem então duas combo boxes, em que a segunda é 'enchida' com dados depois de escolhermos um dos campos da primeira. Claro que o programamdor pode usar a opção 'onchange' e fazer este passo automáticamente. Eu fiz assim porque julgo de mais fácil compreensão, e depois o programador pode fazer as alterações que julgue necessárias.

ficheiro : Combo.ASP
  
<%
Sub Combo1()' função que trabalha com a combo inicial
    'vamos fazer a declaração de SQL para encher a Combo
    SQLStmt = "SELECT id_combo1, nome_combo1 FROM combo1"
    'Executamos a declaração na Base de Dados
    rs.Open SQLStmt, conn, 2, 1
    'vamos construir o HMTL da primeira combo
    Response.Write"<font face='Verdana,Arial' size='2'>"
    Response.Write"combo inicial </font>"
    Response.Write"<SELECT name='combo1'>"
    'vamos percorrer o RecordSet referente ás cidades
    while not rs.EOF
        'construímos cada cidade na combo
        Response.Write"<OPTION "
        'se a escolha anterior for igual à do momento, deixamo-la escolhida
        if CInt(Request.Form("combo1"))= rs(0) then
            Response.Write"selected "
        end if
        Response.Write"value='"&rs(0)&"'>"&rs(1)&"</OPTION>"
        rs.MoveNext
    wend
    Response.Write"</SELECT><br><br><br>"
    Response.Write"<INPUT type='Submit' value='OK'><br><br><br>"
    rs.close
End Sub
Sub Combo2()' aqui construímos a combo referente às freguesias
    id_combo1 = Request.Form("combo1")
    'se não houver escolha na combo das cidades, é como termos 0
    if id_combo1 = "" then
        id_combo1 = 0
    end if
    'vamos fazer a procura de freguesias referentes ao
    'id da cidade escolhida
    SQLStmt = "SELECT id_combo2, nome_combo2 FROM combo2 "
    SQLStmt = SQLStmt & "WHERE id_combo1=" & id_combo1
    'executamos o recordset
    rs.Open SQLStmt, conn, 2, 1
    'construímos a combo das freguesias
    Response.Write"<font face='Verdana,Arial' size='2'>"
    Response.Writecombo secundária </font>"
    Response.Write"<SELECT name='combo2'>"
    while not rs.EOF
        Response.Write"<OPTION "
        'aqui também se controla se houve escolha antes,
        'para não perdermos a sua visualização
        if CInt(Request.Form("combo2"))= rs(0) then
            Response.Write"selected "
        end if
        Response.Write"value='"&rs(0)&"'>"&rs(1)&"</OPTION>"
        rs.MoveNext
    wend
    Response.Write"</SELECT>"
    rs.close ' fechar o recordset
End Sub
' criação de uma conexão DSNLess
conn = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="
conn = conn & Server.Mappath("combos.mdb") & ";"
' inicialização do bjecto do recordset
Set rs = Server.CreateObject("ADODB.Recordset")
' criação do formulário que vai suportar ambas as combos
Response.Write"<FORM name='form1' action='combos.asp'"
Response.Write" method='POST'>"
' vamos chamar a combo 1
Call Combo1()
' e vamos também chamar a combo 2
Call Combo2()
' finalizamos o formulário com a Tag para o efeito
Response.Write"</FORM>"
%>

T+,
 


CyberWEB Network Ltda.    © Copyright 2000-2019   -   Todos os direitos reservados.
Powered by HostingZone - A melhor hospedagem para seu site
Topo da página