29 - UPDATE (Modificación de un registro trabajando con dos tablas)


Ya habíamos visto que para modificar datos de una tabla debemos utilizar el comando SQL UPDATE.

Veremos ahora como generar un formulario con los datos actuales de un registro de una tabla rescatando información de otra tabla.

Confeccionararemos una serie de páginas que permitan modificar la descripción, precio y rubro de un artículo. Mostraremos en un control select los rubros y dispondremos como seleccionado el que corresponde.

pagina1.html

<html>
<head>
<title>problema</title>
</head>
<body>
<form action="pagina1.asp" method="post">
Ingrese el código del artículo a modificar:
<input type="text" name="codigo"><br>
<input type="submit" value="Buscar"><br>
</form>
</body>
</html>

Ahora veamos el código de la pagina1.asp donde se encuentran los conceptos nuevos:

<%option explicit%>
<html>
<head>
<title>problema</title>
</head>
<body>
<%
dim conexion
set conexion = Server.CreateObject("ADODB.Connection")
conexion.ConnectionString = "Provider=SQLOLEDB.1;" & _
   "Data Source=.;" & _
   "Integrated Security=SSPI;" & _
   "Persist Security Info=False;" & _
   "Initial Catalog=wi630629_aspya"
conexion.Open
dim registros
set registros = Server.CreateObject("ADODB.RecordSet") 
registros.open "select codigo,descripcion,precio,codigorubro from articulos 
where codigo=" _
& request.form("codigo") ,conexion
if not registros.eof then
%>
<form action="pagina2.asp" method="post">
Descripcion del articulo:
<input type="text" name="descripcion" size="30"
value="<%response.write(registros("descripcion"))%>"><br>
Precio:
<input type="text" name="precio" size="10"
value="<%response.write(registros("precio"))%>"><br>
Rubro:
<select name="codigorubro">
<%
dim registrosru
set registrosru = Server.CreateObject("ADODB.RecordSet") 
registrosru.open "select codigo,descripcion from rubros" ,conexion
do while not registrosru.eof
  if registrosru("codigo")=registros("codigorubro") then
    response.write("<option value=""" &registrosru("codigo")& _
    """ selected>" & registrosru("descripcion")& "</option>")
  else
    response.write("<option value=""" & registrosru("codigo")& _
    """>" &registrosru("descripcion")&"</option>")
  end if
  registrosru.movenext
loop
%>
</select><br>
<input type="hidden" name="codigo"
value="<%response.write(registros("codigo"))%>">
<input type="submit" value="Confirmar"><br>
</form>
<%
else
  response.write("No existe ningún artículo con dicho código")
end if
conexion.close
%>
</body>
</html>

Disponer distintos bloques de asp dentro de la misma página. Lo primero que hacemos en forma similar a conceptos anteriores es verificar si existe el código de artículo ingresado por el operador:

registros.open "select codigo,descripcion,precio from articulos where codigo=" _
    & request.form("codigo") ,conexion
if not registros.eof then

En caso que la condición if se verifique verdadera debemos disponer en la página un formulario HTML que muestre los datos actuales de dicho artículo. Lo más adecuado es escribir el formulario en un bloque HTML clásico y agregarle a la propiedad value de cada control el dato rescatado de la base de datos:

Descripcion del articulo:
<input type="text" name="descripcion" size="30"
value="<%response.write(registros("descripcion"))%>"><br>

Ahora debemos disponer en un select todos los rubros con sus respectivos códigos y además debemos mostrar seleccionado el rubro que pertenece el artículo a modificar. Para esto rescatamos todos los rubros de la tabla "rubros" y dentro de un while verificamos uno a uno si el código de rubro rescatado coincide con el del artículo seleccionado.

El if dentro del while permite disponer la propiedad selected al elemento option respectivo:

  if registrosru("codigo")=registros("codigorubro") then
    response.write("<option value=""" &registrosru("codigo")& _
    """ selected>" & registrosru("descripcion")& "</option>")
  else
    response.write("<option value=""" & registrosru("codigo")& _
    """>" &registrosru("descripcion")&"</option>")
  end if

Tengamos en cuenta que el contenido del control HTML debemos cargarlos con todos los rubros de la tabla "rubros", pero además debemos dejar seleccionado el que corresponde al artículo que estamos modificando.

Por último recordemos que almacenamos en un control oculto, es decir de tipo hidden, el código de artículo. Esto nos permite rescatarlo en la siguiente página donde procederemos a modificar la tabla de la base de datos propiamente dicha.

La última página (pagina2.asp) procede a la modificación propiamente dicha de la tabla:

<%option explicit%>
<html>
<head>
<title>problema</title>
</head>
<body>
<%
dim conexion
set conexion = Server.CreateObject("ADODB.Connection")
conexion.ConnectionString = "Provider=SQLOLEDB.1;" & _
  "Data Source=.;" & _
  "Integrated Security=SSPI;" & _
  "Initial Catalog=wi630629_aspya"
conexion.Open
conexion.execute("update articulos set descripcion='" & _
  request.form("descripcion") & "'," & _
    "codigorubro=" & request.form("codigorubro") & "," & _
    "precio=" & request.form("precio") & _
    " where codigo=" & request.form("codigo"))
conexion.close
response.write("Los datos fueron modificados")
%>
</body>
</html>


Retornar