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
[APORTE] Final Gestión de Datos 14/02/17
Autor Mensaje
takuma1985 Sin conexión
Militante
.
***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 56
Agradecimientos dados: 107
Agradecimientos: 81 en 18 posts
Registro en: Oct 2011
Mensaje: #1
[APORTE] Final Gestión de Datos 14/02/17 Finales Gestión de Datos
Buenas!

Subo el final de hoy. Yo me fui así que los resultados no los puedo confirmar.
De los V/F el 1.a creo que es falso y el 1.b no estoy segura (leí por ahí que algunos motores lo permitían, pero no recordaba cuáles).
Los teóricos están en varios apuntes.

Respecto a la práctica, punto 3.a, si bien hay un error de sintaxis en el If (dentro del select dice 'stoc_cantidad' y 'stoc_producto'), en el examen dijeron que no había errores de sintaxis, así que eso hay que descartarlo. Yo lo hice en la máquina, y me da la opción C...el tema es que no puedo entender dónde es que pincha en tiempo de ejecución. Cualquier ayuda será bienvenida =)

El 3.b creo que con un trigger se resuelve, todavía no lo hice.

Saludos!


Archivo(s) adjuntos Imagen(es)
   
14-02-2017 20:34
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] takuma1985 recibio 3 Gracias por este post
CarooLina (15-02-2017), tincho543 (15-02-2017), Sir Ulrich (06-03-2017)
feder Sin conexión
Militante
Sin estado :(
***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 63
Agradecimientos dados: 2
Agradecimientos: 27 en 17 posts
Registro en: Apr 2011
Mensaje: #2
RE: [APORTE] Final Gestión de Datos 14/02/17
Yo lo rendí y me clavaron el dos. Un salame

el 1.a es falso, podes tener deadlocks

el 1.b es falso, podes tener 1, no se el tema de los motores, a mí me la consideraron bien con poner eso.

3.a es la C, cuando a @cantidad le queres meter item_cantidad from INSERTED rompe, le queres meter a una variable un posible conjunto de valores. Si insertás una fila anda perfecto, pero si le metés un INSERT INTO item_facture SELECT bla bla, rompe.


Desaprobé porque no hice el 3.b y porque me consideraron 0.5/2 en la de plan de consulta y 1/2 en la de HASH y eso que puse lo que está en los apuntes. O sea, sumé 5.5 de los 6, una GARCHA
15-02-2017 10:12
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] feder recibio 3 Gracias por este post
takuma1985 (15-02-2017), CarooLina (06-02-2018), Soy (05-02-2019)
tincho543 Sin conexión
Empleado de Fotocopiadora
A BOEDO VAMOS A VOLVER
**

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 49
Agradecimientos dados: 71
Agradecimientos: 2 en 2 posts
Registro en: Aug 2010
Mensaje: #3
RE: [APORTE] Final Gestión de Datos 14/02/17
Hola, yo tampoco me quedé.
Agrego la de plan de ejecución por si a alguno le sirve, según lo que está en varios apuntes...

Plan de Ejecución de un SELECT
Antes de ejecutar una consulta, el motor de base de datos la optimiza. El resultado de esa optimización es lo que se conoce como plan de ejecución. Las decisiones que toma el motor para optimizar incluyen: qué algoritmo de join usar, qué algoritmo de ordenamiento usar, qué algoritmo de agrupación usar o si recorrer la tabla de forma secuencial o usando índices. Todas estas decisiones mejoran la performance de la consulta. Por ejemplo, no es lo mismo utilizar un algoritmo de join especializado para tablas de tamaño pequeño que usarlo para tablas de tamaño mayor

y de Wiki
https://es.wikipedia.org/wiki/Optimizador_de_consultas
15-02-2017 11:31
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] tincho543 recibio 1 Gracias por este post
takuma1985 (15-02-2017)
Matiaslf Sin conexión
Empleado del buffet
:)
*

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 17
Agradecimientos dados: 31
Agradecimientos: 12 en 5 posts
Registro en: Oct 2010
Mensaje: #4
RE: [APORTE] Final Gestión de Datos 14/02/17
El trigger del ultimo punto se hace con after insert y un cursor adentro por si tenes muchos inserts en Inserted.
15-02-2017 11:35
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] Matiaslf recibio 1 Gracias por este post
takuma1985 (15-02-2017)
Martin. Sin conexión
Presidente del CEIT
Enjoy it !
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 1.379
Agradecimientos dados: 88
Agradecimientos: 296 en 137 posts
Registro en: Oct 2011
Mensaje: #5
RE: [APORTE] Final Gestión de Datos 14/02/17
Añado un par de comentarios sobre el final.

Una de las principales características de revisar y analizar el plan de ejecución de una consulta es poder ver cuales son los motivos por el cual la misma se demora en devolver los resultados. Básicamente te permite detectar la falta de una primary key, o un índice en una columna, ya que la misma te regresa un "Table scan". A grandes rasgos la príncipal útilidad de el plan es detectar esos pequeños errores de diseño de base de datos.

Respecto al 3A como ya dijeron la correcta es la C dado que solo se puede asignar 1 solo valor a una variable, por lo que si haces un insert directo desde una consulta el trigger rompe.

[Imagen: jQJfyBGh9SOmZ.png]
15-02-2017 11:51
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] Martin. recibio 1 Gracias por este post
takuma1985 (15-02-2017)
grmnn Sin conexión
Militante

***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 50
Agradecimientos dados: 26
Agradecimientos: 15 en 7 posts
Registro en: Feb 2013
Mensaje: #6
RE: [APORTE] Final Gestión de Datos 14/02/17
Rendí ayer y me saqué un 7 así que supongo que los VoF los tenía bien. Mis respuestas fueron:

VoF:
Spoiler: Mostrar
1.a)Falso. De hecho a veces se suele producir deadlock en determinadas situaciones de lectura/escritura en algún nivel.
1.b)Falso. En esta dudé porque decía SQL SERVER y tenía entendido que no se podía tener más de un TRIGGER por tipo en una tabla de ningún motor, aparantemente estaba en lo cierto.


Los puntos 2.a) y 2.b) están en la teoría, creo que nada del otro mundo.

3.a)
Spoiler: Mostrar

Puse la d) pero creo que es la c) como pusieron, yo no tuve en cuenta el INSERT masivo de filas, sólo pense la de una fila y pifié.


3.b)
Spoiler: Mostrar

Hice un TRIGGER AFTER INSERT sobre la tabla item_factura con un cursor adentro tomando en cuenta que se inserten varios item_factura. La lógica era MUY parecida a la del 3.a) pero declarando un cursor y teniendo en cuenta que si la cantidad que insertaba era mayor a la que tenías en stock de ese producto hacías un ROLLBACK y listo (porque te decía que no podía haber stock menor a cero). La lógica de eso no era complicada.



Saludos!
15-02-2017 12:22
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] grmnn recibio 2 Gracias por este post
takuma1985 (15-02-2017), tincho543 (15-02-2017)
feder Sin conexión
Militante
Sin estado :(
***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 63
Agradecimientos dados: 2
Agradecimientos: 27 en 17 posts
Registro en: Apr 2011
Mensaje: #7
RE: [APORTE] Final Gestión de Datos 14/02/17
(15-02-2017 11:51)Martin. escribió:  Añado un par de comentarios sobre el final.

Una de las principales características de revisar y analizar el plan de ejecución de una consulta es poder ver cuales son los motivos por el cual la misma se demora en devolver los resultados. Básicamente te permite detectar la falta de una primary key, o un índice en una columna, ya que la misma te regresa un "Table scan". A grandes rasgos la príncipal útilidad de el plan es detectar esos pequeños errores de diseño de base de datos.

Respecto al 3A como ya dijeron la correcta es la C dado que solo se puede asignar 1 solo valor a una variable, por lo que si haces un insert directo desde una consulta el trigger rompe.

Yo puse lo que dijeron por arriba y estaba mal, a ellos les interesaba que pongas esto que puso martin, cuál es la utilidad o cómo impacta en el usuario el plan de ejecución. Si ponías como yo que el plan de ejecución mejoraba la performance y toda esa guitarreada, te clavaban un 0.5/2. Gracias por la respuesta.

Con el trigger me ayudan? O sea, claramente era un trigger y una forma eran los cursores. Pero se puede hacer sin cursores ? En el final hice algo así:

CREATE TRIGGER tr_bajar_stock ON item_factura AFTER INSERT
AS
BEGIN
UPDATE stock
SET stock_cantidad = stock_cantidad - P.parcial
FROM stock S
INNER JOIN
(SELECT item_producto,
SUM(CASE WHEN item_cantidad<= stock_cantidad THEN item_cantidad END)
AS parcial FROM INSERTED INNER JOIN STOCK WHERE item_producto=stock_producto
GROUP BY item_producto) P
ON s.stock_producto = P.item_producto
END

Pero el problema es justamente que P.item_producto puede tener un monton de filas y también falla.

Los profesores también dijeron que una opción era modificar todos los stock, y despues hacer otro update de los que quedaron negativos, poniendole el valor anterior, pero tampoco se me ocurre como encararlo.

Gracias !
15-02-2017 12:44
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] feder recibio 1 Gracias por este post
tincho543 (15-02-2017)
tincho543 Sin conexión
Empleado de Fotocopiadora
A BOEDO VAMOS A VOLVER
**

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 49
Agradecimientos dados: 71
Agradecimientos: 2 en 2 posts
Registro en: Aug 2010
Mensaje: #8
RE: [APORTE] Final Gestión de Datos 14/02/17
El 3)c) no lo pude hacer,

