Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

un campo impida ingreso de valores mayores que los de otro campo de otra tabla

Estas en el tema de un campo impida ingreso de valores mayores que los de otro campo de otra tabla en el foro de SQL Server en Foros del Web. Saludos Pido su ayuda para saber como hacer que un campo no permita que se ingresen valores mas altos que otro campo de otra tabla. ...
  #1 (permalink)  
Antiguo 11/04/2011, 16:05
 
Fecha de Ingreso: junio-2009
Mensajes: 88
Antigüedad: 14 años, 10 meses
Puntos: 4
un campo impida ingreso de valores mayores que los de otro campo de otra tabla

Saludos

Pido su ayuda para saber como hacer que un campo no permita que se ingresen valores mas altos que otro campo de otra tabla. Cual es la mejor herramienta para hacerlo?

Por ejemplo, como hago para que el monto aprobado en una tabla de prestamos, sea menor o igual que el limite de credito en una tabla cliente.

Debo hacer un stored procedure, puedo esto ir dentro de eso?

Gracias de antemano por cualquier ayuda!
  #2 (permalink)  
Antiguo 11/04/2011, 16:27
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: un campo impida ingreso de valores mayores que los de otro campo de otra t

Busca como hacer eso con triggers :)

Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 11/04/2011, 16:57
 
Fecha de Ingreso: junio-2009
Mensajes: 88
Antigüedad: 14 años, 10 meses
Puntos: 4
Respuesta: un campo impida ingreso de valores mayores que los de otro campo de otra t

Gracias. el asunto es que no sabia como podia resolverlo.
  #4 (permalink)  
Antiguo 11/04/2011, 19:52
 
Fecha de Ingreso: junio-2009
Mensajes: 88
Antigüedad: 14 años, 10 meses
Puntos: 4
Respuesta: un campo impida ingreso de valores mayores que los de otro campo de otra t

Hice un trigger,...

Cita:
CREATE TRIGGER monto_aprobado ON Prestamos FOR INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON
DECLARE @monto_aprobado int
IF (select monto_aprobado from prestamos) > (select limite_credito from cliente)
begin
raiserror ('Hay menos libros en stock de los solicitados para la venta', 16,1)
rollback transaction
end
END
...pero me da este error error...

Cita:
El monto aprobado no puede ser mayor que el limite de credito: La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión.
...cuando inserto los siguientes datos:

Cita:
-- Intento de ingresar MONTO APROBADO mayor que el LMITE DE CREDITO:

BEGIN TRAN monto_aprob_limite_cred
BEGIN TRY
Insert into prestamos (monto_aprobado) values (1)
COMMIT TRAN monto_aprob_limite_cred
END TRY
BEGIN CATCH
PRINT 'El monto aprobado no puede ser mayor que el limite de credito: '+ERROR_MESSAGE()
END CATCH
Alguna ayuda, por favor.
  #5 (permalink)  
Antiguo 12/04/2011, 07:43
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: un campo impida ingreso de valores mayores que los de otro campo de otra t

select limite_credito from cliente

Al parecer esta consulta esta regresando mas de un valor y cuando haces una comparacion con <>, <, >...etc tiene que ser nada mas un valor podrias usar ahi un

select limite_credito from cliente where cliente=@id_cliente


Saludos!!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 12/04/2011, 10:37
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: un campo impida ingreso de valores mayores que los de otro campo de otra t

Bueno, nunca veo en su trigger que haga mencion a las tablas temporales de INSERTED.

Ademas, no lo se, podria hacerse mediante un CONSTRAINT de CHECK, en lugar de un trigger.

Espero mas comentarios.
__________________
MCTS Isaias Islas
  #7 (permalink)  
Antiguo 12/04/2011, 10:41
 
Fecha de Ingreso: junio-2009
Mensajes: 88
Antigüedad: 14 años, 10 meses
Puntos: 4
Respuesta: un campo impida ingreso de valores mayores que los de otro campo de otra t

Saludos, gracias por sus ayudas y sugerencias.

Cita:
CREATE TRIGGER id_cliente ON Prestamos FOR INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON
DECLARE @monto_aprobado int
DECLARE @id_cliente nvarchar(100)
IF (select monto_aprobado from prestamos,cliente where prestamos.id_cliente= cliente.id_cliente) > (select limite_credito from cliente where id_cliente=@id_cliente)
begin
raiserror ('No tiene suficiente crédito para tomar este prestamo.', 16,1)
rollback transaction
end
END
Ahora hice el trigger de la siguiente forma pero no me funciona. Intenté haciandolo con un check, pero leyendo, decia que solo podia hacer check con campos de la misma tabla. Y de las tablas inserted, no se como usarlas por mas que leo tutoriales.
  #8 (permalink)  
Antiguo 12/04/2011, 10:47
 
Fecha de Ingreso: junio-2009
Mensajes: 88
Antigüedad: 14 años, 10 meses
Puntos: 4
Respuesta: un campo impida ingreso de valores mayores que los de otro campo de otra t

Gracias, asi estoy más cerca de la solucion, pero aun no obtengo el resultado. Ahora lo hice de este modo:

Cita:
CREATE TRIGGER id_cliente ON Prestamos FOR INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON
DECLARE @monto_aprobado int
DECLARE @id_cliente nvarchar(100)
IF (select monto_aprobado from prestamos,cliente where prestamos.id_cliente= cliente.id_cliente) > (select limite_credito from cliente where id_cliente=@id_cliente)
begin
raiserror ('No tiene suficiente crédito para tomar este prestamo.', 16,1)
rollback transaction
end
END
  #9 (permalink)  
Antiguo 12/04/2011, 16:32
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: un campo impida ingreso de valores mayores que los de otro campo de otra t

Espero que no se moleste, pero digame DONDE HACE REFERENCIA A LAS TABLAS TEMPORALES DEL TRIGGER (UPDATED, INSERTED)
__________________
MCTS Isaias Islas
  #10 (permalink)  
Antiguo 12/04/2011, 16:46
 
Fecha de Ingreso: junio-2009
Mensajes: 88
Antigüedad: 14 años, 10 meses
Puntos: 4
Respuesta: un campo impida ingreso de valores mayores que los de otro campo de otra t

Por lo que me dices, entiendo que debo usar tablas temporales. Asi que voy a investigar que son y como usarlas.
  #11 (permalink)  
Antiguo 13/04/2011, 08:36
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: un campo impida ingreso de valores mayores que los de otro campo de otra t

Exacto, hay que leer un poco sobre el contexto de como trabaja un TRIGGER...aunque insisto, tal vez, podria resolverse con un CONTRAINT de CHECK
__________________
MCTS Isaias Islas
  #12 (permalink)  
Antiguo 13/04/2011, 16:22
 
Fecha de Ingreso: junio-2009
Mensajes: 88
Antigüedad: 14 años, 10 meses
Puntos: 4
Respuesta: un campo impida ingreso de valores mayores que los de otro campo de otra t

Lei que el constraint check solo puede hacer referencias a campos de la misma tabla, y no de otras. Pero tambien me dijeron que para ello no es necesario un trigger, pues en el stored procedure se puede hacer. Gracias por sus valiosas ayudas.
  #13 (permalink)  
Antiguo 14/04/2011, 11:30
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: un campo impida ingreso de valores mayores que los de otro campo de otra t

Exacto, creo que ya encontraste la luz, los triggers fueron creados en un inicio para soportar el DRI, en la realidad, todo lo deberias hacer mediante tu STORE PROCEDURE
__________________
MCTS Isaias Islas

Etiquetas: procedure, restriccion, set, campos, checked
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:31.