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 Gestion de Datos 16/02/2015
Autor Mensaje
DanAykroyd Sin conexión
Profesor del Modulo A
On a Mission from God
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 293
Agradecimientos dados: 14
Agradecimientos: 659 en 82 posts
Registro en: Oct 2009
Mensaje: #16
RE: Final Gestion de Datos 16/02/2015
Buenísimo; gracias Alhasar y gracias Stephanie! Yo también cursé con Zafaronni (en el 2011... cry), así que si lo tenés por ahí para subirlo te lo agradezco.
17-02-2016 16:20
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
gabel Sin conexión
Empleado del buffet
Sin estado :(
*

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 4
Agradecimientos dados: 0
Agradecimientos: 5 en 3 posts
Registro en: Jul 2012
Mensaje: #17
RE: Final Gestion de Datos 16/02/2015
(17-02-2016 12:50)stephanie escribió:  Yo tambien la rendi ayer y pegue 8 no se de donde jaja
1a) no lo hice para no restar
1b) Puse falso, que podes tener la clausula IN en el where y no traer ninguna fila

2a) La tipica definicion de transaccion y puse de ejemplo cuando se quiere insertar en una tabla que referencia a otra, que si la pk no existe hace un rollback, porque esas sentencias son una transaccion en si
2b) Puse de objetos Sinonimos y Vista

3a) Hice un trigger INSTEAD OF de la vista y le agregue un cursor adentro y preguntaba si ya existia el numero de la factura, si exisita solo insertaba items y sino sino ambas cosas (factura e items)

3b) No se si esta bien lo que hice, pero hice algo asi porque lo hice a las apuradas a ese ej


SELECT I1.ite_id, I2.ite_id
FROM ITEM I1 JOIN FACTURA F ON (I1.fac_numero = F.fac_numero)
JOIN ITEM I2 ON (I2.fac_numero = F.fac_numero)
WHERE I2.fac_numero = I2.fac_numero
HAVING COUNT(*) > 500



Yo lo probe en casa y me dio bien este codigo que agrego abajo.
/* Solucion 3B */

/* Solucion 1 */
select i.ite_codproducto, i2.ite_codproducto from item i join item i2 on i.ite_facnumero = i2.ite_facnumero and i.ite_id > i2.ite_id
group by i.ite_codproducto, i2.ite_codproducto having count(*) > 500;

/* Solucion 2 */
select i.ite_codproducto, i2.ite_codproducto from item i,item i2 where i.ite_facnumero = i2.ite_facnumero and i.ite_id > i2.ite_id
group by i.ite_codproducto, i2.ite_codproducto having count(*) > 500;


Archivo(s) adjuntos Imagen(es)
   
21-02-2016 13:18
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] gabel recibio 1 Gracias por este post
CarooLina (07-02-2018)
DanAykroyd Sin conexión
Profesor del Modulo A
On a Mission from God
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 293
Agradecimientos dados: 14
Agradecimientos: 659 en 82 posts
Registro en: Oct 2009
Mensaje: #18
RE: Final Gestion de Datos 16/02/2015
(17-02-2016 15:45)Alhasar escribió:  Dan, ejercicios no tengo, ni se si tiene la catedra. Lo que yo te diria es agarrar un sql y ponerte a probar creando triggers y cursores. La mejor herramienta lamentablemente es la de siempre, Internet. Si queres practicar algo como lo del parcial, crea en un esquema una tabla y una vista a esa tabla y crear un trigger que en caso de que alguien quiera insertar en la vista, inserte en cambio en la tabla. Aca hay un ejemplo:
http://www.sqlserverya.com.ar/temarios/d...&punto=146

En el final, consideraron ademas que te pueden venir varios inserts juntos y que el trigger tiene que bancarselo. Explicado muy por arriba el tema es el siguiente, existe una tabla del sistema llamada INSERTED que siempre guarda temporalmente lo que se va a insertar antes de que se inserte. En el ejemplo que te pase esta pensando que esa tabla solo va a tener un registro entonces no hay problema. Pero si esta tabla de insercion tiene mas de una fila pendiente de ser insertada, cuando vos tratas de hacer

select documento,nombre,domicilio from inserted where condicion='cliente'

y te va a devolver mas de una fila y no va a poder hacer el insert en la tabla. El cursor lo que hace es convertir la tabla inserted en un select que podes ir recorriendo y tratando fila por fila, haciendo asi un insert por cada fila.