Si alguien puede ayudar con el trigger con el cursor vendría muy bien! Gracias.
15-02-2017 14:53
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Martin. Sin conexión
Presidente del CEIT
Enjoy it !
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 1.379
Agradecimientos dados: 88
Agradecimientos: 296 en 137 posts
Registro en: Oct 2011
Mensaje: #9
RE: [APORTE] Final Gestión de Datos 14/02/17
(15-02-2017 14:53)tincho543 escribió:  El 3)c) no lo pude hacer,

Si alguien puede ayudar con el trigger con el cursor vendría muy bien! Gracias.

Con el cursor vendría a ser algo así:


CREATE TRIGGER tr_bajar_stock ON item_factura AFTER INSERT
AS
BEGIN
DECLARE @idProducto int, @cantidad int

DECLARE cStock CURSOR FOR
SELECT item_producto, item_cantidad from INSERTED

OPEN cStock
FETCH cStock INTO @idProducto, @cantidad

WHILE (@@FETCH_STATUS = 0)
BEGIN

UPDATE STOCK
SET STOCK_CANTIDAD = STOCK_CANTIDAD - @CANTIDAD
WHERE STOCK_PRODUCTO = @IDPRODUCTO

FETCH cStock INTO @idProducto, @cantidad
END

CLOSE cStock
DEALLOCATE cStock

end




(15-02-2017 12:44)feder escribió:  Yo puse lo que dijeron por arriba y estaba mal, a ellos les interesaba que pongas esto que puso martin, cuál es la utilidad o cómo impacta en el usuario el plan de ejecución. Si ponías como yo que el plan de ejecución mejoraba la performance y toda esa guitarreada, te clavaban un 0.5/2. Gracias por la respuesta.

Con el trigger me ayudan? O sea, claramente era un trigger y una forma eran los cursores. Pero se puede hacer sin cursores ? En el final hice algo así:
[code=sql]
CREATE TRIGGER tr_bajar_stock ON item_factura AFTER INSERT
AS
BEGIN
UPDATE stock
SET stock_cantidad = stock_cantidad - P.parcial
FROM stock S
INNER JOIN
(SELECT item_producto,
SUM(CASE WHEN item_cantidad<= stock_cantidad THEN item_cantidad END)
AS parcial FROM INSERTED INNER JOIN STOCK WHERE item_producto=stock_producto
GROUP BY item_producto) P
ON s.stock_producto = P.item_producto
END

Pero el problema es justamente que P.item_producto puede tener un monton de filas y también falla.

Los profesores también dijeron que una opción era modificar todos los stock, y despues hacer otro update de los que quedaron negativos, poniendole el valor anterior, pero tampoco se me ocurre como encararlo.

Gracias !

Creo que si al trigger lo definis del tipo Instead Of Insert, funcionaría.


CREATE TRIGGER tr_bajar_stock ON item_factura INSTEAD OF INSERT
AS
BEGIN
--INSERTO PRIMERO LOS ELEMENTOS EN SU TABLA
INSERT INTO item_factura
SELECT * FROM INSERTED

--ACTUALIZO STOCK PARA CADA ELEMENTO DE LA TABLA INSERTED
UPDATE stock
SET stock_cantidad = stock_cantidad - P.parcial
FROM stock S
INNER JOIN
(SELECT item_producto,
SUM(CASE WHEN item_cantidad<= stock_cantidad THEN item_cantidad END)
AS parcial FROM INSERTED INNER JOIN STOCK WHERE item_producto=stock_producto
GROUP BY item_producto) P
ON s.stock_producto = P.item_producto
END

[Imagen: jQJfyBGh9SOmZ.png]
(Este mensaje fue modificado por última vez en: 15-02-2017 15:35 por Martin..)
15-02-2017 15:15
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] Martin. recibio 3 Gracias por este post
tincho543 (15-02-2017), takuma1985 (15-02-2017), CarooLina (07-02-2018)
grmnn Sin conexión
Militante

***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 50
Agradecimientos dados: 26
Agradecimientos: 15 en 7 posts
Registro en: Feb 2013
Mensaje: #10
RE: [APORTE] Final Gestión de Datos 14/02/17
Cita:Con el cursor vendría a ser algo así:


CREATE TRIGGER tr_bajar_stock ON item_factura AFTER INSERT
AS
BEGIN
DECLARE @idProducto int, @cantidad int

DECLARE cStock CURSOR FOR
SELECT item_producto, item_cantidad from INSERTED

OPEN cStock
FETCH cStock INTO @idProducto, @cantidad

WHILE (@@FETCH_STATUS = 0)
BEGIN

