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.
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.