Buenas gente, me podrían dar una mano con los ejercicios que tomó lacquaniti este cuatrimestre? . Sé que no es lo ideal ver resoluciones pero falté mucho y me están faltando ejemplos para tener de referencia. Desde ya agradezco su tiempo
1) Se necesita saber que productos no son vendidos durante el 2018 y cuáles sí. La consulta debe mostrar:
a) código de producto
b) Nombre de producto
c) Fue vendido (si o no) según el caso
d) cantidad de componentes
EL resultado debe ser ordenado por cantidad total vendida
Nota: no se permite el uso de sub-selects en el FROM ni funciones definidas por el usuario
Aclaracion: se realiza con la base de práctica de la cátedra, en lugar de 2018 se puede usar otro año para testearla
2) implementar el/los objetos necesarios para mantener siempre actualizado al instante ante cualquier evento el campo fact_total de la tabla Factura
Nota: se sabe que actualmente el campo fact_total presenta esta propiedad
Hola, yo tuve un 7 en el de SQL ( porque mostraba una columna que el no pedia para poder ordernar adecuadamente, con el tiempo que tenia preferi dejarlo asi ). El de T-SQL no lo aprobe pero porque me olvide de poner las otras PKs, la logica en si no me dijo que estaba mal.
SELECT p.prod_codigo, p.prod_detalle as 'nombre',
ISNULL((SELECT COUNT(c.comp_producto) FROM [GD2015C1].[dbo].Composicion c WHERE c.comp_producto = p.prod_codigo),0) as 'Cantidad componentes',
'Vendido' AS 'Producto', SUM(it.item_cantidad) as cant_vendida
FROM [GD2015C1].[dbo].Producto p
INNER JOIN [GD2015C1].[dbo].Item_Factura it ON it.item_producto = p.prod_codigo
INNER JOIN [GD2015C1].[dbo].Factura f ON f.fact_numero = it.item_numero AND f.fact_sucursal = it.item_sucursal AND f.fact_tipo = it.item_tipo
where YEAR(f.fact_fecha) = 2018
GROUP BY p.prod_codigo, p.prod_detalle
UNION ALL
SELECT p.prod_codigo, p.prod_detalle as 'nombre',
ISNULL((SELECT COUNT(c.comp_producto) FROM [GD2015C1].[dbo].Composicion c WHERE c.comp_producto = p.prod_codigo),0) as 'Cantidad componentes',
'No Vendido' AS 'Producto',0 as cant_vendida
FROM [GD2015C1].[dbo].Producto p
where p.prod_codigo not in (SELECT p.prod_codigo
FROM [GD2015C1].[dbo].Producto p
INNER JOIN [GD2015C1].[dbo].Item_Factura it ON it.item_producto = p.prod_codigo
INNER JOIN [GD2015C1].[dbo].Factura f ON f.fact_numero = it.item_numero AND f.fact_sucursal = it.item_sucursal AND f.fact_tipo = it.item_tipo
where YEAR(f.fact_fecha) = 2018)
GROUP BY p.prod_codigo, p.prod_detalle
order by 5 desc
CREATE TRIGGER tr_totalFactura ON ItemFactura
AFTER INSERT, UPDATE, DELETE
AS
BEGIN TRANSACTION
DECLARE @fact decimal (12,2)
DECLARE @importe decimal (12,2)
DECLARE mi_cursor cursor for
SELECT (ITEM_CANTIDAD * ITEM_PRECIO),ITEM_NUMERO FROM
INSERTED GROUP BY ITEM_NUMERO
UNION SELECT (-1* (ITEM_CANTIDAD * ITEM_PRECIO)),ITEM_NUMERO FROM
DELETED GROUP BY ITEM_NUMERO
OPEN mi_cursor
FETCH NEXT mi_cursor into @importe,@fact
WHILE @@FETCH_STATUS =0
BEGIN
UPDATE FACTURA
SET FACT_TOTAL=FACT_TOTAL+@importe
WHERE
FACT_NUMERO=@fact (aca faltaba preguntar por los otros PK que eran tipo y sucursal[/offtopic])
FETCH NEXT mi_cursor into @importe,@fact
END
CLOSE mi_cursor
DEALLOCATE mi_cursor
COMMIT TRANSACTION
Espero te haya ayudado.
Saludos.
Buenas
Hoy me hicieron pasar un mal momento con el mismo enunciado del ejercicio de T-SQL así que lo paso por si a alguien le sirve (No está verificado porque hay detalles que no pude hacer para mi entrega final)
/*
Implementar el/los objetos necesarios para mantener siempre actualizado
al instante ante cualquier evento el campo fact_total de la tabla Factura
considerando que el importe es la suma de los precios por las cantidades de los items.
Nota: Se sabe que actualmente el campo fact_total presenta esta propiedad.
*/
IF OBJECT_ID('TR_TOTAL_FACTURA') IS NOT NULL
DROP TRIGGER TR_TOTAL_FACTURA
GO
CREATE TRIGGER TR_TOTAL_FACTURA ON Item_Factura
AFTER INSERT, UPDATE, DELETE
AS BEGIN
-- Hasta donde encontre no se pueden hacer updates sobre varias rows al mismo tiempo
-- Se "podria" pero es medio complicado y CREO que no viene al caso
IF UPDATE(item_cantidad) OR UPDATE(item_precio) BEGIN
DECLARE @CANT_VIEJA DECIMAL(12, 2) =
(SELECT item_cantidad FROM deleted)
DECLARE @CANT_NUEVA DECIMAL(12, 2) =
(SELECT item_cantidad FROM inserted)
DECLARE @PRECIO_VIEJO DECIMAL(12, 2) =
(SELECT item_precio FROM deleted)
DECLARE @PRECIO_NUEVO DECIMAL(12, 2) =
(SELECT item_precio FROM inserted)
UPDATE Factura
SET fact_total = fact_total - @CANT_VIEJA * @PRECIO_VIEJO + @CANT_NUEVA * @PRECIO_NUEVO
WHERE fact_tipo = (SELECT item_tipo FROM deleted)
AND fact_sucursal = (SELECT fact_sucursal FROM deleted)
AND fact_numero = (SELECT fact_numero FROM deleted)
END
ELSE BEGIN
DECLARE @TIPO CHAR(1)
DECLARE @SUCURSAL CHAR(4)
DECLARE @FACTURA CHAR(8)
DECLARE @IMPORTE DECIMAL(12, 2)
DECLARE C_FACTURA CURSOR FOR
SELECT item_tipo, item_sucursal, item_numero,
SUM(item_cantidad * item_precio)
FROM inserted
GROUP BY item_tipo, item_sucursal, item_numero
UNION
SELECT item_tipo, item_sucursal, item_numero,
SUM(item_cantidad * item_precio)*(-1)
FROM deleted
GROUP BY item_tipo, item_sucursal, item_numero
OPEN C_FACTURA
FETCH NEXT FROM C_FACTURA INTO @TIPO, @SUCURSAL, @FACTURA, @IMPORTE
WHILE @@FETCH_STATUS = 0 BEGIN
UPDATE Factura SET fact_total = fact_total + @IMPORTE
WHERE fact_tipo = @TIPO AND
fact_sucursal = @SUCURSAL AND
fact_numero = @FACTURA
FETCH NEXT FROM C_FACTURA INTO @TIPO, @SUCURSAL, @FACTURA, @IMPORTE
END
CLOSE C_FACTURA
DEALLOCATE C_FACTURA
END
END
GO