En PL/SQL existe una opcion exclusiva de este lenguaje que es "for each row" que te ahorra el uso del cursor. Como dije antes, no hace falta que te sepas las 2 maneras, si te resulta comodo o mas entendible hacer el cursor, lo haces y si queres usar el "FOR EACH ROW" tenes que aclarar que estas usando PL/SQL que tiene esa opcion.

Buenísima tu explicación Alhasar; muchas gracias por tomarte el tiempo de redactarla. Quería preguntarte si tenés más ejemplos como el que pasaste, de Cursores, Triggers, Store Procedures, etc; cosas que se puedan reproducir facilmente en el MS SQL Server y probarlas.

Por por ejemplo, para armar un Trigger y ver si funciona, no tengo idea de si se pueden poner mensajes desde ahí que te avise que está entrando al mismo y debuggearlos; o si se puede, es demasiado complicado ponerme a investigar eso para rendir este final. Por eso quisiera practicar cosas "realizables" de lo que puedan llegar a tomar.

Gracias!
21-02-2016 21:16
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Alhasar Sin conexión
Campeon del cubo Rubik
Analista
****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 120
Agradecimientos dados: 27
Agradecimientos: 43 en 24 posts
Registro en: Jun 2012
Mensaje: #19
RE: Final Gestion de Datos 16/02/2015
Buenas otra vez. Respecto al 3b puse un primer esbozo en este link :http://www.utnianos.com.ar/foro/tema-final-de-gestion-16-02-2016?pid=437167#pid437167

con respecto a lo del trigger, te tiro un ejemplo para que te des un poco mas de maña(Primero crea el esquema que deje en el post del link de arriba). Mi tabla es como la del final pero con un estado en lugar de una fecha , lo hice por comodidad, para el ejercicio es lo mismo).

Anda corriendo cada comando uno a uno por las dudas de que no se banque mas de un create.
[/code]
CREATE VIEW VW_FACTURAS (FAC_NUMERO,FAC_FECHA,ITE_ID,ITE_COD_PRODUCTO,ITE_CANTIDAD)
as
select f.fac_numero,f.fac_estado,i.ite_id,i.ite_cod_producto,i.ite_cantidad
from factura f inner join item i on f.fac_numero = i.fac_numero
;

CREATE TRIGGER TRG_VW_FACTURAS ON VW_FACTURAS
INSTEAD OF INSERT
AS
BEGIN
select * from inserted;
END
--DROP VIEW VW_FACTURAS; si queres dropearla, si esta creado el trigger, se borra cuando se borra la tabla
INSERT INTO VW_FACTURAS VALUES (1,'VENDIDO',1,58,21);



Fijate que en este ejemplo estoy haciendo que cuando alguien quiere insertar en la vista, el trigger devuelve lo que se quizo insertar. Es parte de la magia del trigger cambiar el insert a lo que vos quieras.

Aprovecho para dejar el trigger para mi esquema, analizalo un poco y vas a entenderlo bien, le deje comentado unos selects dentro del trigger por si queres ver que va retornando cada paso, lo descomentas y lo creas de nuevo y listo:



CREATE TRIGGER TRG_VW_FACTURAS ON VW_FACTURAS
INSTEAD OF INSERT
AS
BEGIN
DECLARE @fac_estado varchar(10);
DECLARE @FAC_NUMERO int;
DECLARE @ITE_ID int;
DECLARE @ITE_COD_PRODUCTO int;
DECLARE @ITE_CANTIDAD int;
DECLARE cursor_insertados cursor for (Select * from inserted);
--Select * from inserted;
OPEN cursor_insertados;
FETCH NEXT FROM cursor_insertados
INTO @FAC_NUMERO,@fac_estado,@ITE_ID,@ITE_COD_PRODUCTO,@ITE_CANTIDAD;
--Select @FAC_NUMERO,@fac_estado,@ITE_ID,@ITE_COD_PRODUCTO,@ITE_CANTIDAD;
WHILE @@FETCH_STATUS = 0
BEGIN
IF (SELECT COUNT(*) from factura where fac_numero = @FAC_NUMERO) > 0
BEGIN --si existe la factura
insert into item values(@ITE_ID,@ITE_COD_PRODUCTO,@ITE_CANTIDAD,@FAC_NUMERO);
END;
else
BEGIN --si no existe
insert into factura values (@FAC_NUMERO,@fac_estado,1,1);
-- inserto 1,1 porque mi modelo tiene un campo cantidad y la tabla cliente como fk y sino chilla, para el final era sin eso
insert into item values(@ITE_ID,@ITE_COD_PRODUCTO,@ITE_CANTIDAD,@FAC_NUMERO);
END;
FETCH NEXT FROM cursor_insertados
INTO @FAC_NUMERO,@fac_estado,@ITE_ID,@ITE_COD_PRODUCTO,@ITE_CANTIDAD;
END;

