Validar

05/01/2008 - 01:16 por Edwin Rivera | Informe spam
Hola tengo este tabla en una base de datos
CREATE TABLE [dbo].[Depreciacion] (
[Annio] [char] (4) ,
[AntMinimo] tinyint,
[AntMaximo] tinyint,
[Valor] tinyint
) ON [PRIMARY]
GO
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','0','5','0')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','10','0')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','11','15','3')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','16','20','6')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','21','25','9')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','26','30','12')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','31','35','15')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','36','40','18')

mi pregunta es al momento de ingresar en los campo [AntMinimo] y [AntMaximo]
me debe de validar si ya existe los valores por ejemplo
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','2','4','0') 'existe no
me debe premitir guardar
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','2','9','6') 'existe no
me debe premitir guardar
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','26','30','6') 'existe no
me debe premitir guardar

INSERT INTO [dbo].[Depreciacion] VALUES ('2004','41','45','18') ' no existe
si me permite guardar
espero que me entienda la pregunta que les hago
y gracias por su pronta respuesta

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
05/01/2008 - 02:39 | Informe spam
Edwin Rivera,

Puedes usar una restriccion de unicicdad por las tres columnas (Annio,
AntMinimo, AntMaximo).

CREATE TABLE [dbo].[Depreciacion] (
[Annio] [char] (4) ,
[AntMinimo] tinyint,
[AntMaximo] tinyint,
[Valor] tinyint,
constraint UQ_Depreciacion unique (Annio, AntMinimo, AntMaximo)
) ON [PRIMARY]

Cuando trates de insertar una tupla existente, SQL Server dara error.

AMB

"Edwin Rivera" wrote:

Hola tengo este tabla en una base de datos
CREATE TABLE [dbo].[Depreciacion] (
[Annio] [char] (4) ,
[AntMinimo] tinyint,
[AntMaximo] tinyint,
[Valor] tinyint
) ON [PRIMARY]
GO
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','0','5','0')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','10','0')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','11','15','3')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','16','20','6')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','21','25','9')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','26','30','12')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','31','35','15')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','36','40','18')

mi pregunta es al momento de ingresar en los campo [AntMinimo] y [AntMaximo]
me debe de validar si ya existe los valores por ejemplo
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','2','4','0') 'existe no
me debe premitir guardar
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','2','9','6') 'existe no
me debe premitir guardar
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','26','30','6') 'existe no
me debe premitir guardar

INSERT INTO [dbo].[Depreciacion] VALUES ('2004','41','45','18') ' no existe
si me permite guardar
espero que me entienda la pregunta que les hago
y gracias por su pronta respuesta

Respuesta Responder a este mensaje
#2 Carlos M. Calvelo
05/01/2008 - 14:15 | Informe spam
Hola Alejandro,

On 5 jan, 02:39, Alejandro Mesa
wrote:
Edwin Rivera,

Puedes usar una restriccion de unicicdad por las tres columnas (Annio,
AntMinimo, AntMaximo).




Que si además define esas columnas como NOT NULL,
estamos hablando de la clave primaria de la tabla.

Saludos,
Carlos
Respuesta Responder a este mensaje
#3 Carlos M. Calvelo
05/01/2008 - 14:43 | Informe spam
Hola otra vez,

On 5 jan, 14:15, "Carlos M. Calvelo" wrote:
Hola Alejandro,

On 5 jan, 02:39, Alejandro Mesa

wrote:
> Edwin Rivera,

> Puedes usar una restriccion de unicicdad por las tres columnas (Annio,
> AntMinimo, AntMaximo).

Que si además define esas columnas como NOT NULL,
estamos hablando de la clave primaria de la tabla.




Bueno.. si me fijo bien en los datos que se dan como ejemplo, la clave
primaria debería ser {Annio, AntMinimo} y necesitaría una restricción
de que AntMaximo tiene que ser menor que el AntMinimo del registro
siguiente (por orden Annio, AntMinimo), para evitar solapamientos.

Saludos,
Carlos
Respuesta Responder a este mensaje
#4 Carlos M. Calvelo
05/01/2008 - 19:36 | Informe spam
Hola Edwin,

On 5 jan, 01:16, Edwin Rivera
wrote:
Hola tengo este tabla en una base de datos
CREATE TABLE [dbo].[Depreciacion] (
[Annio] [char] (4) ,
[AntMinimo] tinyint,
[AntMaximo] tinyint,
[Valor] tinyint
) ON [PRIMARY]
GO
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','0','5','0')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','10','0')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','11','15','3')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','16','20','6')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','21','25','9')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','26','30','12')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','31','35','15')
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','36','40','18')

mi pregunta es al momento de ingresar en los campo [AntMinimo] y [AntMaximo]
me debe de validar si ya existe los valores por ejemplo
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','2','4','0') 'existe no
me debe premitir guardar
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','2','9','6') 'existe no
me debe premitir guardar
INSERT INTO [dbo].[Depreciacion] VALUES ('2004','26','30','6') 'existe no
me debe premitir guardar

INSERT INTO [dbo].[Depreciacion] VALUES ('2004','41','45','18') ' no existe
si me permite guardar
espero que me entienda la pregunta que les hago
y gracias por su pronta respuesta



Ya que he reaccionado al post de Alejandro, voy a poner aquí una
solución a "como entiendo yo" cual es tu problema.

Entiendo que la combinación {Annio, AntMinimo} es la que tiene
que ser única. Por los ejemplos que das entiendo también que
para cada registro AntMinimo tiene que ser menor o igual a
AntMaximo y que además no se deberían solapar los rangos
[AntMinimo..AntMaximo] dentro de un mismo año.
Por cierto, la combinación {Annio, AntMaximo} también es única,
pero escogemos la otra como clave primaria.

Bueno... para controlar que no se solapen los rangos creamos
primero una función.

CREATE FUNCTION checkDeprSolap(@annio smallint, @minimo tinyint,
@maximo tinyint)
RETURNS BIT AS
BEGIN
IF EXISTS(SELECT * FROM Depreciacion
WHERE Annio = @annio AND
AntMinimo <> @minimo AND
AntMinimo <= @maximo AND
AntMaximo >= @minimo)
RETURN 1
RETURN 0
END

Esta función devuelve 1 si el rango en el registro que se está
introducciendo o actualizando se solapa con otros registros.
Si no devuelve 0.

Ahora creamos la tabla con un 'primary key' y un par de constraints
para controlar lo que he explicado arrriba, donde se usa también
la función anterior.

CREATE TABLE Depreciacion (
Annio smallint not null ,
AntMinimo tinyint not null,
AntMaximo tinyint not null,
Valor tinyint not null,

CONSTRAINT ID_PK
PRIMARY KEY (Annio,AntMinimo),
CONSTRAINT check_minLEmax
CHECK(AntMinimo <= AntMaximo),
CONSTRAINT check_DeprSolap
CHECK(dbo.checkDeprSolap(Annio, AntMinimo, AntMaximo) = 0)
)

Fíjate que he hecho también otros cambios. La columna Annio
ahora es del tipo smallint en vez de char(4), aunque eso no
es necesario, y todas las columnas tienen la restricción de
que no pueden ser null.

Espero haber acertado como mi interpretación del asunto.

Saludos,
Carlos
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida