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

Ayuda con codigo carrito de la compra en ASP

Estas en el tema de Ayuda con codigo carrito de la compra en ASP en el foro de ASP Clásico en Foros del Web. HOla, He configurado un carrito de la compra en ASP y tengo un problena que no puedo resolver. El carrito funciona bien pero ahora le ...
  #1 (permalink)  
Antiguo 16/09/2009, 05:14
Avatar de Laika  
Fecha de Ingreso: octubre-2001
Mensajes: 1.376
Antigüedad: 23 años, 6 meses
Puntos: 0
Ayuda con codigo carrito de la compra en ASP

HOla,

He configurado un carrito de la compra en ASP y tengo un problena que no puedo resolver. El carrito funciona bien pero ahora le he añadido un campo que es Personzalizacion. Esta variable se recoge de un formulario de pedido.

Si es que si se le suma 90 € al articulo y sino es 0 ese importe adicional.

Me lo hace bien por ejemplo cuando compro un articulo pero si añado otro al carrito sin ese plus, me pone a 0 también el que ya tenia en el carrito con 90.

Lo mismo me pasa si tengo en el carrito 2 productos con el plus de 90 y borro un articulo del carrito, al que queda le pone el plus a 0 (pierde su valor de 90).

Este es el codigo a ver si alguien puede ayudarme

Gracias

Código:
<%@LANGUAGE="VBSCRIPT"%>
<%Option Explicit%>
<%Response.Buffer=True%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:fo="http://www.w3.org/1999/XSL/Format"><!-- InstanceBegin template="/Templates/paginas.dwt" codeOutsideHTMLIsLocked="false" -->

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">  
</head>

<body class="naranja">
 
    <center>
      <div id="cabecera"><a href="../index.aspx"><img src="../images/encabezado.jpg" width="995" height="95" border="0"/></a></div>      
      
      <div id="cuerpo">
        
        <div class="cierrefotohome"></div>
        <div class="principal">
		 <!-- InstanceBeginEditable name="titulo" -->         
         <h1>Resumen del Pedido</h1>
		 <!-- InstanceEndEditable -->

<!-- InstanceBeginEditable name="contenido" -->
<br /><br />

<%

Dim unidades,personalizado,precio,iva,iva_pantalla,descuento,descuento_pantalla,tacos,subtotal_pantalla,sacar,paginadestino

unidades=0
personalizado=0
'Recojo los valores del formulario:
unidades=CInt(Request.Form("unidades"))
personalizado=Request.Form("personalizado")

if unidades = 0 then ' Para que si se viene a la pagina sin comprar (ej. finalizar pedido), no entre en error.aspx si compra menos de 50 €
	unidades = 50
	precio= 1
End If

If personalizado = 1 then
	personalizado= 90 'Plus que se suma a cada producto que vaya personzalido
else
	personalizado= 0
End If
'____________________________________________________--

Sub MostrarCarrito
' Muestra el contenido del carrito de la compra
' carrito es la variable global que referencia al carrito

Dim oRs,Ors2, SQL,SQL2
Dim clave
Dim total, subtotal

total=0
subtotal=0
descuento=0.10
iva=0.16

' 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")
set oRs2=Server.CreateObject("ADODB.Recordset")

'Dibujo la tabla

%>
	<TABLE width="695" BORDER="0" align="center" CELLPADDING="0" CELLSPACING="0" class="tabla_pedidos">
	<TR class="filas_tabla_pedidos">
	<TD width="212" height="27" class="tit_filas_tabla_pedidos">ARTICULO</TD>
	<TD width="74" class="tit_filas_tabla_pedidos">CANTIDAD</TD>
	<TD width="121" class="tit_filas_tabla_pedidos">PRECIO / UNIDAD</TD>
	<TD width="127" class="tit_filas_tabla_pedidos">+ PERSONALIZAR</TD>
	<TD width="84" class="tit_filas_tabla_pedidos">TOTAL</TD>
	<TD width="76" class="tit_filas_tabla_pedidos">ELIMINAR</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 id_producto="&clave&";"
set oRs=oConn.Execute(SQL)

SQL2="SELECT * FROM precios WHERE id_producto="&clave&";"
set oRs2=oConn.Execute(SQL2)