CLOSE cursor_insertados;
DEALLOCATE cursor_insertados;

END;
[code=sql]

Espero que te sirva.
Saludos!
22-02-2016 01:08
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] Alhasar recibio 1 Gracias por este post
rovila (22-07-2016)
DanAykroyd Sin conexión
Profesor del Modulo A
On a Mission from God
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 293
Agradecimientos dados: 14
Agradecimientos: 659 en 82 posts
Registro en: Oct 2009
Mensaje: #20
RE: Final Gestion de Datos 16/02/2015
Gracias Alhasar de nuevo por el detalle.

Estoy armando todo en SQL ahora y probando mis versiones. Un punto antes de empezar, el final dice "Realizar un trigger sobre la vista que permita dar de alta una factura completa (cabecera más ítems) y agregar ítems a facturas ya existentes)". Alguién preguntó al profesor si se esperaban INSERT INTO múltiples y dijo que sí, pero según el final no dice exactamente la inserción de UNA sola factura? Es decir, lo hubieran puesto bien si manejaba un solo registro? O realmente esperaban que hicieramos todo el quilombo de cursores en 1 hora?

Les paso la versión que armé yo y que aparentemente funciona (para un valor hasta ahora):

Creo las tablas (sin fecha):


DROP TABLE Factura
CREATE TABLE Factura (
fac_numero INT, -- Saco para probar funcionamiento correcto del TRIGGER: PRIMARY KEY
fac_importe REAL
)

DROP TABLE Item
CREATE TABLE Item (
ite_id INT IDENTITY (1,1),
ite_codproducto VARCHAR (255),
ite_cantidad INT,
ite_facnumero INT -- Saco para probar funcionamiento correcto del TRIGGER: FOREIGN KEY REFERENCES Factura (fac_numero)
)


Creo la Vista:

DROP VIEW Vista_Facturas
GO -- Uso el GO para separar porque en estos casos no puedo correr el DROP y CREATE juntos
CREATE VIEW Vista_Facturas
(fac_numero, fac_importe, ite_id, ite_codproducto, ite_cantidad, ite_facnumero)
AS
SELECT fac_numero, fac_importe, ite_id, ite_codproducto, ite_cantidad, ite_facnumero
FROM Factura
LEFT JOIN Item ON Item.ite_facnumero = Factura.fac_numero



Creo el Trigger que maneja un único valor de la tabla inserted:


DROP TRIGGER Trigger_Facturas
GO
CREATE TRIGGER Trigger_Facturas ON Vista_Facturas
INSTEAD OF INSERT
AS
BEGIN
PRINT 'Adentro del Trigger!'

-- Verifico que no exista el nùmero de factura en la cabecera antes de insertarlo
-- No puedo hacer inserted.fac_numero en el WHERE, asì que utilizo un sub query
IF (SELECT COUNT (*) FROM Factura WHERE Factura.fac_numero = (SELECT fac_numero FROM inserted)) = 0
-- El BEGIN/END lo pongo para bloques de IF, WHILE, STORED PROCEDURES, etc.; para encerrar comandos
BEGIN
-- Acà el INSERT INTO va sin VALUES cuando toma de otro SELECT
INSERT INTO Factura
SELECT fac_numero, fac_importe FROM inserted
END

-- Ahora agrego el detalle de los ìtems
-- Acà especifìco los campos que quiero insertar, para evitar el ite_id que es IDENTITY automático
INSERT INTO Item (ite_codproducto, ite_cantidad, ite_facnumero)
SELECT ite_codproducto, ite_cantidad, ite_facnumero FROM inserted
END



Pruebo el Trigger insertando un valor:


-- Hasta acá, cada INSERT que hago en la Vista se fija si existe el número de factura en la cabecera y sino
-- lo crea. Ingresa los Items y el campo ite_id IDENTITY va incrementando automáticamente. El tercer parámetro
-- '0' es ignorado por el TRIGGER
INSERT INTO Vista_Facturas
VALUES (1, 100, 0, 'Còdigo', 10, 1)



Y efectivamente funciona bien, la vista va quedando de esta manera luego de correr el INSERT INTO 3 veces:
[Imagen: JWClzbW.png]