UPDATE STOCK
SET STOCK_CANTIDAD = STOCK_CANTIDAD - @CANTIDAD
WHERE STOCK_PRODUCTO = @IDPRODUCTO

FETCH cStock INTO @idProducto, @cantidad
END

CLOSE cStock
DEALLOCATE cStock

end



Corrijo una boludes, como el enunciado decía que no podía haber stock menor a 0 le agregaría un par de líneas nomás y quedaría así:



CREATE TRIGGER tr_bajar_stock ON item_factura AFTER INSERT
AS
BEGIN TRAN
DECLARE @idProducto int, @cantidad int

DECLARE cStock CURSOR FOR
SELECT item_producto, item_cantidad from INSERTED

OPEN cStock
FETCH cStock INTO @idProducto, @cantidad

WHILE (@@FETCH_STATUS = 0)
BEGIN

IF (@cantidad - (SELECT stock_cantidad FROM stock WHERE stock_producto = @idProducto)) =< 0
BEGIN
UPDATE STOCK
SET STOCK_CANTIDAD = STOCK_CANTIDAD - @CANTIDAD
WHERE STOCK_PRODUCTO = @IDPRODUCTO
END
ELSE
ROLLBACK TRAN

FETCH cStock INTO @idProducto, @cantidad
END

CLOSE cStock
DEALLOCATE cStock

COMMIT TRAN




Saludos.
15-02-2017 17:51
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] grmnn recibio 5 Gracias por este post
tincho543 (15-02-2017), takuma1985 (16-02-2017), CarooLina (07-02-2018), Joaquin Alsamendi (25-11-2018), Soy (05-02-2019)
lianndt Sin conexión
Empleado de Fotocopiadora
Sin estado :(
**

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 28
Agradecimientos dados: 3
Agradecimientos: 8 en 5 posts
Registro en: Feb 2014
Mensaje: #11
RE: [APORTE] Final Gestión de Datos 14/02/17
El trigger sin cursor podria ser algo asi, haciendo join con inserted.

UPDATE stock SET stock_cantidad = stock_cantidad - i.item_cantidad

FROM stock s INNER JOIN inserted i ON i.ProductoID = s.ProductoID
WHERE (s.stock_cantidad - i.item_cantidad >= 0)


De esa manera no manejas errores, simplemente el item que se pasa de stock no se tiene en cuenta
16-02-2017 19:42
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] lianndt recibio 1 Gracias por este post
tincho543 (21-02-2017)
RominaP Sin conexión
Empleado del buffet
Sin estado :(
*

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 6
Agradecimientos dados: 0
Agradecimientos: 0 en 0 posts
Registro en: Mar 2012
Mensaje: #12
RE: [APORTE] Final Gestión de Datos 14/02/17
Buen día!
Sigue el método de ver el final 5 minutos e irse?
No estoy muy segura para rendir hoy, pero quería verlo.

Gracias!
27-09-2017 13:11
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
gabrielarce Sin conexión
Militante
Benditos finales..
***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 99
Agradecimientos dados: 62
Agradecimientos: 19 en 11 posts
Registro en: Jan 2010
Mensaje: #13
RE: [APORTE] Final Gestión de Datos 14/02/17
hola! en que apunte puedo encontrar las diferencias del indice hash y arbol b+?

Gracias!
22-11-2017 19:18
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
lucianovperez Sin conexión
Empleado del buffet
;) ;) ;) ;) ;)
*

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 15
Agradecimientos dados: 37
Agradecimientos: 87 en 2 posts
Registro en: Jun 2014
Mensaje: #14
RE: [APORTE] Final Gestión de Datos 14/02/17
CREATE TRIGGER actual_stock ON item_factura instead of INSERT
AS
BEGIN TRAN
DECLARE @item_num
DECLARE @item_cant decimal(12,2)
DECLARE @item_prod int

DECLARE cursor_fact CURSOR FOR SELECT * FROM INSERTED
OPEN cursor_fact
FETCH NEXT FROM cursor_fact INTO @item_num,@item_cant,@item_prod

WHILE(@@FECHT_STATUS=0)
BEGIN
IF((SELECT stock_cantidad FROM stock WHERE stock_producto=@item_prod)-@item_cant>=0)
BEGIN
INSERT INTO item_factura VALUES(@item_num,@item_cant,@item_prod)
UPDATE stock SET stock_cantidad=stock_cantidad-@item_cant WHERE stock_producto=@item_producto
END
FETCH NEXT FROM cursor_fact INTO @item_num,@item_cant,@item_prod
END
CLOSE cursor_fact
DEALLOCATE cursor_fact
END
02-10-2018 23:36
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] lucianovperez recibio 1 Gracias por este post
mpicollo (12-02-2020)
Buscar en el tema
Enviar respuesta 




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