Comprobar a traves de constraint

04/06/2009 - 19:25 por jcac | Informe spam
Hola lista,

Una consulta tengo una tabla donde tengo la siguiente estructura (trabajo
con sql server 2000):

create table VersionesxFormula(
DIVI_Codigo int not null,
FORM_Codigo int not null,
VEFO_Codigo int not null,
VEFO_Activa bit,
constraint PK_VersionesxFormula primary key (DIVI_Codigo, FORM_Codigo,
VEFO_Codigo))

segun esta tabla puedo varios registros que tengan los siguientes datos:

insert into versionesxformulas
select 1,1,1,1
union all
select 1,1,2,0
union all
select 1,1,3,1
union all
select 1,1,4,1

la idea es que si insertara un registro mas como por ejemplo:

insert into versionesxformulas
select 1,1,5,0

al colocarle 0 en el campo de VEFO_Activa me indique que no se puede debido
a que ya existe un registro que pertenece la misma DIVI_Codigo, FORM_Codigo
y VEFO_Codigo.

esto como lo podria controlar con un constraint o no es lo mas indicado.

Saludos

Juan Carlos

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
05/06/2009 - 00:23 | Informe spam
Juan Carlos,

la idea es que si insertara un registro mas como por ejemplo:

insert into versionesxformulas
select 1,1,5,0

al colocarle 0 en el campo de VEFO_Activa me indique que no se puede debido
a que ya existe un registro que pertenece la misma DIVI_Codigo, FORM_Codigo
y VEFO_Codigo.



No entiendo muy bien lo que planteas. Por que dices que existe ya una fila
con ese valor de (DIVI_Codigo, FORM_Codigo, VEFO_Codigo)?

DIVI_Codigo = 1
FORM_Codigo = 1
VEFO_Codigo = 5

Yo no veo una fila con [VEFO_Codigo] = 5, excepto la que se esta insertando.

Puedes ampliar un poco mas lo que deseas hacer?


AMB


"jcac" wrote:

Hola lista,

Una consulta tengo una tabla donde tengo la siguiente estructura (trabajo
con sql server 2000):

create table VersionesxFormula(
DIVI_Codigo int not null,
FORM_Codigo int not null,
VEFO_Codigo int not null,
VEFO_Activa bit,
constraint PK_VersionesxFormula primary key (DIVI_Codigo, FORM_Codigo,
VEFO_Codigo))

segun esta tabla puedo varios registros que tengan los siguientes datos:

insert into versionesxformulas
select 1,1,1,1
union all
select 1,1,2,0
union all
select 1,1,3,1
union all
select 1,1,4,1

la idea es que si insertara un registro mas como por ejemplo:

insert into versionesxformulas
select 1,1,5,0

al colocarle 0 en el campo de VEFO_Activa me indique que no se puede debido
a que ya existe un registro que pertenece la misma DIVI_Codigo, FORM_Codigo
y VEFO_Codigo.

esto como lo podria controlar con un constraint o no es lo mas indicado.

Saludos

Juan Carlos



Respuesta Responder a este mensaje
#2 jcac
05/06/2009 - 16:18 | Informe spam
Hola Alejandro,

Si me equivoque en el planteamiento en realidad lo que deseo es lo
siguiente:

Como tengo los siguientes datos:

DIVI_Codigo, FORM_Codigo, VEFO_Codigo, VEFO_Activa
1,1,1,1
1,1,2,0
1,1,3,1
1,1,4,1

al insertar el siguiente datos que seria:
DIVI_Codigo, FORM_Codigo, VEFO_Codigo, VEFO_Activa
1,1,5,0

Solo deberia de tener una que marque como activa para todos los registros
donde se repita DIVI_Codigo, FORM_Codigo y que solo una de todas tenga
VEFO_Activa = 0.

Espero que esta ves me haya explicado bien.

Saludos

Juan Carlos


"Alejandro Mesa" escribió en el
mensaje news:
Juan Carlos,

la idea es que si insertara un registro mas como por ejemplo:

insert into versionesxformulas
select 1,1,5,0

