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 DECLARE idVenta
INT; /* idventas tomara el ultimo valor auto*/ INSERT INTO ventas
(fecha
,Idcliente
,Idempleados
,Idproducto
,cantidad
,PrecioUnit
,total
,Id_color
) VALUES(current_date(), xIdcliente
, xIdempleados
, xIdproducto
, xcantidad
, xPrecioUnit
, xcantidad
*xPrecioUnit
, xId_color
); /* Ahora restando el stock*/
UPDATE producto
SET stock
= (stock
- xcantidad
) WHERE xIdProducto
= Idproducto
;
/* Mostrando el Resumen de venta */
v.Idventas,
v.Fecha,
c.nombre,
e.nombre,
p.Descripcion,
v.Cantidad,
v.PrecioUnit,
v.total,
co.Descripcion
INNER JOIN empleados e
ON (v.Idempleados
= e.Idempleados
) 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)