Enviar el pedido II

Valoración del artículo:
Comentamos las dos partes de este script
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
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

Comentarios
Fueron enviados 3 comentarios al artículo
1 comentario no revisado
2 comentarios revisados:
Por: Miguel Angel
02/4/02
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/

Por: Ángel Cardiel
17/6/02
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...


Manuales relacionados
Categorias relacionadas
El autor
Rubén Alvarez
Redactor de DesarrolloWeb.com
http://www.desarrolloweb.com
Lectura recomendada
Compra este libro en Agapea, la librería urgente a domicilio.
Últimas noticias
Alojados en el grupo