al colocarle 0 en el campo de VEFO_Activa me indique que no se puede
debido
a que ya existe un registro que pertenece la misma DIVI_Codigo,
FORM_Codigo
y VEFO_Codigo.



No entiendo muy bien lo que planteas. Por que dices que existe ya una fila
con ese valor de (DIVI_Codigo, FORM_Codigo, VEFO_Codigo)?

DIVI_Codigo = 1
FORM_Codigo = 1
VEFO_Codigo = 5

Yo no veo una fila con [VEFO_Codigo] = 5, excepto la que se esta
insertando.

Puedes ampliar un poco mas lo que deseas hacer?


AMB


"jcac" wrote:

Hola lista,

Una consulta tengo una tabla donde tengo la siguiente estructura (trabajo
con sql server 2000):

create table VersionesxFormula(
DIVI_Codigo int not null,
FORM_Codigo int not null,
VEFO_Codigo int not null,
VEFO_Activa bit,
constraint PK_VersionesxFormula primary key (DIVI_Codigo, FORM_Codigo,
VEFO_Codigo))

segun esta tabla puedo varios registros que tengan los siguientes datos:

insert into versionesxformulas
select 1,1,1,1
union all
select 1,1,2,0
union all
select 1,1,3,1
union all
select 1,1,4,1

la idea es que si insertara un registro mas como por ejemplo:

insert into versionesxformulas
select 1,1,5,0

al colocarle 0 en el campo de VEFO_Activa me indique que no se puede
debido
a que ya existe un registro que pertenece la misma DIVI_Codigo,
FORM_Codigo
y VEFO_Codigo.

esto como lo podria controlar con un constraint o no es lo mas indicado.

Saludos

Juan Carlos



Respuesta Responder a este mensaje
#3 Alejandro Mesa
05/06/2009 - 18:32 | Informe spam
Juan Carlos,

Ahora si entiendo bien lo que deseas.

Puedes usar una de estas formas:

- Crear una vista indexada, tomando solo las activas, para enforzar la
unicidad.
- Una columna calculada, basada una una llave unica entera, en este caso,
como por ejemplo una columna con propiedad identity, que sea unica y no
acepte null.

Ejemplos:

CREATE TABLE dbo.t (
DIVI_Codigo INT,
FORM_Codigo INT,
VEFO_Codigo INT,
VEFO_Activa BIT NOT NULL
);
GO

INSERT INTO dbo.t VALUES(1,1,1,1);
INSERT INTO dbo.t VALUES(1,1,2,0);
INSERT INTO dbo.t VALUES(1,1,3,1);
INSERT INTO dbo.t VALUES(1,1,4,1);
GO

CREATE VIEW dbo.vwDIVI_FORM_Activas
WITH SCHEMABINDING
AS
SELECT DIVI_Codigo, FORM_Codigo
FROM dbo.t
WHERE VEFO_Activa = 0
GO

CREATE UNIQUE CLUSTERED INDEX cidx_vwDIVI_FORM_Activas
ON dbo.vwDIVI_FORM_Activas(DIVI_Codigo, FORM_Codigo);
GO

INSERT INTO dbo.t VALUES(1,1,5,0);
GO

DROP VIEW dbo.vwDIVI_FORM_Activas;
GO

ALTER TABLE dbo.t
ADD sk INT NOT NULL IDENTITY(1, 1);
GO

ALTER TABLE dbo.t
ADD c1 AS CASE WHEN VEFO_Activa = 1 THEN sk ELSE 0 END;
GO

ALTER TABLE dbo.t
ADD CONSTRAINT uq_t_VEFO_Activa UNIQUE (DIVI_Codigo, FORM_Codigo, c1)
GO

INSERT INTO dbo.t VALUES(1,1,5,0);
GO

SELECT * FROM dbo.t;
GO

DROP TABLE dbo.t;
GO


AMB






AMB



"jcac" wrote:

Hola Alejandro,

Si me equivoque en el planteamiento en realidad lo que deseo es lo
siguiente:

Como tengo los siguientes datos:

DIVI_Codigo, FORM_Codigo, VEFO_Codigo, VEFO_Activa
1,1,1,1
1,1,2,0
1,1,3,1
1,1,4,1

al insertar el siguiente datos que seria:
DIVI_Codigo, FORM_Codigo, VEFO_Codigo, VEFO_Activa
1,1,5,0

Solo deberia de tener una que marque como activa para todos los registros
donde se repita DIVI_Codigo, FORM_Codigo y que solo una de todas tenga
VEFO_Activa = 0.

Espero que esta ves me haya explicado bien.

Saludos

Juan Carlos


"Alejandro Mesa" escribió en el
mensaje news:
> Juan Carlos,
>
>> la idea es que si insertara un registro mas como por ejemplo:
>>
>> insert into versionesxformulas
>> select 1,1,5,0
>>
>> al colocarle 0 en el campo de VEFO_Activa me indique que no se puede
>> debido
>> a que ya existe un registro que pertenece la misma DIVI_Codigo,
>> FORM_Codigo
>> y VEFO_Codigo.
>
> No entiendo muy bien lo que planteas. Por que dices que existe ya una fila
> con ese valor de (DIVI_Codigo, FORM_Codigo, VEFO_Codigo)?
>
> DIVI_Codigo = 1
> FORM_Codigo = 1
> VEFO_Codigo = 5
>
> Yo no veo una fila con [VEFO_Codigo] = 5, excepto la que se esta
> insertando.
>
> Puedes ampliar un poco mas lo que deseas hacer?
>
>
> AMB
>
>
> "jcac" wrote:
>
>> Hola lista,
>>
>> Una consulta tengo una tabla donde tengo la siguiente estructura (trabajo
>> con sql server 2000):
>>
>> create table VersionesxFormula(
>> DIVI_Codigo int not null,
>> FORM_Codigo int not null,
>> VEFO_Codigo int not null,
>> VEFO_Activa bit,
>> constraint PK_VersionesxFormula primary key (DIVI_Codigo, FORM_Codigo,
>> VEFO_Codigo))
>>
>> segun esta tabla puedo varios registros que tengan los siguientes datos:
>>
>> insert into versionesxformulas
>> select 1,1,1,1
>> union all
>> select 1,1,2,0
>> union all
>> select 1,1,3,1
>> union all
>> select 1,1,4,1
>>
>> la idea es que si insertara un registro mas como por ejemplo:
>>
>> insert into versionesxformulas
>> select 1,1,5,0
>>
>> al colocarle 0 en el campo de VEFO_Activa me indique que no se puede
>> debido
>> a que ya existe un registro que pertenece la misma DIVI_Codigo,
>> FORM_Codigo
>> y VEFO_Codigo.
>>
>> esto como lo podria controlar con un constraint o no es lo mas indicado.
>>
>> Saludos
>>
>> Juan Carlos
>>
>>
>>



Respuesta Responder a este mensaje
#4 jcac
06/06/2009 - 00:04 | Informe spam
Muchas gracias Alejandro

Saludos

Juan Carlos

"Alejandro Mesa" escribió en el
mensaje news:
Juan Carlos,

Ahora si entiendo bien lo que deseas.

Puedes usar una de estas formas:

- Crear una vista indexada, tomando solo las activas, para enforzar la
unicidad.
- Una columna calculada, basada una una llave unica entera, en este caso,
como por ejemplo una columna con propiedad identity, que sea unica y no
acepte null.

Ejemplos:

CREATE TABLE dbo.t (
DIVI_Codigo INT,
FORM_Codigo INT,
VEFO_Codigo INT,
VEFO_Activa BIT NOT NULL
);
GO

INSERT INTO dbo.t VALUES(1,1,1,1);
INSERT INTO dbo.t VALUES(1,1,2,0);
INSERT INTO dbo.t VALUES(1,1,3,1);
INSERT INTO dbo.t VALUES(1,1,4,1);
GO

CREATE VIEW dbo.vwDIVI_FORM_Activas
WITH SCHEMABINDING
AS
SELECT DIVI_Codigo, FORM_Codigo
FROM dbo.t
WHERE VEFO_Activa = 0
GO

CREATE UNIQUE CLUSTERED INDEX cidx_vwDIVI_FORM_Activas
ON dbo.vwDIVI_FORM_Activas(DIVI_Codigo, FORM_Codigo);
GO

INSERT INTO dbo.t VALUES(1,1,5,0);
GO

DROP VIEW dbo.vwDIVI_FORM_Activas;
GO

ALTER TABLE dbo.t
ADD sk INT NOT NULL IDENTITY(1, 1);
GO

ALTER TABLE dbo.t
ADD c1 AS CASE WHEN VEFO_Activa = 1 THEN sk ELSE 0 END;
GO

ALTER TABLE dbo.t
ADD CONSTRAINT uq_t_VEFO_Activa UNIQUE (DIVI_Codigo, FORM_Codigo, c1)
GO

INSERT INTO dbo.t VALUES(1,1,5,0);
GO

SELECT * FROM dbo.t;
GO

DROP TABLE dbo.t;
GO


AMB






AMB



"jcac" wrote:

Hola Alejandro,

Si me equivoque en el planteamiento en realidad lo que deseo es lo
siguiente:

Como tengo los siguientes datos:

DIVI_Codigo, FORM_Codigo, VEFO_Codigo, VEFO_Activa
1,1,1,1
1,1,2,0
1,1,3,1
1,1,4,1

al insertar el siguiente datos que seria:
DIVI_Codigo, FORM_Codigo, VEFO_Codigo, VEFO_Activa
1,1,5,0

Solo deberia de tener una que marque como activa para todos los registros
donde se repita DIVI_Codigo, FORM_Codigo y que solo una de todas tenga
VEFO_Activa = 0.

Espero que esta ves me haya explicado bien.

Saludos

Juan Carlos


"Alejandro Mesa" escribió en el
mensaje news:
> Juan Carlos,
>
>> la idea es que si insertara un registro mas como por ejemplo:
>>
>> insert into versionesxformulas
>> select 1,1,5,0
>>
>> al colocarle 0 en el campo de VEFO_Activa me indique que no se puede
>> debido
>> a que ya existe un registro que pertenece la misma DIVI_Codigo,
>> FORM_Codigo
>> y VEFO_Codigo.
>
> No entiendo muy bien lo que planteas. Por que dices que existe ya una
> fila
> con ese valor de (DIVI_Codigo, FORM_Codigo, VEFO_Codigo)?
>
> DIVI_Codigo = 1
> FORM_Codigo = 1
> VEFO_Codigo = 5
>
> Yo no veo una fila con [VEFO_Codigo] = 5, excepto la que se esta
> insertando.
>
> Puedes ampliar un poco mas lo que deseas hacer?
>
>
> AMB
>
>
> "jcac" wrote:
>
>> Hola lista,
>>
>> Una consulta tengo una tabla donde tengo la siguiente estructura
>> (trabajo
>> con sql server 2000):
>>
>> create table VersionesxFormula(
>> DIVI_Codigo int not null,
>> FORM_Codigo int not null,
>> VEFO_Codigo int not null,
>> VEFO_Activa bit,
>> constraint PK_VersionesxFormula primary key (DIVI_Codigo, FORM_Codigo,
>> VEFO_Codigo))
>>
>> segun esta tabla puedo varios registros que tengan los siguientes
>> datos:
>>
>> insert into versionesxformulas
>> select 1,1,1,1
>> union all
>> select 1,1,2,0
>> union all
>> select 1,1,3,1
>> union all
>> select 1,1,4,1
>>
>> la idea es que si insertara un registro mas como por ejemplo:
>>
>> insert into versionesxformulas
>> select 1,1,5,0
>>
>> al colocarle 0 en el campo de VEFO_Activa me indique que no se puede
>> debido
>> a que ya existe un registro que pertenece la misma DIVI_Codigo,
>> FORM_Codigo
>> y VEFO_Codigo.
>>
>> esto como lo podria controlar con un constraint o no es lo mas
>> indicado.
>>
>> Saludos
>>
>> Juan Carlos
>>
>>
>>



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