Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Trigger para descontar stock, MSQL

Estas en el tema de Trigger para descontar stock, MSQL en el foro de Mysql en Foros del Web. Hola muy buenos dias, quería saber si alguien puede ayudarme en este tema ya que soy nuevo en esto de los triggers, lo que quiero ...
  #1 (permalink)  
Antiguo 26/02/2016, 10:34
 
Fecha de Ingreso: febrero-2016
Mensajes: 31
Antigüedad: 8 años, 1 mes
Puntos: 0
Trigger para descontar stock, MSQL

Hola muy buenos dias, quería saber si alguien puede ayudarme en este tema ya que soy nuevo en esto de los triggers, lo que quiero que quiero que haga el trigger es que me descuente el stock del producto cuando alguien pide cierta cantidad de dicho producto mi base de datos es la siguiente
-articulos-
fecha_entrada
fecha_salida
id_detalle
id_producto
marca
modelo
nombre_produc
no_requisicion
stock

-pedido-
area
empleado
id_detalle
id_pedido
modelo
producto
solicitud
status
stock

y estas 2 tablas estan relacionadas con

-detalle-
descripcion
id_detalle

el trigger que realize es el siguiente, no se si este bien estructurado, o si me falta por agregarle mas campos
Código MySQL:
Ver original
  1. delimiter //
  2. CREATE TRIGGER destock AFTER INSERT ON articulos
  3. FOR EACH
  4. ROW
  5.     UPDATE articulos
  6.     SET stock = stock - stock
  7.     WHERE id_detalle = id_detalle;
  8. //
  9. delimiter ;
espero puedan ayudarme, de antemano gracias

Última edición por gnzsoloyo; 26/02/2016 a las 10:47
  #2 (permalink)  
Antiguo 26/02/2016, 10:50
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Trigger para descontar stock, MSQL

El trigger está mal escrito por varias razones:
1) MySQL no permite que un trigger realice operaciones INSERT/UPDATE/DELETE sobre la misma tabla que está ejecutando el trigger.
2) No debes invocar campos directamente, ni valores, sin usar las pseudovariables NEW y OLD. Por favor, lee el Manual de Referencia para entender como se trabaja con TRIGGERs.
3) Si la operación es un INSERT en la tabla Articulo, es porque el stock no existe. En consecuencia hacer un update del stock no tiene sentido.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 26/02/2016, 11:11
 
Fecha de Ingreso: febrero-2016
Mensajes: 31
Antigüedad: 8 años, 1 mes
Puntos: 0
Respuesta: Trigger para descontar stock, MSQL

Cita:
Iniciado por gnzsoloyo Ver Mensaje
El trigger está mal escrito por varias razones:
1) MySQL no permite que un trigger realice operaciones INSERT/UPDATE/DELETE sobre la misma tabla que está ejecutando el trigger.
2) No debes invocar campos directamente, ni valores, sin usar las pseudovariables NEW y OLD. Por favor, lee el [URL="https://dev.mysql.com/doc/refman/5.5/en/create-trigger.html"]Manual de Referencia[/URL] para entender como se trabaja con TRIGGERs.
3) Si la operación es un INSERT en la tabla Articulo, es porque el stock no existe. En consecuencia hacer un update del stock no tiene sentido.
ooh ok, podrías ayudarme con código de como es la estructura correcta del trigger para realizar la acción que quiero que haga por favor? si no es mucha molestia claro
  #4 (permalink)  
Antiguo 26/02/2016, 11:25
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Trigger para descontar stock, MSQL

Es que el problema es que todo lo tienes mal diseñado...
Esas tres tablas están directamente mal hechas. No cumplen un esquema maestro-detalle necesario para los pedidos, y la tabla de articulos no tiene que relacionarse con los pedidos, sino al revés.

La verdad es que tienes que descartar todo el modelo y empezarlo de cero.
Cita:
ARTICULO
id_producto (PK)
marca
modelo
nombre_produc
stock
Cita:
PEDIDO
id_pedido (PK)
area
empleado
estado
fecha_entrada
fecha_salida
Cita:
DETALLE_PEDIDO
id_pedido
nro_item
id_producto
cantidad
Este campo no se entiende:

Cita:
no_requisicion
El resto de los campos no queda claro para qué se usan.

Describe completamente los detalles del sistema en esta parte y veremos qué está faltando.
Recién entonces tendría sentido ponerse a ver un TRIGGER...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 26/02/2016, 11:54
 
Fecha de Ingreso: febrero-2016
Mensajes: 31
Antigüedad: 8 años, 1 mes
Puntos: 0
Respuesta: Trigger para descontar stock, MSQL

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Es que el problema es que todo lo tienes mal diseñado...
Esas tres tablas están directamente mal hechas. No cumplen un esquema maestro-detalle necesario para los pedidos, y la tabla de articulos no tiene que relacionarse con los pedidos, sino al revés.

