Seleccione del menú desplegable que completa la segunda categoría

Tengo una mesa llamada tbl_Teacher con datos como:

Teacher_ID   Lastname   Firstname   Department
1               aaa         Joe         Math
2               bbb         Jenny       History
3               ccc         Mark        Math

Creé un ASP SELECT. Si selecciono "aaa, Mark" de la lista desplegable, entonces "Coincidencia" se seleccionará automáticamente en la segunda lista desplegable. Sin embargo, no toma ningún valor después de seleccionar Apellido y Nombre; muestra No se encontró ningún departamento.

¿Qué hice mal? ¿Alguien puede ayudar?

Muchas gracias.

Aquí está el código:

<%  Set rsSelect = Server.CreateObject("adodb.recordset")
    strSQL = "SELECT Lastname, Firstname, Teacher_ID FROM tbl_Teacher;"
    rsSelect.Open strSQL, strCon
    Dim strID
    strID = Request.QueryString("Teacher_ID")
    if not rsSelect.eof then %>
        <select name="Name" onChange="this.form.action='Teacher.asp';this.form.submit();">
             <option value="1">Select a Teacher</option>
             <% do until rsSelect.eof %>
                <option value="<%= rsSelect(0) %>" <% if trim(request.Form("Name")) = trim(rsSelect(0)) then response.write " selected "end if %>><%= rsSelect("Lastname") %>, <%= rsSelect("Firstname") %></option>
                <%  rsSelect.MoveNext
             loop       %>
         </select>
         <% end if 

    if trim(request.Form("Name")) <> "" then
        strSQL = "SELECT Department FROM tbl_Teacher WHERE Teacher_ID = '" & Request.Form("strID") & "';"
        Set rsSelect = Server.CreateObject("adodb.RecordSet")
        rsSelect.Open strSQL, strCon
        if not rsSelect.eof then %>
            <select name="Department">
                <% do until rsSelect.eof       %>
                    <option value="<%= rsSelect("Department") %>"><%= rsSelect("Department") %></option>
                    <% rsSelect.MoveNext
                loop %>
            </select>
            <% else %>
                <i>No Department found</i>
            <%  end if
        else
            response.write "<i>Select a Department</i>"
        end if %>

preguntado Oct 07 '14, 14:10

1 Respuestas

Sería mucho mejor utilizar el teacher_id que un nombre o código:

<%Set rsSelect = Server.CreateObject("adodb.recordset")
strSQL = "SELECT Teacher_ID, Lastname, Firstname FROM tbl_Teacher;"
rsSelect.Open strSQL, strCon, 1, 1
Dim strID
strID = Request.QueryString("Teacher_ID")
if not rsSelect.eof then %>
    <select name="Name" onChange="this.form.action='Teacher.asp';this.form.submit();">
         <option value="1">Select a Teacher</option>
         <% do until rsSelect.eof %>
            <option value="<%= rsSelect(0) %>" <% if request.Form("teacherId") = rsSelect(0) then response.write " selected "end if %>><%= rsSelect("Lastname") %>, <%= rsSelect("Firstname") %></option>
            <%  rsSelect.MoveNext
         loop       %>
     </select>
     <% end if 

Sin embargo, tiene otro problema en el siguiente fragmento de código, basado en lo que está recuperando de la base de datos. Recomendaría repensar su diseño, ya que se está confundiendo aquí y abriendo su código a una multitud de errores más adelante. Trate de separar su Departments en una lista sucinta de valores en su propia tabla; esto evitará que nadie ingrese a departamentos no deseados o mal escritos más adelante. Entonces necesitaría lo siguiente para reemplazar lo que tiene...

if request.Form("teacherId")) <> "" then
    Set rsSelect = Server.CreateObject("adodb.RecordSet")
    strSQL = _
        "SELECT " & _ 
            "tbl_department.departmentId, " & _ 
            "tbl_department.departmentName, " & _ 
            "tbl_teacher.department " & _ 
        "FROM " & _ 
            "tbl_departments " & _ 
            "LEFT JOIN " & _ 
            "tbl_teacher " & _ 
                "ON  tbl_departments.departmentId = tbl_teacher.department AND " & _ 
                    "tbl_teacher.teacherId = " & request.Form("teacherId")
    rsSelect.Open strSQL, strCon
    if not rsSelect.eof then %>
        <select name="Department">
            <% do until rsSelect.eof       %>
                <option <%if rsSelect("department")&""<>"" then response.write(" selected ")%> value="<%= rsSelect("Department") %>"><%= rsSelect("Department") %></option>
                <% rsSelect.MoveNext
            loop %>
        </select>
        <% else %>
            <em>No Department found</em>
        <% end if
    else %>
        <em>Select a Department</em>
    <% end if %>

SIN EMBARGO... Aquí hay un gran problema con la seguridad de SQL: el código anterior lo deja abierto a Ataques de inyección SQL, y debe ser considerado cuidadosamente.

Respondido 07 Oct 14, 15:10

Funcionó a las mil maravillas. Es una intranet, así que no te preocupes por los ataques de inyección SQL. Muchas gracias. - Jenny Tran

Solo hay un problema. El "seleccionado" no se selecciona cuando se completa el segundo menú desplegable. Por ejemplo, cuando selecciono "aaa, Joe", entonces el departamento de "Matemáticas" selecciona en la segunda selección. Sin embargo, "Seleccione un departamento" aparece en el primer Select, en lugar de "aaa, Joe". ¿Cómo lo cambio para mantener el valor seleccionado después de que se complete la segunda selección? Gracias. - Jenny Tran

@JennyTran: ¿Quieres decir cuando la primera select puebla? Si es así, entonces esto es mucho más complicado e involucra JavaScript... - Paul

Quiero decir DESPUÉS de que se complete el segundo SELECCIONAR. El primer SELECCIONAR debe mantener el valor que seleccioné previamente. - Jenny Tran

Me lo imaginé. Agregué Trim(request.Form("teacherId")) y funcionó. Gracias. - Jenny Tran

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.