Controlar el valor de un campo con un valor de un campo de otra tabla?

25/09/2007 - 21:43 por jmauriciopb | Informe spam
Tengo la siguiente tablas.

Maestro de Items
Item.
iItemId Int
cItemId Varchar 25
cDescri Varchar 100
yCosto Money. --Valor al que no puede ser
menor Item_pvt.yValor

Stock de Items
Item_Stock
iItemStockId Int
iIdItem Int
iIdBodega Int
nCantidad Numerico

Precios de venta.
Item_Pvt.
iPVtaId Int
iIdItemStock Int
iIdTipPrecio Int
yValor Money --Valor a ser controlado

Necesito controlar que al hacer una actualizacion Item_Pvt.yValor no
puedan ser menor al Item.yCosto.
No se si hacerlor por restrinccion a nivel de campo o por un trigeer,
talvez por un PS.
En la aplicacion que hace este actualizaciones de precios puede hacer
1 o varios, cual seria la mejor forma de hacerlo.

Realmente no tengo idea de como implementar este control.

Select Item.nCosto From Item Inner Join Item_Stock ON Item.iItemId Item_Stock.iIdItem
Inner Join Item_Pvt On Item_Stock.iItemStockId Item_Pvt.iIdItemStock

Espero me puedan ayudar.

Estoy utilizando Sql Server 2000 SP 4

Saludos,
Mauricio Pulla.
 

Leer las respuestas

#1 Carlos M. Calvelo
26/09/2007 - 17:47 | Informe spam
On 25 sep, 21:43, wrote:
Tengo la siguiente tablas.

Maestro de Items
Item.
iItemId Int
cItemId Varchar 25
cDescri Varchar 100
yCosto Money. --Valor al que no puede ser
menor Item_pvt.yValor

Stock de Items
Item_Stock
iItemStockId Int
iIdItem Int
iIdBodega Int
nCantidad Numerico

Precios de venta.
Item_Pvt.
iPVtaId Int
iIdItemStock Int
iIdTipPrecio Int
yValor Money --Valor a ser controlado

Necesito controlar que al hacer una actualizacion Item_Pvt.yValor no
puedan ser menor al Item.yCosto.
No se si hacerlor por restrinccion a nivel de campo o por un trigeer,
talvez por un PS.
En la aplicacion que hace este actualizaciones de precios puede hacer
1 o varios, cual seria la mejor forma de hacerlo.

Realmente no tengo idea de como implementar este control.

Select Item.nCosto From Item Inner Join Item_Stock ON Item.iItemId > Item_Stock.iIdItem
Inner Join Item_Pvt On Item_Stock.iItemStockId > Item_Pvt.iIdItemStock

Espero me puedan ayudar.

Estoy utilizando Sql Server 2000 SP 4

Saludos,
Mauricio Pulla.




Obviamente es una restricción (integridad de datos) y lo que
realmente queremos expresar es algo como:

CONSTRAINT <nombre_constraint> ON <base_de_datos>
NOT EXISTS (SELECT *
FROM Item I inner join Item_Stock S
on I.iItemId=S.iIdItem
inner join Item_Pvt P
on S.ItemStockId = P.iIdItemStock
WHERE I.yCosto > P.yValor )

Es decir, que "no deben existir lineas en el join de estas tres
tablas con I.yCosto > P.yValor"; una expresión booleana que deberá
cumplirse siempre (siempre debe evaluar True) y cualquier acción
que cause que la restricción evalue False deberá ser rechazada por
el SGBD.

Pero no podemos expresar esto en SQL Server. Para empezar esta es
una restricción a nivel de BBDD. Es decir, que abarca mas de una
tabla. Y los CHECKS en SQL Server son a nivel de columna o tabla.
Además en los checks no se pueden utilizar consultas.
Para colmo ni existe el tipo Boolean!
Hasta aquí la 'pequeña' crítica :)

Si insistimos en que debe ser definido como un constraint (y yo
insistiría en eso; son su razón de ser y triggers no son para esto)
entonces propongo lo siguiente:

Definir un constraint para la tabla Item y otro para la tabla
Item_Pvt. En el CHECK no se pueden poner consultas pero sí llamar
funciones. Estas a su vez si pueden usar consultas.

Aquí abajo tienes lo que quiero decir. Espero que los nombres
de las dos funciones y los dos constraints indiquen de por sí lo
que tratan de hacer. Estos nombres tratan de expresar la condición
que se tiene que cumplir.
'LE' y 'GE' deben leerse como '<=' y '>=' respectivamente.


create function dbo.is_yCosto_LE_ItemPvt_yValor(@iItemId int, @yCosto
money)
returns bit
as
begin
if exists (select S.iIdItem
from Item_Stock S inner join Item_Pvt P
on S.iItemStockId = P.iIdItemStock
where S.iIdItem = @iItemId and P.yValor < @yCosto)
return 0 --False
return 1 --True
end

alter table Item
add constraint yCosto_LE_ItemPvt_yValor
check (dbo.is_yCosto_LE_ItemPvt_yValor(iItemId, yCosto)=1)

create function dbo.is_yValor_GE_Item_yCosto(@iIdItemStock int,
@yValor money)
returns bit
as
begin
if exists(select I.iItemId
from Item I inner join Item_Stock S
on I.iItemId = S.iIdItem
where S.iItemStockId = @iIdItemStock and I.yCosto > @yValor)
return 0 --False
return 1 --True
end

alter table Item_Pvt
add constraint yValor_GE_Item_yCosto
check (dbo.is_yValor_GE_Item_yCosto(iIdItemStock, yValor)=1)


Saludos,
Carlos

Preguntas similares