'---------------------
'CALCULO DE PRECIOS

Dim precio1,precio2,precio3
precio1=oRs2("precio1")
precio2=oRs2("precio2")
precio3=oRs2("precio3")

If request.QueryString("prod") <> 5 then
	If unidades <= 200 then
	precio=precio1
		If (precio * unidades) < 50 then
			call SacarArticulo (clave, unidades)
			paginadestino="error.aspx?id_producto="&clave
			response.Redirect(paginadestino)
		End if
		
	elseif unidades >200 AND unidades <= 500 then
	precio=precio2
		If (precio * unidades) < 50 then
			call SacarArticulo (clave, unidades)
			paginadestino="error.aspx?id_producto="&clave
			response.Redirect(paginadestino)
		End if
		
	elseif unidades > 500 then
	precio=precio3
		If (precio * unidades) < 50 then
			call SacarArticulo (clave, unidades)
			paginadestino="error.aspx?id_producto="&clave
			response.Redirect(paginadestino)
		End if
		
	End if
elseif Request.QueryString("prod") = 5 then 'âra los tacos de notas
	Dim tacos			
	tacos=request.Form("tacos")
	If tacos = 200 then
		precio=precio1
	elseif tacos = 300 then
		precio=precio2
	End if		

End If

'--------------------------------------------------------------------

' 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))*precio)
subtotal_pantalla=Formatnumber(subtotal,2)
total=total+subtotal
%>

	<TR class="filas_tabla_pedidos">

	<TD height="32" class="celdas_pedidos"><%=oRs.Fields("Nombre")%></TD>
	<TD class="celdas_pedidos"><%=carrito(clave)%></TD>
	<TD class="celdas_pedidos"><%=precio%></TD>
	<TD class="celdas_pedidos">&nbsp;</TD>
	<TD class="celdas_pedidos"><%= subtotal_pantalla %> &euro;</TD>

	<TD class="celdas_pedidos"><a href="tienda.asp?ac=sacar&amp;prod=<%=clave%>&amp;cant=<%=carrito(clave)%>"><img src="../images/papelera.gif" alt="Eliminar Art&iacute;culo" width="20" height="25" border="0" /></a></TD>
	</TR>
<%
Next

if carrito.Count > 0 then
   oRs.Close
   set oRs=nothing
end if

'Pinto el final de la tabla

%>	
	</TABLE> <br />
	<table width="640" border="0" align="center" cellpadding="0" cellspacing="0">
	  <tr>
	    <td width="213">&nbsp;</td>
	    <td width="177">&nbsp;</td>
	    <td width="250">
        
        <table width="250" border="0" align="center" cellpadding="0" cellspacing="0" class="tabla_pedidos">
	      <tr class="filas_tabla_pedidos">
	        <td height="25" colspan="4" align="right" class="tit_filas_tabla_pedidos">DESCUENTO (-10 %)</td>
	        <td width="106" class="celdas_pedidos" ><%
	if total=0 then 
		Response.Write("0") 	' Sin compra no hay descuento
	else
		descuento=total*descuento
		descuento_pantalla=Formatnumber(descuento,2)
		Response.Write(descuento_pantalla)
		'Actualizazo TOTAl
		total=total-descuento
	end if
	%>	          &euro;</td>
	        </tr>
	      <tr class="filas_tabla_pedidos">
	        <td height="25" colspan="4" align="right" class="tit_filas_tabla_pedidos">SUBTOTAL</td>
	        <td class="celdas_pedidos"><%		
		Response.Write(formatnumber(total,2))
	%>
	          &euro;</td>
	        </tr>
	      <tr class="filas_tabla_pedidos">
	        <td height="25" colspan="4" align="right" class="tit_filas_tabla_pedidos">IVA (16 %)</td>
	        <td class="celdas_pedidos"><%
	if total=0 then 
		Response.Write("0")
	else
		iva=(iva * total)
		iva_pantalla=Formatnumber(iva,2)
		response.Write(iva_pantalla)
		'Actualizazo TOTAl
		total=total+iva	
	end if	
	%>
	          &euro;</td>
	        </tr>
	      <tr class="filas_tabla_pedidos">
	        <td height="25" colspan="4" align="right" class="tit_filas_tabla_pedidos"><b>TOTAL FINAL:</b></td>
	        <td class="celdas_pedidos"><%if total=0 then
		Response.Write("0")
	else
		total=total
		Response.Write(Formatnumber(total,2))
	end if
	%>
	          &euro;</td>
	        </tr>
        </table></td>
      </tr>
    </table>
	<p>
      <%
