Inicio > SQL Server > iislas > IF en SQL Server

IF en SQL Server

Experto:
Usuario:
Fecha: 01/07/2008
Valoración: (4,00 sobre 5) Categoría: SQL Server
29/06/2008
raphsoft, usuario preguntando en SQL Server
Usuario
Hola, espero que puedas ayudarme, necesito usar de alguna forma el IF que yo usaria en otro lenguaje.
Tengo un modulo de pedido de materiales para el area de almacenes de una tienda, y como es logico, no se deberia poder pedir mas de lo que se tiene de un producto, por decir, si solo tengo 5 planchas en mi almacen, no puedo pedir mas de 5.
Tengo un procedimiento almacenado que se debe encargar de todo eso y si es que se pasa la validacion insertar datos en una tabla de detalles y actualizar el valor que se tiene en el almacen, en este caso, restar lo que se tenia antes menos lo que se ha pedido.
El procedimiento mas o menos es el siguiente:
Se supone que en la parte que esta con comentarios deberia haber algo que permita saber si es que se tiene mas de lo que se esta pidiendo:
create procedure sp_addDetalleRequerimiento
    @idRequerimiento bigint,@cantidad int,@producto varchar(120),
    @mensaje varchar(10) output
as
    declare @idDetalle bigint
    declare @idProd bigint
    declare @costo real
    declare @cantidadReal int
    set @idDetalle=(select count(*)from detallerequerimientos)+1  
    set @idProd=(select idProducto from productos where nombre=@producto)
    set @costo=(select costoUnitario from productos where idProducto=@idProd)
    set @cantidadReal=(select cantidadStock from productos where idProd=@idProd)
    /*Se Supone que en esta parte se deberia hacer la validacion, deberia ser algo como::
    set @mensaje='Error'
    if @cantidad>=@cantidad real then --Busco como hacer esto
        insert into detalleRequerimientos
        values(@idDetalle,@idRequerimiento,@costo,@cantidad,@idMaterial,'INCONCLUSO')
        Update Productos
        set cantidadStock=cantidadStock - @cantidad where idProducto=@idProd
        set mensaje='OK'
    end if
go

Lo que quiero hacer mediante este procedimiento es manejar toda la parte de validaciones desde el servidor de datos, la variable @mensaje es una variable de tipo output que  me dira si se ha realizado correctamente el pedido del producto una ves que se inserten los valores en la tabla de requerimientos o pedidos y se actualize el stock de la tabla productos. Cabe resaltar que necesito usar los Operadores Mayor, Mayo o igual, menor, menor o igual, por eso es que no he podido hacerlo con el select case adeas no es solo un select, es un SP que luego tiene que insertar y actualizar datos.
Gracias
Espero tu respuesta
30/06/2008
raphsoft, experto respondiendo en SQL Server
Experto
Como en tu caso, mas de una conexion puede estar solicitando validar la operacion, te recomiendo que manejes TRANSACCIONES IMPLICITAS (BEGIN TRAN, COMMIT TRAN, ROLLBACK TRAN), y el codigo deberia verse mas o menos asi.
 
if (SELECT cantidadStock-@cantidad FROM productos where idProd = @idProd)>0
 begin
insert into detalleRequerimientos
values(@idDetalle,@idRequerimiento,@costo,@cantidad,@idMaterial,'INCONCLUSO')
Update Productos
set cantidadStock=cantidadStock - @cantidad where idProducto=@idProd
set mensaje='OK'
end if
 
30/06/2008
raphsoft, usuario preguntando en SQL Server
Usuario
Hola, estuve probando, cambie los nombres de algunas tablas y campos.
Hice lo que esta debajo pero tengo el siguiente erro al ejecutar todo el codigo:
"Mens 102, Nivel 15, Estado 1, Procedimiento sp_addDetRequerimiento, Línea 21
Sintaxis incorrecta cerca de 'if'."
Este es el codigo que he tratado de ejecutar y no ha funcionado:
--Procedimiento para insertar registros en el detalle del requerimiento
create procedure sp_addDetRequerimiento
@idRequerimiento bigint,@cantidad int,@material varchar(120),
@mensaje varchar(5) output
as
declare @idDetalle bigint
declare @idMaterial bigint
declare @costo real
set @idDetalle=(select count(*)from detallerequerimientos)+1
set @idMaterial=(select idMaterial from materiales where nombre=@material /*and descripcion=@desc*/)
set @costo=(select costoUnitario from materiales where idMaterial=@idMaterial)
set @mensaje='ERROR'
if (SELECT cantidadStock - @cantidad FROM materiales where idMaterial = @idMaterial) >= 0
begin
insert into detalleRequerimientos
values(@idDetalle,@idRequerimiento,@costo,@cantidad,@idMaterial,'INCONCLUSO')
update materiales
set cantidadStock=cantidadStock-@cantidad where idMaterial=@idMaterial
set @mensaje='OK'
end if
go
30/06/2008
raphsoft, usuario preguntando en SQL Server
Usuario
Te comento que uso Microsoft SQL Server 2005 por si eso es importante.
30/06/2008
raphsoft, experto respondiendo en SQL Server
Experto
en lugar de END IF, es solamente END
01/07/2008
raphsoft, usuario preguntando en SQL Server
Usuario
Muy Bien. Me ha sido de gran utilidad
Enlaces patrocinados