|
|
|
|
|
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+,
|
|
|
|
|