' Pinto los enlaces
' si no he llamado desde PasarPorCaja
if accion<>"fin" then
%>
    </p><br />
    <center>
      <A HREF=calendarios-personalizados.aspx class="enlace">Seguir comprando</A> <span class="enlace">/</span> <A HREF=tienda.asp?ac=fin class="enlace">Confirmar Pedido</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)+ unidades 'PERSONALIZADO
else
' Si no lo añado
   carrito.Add id, unidades 'PERSONALIZADO
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
  #2 (permalink)  
Antiguo 16/09/2009, 05:14
Avatar de Laika  
Fecha de Ingreso: octubre-2001
Mensajes: 1.376
Antigüedad: 23 años, 6 meses
Puntos: 0
Respuesta: Ayuda con codigo carrito de la compra en ASP

Aqui sigue el codigo que no ntraba en un post

Código:
'_________________________________________________________________________________________________________________________________

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.
%>

<H3 align="center"><b>¡GRACIAS POR COMPRAR</b> <br />
  <br />
  Aqu&iacute; puede ver el resumen de su Pedido:</H3>
<p><br />
  <%
MostrarCarrito
%>
  <br />
  <h3 align="center">En breve nuestro Dpto. de Atenci&oacute;n al Cliente se pondr&aacute; en contacto con usted.<br />
    <br />
    Para ello facil&iacute;tenos los siguientes datos:</h3></p>
<p> <br>
</p>

<form action="tratar-enviar-pedido-linea-naranja.aspx" method="post">
<table width="550" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td width="59" height="21">(*) Nombre:</td>
    <td width="136" height="30"><input type="text" name="nombre" id="nombre" /></td>
    <td width="62">(*) Apellidos:</td>
    <td width="143"><input type="text" name="apellidos" id="apellidos" /></td>
  </tr>
  <tr>
    <td height="21">Direcci&oacute;n:</td>
    <td height="30"><input type="text" name="direccion" id="direccion" /></td>
    <td>CP:</td>
    <td><input type="text" name="cp" id="cp" /></td>
  </tr>
  <tr>
    <td height="21">Poblaci&oacute;n:</td>
    <td height="30"><input type="text" name="poblacion" id="poblacion" /></td>
    <td>Provincia:</td>
    <td><input type="text" name="provincia" id="provincia" /></td>
  </tr>
  <tr>
    <td height="21">Pa&iacute;s:</td>
    <td height="30"><input type="text" name="pais" id="pais" /></td>
    <td>(*) Tel&eacute;fono:</td>
    <td><input type="text" name="telefono" id="telefono" /></td>
  </tr>
  <tr>
    <td> (*) Email:</td>
    <td height="30"><input type="text" name="email" id="email" /></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
</table>
<table width="550" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td><p>Comentarios:</p>
      <p>
        <textarea name="comentarios" id="comentarios" cols="58" rows="5"></textarea>
      </p></td>
  </tr>
  <tr>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td align="center"><input name="button" type="submit" id="button" onclick="MM_validateForm('nombre','','R','apellidos','','R','telefono','','R','email','','RisEmail');return document.MM_returnValue" value="Enviar Pedido" /></td>
  </tr>
</table>


<%
Dim clave,precio,SQL,oRs,SQL2,oRs2,subtotal,subtotal_pantalla,total,descuento_pantalla,descuento,iva,subtotal_final

total=0
subtotal=0
descuento=0.10
iva=0.16

For Each clave in carrito
 
 SQL="SELECT * FROM Productos WHERE id_producto="&clave&";"
set oRs=oConn.Execute(SQL)

SQL2="SELECT * FROM precios WHERE id_producto="&clave&";"
set oRs2=oConn.Execute(SQL2)

