PDA

Ver la Versión Completa : Procedure


Ledian_Fdez
05-11-2010, 16:50:56
Hola chicos !!!

Tengo la tabla Producto con una series de campos, donde IdProducto es mi llave primaria, quisiera validar que el campo código no se me repita es desir que sea unico.

Les muestro el código que empleo para el Insert y Update. Por favor me podrian ayudar?
No se si se podrá contralar con Trigger y en ese caso ¿cómo? o modificando el precedimiento que mas abajo le muestro.

CREATE procedure ActualizaProducto

@IdProducto int,
@Codigo char(3),
@Descripcion varchar(50),
@UM int,
@Periodicidad int,
@TipoProducto int,
@Identity int OUTPUT

AS

if (@IdProducto = -1)
begin
insert into Producto(Codigo, Descripcion, idUM, idPeriodicidad, IDTipoProducto)
values (@Codigo, @Descripcion, @UM, @Periodicidad, @TipoProducto)

set @Identity = SCOPE_IDENTITY();
end
else
begin
update Producto
set Codigo = @Codigo,
Descripcion = @Descripcion,
idUM = @UM,
idPeriodicidad = @Periodicidad,
IDTipoProducto = @TipoProducto
where (IdProducto = @IdProducto)

set @Identity = @IdProducto
end

GO

Salu2.

mightydragonlor
05-11-2010, 20:44:43
Select * from tabla where IdProducto = @IdProducto
If @@ROWCOUNT = 0
BEGIN
--Acá llega si no encontró registros
END

Ledian_Fdez
05-11-2010, 21:23:39
Me parece muy bien, pero ahora otra pregunta ¿Podre lanzar algun mensaje? para que el usuario sepa que ya existe ese codigo.


Salu2 y mil Grasias

mightydragonlor
05-11-2010, 21:25:51
para eso deberías tener 2 variables de salida, la primera es un entero, si todo pasa bien le pasas un 0 si no, algo diferente, en tu programa preguntas si esa variable es deferente de 0 pues muestras el mensaje de error.

Ledian_Fdez
26-11-2010, 14:39:27
Hola Desphianos:

Ya he resuelto grasias a mightydragonlor el controlar por la aplicación (que es desde donde llamo al procedimiento almacenado) que no me inserten dos códigos iguales, pero ahora ¿Cómo podré controlarlo dentro del SQL?; quiero desir al abrir la tabla por dentro del SQL Server no me puedan al insertar o modificar duplicar el código?

Mil grasias de antemano,
En espera de su ayuda

Salu2,
Ledian.

mightydragonlor
26-11-2010, 14:46:44
para ese casi necesitarias usar triggers en before insert y before update.

Ledian_Fdez
26-11-2010, 20:11:05
mightydragonlor, Lo intenete con este código, pero siempre me entra en el begin. ¿Que pudiera ser? Es desir aunque el codigo no se repita entra en el begin.

CREATE [InsUpd_Tipo_Bodega] ON [dbo].[Tipo_Bodega]
FOR INSERT, UPDATE

AS

DECLARE @Codigo Char(2)
SELECT @Codigo=Codigo FROM Inserted

IF EXISTS (SELECT * FROM Tipo_Bodega WHERE Codigo=@Codigo)
BEGIN
RAISERROR ('No se admiten Codigos repetido. Intente con otro por favor.', 16, 1)
ROLLBACK TRAN
RETURN
END

GO

Grasias de antemano,
Disculpen las molestias que pueda ocacionarles,
Pero no salgo de esto !!

SAlu2,
Ledian.

mightydragonlor
26-11-2010, 21:47:53
CREATE [InsUpd_Tipo_Bodega] ON [dbo].[Tipo_Bodega]
FOR INSERT, UPDATE
AS

DECLARE @Codigo Char(2)
SELECT @Codigo=Codigo FROM Inserted

SELECT 1 FROM Tipo_Bodega WHERE Codigo=@Codigo
IF @@ROWCOUNT
BEGIN
RAISERROR ('No se admiten Codigos repetido. Intente con otro por favor.', 16, 1)
ROLLBACK TRAN
RETURN
END

GO

Intenta con eso y me cuentas.

Ledian_Fdez
29-11-2010, 14:28:25
Te cuento, que ahora si no me deja insertar dos códigos repetidos, solo que no me salta el mensaje RAISERROR ('No se admiten Codigos repetido. Intente con otro por favor.', 16, 1)

ALTER TRIGGER [InsUpd_Tipo_Bodega] ON [dbo].[Tipo_Bodega]
FOR INSERT, UPDATE

AS

DECLARE @Codigo Char(2)
SELECT @Codigo=Codigo FROM Inserted

