tengo este carrito de la compra en ASP el cual guarda en una variable de sesion la cantidad de cada id de prodcuto.
¿Podeis decirme como puedo hacer para guardar en la variable de sesion mas datos? Usa la funcion MeterArticulo.
¿Y luego de que manera en Mostrarcatalogo visualizaria esos campos en el bucle?
Este es el codigo:
Código:
<%@LANGUAGE="VBSCRIPT"%> <%Option Explicit%> <%Response.Buffer=True%> <% Sub MostrarCatalogo ' Muestra el catálogo con enlaces para ir comprando Dim oRs, oRs2, SQL ' Uso 2 recordset Dim idmarca ' IdMarca en Productos ' Conexión sin DSN a la base de datos set oRs=Server.CreateObject("ADODB.Recordset") set oRs2=Server.CreateObject("ADODB.Recordset") SQL="SELECT * FROM Productos;" oRs.Open SQL, oConn 'Dibujo la tabla %> <TABLE BORDER=1 CELLSPACING="1" CELLPADDING="1"> <TR> <TD><B>Marca</B></TD> <TD><B>Producto</B></TD> <TD><B>Precio</B></TD> <TD></TD> <% do until oRs.EOF idmarca=oRs.Fields("Marca") ' Tengo que sacar el nombre y la URL de la marca SQL="SELECT * FROM Marcas WHERE IdMarca="&idmarca&";" oRs2.Open SQL, oConn ' Cuidado con los dos recordset ahora: ' oRs2 tiene la marca ' oRs tiene el producto %> <TR> <TD><A HREF="<%=oRs2.Fields("URL")%>"><%=oRs2.Fields("Nombre")%></A></TD> <TD><%=oRs.Fields("Nombre")%></TD> <TD><%=oRs.Fields("Precio")%></TD> <TD><A HREF="shop.asp?ac=meter&prod=<%=oRs.Fields("IdProducto")%>">Comprar</A></TD> </TR> <% 'Limpio oRs2 oRs2.Close oRs.MoveNext loop 'Termino la tabla %> </TABLE> <% oRs.Close set oRs=nothing set oRs2=nothing ' Pinto opciones %> <center><A HREF=shop.asp?ac=ver>Ver Carrito</A></center> <% End Sub '---------------------------------------------------------- Sub MostrarCarrito ' Muestra el contenido del carrito de la compra ' En este ejemplo los gastos de envío los declaro aquí como constante. ' En un caso real deberían traerse de base de datos y llenar un combo por ejemplo ' carrito es la variable global que referencia al carrito Dim oRs, oRs2, SQL Dim clave Dim gastos ' Gastos de envio Dim total, subtotal gastos=2500 ' Para todo el mundo! :) total=0 subtotal=0 ' Conexión sin DSN a la base de datos ' Debería haber sacado estas líneas a un sub y llamarlo, pero en fin :( set oRs=Server.CreateObject("ADODB.Recordset") 'Pinto la tabla %> <TABLE BORDER="1" CELLPADDING="1" CELLSPACING="1"> <TR> <TD>Artículo</TD> <TD>Cantidad</TD> <TD>Precio/unidad</TD> <TD>Quitar del carrito</TD> <TD>Total</TD> </TR> <% For Each clave in carrito subtotal=0 ' Total de cada artículo en el carrito 'Pinto la línea de este producto SQL="SELECT * FROM Productos WHERE IdProducto="&clave&";" set oRs=oConn.Execute(SQL) %> <TR> <TD><%=oRs.Fields("Nombre")%></TD> <TD><%=carrito(clave)%></TD> <TD><%=oRs.Fields("Precio")%></TD> <TD><A HREF="shop.asp?ac=sacar&prod=<%=clave%>&cant=1">Quitar Uno</A> <A HREF="shop.asp?ac=sacar&prod=<%=clave%>&cant=<%=carrito(clave)%>">Quitar Todos</A> </TD> <% ' Multiplico el precio por la cantidad. FormatNumber me asegura que es un nº válido ' y convierto todo a tipo Single con CSng. subtotal=CSng(FormatNumber(carrito(clave))*oRs.Fields("Precio")) total=total+subtotal %> <TD><%= subtotal %></TD> </TR> <% Next if carrito.Count > 0 then oRs.Close set oRs=nothing end if 'Pinto el final de la tabla %> <TR> <TD COLSPAN=4>Gastos de envío</TD> <TD> <% if total=0 then Response.Write("0") ' Sin compra no hay gastos de envío else Response.Write(gastos) end if %> </TD> <TR> <TD COLSPAN=4><B>Total:</B></TD> <TD> <%if total=0 then Response.Write("0") else Response.Write(total+gastos) end if %> </TD> </TABLE> <% ' Pinto los enlaces ' si no he llamado desde PasarPorCaja if accion<>"fin" then %> <center> <A HREF=shop.asp>Seguir mirando</A> / <A HREF=shop.asp?ac=fin>Pasar por caja</A> </center> <% end if End Sub '---------------------------------------------------------- Sub MeterArticulo (id) ' Añade el producto id al carrito de la compra ' En un caso real se deberían poder añadir más de una unidad ' bien desde el catálogo, bien editando en el carrito ' Si ya tengo el artículo en el carrito sumo 1 a la cantidad if carrito.Exists(id) then carrito(id)=carrito(id)+1 else ' Si no lo añado carrito.Add id, 1 end if Response.Write("Se ha añadido el artículo al carrito<br>") End Sub Sub SacarArticulo (id, cantidad) ' Saca un numero "cantidad" de articulos "id" del carrito if not carrito.Exists(id) then Response.Write("¡No tienes eso en tu carrito!") else if cantidad>1 then 'Quito todos así que quito ese articulo del carrito carrito.Remove(id) else 'Quito uno carrito(id)=carrito(id)-1 if carrito(id)<1 then carrito.Remove(id) end if end if end if End Sub Sub PasarPorCaja '----------------------------------------------- ' En este punto del script es donde debería ir ' todo lo relacionado con el pago, etc. ' Se podría por ejemplo escribir el pedido en un fichero ' de texto y añadirlo a una tabla de pedidos en la base de datos ' o bien enviar los detalles por email a una dirección. ' ¡Es tu decisión! ' Para el ejemplo, simplemente se lista el carrito una vez más ' y se muestra un mensaje de agradecimiento %> <H2>¡Gracias por comprar!</H2> <% MostrarCarrito %> En breve te llegarán a tu casa los productos. Gracias por comprar en ASPFácil. <br> (En un caso real aquí pediríamos los datos, etc.) <% ' Para el ejemplo, aquí libero la variable de sesión set Session("carrito")=nothing End Sub '--------------------------------- ' Programa "principal" '--------------------------------- Dim carrito Dim accion Dim producto Dim cant Dim oConn set oConn=Server.CreateObject("ADODB.Connection") oConn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("tienda.mdb") ' Si no existe el carrito lo creo ' si existe lo referencio if isobject(Session("carrito")) then set carrito=Session("carrito") else set carrito=Server.CreateObject("Scripting.Dictionary") end if accion=CStr(Request.QueryString("ac")) 'Paso el parámetro a cadena producto=CInt(Request.QueryString("prod")) 'Paso el parámetro cant a número entero cant=CInt(Request.QueryString("cant")) 'Paso el parámetro cant a número entero Select Case accion Case "ver" 'Muestro el carrito MostrarCarrito Case "meter" 'Añado articulo al carrito MeterArticulo producto MostrarCarrito Case "sacar" ' Quito el numero 'cant' de articulos 'producto' del carrito call SacarArticulo (producto, cant) MostrarCarrito Case "fin" ' Muestro las compras y termino PasarPorCaja Case else 'Muestro el catálogo MostrarCatalogo End Select set Session("carrito")=carrito oConn.Close set oConn=nothing %>