Ahora voy a probar (aprender?) lo del manejo de cursores, pero insisto que me parece demasiado para que en el final esperen todo eso... no se qué opinan.

Y también si puede pegarle una mirada a los códigos que pegué, para ver si está bien y me quedo tranquilo (los resultados parecen correctos!).

Gracias y saludos.
22-02-2016 05:03
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
DanAykroyd Sin conexión
Profesor del Modulo A
On a Mission from God
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 293
Agradecimientos dados: 14
Agradecimientos: 659 en 82 posts
Registro en: Oct 2009
Mensaje: #21
RE: Final Gestion de Datos 16/02/2015
Bueno, acá terminé la versión con Cursor hecha desde cero viendo un tutorial de Cursores, con comentarios de tipo "PASO 1, PASO 2, etc." con lo que hay que ir haciendo para poder trabajarlos.

Creo que functiono bien también y obtuve los mismos resultados que con el TRIGGER de un solo registro (sin Cursor), luego de insertar 3 veces un set de valores. Ahora para este, estoy insertando los 3 registros en el mismo INSERT INTO.

Me avisan si está bien hecho para quedarme tranquilo o hay algo que esté faltando?

Trigger con Cursor:


DROP TRIGGER Trigger_Facturas
GO
CREATE TRIGGER Trigger_Facturas ON Vista_Facturas
INSTEAD OF INSERT
AS
BEGIN
PRINT 'Adentro del Trigger con Cursor!'

-- Como pueden venir varias filas en inserted, manejo mediante Cursor
-- PASO 1: DECLARO VARIABLES PARA ALMACENAR CADA REGISTRO DEL CURSOR
DECLARE @FAC_NUMERO INT
DECLARE @FAC_IMPORTE REAL
DECLARE @ITE_ID INT
DECLARE @ITE_CODPRODUCTO VARCHAR (255)
DECLARE @ITE_CANTIDAD INT
DECLARE @ITE_FACNUMERO INT

-- PASO 2: DECLARO EL CURSOR QUE VOY A UTILIZAR
DECLARE CursorInserted CURSOR FOR
SELECT fac_numero, fac_importe, ite_codproducto, ite_cantidad, ite_facnumero
FROM inserted

-- PASO 3: ABRO EL CURSOR
OPEN CursorInserted

-- PASO 4: OBTENGO EL PRIMER REGISTRO INSERTADO Y ALMACENO EN LAS VARIABLES
FETCH NEXT FROM CursorInserted
INTO @FAC_NUMERO, @FAC_IMPORTE, @ITE_CODPRODUCTO, @ITE_CANTIDAD, @ITE_FACNUMERO

-- PASO 5: RECORRO TODOS LOS REGISTROS INSERTADOS PARA PROCESARLOS
-- @@FETCH_STATUS = 0 indica que el último registro obtenido estuvo OK, así que hay que intentar seguir
WHILE @@FETCH_STATUS = 0
BEGIN
Print 'Inserto: ' + @ITE_CODPRODUCTO

-- Acà voy a incluir lo que antes hacía con el TRIGGER sin CURSOR, para que procese cada registro
-------------------------------------------------------------------------------------------------
-- Verifico que no exista el nùmero de factura en la cabecera antes de insertarlo
-- No puedo hacer inserted.fac_numero en el WHERE, asì que utilizo un sub query
IF (SELECT COUNT (*) FROM Factura WHERE Factura.fac_numero = @FAC_NUMERO) = 0
-- El BEGIN/END lo pongo para bloques de IF, WHILE, STORED PROCEDURES, etc.; para encerrar comandos
BEGIN
-- Acà el INSERT INTO va sin VALUES cuando toma de otro SELECT
INSERT INTO Factura
VALUES (@FAC_NUMERO, @FAC_IMPORTE)
END

-- Ahora agrego el detalle de los ìtems
-- Acà especifìco los campos que quiero insertar, para evitar el ite_id que es IDENTITY automático
INSERT INTO Item (ite_codproducto, ite_cantidad, ite_facnumero)
VALUES (@ITE_CODPRODUCTO, @ITE_CANTIDAD, @ITE_FACNUMERO)
-------------------------------------------------------------------------------------------------

-- PASO 6: OBTENGO EL SIGUIENTE REGISTRO INSERTADO Y ALMACENO EN LAS VARIABLES
FETCH NEXT FROM CursorInserted
INTO @FAC_NUMERO, @FAC_IMPORTE, @ITE_CODPRODUCTO, @ITE_CANTIDAD, @ITE_FACNUMERO
END