SELECT 1 FROM Tipo_Bodega WHERE Codigo=@Codigo
IF (@@ROWCOUNT>1)
BEGIN
RAISERROR ('No se admiten Codigos repetido. Intente con otro por favor.', 16, 1)
ROLLBACK TRAN
RETURN
END

GO

Muchas grasias ...

salu2,
Ledian.

Ledian_Fdez
29-11-2010, 15:09:38
Como bien les habia dicho anteriormente no se por que no me lansa el mensaje de error, sin embargo no me inserta el código cuando este ya se encuantra en la tabla, lo curioso es que tengo que cerrar la tabla y volver abrirla para darme cuanta que no fue insertada pues este se ve como si se hubiera insertado normalmente.


¿Me podrian ayudar al respecto? :confused:

mil grasias ...

Salu2,
Ledian.

Ledian_Fdez
29-11-2010, 18:05:48
Hola chicos, que manera de insistir la mía, el problema es que he seguido probando y buscándole una respuesta al ¿Por qué no me lanza el RAISERROR el mensaje?

Lo curioso es que con este código si sale el mensaje:

ALTER TRIGGER [InsUpd_TipoProducto] ON [dbo].[TipoProducto]
FOR INSERT, UPDATE
AS

DECLARE @Codigo Char(2)
SELECT @Codigo=Codigo FROM Inserted

IF EXISTS(SELECT Codigo FROM TipoProducto WHERE Codigo=@Codigo)
BEGIN
RAISERROR ('No se admiten Códigos repetido. Intente con otro por favor.', 16, 1)
ROLLBACK TRAN
RETURN
END

Lo malo es que con este código no hace lo que quiero pues siempre va a existir.

Cuando pongo este otro:
ALTER TRIGGER [InsUpd_TipoProducto] ON [dbo].[TipoProducto]
FOR INSERT, UPDATE
AS

DECLARE @Codigo Char(2)
SELECT @Codigo=Codigo FROM Inserted
SELECT Codigo FROM TipoProducto WHERE Codigo=@Codigo
IF (@@ROWCOUNT>1)
BEGIN
RAISERROR ('No se admiten Códigos repetido. Intente con otro por favor.', 16, 1)
ROLLBACK TRAN
RETURN
END

No me deja repetir el código, solo que no me lanza el mensaje

¿En que podrá consistir tal hecho?

En lo único que difieren es en la linea:

IF EXISTS(SELECT Codigo FROM TipoProducto WHERE Codigo=@Codigo)

IF (@@ROWCOUNT>1)


En espera de su ayuda
Y como siempre mil gracias de antemano.

Salu2,
Ledian.

mightydragonlor
29-11-2010, 18:32:30
entonces usa el primero que pusiste solo que el trigger deberia estar before insert, before update.

ContraVeneno
29-11-2010, 19:11:00
¿no era más sencillo ponerle un índice único al campo que no debe repetirse?:confused:

mightydragonlor
29-11-2010, 19:13:11
¿no era más sencillo ponerle un índice único al campo que no debe repetirse?:confused:

si, pero el quiere el mensajito :p

ContraVeneno
29-11-2010, 19:18:47
pues sería lo mismo, ¿no?

pones el índice único y en lugar de verificar con cualquiera de las formas:

IF EXISTS(SELECT Codigo FROM TipoProducto WHERE Codigo=@Codigo)
....
SELECT @Codigo=Codigo FROM Inserted
SELECT Codigo FROM TipoProducto WHERE Codigo=@Codigo
IF (@@ROWCOUNT>1)



con esto sería suficiente:
If (@@Error > 0 )
Verificas si el número de error es de llave duplicada y muestras el mensaje...

:confused::confused:

Ledian_Fdez
01-12-2010, 14:59:02
entonces usa el primero que pusiste solo que el trigger deberia estar before insert, before update.

El motor de base de datos es MS SQL server 2000 y no me reconoce before insert, before update

Ledian_Fdez
01-12-2010, 15:05:30
¿no era más sencillo ponerle un índice único al campo que no debe repetirse?:confused:

Pues comparto ese criterio con usted, pero el problema radica que ya la base de datos esta diseñada asi y la aplicacion tambien, solo que necesito hacerle unos pequeños arreglos, y no es facil a esta altura modificar cada uno de los campos.

Ledian_Fdez
01-12-2010, 15:11:38
si, pero el quiere el mensajito :p

No es un problema de "mensajito" como bien dices, solo es cuestión de informarle al usuario que es lo que anda mal.

abelg
31-01-2011, 14:05:38
Creo si no quieres que ingresen un código duplicado solo necesitas poner unique al definir tu campo.

Create table producto (
id_producto int identity not null primary key,
codigo Varchar(10) not null unique,
...
)

Asi cuando intente ingresar un codigo duplicado no dejara.