UTNianos

Versión completa: [Ayuda] Parcial GDD Lacquaniti 1C2018
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
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.
Spoiler: Mostrar
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
Spoiler: Mostrar
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
URLs de referencia