Seguimos buscando a Arshak. Ayudanos compartiendo!
Encuesta no oficial de docentes
Resultados de la encuesta no oficial de docentes
Probaste el SIGA Helper?

Donar $100 Donar $200 Donar $500 Donar mensualmente


Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
Final Gestión de Datos 28/02/2012
Autor Mensaje
shecoop Sin conexión
Campeon del cubo Rubik
Sin estado :(
****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 112
Agradecimientos dados: 20
Agradecimientos: 31 en 14 posts
Registro en: Mar 2010
Mensaje: #16
RE: Final Gestión de Datos 28/02/2012
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
(Este mensaje fue modificado por última vez en: 27-07-2012 12:29 por shecoop.)
27-07-2012 12:26
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
orekav Sin conexión
Militante
¿¡!?
***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 60
Agradecimientos dados: 10
Agradecimientos: 35 en 15 posts
Registro en: Jun 2013
Mensaje: #17
RE: Final Gestión de Datos 28/02/2012
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
(Este mensaje fue modificado por última vez en: 02-03-2015 14:28 por orekav.)
02-03-2015 13:49
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Nacho14 Sin conexión
Profesor del Modulo A
-
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 295
Agradecimientos dados: 36
Agradecimientos: 50 en 36 posts
Registro en: Aug 2009
Mensaje: #18
RE: Final Gestión de Datos 28/02/2012
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

(Este mensaje fue modificado por última vez en: 02-03-2015 15:27 por gonnza.)
02-03-2015 14:35
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
HernanAlbo Sin conexión
Militante
Sin estado :(
***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 52
Agradecimientos dados: 7
Agradecimientos: 10 en 7 posts
Registro en: Mar 2012
Mensaje: #19
RE: Final Gestión de Datos 28/02/2012
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
02-03-2015 16:10
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Buscar en el tema
Enviar respuesta 




Usuario(s) navegando en este tema: 1 invitado(s)