Enviar el pedido II

Comentamos las dos partes de este script
Para mejor comprensión del listado pasaremos a describir en primer lugar el rellenado de los formularios que se encuentra en la segunda mitad del script.

Este fragmento comienza recuperando los posibles valores de las cookies correspondientes a los datos del cliente almacenados en visitas anteriores para evitarle trabajo:

nombre=Request.Cookies("nombre")
direccion=Request.Cookies("direccion")


Seguidamente se muestra un formulario clásico en el que algunos campos pueden estar rellenados si las cookies contenían la información. Esta parte no deja de ser una hoja HTML con pequeñas incrustaciones de código ASP:

<form action="pedido.asp" method="post" name="pedido">
<table align="center" width="400" cellspacing="2" cellpadding="2" border="0">
<tr>
<td bgcolor="#999966" align="center">
<FONT face="verdana,arial,helvetica" size=2 color="#ffffff"><%imprimir("formulario")%></font><br>
</td></tr>
<tr>
<td bgcolor="#cc9900" align="center">
<FONT face="verdana,arial,helvetica" size=2 color="#ffffff"><%imprimir("nombre")%></font><br>
<input type="Text" name="nombre" value="<%=nombre%>">
</td></tr>
<tr>
<td bgcolor="#cc9900" align="center"><FONT face="verdana,arial,helvetica" size=2 color="#ffffff"><%imprimir("direccion")%></font><br>
<input type="Text" name="direccion" value="<%=direccion%>">
</td></tr>
<tr>
<td bgcolor="#999966" align="center">
<input type="submit" name="enviar" value="<%imprimir("enviar")%>">
</td></tr>
</table>
</form>


Ni que decir tiene que este formulario ha sido simplificado al máximo para mostrar la utilidad de las cookies en este tipo de situaciones.

Por supuesto, en un formulario de este tipo para una tienda virtual, se pediría otra serie de datos entre los cuales figuraría probablemente el numero de tarjeta bancaria o datos de cuenta. Es por ello que este tipo de páginas tienen que ser alojadas en un directorio protegido con una conexión de seguridad tipo SSL.

La segunda parte del script, localizada al principio del listado, gestiona la creación del registro en la base de datos de pedidos correspondiente a esta nueva orden.

Antes de nada, recogeremos las variables enviadas por el formulario de esta misma página y crearemos las cookies para que en futuras visitas los formularios sean rellenados automáticamente:

'Recogemos variables
nombre=Request.Form("nombre")
direccion=Request.Form("direccion")
Response.Cookies("nombre")=nombre
Response.Cookies("direccion")=direccion
Response.Cookies("nombre").Expires = #1/1/2002#
Response.Cookies("direccion").Expires = #1/1/2002#


Seguidamente leeremos el contenido del carrito, es decir, las referencias almacenadas en cada una de las variables Session(numero). Esto lo podemos hacer una a una escribiendo líneas del tipo "id(numero)=Session(numero)" o bien podemos crear un bucle como el que hemos propuesto:

Dim id(10)
For i=1 to 10
   id(i)=Cint(Session(i))
Next%>


La instrucción Dim sirve para declarar una matriz, en este caso, la matriz declarada es un conjunto de 10 elementos llamados id(numero).

Nada nos hubiese impedido pasar de esta conversión de Session en id e introducir las Session directamente en la sentencia SQL creada más adelante. Sin embargo, resulta más fácil de manipular y leer esta sentencia con variables más cortas.

El paso siguiente será confirmar que los formularios han sido rellenados satisfactoriamente, algo bastante fácil y evidente en este caso:

'Comprobamos si el formulario ha sido rellenado bien y si es asi, incluimos el pedido en la BD
   If nombre="" Then%>
      <tr>
      <td bgcolor="#cc9900" align="center"><FONT face="verdana,arial,helvetica" size=2 color="#ffffff"><%imprimir("fallo_nombre")%></font><br>
      </td></tr>
      <tr>
      <td bgcolor="#999966" align="center">
      <a href="pedido.asp"><FONT face="verdana,arial,helvetica" size=2 color="#ffffff"><%imprimir("volver")%></font></a>
      </td></tr>
   <%Elseif direccion="" Then%>
      <tr>
      <td bgcolor="#cc9900" align="center"><FONT face="verdana,arial,helvetica" size=2 color="#ffffff"><%imprimir("fallo_direccion")%></font><br>
      </td></tr>
      <tr>
      <td bgcolor="#999966" align="center">
      <a href="pedido.asp"><FONT face="verdana,arial,helvetica" size=2 color="#ffffff"><%imprimir("volver")%></font></a>


