O "probleminha" é que toda vez que é selecionada uma nova opção a página é carregada novamente! Mas acho que isso não é problema.
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
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 aos estados
while not rs.EOF
'construímos cada estado 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 cidades
id_combo1 = Request.Form("combo1")
'se não houver escolha na combo dos estados, é como termos 0
if id_combo1 = "" then
id_combo1 = 0
end if
'vamos fazer a procura de cidades referentes ao
'id da estado escolhido
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 cidades
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>"
%>
É esse que eu uso. Espero que ajude.
Boa sorte.