none
SQL RRS feed

  • Pregunta

  • IF OBJECT_ID ('dbo.UpdateStock') IS NOT NULL
    DROP PROCEDURE dbo.UpdateStock
    GO

    CREATE PROC UpdateStock
    @orderId int,
    @productId int,
    @price money,
    @quantity smallint,
    @discount real
    AS
    BEGIN
    SET NOCOUNT ON
    -- DECLARA VARIABLE PARA FECHA
    DECLARE @fechaActual datetime = getDate()
    -- TRY
    BEGIN TRY
    BEGIN TRAN EXISTENCIA
    --VERIFICA EXISTENCIA DE ORDER
    IF EXISTS (SELECT OrderID FROM Orders WHERE OrderID = @orderId)
    BEGIN
    --VERIFICA EXISTENCIA DE PRODUCTO
    IF EXISTS (SELECT ProductID FROM Products WHERE ProductID = @productId)
    BEGIN
    --VERIFICA SI LA CANTIDAD SOLICITADA ES SUFICIENTE
    IF (@quantity <= (SELECT UnitsInStock FROM Products WHERE ProductID = @productId))
    BEGIN
    INSERT INTO [Order Details] VALUES (@orderId, @productId, @price, @quantity, @discount)
    PRINT 'SE INSERTO REGISTRO DE ORDEN'

    --ACTUALIZA EXISTENCIA
    UPDATE Products SET UnitsInStock -= @quantity WHERE ProductID = @productId

    --VERIFICA LA EXISTENCIA RESTANTE
    IF((SELECT UnitsInStock FROM Products WHERE ProductID = @productId) = 0)
    BEGIN
    --INSERTA PRODCUTO AGOTADO
    INSERT INTO [Producto Agotado] VALUES (@productId, (SELECT EmployeeId FROM ORDERS WHERE OrderID = @orderId), @orderId, @fechaActual)
    END

    END
    --INSERTA EN SOLICITADO AGOTADO
    ELSE
    BEGIN
    INSERT INTO SolicitadoAgotado VALUES (@orderId, @productId, @fechaActual)

    declare @cantidadreal int = (SELECT UnitsInStock FROM Products WHERE ProductID = @productId)
    PRINT 'NO ES POSIBLE AGREGAR ORDEN, LA CANTIDAD SOLICITADA ES: ' + CONVERT(VARCHAR, @quantity) 
    + ', Y LA CANTIDAD EN EXISTENCIA ES: ' + + CONVERT(VARCHAR, @cantidadreal)
    END


    DECLARE @producto varchar(max) = (SELECT PRODUCTNAME FROM PRODUCTS P JOIN SOLICITADOAGOTADO SA ON P.PRODUCTID = SA.ClaveProducto where p.ProductID = @productId)
    declare @cantidad int = (SELECT count(ClaveProducto) FROM SOLICITADOAGOTADO SA where ClaveProducto = @productId)

    --GENERA REPORTES
    print '' 
    PRINT REPLICATE('*', 100)
    PRINT SPACE(30) + 'PRODUCTOS SOLICITADOS PERO AGOTADOS'
    PRINT REPLICATE('*', 100)
    print ''
    PRINT SPACE(5) + '  PRODUCTO SOLICITADO  ' + SPACE(15)+ 'CANTIDAD DE VECES SOLICITADO'
    PRINT SPACE(5) + @producto + space(15) + @cantidad

    print ''
    print ''
    print ''
    print ''
    print ''

    DECLARE @empleado varchar(max) = (select FirstName + ' ' + LastName from Employees e join orders o on e.EmployeeID= o.EmployeeID join [Producto Agotado] pa on pa.ClaveOrden = o.OrderID where o.OrderID =  @orderId),
    @nombreprod varchar(max) = (SELECT PRODUCTNAME FROM PRODUCTS P JOIN [Producto Agotado] pa ON P.PRODUCTID = pa.ClaveProducto where p.ProductID = @productId),
    @fechaorden varchar(max) = (select FechaRegistro from [Producto Agotado] where ClaveOrden = @orderId and ClaveProducto = @productId),
    @fecharegistro varchar(max) = (select FechaRegistro from [Producto Agotado] where ClaveOrden = @orderId and ClaveProducto = @productId)



    PRINT REPLICATE('*', 100)
    PRINT SPACE(40) + 'PRODUCTOS POR AGOTARSE'
    PRINT REPLICATE('*', 100)
    print ''
    PRINT SPACE(5) + '  CLAVE ORDEN' + SPACE(5)+ 'FECHA ORDEN'+ SPACE(5)+ 'NOMBRE EMPLEADO'+ SPACE(5)+ 'NOMBRE PRODUCTO '+ SPACE(5)+ 'FECHA REGISTRO'
    PRINT SPACE(5) + @orderId + space(5) + convert (int, convert(varchar, year (@fechaorden))) + space(5) + @empleado+ space(5) + @nombreprod + space(5) + @fecharegistro

    END
    ELSE
    PRINT 'ID DE PRODUCTO NO EXISTE'
    END
    ELSE
    PRINT 'ID DE ORDER NO EXISTE'

    COMMIT TRAN EXISTENCIA
    END TRY
    -- CATCH
    BEGIN CATCH
    ROLLBACK TRAN EXISTENCIA
    PRINT 'ERROR, ' + ERROR_MESSAGE()
    END CATCH

    END

    NO ES POSIBLE AGREGAR ORDEN, LA CANTIDAD SOLICITADA ES: 17, Y LA CANTIDAD EN EXISTENCIA ES: 0
    ERROR, La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión.

    martes, 9 de julio de 2019 21:52

Todas las respuestas

  • Hola Alguien que me pueda ayudar:

    El mensaje de error es claro, has solicitado algo en una select donde creías que te iba a devolver un valor, el motor ha visto que te puede devolver varios, y eso no lo puede subsanar.

    ejemplos a primera vista:

    @fecharegistro VARCHAR(MAX)=
                                (
                                    SELECT FechaRegistro
                                    FROM [Producto Agotado]
                                    WHERE ClaveOrden = @orderId
                                          AND ClaveProducto = @productId
                                );
    
    -- o 
    
    @fechaorden VARCHAR(MAX)=
                                (
                                    SELECT FechaRegistro
                                    FROM [Producto Agotado]
                                    WHERE ClaveOrden = @orderId
                                          AND ClaveProducto = @productId
                                ),

    Una solución simple, para saber lo que tienes mal es:

    Cojes todas las select que tienes en el procedure y 1 por 1, donde dice Select lo que sea pones Select Top (1) lo que sea. Cuando localices la subconsulta que retorna más de un valor, ya sabes donde tienes el error.

    Top

    https://docs.microsoft.com/es-es/sql/t-sql/queries/top-transact-sql?view=sql-server-2017

    miércoles, 10 de julio de 2019 3:42
  • Deleted
    miércoles, 10 de julio de 2019 5:45