-- PASO 7: CIERRO Y DEALOCO EL CURSOR
CLOSE CursorInserted
DEALLOCATE CursorInserted
END



Inserto múltiples valores todos juntos:


-- Inserto mùltiples valores y veo que el TRIGGER con CURSOR lo maneje bien
INSERT INTO Vista_Facturas
VALUES (1, 23, 0, 'Chicle', 44, 1), (1, 45, 0, 'Chocolate', 12, 1), (2, 5, 0, 'Helado', 30, 2)



Esto sale en el log de la consola:


Adentro del Trigger con Cursor!
Inserto: Chicle

(1 filas afectadas)

(1 filas afectadas)
Inserto: Chocolate

(1 filas afectadas)
Inserto: Helado

(1 filas afectadas)

(1 filas afectadas)

(3 filas afectadas)



Y así quedó la vista:
[Imagen: daImbiJ.png]

Gracias! Un abrazo. Me voy a dormir un poco más motivado a las 06:30 AM! lol
22-02-2016 06:28
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] DanAykroyd recibio 1 Gracias por este post
holautn (22-02-2016)
Alhasar Sin conexión
Campeon del cubo Rubik
Analista
****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 120
Agradecimientos dados: 27
Agradecimientos: 43 en 24 posts
Registro en: Jun 2012
Mensaje: #22
RE: Final Gestion de Datos 16/02/2015
Hola, el tipo en el final tiro que podian venir varios... se que es una cagada pero mejor saberte armar un cursor por si acaso.
22-02-2016 17:40
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
DanAykroyd Sin conexión
Profesor del Modulo A
On a Mission from God
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 293
Agradecimientos dados: 14
Agradecimientos: 659 en 82 posts
Registro en: Oct 2009
Mensaje: #23
RE: Final Gestion de Datos 16/02/2015
Hola gente,

Alguien me da una mano para rendir hoy con el tema de árboles? Leí más de 10 apuntes, páginas de internet, Wikipedia, threads acá de verdadero y falso, etc. etc. y todos tienen definisiones distintas.

Qué DEMONIOS es un (en azul lo que yo encontré):

ARBOL COMPLETO

"Todos los niveles completos menos el último que se completa de izquierda a derecha"
"Grado de todos los nodos no maximales deben ser dos"
"Con 4 nodos puede ser completo?" Ejemplos:


Este supuestamente sí:
Cita:------A
-----B
----C
---D

o

Este supuestamente no
Cita:----------A-------------
----B-----------C------
--D---------------------

Otras definiciones de Zaffaroni que no me acuerdo

ARBOL LLENO

"Cada uno de los nodos tiene 0 o 2 hijos"
"Todo el arbol debe ser ""perfecto""" (es decir, todos los espacios completos y niveles iguales)


ARBOL BALANCEADO COMPLETAMENTE

No se...


ARBOL CASI BALANCEADO

"Árbol que puede diferir en un nivel entre nodos"


ARBOL AVL

Es lo mismo que ARBOL CASI BALANCEADO ???



Me pueden aclarar algo de esto con "la posta" de cómo es? Porque mientras más leo, menos entiendo. Sobre todo lo necesito saber para los Verdadero-Falso

Gracias!!!
23-02-2016 06:30
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
alejhon_48 Sin conexión
Empleado del buffet
soy un aprendiz
*

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 6
Agradecimientos dados: 1
Agradecimientos: 1 en 1 posts
Registro en: Sep 2014
Mensaje: #24
RE: Final Gestion de Datos 16/02/2015
(17-02-2016 01:41)DanAykroyd escribió:  Hola Alhasar,

Yo también fui - un desastre la verdad también. Te cuento lo que (creo) me acuerdo:

1A) Si un Arbol B tiene n hojas con datos, entonces el grado del mismo es n+1
Acá no sabía ni lo que era el "grado del árbol". Alguien que me aclare? Le mandé "VERDADERO

1B) Un SELECT dentro de un WHERE no puede retornar resultados vacíos. Acá le puse FALSO
Mi razonamiento fue que si quiero realizar lo siguiente:



SELECT * FROM FINAL_DEL_ORTO
WHERE EXISTS (
SELECT Aprobados FROM MATERIA_DEL_ORTO
)



Y el subquery da vacío, debería funcionar bien y no traer nada. No les parece?

