Ver Mensaje Individual
  #2 (permalink)  
Antiguo 04/01/2010, 13:48
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: procedimiento no puede devolver un conjunto de resultados en el contexto d

Normalmente ese mensaje dice que se está intentando usar indebidamente una función o una sentencia en un contexto en que no trabaja.
En tu caso yo sospecho que es por el LAST_INSERT_ID(), que no se usa ni devuelve el dato que pides de la forma que lo pones.
LAST_INSERT_ID() devuelve el ultimo ID autonumérico insertado o modificado si luego no se ha realizado ninguna otra inserción o modificación. En tu caso lo estás poniendo luego de un UPDATE, lo que haría que te devolviese el ID del producto, y no de la venta.
Además, lo estás poniendo incorrectamente, por cuanto no devuelve un valor relacionado con ninguna tabla determinable, devuelve el último ID insertado o modificado, sea cual sea la tabla que se manipuló. No existe una relación entre la función y la tabla.

Yo te propondría esta sintaxis:
Código MySQL:
Ver original
  1. CREATE PROCEDURE `PA_Venta`
  2.   (xIdcliente INT,
  3.   xIdempleados varchar(3),
  4.   xIdproducto varchar(6),
  5.   xcantidad Numeric(18,2),
  6.   xPrecioUnit Numeric (18,2),
  7.   xId_color int)
  8.   DECLARE idVenta INT;  /* idventas tomara el ultimo valor auto*/
  9.   INSERT INTO ventas(fecha,Idcliente,Idempleados,Idproducto,cantidad,PrecioUnit,total,Id_color)
  10.   VALUES(current_date(), xIdcliente, xIdempleados, xIdproducto, xcantidad, xPrecioUnit, xcantidad*xPrecioUnit, xId_color);
  11.   /* Ahora restando el stock*/
  12.  
  13.   SET idVenta = SELECT LAST_INSERT_ID();  /*capturando el ultimo valor de autoincrement*/
  14.   UPDATE producto SET stock = (stock - xcantidad)
  15.   WHERE xIdProducto = Idproducto;
  16.  
  17.         /* Mostrando el Resumen de venta */
  18.     v.Idventas,
  19.     v.Fecha,
  20.     c.nombre,
  21.     e.nombre,
  22.     p.Descripcion,
  23.     v.Cantidad,
  24.     v.PrecioUnit,
  25.     v.total,
  26.     co.Descripcion
  27.   FROM ventas v
  28.     INNER JOIN empleados e ON (v.Idempleados = e.Idempleados)
  29.     INNER JOIN clientes c ON (c.Idcliente = v.Idcliente)
  30.     INNER JOIN producto p ON (p.Idproducto = v.Idproducto)
  31.     INNER JOIN color co ON (v.Id_color = co.Id_color )
  32.       WHERE v.Idventas = idVenta;

Además de lo dicho, el tipo de relaciones entre tablas no se debe hacer en el WHERE, por cuestiones de eficiencia, sino con JOIN. Si no te resulta así, prueba poner LEFT JOIN.
Atención: Sólo devolverá datos si se se cumplen todas las condiciones del JOIN.

Por el uso de LAST_INSERT_ID(): 12.9.3. Funciones de información

Respecto al mensaje de error: 19.2.1. CREATE PROCEDURE y CREATE FUNCTION (Ver nota)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)