none
Trigger para stock minimo en sql RRS feed

  • Pregunta

  • Buenas noches, tengo duda de como realizar un trigger para el stock  mínimo de una empresa, lo que quiero es que cuando las unidades de existencia en almacén de "X" producto llegue a su mínimo, se dispare el trigger y me mande un mensaje de que debo comprar más unidades de ese producto. GRACIAS! 
    • Editado Aleirbag sábado, 10 de junio de 2017 3:55
    sábado, 10 de junio de 2017 3:50

Respuestas

  • La primera observación que te hago es que probablemente existe un error en el diseño de la arquitectura de la aplicación: ese tipo de control debería realizarse desde la capa de reglas de negocio de la aplicación, y no desde la capa de datos.

    Pero si por alguna razón esto no es viable y necesariamente tienes que hacerlo en un trigger, entonces lo que habría que hacer es añadir un trigger del tipo "AFTER UPDATE" sobre la tabla Almacén, que compruebe si el UPDATE afectó al campo Existencias, y en ese caso si están bajo el mínimo que envíe el mensaje mediante el mecanismo que tengas previsto para ello, posiblemente inyectando el mensaje en una cola y luego desde otro sitio vaciando la cola y enviándolo con sp_send_dbmail. Si se requiere un alto rendimiento del sistema, no aconsejo llamar al sp_send_dbmail directamente desde dentro del trigger, porque es una operación lenta que prolongaría la transacción que actualiza la tabla, perjudicando el rendimiento de dichas actualizaciones. Además de eso, tienes que tener presente las dificultades que podría ocasionarte en cuanto a la gestión de los permisos, ya que el usuario que lanza el update tendría que tener concedidos permisos para enviar correo. Hay más facilidades para soslayar este problema si los mensajes los envías desde otro proceso que vacíe la cola.

    CREATE TRIGGER ComprobarExistencias
       ON [dbo].[Almacen]
       AFTER UPDATE
    AS BEGIN
        SET NOCOUNT ON;
        IF UPDATE (Existencias) 
        BEGIN
            INSERT into dbo.ArticulosBajoMinimo(Codigo)
            SELECT dbo.CodigoArticulo From Almacen A
            JOIN Inserted I ON A.CodigoArticulo=I.CodigoArticulo
            WHERE A.Existencias < 10 --Poner aquí el valor mínimo
        END 
    END

    En este ejemplo he simulado la cola mediante una tabla que he llamado ArticulosBajoMinimo (y que periódicamente examinarías desde otro proceso para enviar los mensajes correspondientes). Por supuesto, esto es solo un ejemplo; podrías usar una auténtica cola mediante el Service Broker, o podrías meter una llamada al sp_send_dbmail usando un cursor sobre los registros devueltos por la Select.

    sábado, 10 de junio de 2017 6:54

Todas las respuestas

  • La primera observación que te hago es que probablemente existe un error en el diseño de la arquitectura de la aplicación: ese tipo de control debería realizarse desde la capa de reglas de negocio de la aplicación, y no desde la capa de datos.

    Pero si por alguna razón esto no es viable y necesariamente tienes que hacerlo en un trigger, entonces lo que habría que hacer es añadir un trigger del tipo "AFTER UPDATE" sobre la tabla Almacén, que compruebe si el UPDATE afectó al campo Existencias, y en ese caso si están bajo el mínimo que envíe el mensaje mediante el mecanismo que tengas previsto para ello, posiblemente inyectando el mensaje en una cola y luego desde otro sitio vaciando la cola y enviándolo con sp_send_dbmail. Si se requiere un alto rendimiento del sistema, no aconsejo llamar al sp_send_dbmail directamente desde dentro del trigger, porque es una operación lenta que prolongaría la transacción que actualiza la tabla, perjudicando el rendimiento de dichas actualizaciones. Además de eso, tienes que tener presente las dificultades que podría ocasionarte en cuanto a la gestión de los permisos, ya que el usuario que lanza el update tendría que tener concedidos permisos para enviar correo. Hay más facilidades para soslayar este problema si los mensajes los envías desde otro proceso que vacíe la cola.

    CREATE TRIGGER ComprobarExistencias
       ON [dbo].[Almacen]
       AFTER UPDATE
    AS BEGIN
        SET NOCOUNT ON;
        IF UPDATE (Existencias) 
        BEGIN
            INSERT into dbo.ArticulosBajoMinimo(Codigo)
            SELECT dbo.CodigoArticulo From Almacen A
            JOIN Inserted I ON A.CodigoArticulo=I.CodigoArticulo
            WHERE A.Existencias < 10 --Poner aquí el valor mínimo
        END 
    END

    En este ejemplo he simulado la cola mediante una tabla que he llamado ArticulosBajoMinimo (y que periódicamente examinarías desde otro proceso para enviar los mensajes correspondientes). Por supuesto, esto es solo un ejemplo; podrías usar una auténtica cola mediante el Service Broker, o podrías meter una llamada al sp_send_dbmail usando un cursor sobre los registros devueltos por la Select.

    sábado, 10 de junio de 2017 6:54
  • Deleted
    domingo, 11 de junio de 2017 12:29