La verdad es que tienes que descartar todo el modelo y empezarlo de cero.






Este campo no se entiende:



El resto de los campos no queda claro para qué se usan.

Describe completamente los detalles del sistema en esta parte y veremos qué está faltando.
Recién entonces tendría sentido ponerse a ver un TRIGGER...
en mi tabla pedido vienen los campos stock que es la cantidad que el usuario quiere pedir, nombre del producto y la marca para saber que producto, cantidad y marca para saber que esta pidiendo el empleado. y el campo que comentas que no se entiende el que esta en articulos que es "no_requisicion" es para saber que cantidad se compraron y con el "stock" que esta en la misma es para que valla reduciendo cuando el empleado realize un pedido, el campo que agregaste a la tabla detalle "nro_item" que funcion tendria?

Última edición por Eric_Alberto; 26/02/2016 a las 12:12 Razón: duda
  #6 (permalink)  
Antiguo 26/02/2016, 13:59
 
Fecha de Ingreso: febrero-2016
Mensajes: 31
Antigüedad: 8 años, 1 mes
Puntos: 0
Respuesta: Trigger para descontar stock, MSQL

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Es que el problema es que todo lo tienes mal diseñado...
Esas tres tablas están directamente mal hechas. No cumplen un esquema maestro-detalle necesario para los pedidos, y la tabla de articulos no tiene que relacionarse con los pedidos, sino al revés.

La verdad es que tienes que descartar todo el modelo y empezarlo de cero.






Este campo no se entiende:



El resto de los campos no queda claro para qué se usan.

Describe completamente los detalles del sistema en esta parte y veremos qué está faltando.
Recién entonces tendría sentido ponerse a ver un TRIGGER...

ya hize la BD como me comentaste, pero agrege unos campos que creo yo faltan asi quedo

Cita:
-articulo-
id_producto PK
marca
modelo
nombre
stock
no_requisicion <-este campo es para saber que cantidad se compro de dicho producto-
Cita:
-pedidos-
id_pedido PK
area
empleado
estado
fecha_entrada
fecha_salida
stock <-----
producto estos campos los agrege para saber que es lo que pide y cuanto
marca ------>
Cita:
-detalle-
id_detalle
nro_item <-no se que función tiene, me explicarías
id_producto
cantidad
no se si los campos que agregue a las tablas que yo tenia en la BD anterior afecte al menos los de la tabla "pedidos"
  #7 (permalink)  
Antiguo 26/02/2016, 15:27
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Trigger para descontar stock, MSQL

Cita:
-articulo-
id_producto PK
marca
modelo
nombre
stock
no_requisicion <-este campo es para saber que cantidad se compro de dicho producto-
El campo que llamas "no_requisicion" no pertenece a esta entidad. Debería pertenecer a una entidad diferente que represente las compras a los proveedores, y solo tendría impacto SUMANDO STOCK. Por su lado, el stock preexistente se establece como la suma del actual más las ventas realizadas.
Es decir, ese valor se obtiene ñor consulta. No se deben usar campos calculables para almacenar datos.

Cita:
-pedidos-
id_pedido PK
area
empleado
estado
fecha_entrada
fecha_salida
stock <-----
producto estos campos los agrege para saber que es lo que pide y cuanto
marca ------>
Incorrecto. Totalmente.
El "stock" no es tal sino la cantidad de unidades en un mismo pedido de un mismo producto, y eso es un dato que pertenece al DETALLE_PEDIDO, donde se listan todos los items de un mismo pedido.

Por su lado, la MARCA, no debe ir en el pedido, y no debe ir en ninguna de las tablas del pedido. La "marca" es un atributo propio del PRODUCTO, y debe haber una entrada de producto por cada marca, modelo y presentación (volumen, peso, etc.).
La relación entre el pedido y el producto y su marca es transitiva, a traves del id_producto que aparece en el item del detalle.
Cita:
-detalle-
id_detalle
nro_item <-no se que función tiene, me explicarías
id_producto
cantidad
Que no entiendas eso resulta bastante extraño...

¿Nunca has comprado algo en un supermercado, o varios artículos en algún comercio?
¿Viste que la factura tiene de 1 a N items, cada uno de los cuales es un producto que compras?
Bueno, en numero de ítem es eso: Cada uno de los items que entraron en la lista, numerados del 1 a N, siendo N el máximo numero posible de items facturados en una sola compra...
En el caso de las tablas de detalle, la PK está formada por el numero de su entidad padre (Pedido en este caso), y el numero del ítem.
¿Se entiende?

En este contexto, cuando haces un ingreso de pedido entrgado, el TRIGGER (que debe estar en la tabla DETALLE_PEDIDO) realiza la correspondiente resta de stock en la tabla Producto.
Seria un trigger terriblemente simple, aunque en el mundo real NO SE USAN para estos fines. Las restas de stock se validan de otra forma...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: campo, fecha, msql, stock, tabla, trigger
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 10:07.