lpbrenes: cuenta con mi apoyo...
bakanzipp: efectivamente mis tres combos deben ser llenados a partir de una B.D. en access; porque son dinámicos todos.
El código que me envías funciona y es justamente el que utilizo para crear el 2do. combo; hasta allí todo va bien, pero tengo problemas para llenar el tercero, porque cuando construyo el sql que le corresponde basándome en el proceso de creación del 2do. combo; en la función: ComponerLista me genera un error en la instrucción: array = eval("opciones" + array);
Hasta ahora no he encontrado la manera de diferenciar las 2 Tuplas para evitar el error en dicha instrucción.

Ya encontré la manera...
Gracias a todos...
lpbrenes: espero que te sirva...
Código:
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY>
<BR><BR>
<center>
<strong><font FACE="verdana" SIZE="4">Combos Dinámicos de doble dependencia</font></strong>
<FORM ACTION="" METHOD="POST" NAME="frmRecord">
<BR>
<TABLE BORDER=0 WIDTH="50%" class="DataForm">
<TR>
<TD WIDTH="45%">
Proyecto:
</TD>
<TD WIDTH="71%">
<%
'---declaración de variables
Dim Cnn, SQL, rs
Set Cnn = Server.CreateObject("ADODB.Connection")
Cnn.Open Application("CadenaConexion") 'conexion abierta
SQL = "SELECT distinct proy.py_codigo, proy.py_titulo "
SQL = SQL & " FROM Proyectos as proy, Informe_de_Avance_de_Proyecto as iap, Metricas_de_Proyecto as me "
SQL = SQL & " Where proy.py_codigo = iap.rep_proyecto_cod "
SQL = SQL & " And proy.py_codigo = me.me_proyecto_cod ORDER BY py_titulo"
Set rs = Cnn.Execute(SQL)
%>
<Select Name="combo_proyecto" OnChange="ComponerLista (document.forms.frmRecord.combo_proyecto.value);">
<%
if Not rs.Eof then
noRecord = 1
While Not rs.EOF
%>
<option value="<%=rs("py_codigo")%>"><%=rs("py_titulo")%></option>
<%
rs.MoveNext
Wend
else
noRecord = 0
%>
<option value="Ninguno">Ninguno</option>
<%end if
rs.Close
%>
</Select>
</TD>
</TR>
<TR>
<TD WIDTH="17%">
Fecha de Informe de Avance:
</TD>
<TD WIDTH="71%">
<Select Name="combo_fecha" style="display:none">
</Select>
<INPUT
TYPE="TEXT"
NAME="fecha"
SIZE="10"
maxlength="10"
value="Ninguno"
style="display:none"
>
</TD>
</TR>
<TR>
<TR>
<TD WIDTH="17%">
Título de la Métrica:
</TD>
<TD WIDTH="71%">
<Select Name="combo_metrica_proyecto" style="display:none">
</Select>
<INPUT
TYPE="TEXT"
NAME="metrica_proyecto"
SIZE="10"
maxlength="10"
value="Ninguno"
style="display:none"
>
</TD>
</TR>
</TABLE>
</FORM>
</center>
</BODY>
<script language = "JavaScript">
<!--
//-------------------------------------
//--para crear combo número de riesgo
//-------------------------------------
function Tupla ( campo1, campo2 )
{
this.campo1 = campo1;
this.campo2 = campo2;
}
<%
'---Vamos a crear nuestros arrays de proyectos desde ASP
'---El primer if detecta un cambio en el proyecto para
'---crear un nuevo array en Javascript
'-----------------------------------
' query de Informes de Proyecto
'------------------------------------
SQLInf = "Select rep_proyecto_cod, rep_fecha From Informe_de_Avance_de_Proyecto "
SQLInf = SQLInf & " Order By rep_proyecto_cod, rep_fecha"
set rsInf = CreateObject("ADODB.Recordset")
rsInf.Open SQLInf, Cnn
cuenta = 0
cat = "basura"
While Not rsInf.EOF
if cat <> rsInf.Fields("rep_proyecto_cod") then
'---cambio de proyecto, empiezo a contar en 0
cuenta = 0
cat = rsInf.Fields("rep_proyecto_cod")
%>
//además tengo que crear un nuevo array por proyectos
var opciones<%=cat%> = new Array();
<%
end if
%>
opciones<%=cat%>[<%=cuenta%>]=new Tupla("<%=rsInf.Fields("rep_fecha")%>","<%=rsInf.Fields("rep_fecha")%>");
<%
cuenta = cuenta + 1
rsInf.MoveNext
wend
'---Limpiamos objetos
rsInf.Close
set rsInf = nothing
%>
<%
'----------------------------------
' query de Métricas de Proyecto
'----------------------------------
SQLMetrica = "Select me_proyecto_cod, me_metrica From Metricas_de_Proyecto "
SQLMetrica = SQLMetrica & " Order By me_proyecto_cod, me_metrica"
set rsMetrica = CreateObject("ADODB.Recordset")
rsMetrica.Open SQLMetrica, Cnn
x = 0
cod = "basura"
While Not rsMetrica.EOF
if cod <> rsMetrica.Fields("me_proyecto_cod") then
'---cambio de proyecto, empiezo a contar en 0
x = 0
cod = rsMetrica.Fields("me_proyecto_cod")
%>
//además tengo que crear un nuevo array por proyectos
var MatrizMetr<%=cod%> = new Array();
<%
end if
%>
MatrizMetr<%=cod%>[<%=x%>]=new Tupla("<%=rsMetrica.Fields("me_metrica")%>","<%=rsMetrica.Fields("me_metrica")%>");
<%
x = x + 1
rsMetrica.MoveNext
wend
'---Limpiamos objetos
rsMetrica.Close
set rsMetrica = nothing
%>
// Declaración de variable
var contador;
//--------------------------------------------------
// Función que compone dos (2) listas dependientes
//--------------------------------------------------
function ComponerLista ( array )
{
// Limpia opciones del select
BorrarLista();
// Asigna bandera de cantidad de registro del sql proyecto (1=hay registros 0=no hay)
cantReg = <%=noRecord%>
// Verifica si hay registros del combo padre
if (cantReg==0) {
// Despliega el tag <Input> en campo fecha y métrica
document.forms.frmRecord.fecha.style.display = "";
document.forms.frmRecord.metrica_proyecto.style.display = "";
}
else
{
// Despliega el tag <Select> en campo fecha y métrica
document.forms.frmRecord.combo_fecha.style.display = "";
document.forms.frmRecord.combo_metrica_proyecto.style.display = "";
// Compone la lista dependiente a partir
// del valor de la opcion escogida en la lista "padre"
// Evalua el array "opciones" creado en tupla
array = eval("opciones" + array);
for (contador = 0; contador < array.length; contador++)
{
// añade elementos al combobox correspondiente a fecha de informe
var optionObj = new Option( array[contador].campo1, array[contador].campo1);
frmRecord.combo_fecha.options[contador] = optionObj;
}
// asigna el codigo de proyecto de la nueva opción seleccionada
codigo_proy = document.forms.frmRecord.combo_proyecto.options[document.forms.frmRecord.combo_proyecto.selectedIndex].value;
// Compone la lista dependiente a partir
// del valor de la opcion escogida en la lista "padre"
// Evalua el array "MatrizMetr" creado en tupla
Metr = eval("MatrizMetr" + codigo_proy);
for (contador = 0; contador < Metr.length; contador++)
{
// añade elementos al combobox correspondiente a métrica de proyecto
var optionObj1 = new Option( Metr[contador].campo2, Metr[contador].campo2 );
frmRecord.combo_metrica_proyecto.options[contador] = optionObj1;
}
}
}
//-----------------------------------
// Función que limpia las opciones
// de los combos dependientes
//-----------------------------------
function BorrarLista()
{
frmRecord.combo_fecha.length = 0;
frmRecord.combo_metrica_proyecto.length = 0;
}
//Inicializamos
ComponerLista (document.forms.frmRecord.combo_proyecto.value);
-->
</script>
</HTML>