Si todo esta en orden, pasamos a la elaboración y ejecución de la sentencia SQL la cual resulta horriblemente larga y pesada:

'Generamos nuestra sentencia SQL y la ejecutamos
      sSQL="Insert Into pedidos2 (nombre,direccion,fecha,total,id_1,id_2,id_3,id_4,id_5,id_6,id_7,id_8,id_9,id_10) Values ('"&nombre&"','"&direccion&"','"&date&"',"&Session("total")&","&id(1)&","&id(2)&","&id(3)&","&id(4)&","&id(5)&","&id(6)&","&id(7)&","&id(8)&","&id(9)&","&id(10)&")"
      set RS=Conn.Execute(sSQL)


Tras haber dado las gracias al cliente y ofrecerle la posibilidad de volver a la página de entrada de la tienda damos por finalizada la sesión. Mediante la instrucción Session.Abandon que nos permite borrar de la memoria el contenido de las session.

'Damos por finalizada la sesion
      Session.Abandon


Ir la librería

Autor

Rubén Alvarez

Rubén es doctor en química y programador aficionado con experiencia en PHP.

Compartir

Comentarios

Miguel Angel

02/4/2002
Para empezar felicidades por el articulo, estoy desarrollando algo parecido, pero tengo un problema que no se como resolver y que en vuestro articulo no abordais. Para evitar usar mas recursos de los imprescindibles uso unas tablas temporales en la base de datos para acumular las compras en un carrito, pero mi problema es que no puedo eliminar los registros que corresponden a la sesion si el cliente cierra sin comprar, ya que desde Session_OnEnd no es posible hacerlo, como deberia resolver esto?.

RESPUESTA:

Pues deberías encontrar otro momento para hacer esas comprobaciones y los consiguientes borrados de registros antiguos. Por ejemplo, podrías organizarlos cuando un usuario se conecta... que borrre los registros que se hicieron hace más de una hora. También podrías crear una tarea que se ejecute cada hora y que borre los registros que se crearon de más de una hora. O algo así que se te ocurra. También puedes ver qué sugerencias se les ocurren a los compañeros de la lista de correo de ayuda: http://www.desarrolloweb.com/listacorreo/

Ángel Cardiel

17/6/2002
Felicidades por este proyecto. Me gustaría que me resolvieses una duda. Quiero que en el carrito exista la posibilidad de elegir la cantidad de articulos que quiere comprar. Por ejemplo, si quiere recibir dos ejemplares de un libro, no tenga que añadirlo dos veces, si no que elija la cantidad a comprar. Gracias

Respuesta

Si deseas hacer eso necesitarás utilizar una estructura de datos más compleja que una simple variable. Por ejemplo podrías utilizar un array.

En las variables de session puedes guardar cualquier cosa y, por supuesto, un array también. Así que puedes definir el array como lo haces habitualmente y una vez que lo tienes relleno lo puedes meter en la variable de session.

Cuando desees utilizarlo, debes asignar esa variable de session a una variable local en la página y utilizar esa variable como si fuera un array.

A ver si tengo un rato para explicar esto detenidamente...

Eduardo

18/6/2004
Tengo un problema. Estoy implementando algo parecido a este manual pero me aparece un error cuando intento guardar el registro en la BD. El error es el siguiente:

HTTP 500.100. Error interno del servidor: error de ASP
Servicios de Internet Information Server

--------------------------------------------------------------------------------

Información técnica (para personal de soporte técnico)

Tipo de error:
Microsoft OLE DB Provider for ODBC Drivers (0x80004005)
[Microsoft][Controlador ODBC Microsoft Access] Operation must use an updateable query.
pedido.asp, línea 89

Que está pasando?