2A) Qué era una transacción y cuándo el sistema ejecutaba un ROLLBACK en "una transacción abierta". Acá me pareció confuso también porque no se si se refería a lo que el programador escribe explicitamente para tirar un ROLLBACK o a que el sistema solo le pinta hacerlo
Escribí ambas cosas; aclarando que me parecía ambiguo. En el primer caso, el DBMS hace ROLLBACK cuando encuentra la sentencia ROLLBACK =) escrita por el programador. Para el segundo caso, le puse que el sistema hace ROLLBACK cuando detecta alguna falla, cómo perdida de conectividad, acceso en disco, etc., que no le permite completar la transacción, entonces la vuelve para atrás

2B) Como decís vos, nombrar dos elementos de seguridad. Me parecía ambiguo, quise preguntar si se refiere a la tabla de usuarios y las accesos que se definen para cada uno sobre qué elementos de la DB pueden utilizar, o si se refiere a la "seguridad" en las tablas de mantener la integridad de datos
Para este, respondí las dos cosas. Primero diciendo que estaba la tabla de usuarios y el manejo de permisos sobre los objetos y también aclaré el otro punto que me parecía a mi, donde puse lo mismo que vos, diciendo que con CONSTRAINT y TRIGGERS se puede manejar esto

3A) Daban una tabla de Facturas, otra de Items y una vista que mostraba un INNER JOIN entre ambas. Me pareció muy confuso lo que pedían, eso de que había que listar "los pares de productos de la misma factura"... qué pares de productos? Eran una lista de productos, una factura podía tener 'n' productos, no solamente 2... la verdad no entendí nada

3B) Pedían armar un TRIGGER que maneje el INSERT en la Vista, pero obviamente no especificaban qué iban a insertar en la vista. También pedían asegurarse si el número de factura ya existía en la cabecera y sino crearlo. Yo escribí algo más o menos así:



CREATE TRIGGER Final_Choto ON Vista
INSTEAD OF INSERT
BEGIN
IF (
(SELECT Nro_Factura FROM INSERTED) NOT IN SELECT (Nro_Factura FROM FACTURAS)
INSERT INTO FACTURAS (Nro_Facturas) VALUES (INSERTED.Nro_Factura)
END
INSERT INTO DETALLE (Codigo, Precio, Etc.)
VALUES (INSERTED.Codigo, INSERTED.Prcio, INSERTED.Etc.)
END



Cabe aclarar que estoy muy flojo con SQL , así que probablemente esté todo mal esto escrito, pero quizás la idea está bien. Lo que busqué hacer es verificar si no existía el código de factura en la cabecera y en tal caso crearlo. Luego, insertar los detalles.

Respecto a esto, me dan una mano para prepararme para el martes que viene? Que me recomiendan hacer para aprender intensivamente SQL en una semana? Hace 4 años que cursé la matería, en el trabajo lo uso muy poco y hay miles de formas distintas no consistentes para todos los comandos en vistas, procedures, tablas, etc.; me vuelve loco. Algunos van con "AS" prefijando a un SELECT, otros con BEGIN / END, la verdad que estoy re mareado.

Lo que pienso hacer es:
  • Realizar los ejercicios de la guía con el modelo de base de datos como para practicar
  • Volver a revisar los finales y tratar de entenderlos
  • Rezar

Ya me hicé todo el curso básico de W3Schools, pero cada ejercicio que veo mete cosas nuevas que nunca aparecieron, FOR EACH ROW, EXISTS, IN; no se cuándo usar uno, cuándo usar otro... la verdad me siento un fracasado, tengo toda la bronca por ser un forro de mierda.

En fin, perdón por mis pálidas, espero que al menos los enunciados le sirvan y si me dan una mano para prepararme se los voy a agradecer enormemente. Se que para los que trabajan con SQL todo el día esta materia les debe parecer una pelotudez, pero la verdad que cuando se meten con consultas TAN HIJAS DE PUTAS en los finales y rebuscadas al pedo, hago agua por todos lados.

Sin más, me voy a dormir con toda la bronca. Un abrazo grande.

EDIT: Hay alguna guía de práctica SQL RESUELTA? Porque tengo varias bajadas pero si no tengo las resoluciones no puedo comparar con lo que está bien o ver cómo lo hago si me trabo. Alguien puede compartir las resoluciones en .sql si tiene de la cursada? Muchas gracias

Estimados, no se si a esta altura del año sirva la respuesta, pero la 1A) es Verdadera, por definición un arbol-B n-ario tiene n-1 hojas (n punteros en c/nodo), en este caso: n grado => n-1 hojas | n+1 grado => n hojas.
23-09-2016 14:12
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Buscar en el tema
Enviar respuesta 




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