UTNianos

Versión completa: Final Gestión de Datos 28/02/2012
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2
Si, te van a desaprobar si usas funciones o procedimientos cuando te piden que hagas una consulta..

En cuanto a la sintaxis no se, tampoco es que haya mucha sintaxis para las consultas.. Más bien podes llegar a tener errores conceptuales que si seguro te van a desaprobar si los cometés..
En la sintaxis de los procedimientos/trigger/lo que tengas que hacer, tenés que indicar el motor que vas a usar... (Oracle, SQL Server). No se si seran muy estrictos a la hora de ver si estas mezclando cosas de uno o de otro.. Yo no creo, pero te conviene elegir uno y ya usar ese para todo lo que tengas que hacer.

Tu ejercicio no se decirte si está bien ya que no lo hice.. Espero que alguno más experto en el tema te sepa responder!
Saludos
Pongo mi solución: los comentarios son casos que ROMPEN el trigger



CREATE TABLE transferencias(
id_trans INT IDENTITY(1,1),
cuenta INT NOT NULL,
direccion CHAR(1),
fecha datetime,
importe numeric(12,2),
PRIMARY KEY(id_trans),
CHECK(direccion = 'E' OR direccion = 'S')
)

CREATE TABLE relacion(
inquilino INT,
dueño INT
)
GO

CREATE TRIGGER noPerderComision ON transferencias
AFTER INSERT, UPDATE
AS
DECLARE C CURSOR FOR
SELECT * FROM inserted

DECLARE @id_trans INT,
@cuenta INT,
@inquilino INT,
@dueño INT,
@direccion CHAR(1),
@fecha datetime,
@importe numeric(12,2),
@importeInserted numeric(12,2);

OPEN C
FETCH C INTO @id_trans, @cuenta, @direccion, @fecha, @importe

WHILE(@@FETCH_STATUS = 0)
BEGIN
IF(@direccion = 'S')
BEGIN
SET @inquilino = (SELECT relacion.inquilino FROM relacion WHERE relacion.dueño = @cuenta)
SET @importeInserted = (SELECT transferencias.importe FROM transferencias WHERE transferencias.cuenta = @inquilino
AND YEAR(transferencias.fecha) = YEAR(@fecha) AND MONTH(transferencias.fecha) = MONTH(@fecha))
IF(@importe >= @importeInserted)
BEGIN
PRINT('ESTAS PERDIENDO PLATA, SALIDA')
PRINT('Cobraste $' + STR(@importeInserted))
PRINT('y enviaste $' + STR(@importe))
ROLLBACK
END
END
IF(@direccion = 'E')
BEGIN
SET @dueño = (SELECT relacion.dueño FROM relacion WHERE relacion.inquilino = @cuenta)
SET @importeInserted = (SELECT transferencias.importe FROM transferencias WHERE transferencias.cuenta = @dueño
AND YEAR(transferencias.fecha) = YEAR(@fecha) AND MONTH(transferencias.fecha) = MONTH(@fecha))
IF(@importe <= @importeInserted)
BEGIN
PRINT('ESTAS PERDIENDO PLATA, ENTRADA')
PRINT('Cobraste $' + STR(@importe))
PRINT('y enviaste $' + STR(@importeInserted))
ROLLBACK
END
END

FETCH C INTO @id_trans, @cuenta, @direccion, @fecha, @importe
END

CLOSE C
DEALLOCATE C
GO




INSERT INTO transferencias (cuenta,direccion,fecha,importe) VALUES
(1, 'E', '2011-09-01', 100), (1, 'E', '2011-10-01', 150), (1, 'E', '2011-11-01', 200),
(3, 'S', '2011-09-02', 90),
(2, 'E', '2011-09-01', 300), (2, 'E', '2011-10-01', 400), (2, 'E', '2011-11-01', 500),
(4, 'S', '2011-09-02', 270), (4, 'S', '2011-10-02', 360), (4, 'S', '2011-11-01', 450);

INSERT INTO relacion (inquilino, dueño) VALUES
(1, 3), (2, 4);


--select * from transferencias
--select * from relacion

SELECT t1.cuenta, t1.importe, t1.fecha, t1.direccion, relacion.dueño
FROM transferencias t1 INNER JOIN relacion ON relacion.inquilino = t1.cuenta
WHERE t1.direccion = 'E' AND (
select count(*)
from transferencias t2
where t2.direccion = 'S' AND t2.cuenta = relacion.dueño
AND MONTH(t1.fecha) = MONTH (t2.fecha)
AND YEAR(t1.fecha) = YEAR(t2.fecha)) <> 1

--INSERT INTO transferencias (cuenta,direccion,fecha,importe) VALUES (3, 'S', '2011-10-01', 150)
--UPDATE transferencias SET importe = 199 WHERE id_trans = 4
--UPDATE transferencias SET importe = 12 WHERE id_trans = 1


DROP TRIGGER noPerderComision
DROP TABLE relacion
DROP TABLE transferencias



Ya sé, el PRINT es FEO XD... es a modo de que quede claro cuando probaba =P
hice el trigger suponiendo que los insert se producen de a un registro por vez, si se pueden producir varias filas juntas habria que hacer un cursor si o si


CREATE TRIGGER verificarImporte ON transferencias
AFTER INSERT, UPDATE
AS
BEGIN

DECLARE @IMPORTEQUESALE INT
SET @IMPORTE = (SELECT INSERTED.IMPORTE FROM INSERTED WHERE INSERTED.DIRECCION = 'S')

DECLARE @INQUILINO INT
SET @INQUILINO = (SELECT CTA_INQUILINO FROM INSERTED JOIN RELACION ON (INSERTED.CUENTA = CTA_DUENIO)

DECLARE @IMPORTEINGRESADO INT
SET @IMPORTEINGRESADO = (SELECT IMPORTE FROM TRANSFERENCIAS WHERE CUENTA = @INQUILINO)

IF (@IMPORTEQUESALE >= @IMPORTEINGRESADO)
raiserror('error en el valor del importe ingresado')
rollback

END

con el mismo ejemplo que pusiste recien yo llegue a este consulta..

select distinct t1.id_trans from dbo.transferencias T1, dbo.transferencias T2, dbo.relacion R
where T1.cuenta=R.dueño and T2.cuenta=R.inquilino
and MONTH(t1.fecha)!=MONTH(t2.fecha)
or YEAR(t1.fecha)!=YEAR(T2.fecha)

siendo la 4,8,9 las transferencias que aun faltan darle al dueño

nose si estara bien lo mio.. pero no entiendo porque devuelve las transferencias 1,2,3 tu consulta
Páginas: 1 2
URLs de referencia