Foros del Web » Programando para Internet » ASP Clásico »

ayuda con variables de sesion

Estas en el tema de ayuda con variables de sesion en el foro de ASP Clásico en Foros del Web. Hola, tengo este carrito de la compra en ASP el cual guarda en una variable de sesion la cantidad de cada id de prodcuto. ¿Podeis ...
  #1 (permalink)  
Antiguo 18/09/2009, 17:40
Avatar de Laika  
Fecha de Ingreso: octubre-2001
Mensajes: 1.376
Antigüedad: 23 años, 6 meses
Puntos: 0
ayuda con variables de sesion

Hola,

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

%>
  #2 (permalink)  
Antiguo 19/09/2009, 16:23
Avatar de Shiryu_Libra
Colaborador
 
Fecha de Ingreso: febrero-2007
Ubicación: Cantando "Screenager" en "Kirafa Kaput"
Mensajes: 3.614
Antigüedad: 18 años, 2 meses
Puntos: 88
Respuesta: ayuda con variables de sesion



cual es el problema, segun el codigo, verifica que el numero del producto este en el diccionario, sino lo agrega...

te sale algun error?

teoricamente funciona

????
__________________
"Eres parte del problema, parte de la solucion o parte del paisaje"
Un Saludo desde Desierto de Altar, Sonora, MX.
Shiryu_libra
  #3 (permalink)  
Antiguo 19/09/2009, 18:33
Avatar de Laika  
Fecha de Ingreso: octubre-2001
Mensajes: 1.376
Antigüedad: 23 años, 6 meses
Puntos: 0
Respuesta: ayuda con variables de sesion

El problema era ese que no me daba cuanta que usando un objeto del diccionario a la hora de hacerle un Add solo se puede tener en cuenta 2 valores.

Lo he solucionado haciendo desde o un carrito sd¡in usar diccionario

Gracias
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:28.