'-------------------------------------------------------------------------------------------
'CALCULO DE PRECIOS

Dim precio1,precio2,precio3
precio1=oRs2("precio1")
precio2=oRs2("precio2")
precio3=oRs2("precio3")

If request.QueryString("prod") <> 5 then
	If unidades <= 200 then
	precio=precio1
	elseif unidades >200 AND unidades <= 500 then
	precio=precio2
	elseif unidades > 500 then
	precio=precio3
	End if
elseif Request.QueryString("prod") = 5 then 'âra los tacos de notas
	Dim tacos			
	tacos=request.Form("tacos")
	If tacos = 200 then
		precio=precio1
	elseif tacos = 300 then
		precio=precio2
	End if		

End If
'--------------------------------------------------------------------

' 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))*precio)
subtotal_pantalla=Formatnumber(subtotal,2)
total=total+subtotal
%> 
    
<input name="articulo<%=clave%>" type="hidden" id="" value="<%=clave%>">
<input name="unidades<%=clave%>" type="hidden" id="" value="<%=carrito(clave)%>">
<input name="precio<%=clave%>" type="hidden" id="" value="<%=precio%>">
<input name="subtotal<%=clave%>" type="hidden" id="" value="<%=subtotal_pantalla%>">
<%'response.Write("unidades " & clave)%>
<%'response.Write("precio/unidad " & carrito(clave))%>
<%'response.Write("precio " & precio)%>
<%'response.Write("subtotal " & subtotal_pantalla)%>	

<%Next%>

<%if total=0 then 
		Response.Write("0") 	' Sin compra no hay descuento
	else
		descuento=total*descuento
		descuento_pantalla=Formatnumber(descuento,2)		
		'Actualizazo TOTAl
		total=total-descuento
		subtotal_final=total
end if%>


<%if total=0 then 
		Response.Write("0")
	else
		iva=(iva * total)
		iva_pantalla=Formatnumber(iva,2)
		'Actualizazo TOTAl
		total=total+iva	
	end if%>

<br />
<%'response.Write("descuento" & descuento_pantalla)%>
<%'response.Write("subtotal" & subtotal_final)%>
<%'response.Write("iva" & iva)%>
<%'response.Write("total" & total)%>

<input name="descuento" type="hidden" id="" value="<%=descuento_pantalla%>">
<input name="subtotal_final" type="hidden" id="" value="<%=subtotal_final%>">
<input name="iva" type="hidden" id="" value="<%=iva%>">
<input name="total" type="hidden" id="" value="<%=total%>">

<br />

</form>

<p>&nbsp;</p>
<p>
  <%
' Para el ejemplo, aquí libero la variable de sesión
session.abandon
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

%>
</p>
</html>
  #3 (permalink)  
Antiguo 17/09/2009, 09:47
 
Fecha de Ingreso: mayo-2009
Mensajes: 201
Antigüedad: 15 años, 10 meses
Puntos: 9
Respuesta: Ayuda con codigo carrito de la compra en ASP

es un monton de codigo, lo he intentado entender bien y la verdad es que tus comentarios en el codigo son dignos de elogios, pero tienes alguna idea de que partes del codigo tienen relacion con el bug?
  #4 (permalink)  
Antiguo 17/09/2009, 10:27
Avatar de Laika  
Fecha de Ingreso: octubre-2001
Mensajes: 1.376
Antigüedad: 23 años, 6 meses
Puntos: 0
Respuesta: Ayuda con codigo carrito de la compra en ASP

La sesion es:

set Session("carrito")=carrito

El problema es que cuando añado algo al carrito, solo me añade las unidades a la variable de sesion y yo necesito que me añada estos datos numericos que recojo de otra pagina ASP que ya me trae los datos calculados:

id producto
unidades
precio / unidad
personzalizion
total

¿como puedo hacerlo? Y lo mismo para quitar del carrito a un producto. Estas son las funciones:

Código:
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)+ unidades 'PERSONALIZADO
else
' Si no lo añado
   carrito.Add id, unidades 'PERSONALIZADO
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
Una vez este añadido todo estos datos de mas los deberia de tener en cuenta la funcion MostrarCarrito

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 15:49.