miércoles, 26 de noviembre de 2014

Última entrada

Análisis de resultados:
En general el proyecto resulta satisfactorio en cuanto a lo requerido en la especificación se refiere. No pudo probarse con totalidad los stored procedure # 6  y  #8. La #6 teniendo errores al hacer el top 10 de los elementos, los cuales si hace por separado. El #8 no pudo ser testeado por lo que el resultado podría no ser el esperado.

Moralejas:
Utilizar código limpio
Utilizar Estándares para los procedures
Entre más complejo sea el diseño, más complicado será programar los procedures
Comunicación entre los miembros del equipo

Problema de aprendizaje: El uso de group by, order by, diferenciar entre where y having, left joins y tomar en cuenta el uso google y sus aliados.
 se reiteró en los mismos errores

Ayuda recibida


Edward Ovares: 28.15
Luis Diego Flores: 26 Horas


Total de horas: 33.15

Procedure: Problema 7 y Problema 8 Luis



DESCRIPCION:

7) Los nombres de los clientes que compraron tiquetes al menos una
vez, y que no regresaron a comprar, en un periodo de fechas.
Entradas: fecha inicio, fecha fin
Salidas: Nombre del cliente, fecha de la compra; en orden alfabetico del nombre del cliente

8) Los eventos, a los que a los clientes asistieron a funciones mas de una vez, en un rango de fechas
Entrada: Fecha inicio, fecha fin
Salida
Para cada evento: Nombre del evento, numero de personas que asistieron a 2 funciones, numero de personas que asistieron a 3 funciones, numero de personas que asistieron a mas de 3 funciones.

PROBLEMAS:
Error: Msg 8152 Conflicto con tamaño de variables a la hora de programar el SP.
Con los archivos de prueba proporcionados no era posible probarse en su totalidad  el SP, debido a que cada cliente (al ser tan pocos) tenía a su nombre cientos de tiquetes


CODIGO:




----------------------------------------------------------------------------------------------------------------------
-- Verifica si el store procedure existe, para eliminarlo
IF OBJECT_ID ( N'BT_SP_Clientes_Abandono', N'P' ) IS NOT NULL 
    DROP PROCEDURE BT_SP_Clientes_Abandono;
GO

/*
7) Los nombres de los clientes que compraron tiquetes al menos una
vez, y que no regresaron a comprar, en un periodo de fechas.
Entradas: fecha inicio, fecha fin
Salidas: Nombre del cliente, fecha de la compra; en orden alfabetico del nombre del cliente
*/
Create Procedure BT_SP_Clientes_Abandono
@FechaIni datetime,
@FechaFin datetime
As
Begin
 BEGIN TRY
  BEGIN TRANSACTION 
   Select nombre From BT_Usuario
   inner join BT_Tiquete on BT_Usuario.Id = BT_Tiquete.FK_Usuario
   inner join BT_AsientoXTanda on BT_Tiquete.FK_AsientoXTanda = BT_AsientoXTanda.Id
   inner join BT_Tanda on BT_Tanda.Id = BT_AsientoXTanda.FK_Tanda
   Where (select count (*) From BT_Tiquete)=1
   and FechaHora between @FechaIni and @FechaFin
  
  IF @@TRANCOUNT > 0
   COMMIT TRANSACTION;

  RETURN 1;
 END TRY
 BEGIN CATCH
  EXEC BT_SP_GetErrorInfo;
  IF @@TRANCOUNT > 0
   ROLLBACK TRANSACTION;
  RETURN @@ERROR*-1;
 END CATCH
END
GO
-- exec BT_SP_Clientes_Abandono '2014-11-21 00:00:00.000', '2015-07-13 00:00:00.000'




Horas Trabajadas: 3,15 hora
Autor: Luis Diego Flores

martes, 25 de noviembre de 2014

Procedure: Problema 5 y Problema 6 Edward



DESCRIPCION:

5) Idem 4) pero referido a secciones del teatro.

6) Por tipo de evento, de manera historica, los 10 asientos menos preferidos.
Entrada: Ninguna
Salidas: Para cada tipo de evento, se listan los 10 asientos que nunca fueron reservados, o que tienen la menor cantidad de compras.

PROBLEMAS:


CODIGO:



----------------------------------------------------------------------------------------------------------------------

-- Verifica si el store procedure existe, para eliminarlo
IF OBJECT_ID ( N'BT_SP_ASIENTOS_PREFE_SECCION', N'P' ) IS NOT NULL 
    DROP PROCEDURE BT_SP_ASIENTOS_PREFE_SECCION;
GO

/*  
5) Idem 4) pero referido a secciones del teatro.
*/
CREATE PROCEDURE BT_SP_ASIENTOS_PREFE_SECCION
@FechaIni datetime,
@FechaFin datetime
AS
BEGIN
 BEGIN TRY
  DECLARE @TableA TABLE(
   Id_Tiquete int, 
   FK_Asiento int,
   FK_Tanda int,
   FK_Localidad int,
   NumeroAsiento int,
   NombreLocalidad varchar(50),
   FechaHora datetime,
   NombreEvento varchar(150),
   NombreTipoEvento varchar(150)
  );

  DECLARE @TablaAux TABLE(
    NumeroCompras int,
    NumeroAsiento int,
    NombreLocalidad varchar(50)
  );

  BEGIN TRANSACTION 
   INSERT @TableA
   (Id_Tiquete,FK_Asiento,FK_Tanda,FK_Localidad,NumeroAsiento,NombreLocalidad,FechaHora,NombreEvento,NombreTipoEvento)
     SELECT X.ID,AT.FK_Asiento,AT.FK_Tanda,A.FK_Localidad,A.Numero,L.Nombre,T.FechaHora,E.Nombre,TE.Nombre
   FROM BoleteriaTeatroDB.dbo.BT_Tiquete X
   INNER JOIN  BoleteriaTeatroDB.dbo.BT_AsientoXTanda AT ON AT.Id = X.FK_AsientoXTanda
   INNER JOIN  BoleteriaTeatroDB.dbo.BT_Tanda T ON T.Id = AT.FK_Tanda
   INNER JOIN BoleteriaTeatroDB.dbo.BT_Evento E ON E.Id = T.FK_Evento
   INNER JOIN  BoleteriaTeatroDB.dbo.BT_TipoEvento TE ON TE.Id = E.FK_TipoEvento
   INNER JOIN  BoleteriaTeatroDB.dbo.BT_Asiento A ON A.Id = AT.FK_Asiento
   INNER JOIN  BoleteriaTeatroDB.dbo.BT_Localidad L ON L.Id = A.FK_Localidad
   WHERE /*TE.Nombre = 'Opera' AND*/ (T.FechaHora BETWEEN @FechaIni AND @FechaFin)

   INSERT @TablaAux
   (NumeroCompras,NumeroAsiento,NombreLocalidad)
   SELECT COUNT(NumeroAsiento) AS NumeroCompras,NumeroAsiento,NombreLocalidad 
   FROM @TableA GROUP BY NumeroAsiento,NombreLocalidad

   SELECT NumeroCompras,NumeroAsiento,NombreLocalidad FROM @TablaAux ORDER BY NumeroCompras DESC

  IF @@TRANCOUNT > 0
   COMMIT TRANSACTION;

  RETURN 1;
 END TRY
 BEGIN CATCH
  EXEC BT_SP_GetErrorInfo;
  IF @@TRANCOUNT > 0
   ROLLBACK TRANSACTION;
  RETURN @@ERROR*-1;
 END CATCH
END
GO

--EXEC BT_SP_ASIENTOS_PREFE_SECCION '2014-11-21 00:00:00.000', '2015-11-20 00:00:00.000'


----------------------------------------------------------------------------------------------------------------------

-- Verifica si el store procedure existe, para eliminarlo
IF OBJECT_ID ( N'BT_SP_ASIENTOS_MENOS_PREFE', N'P' ) IS NOT NULL 
    DROP PROCEDURE BT_SP_ASIENTOS_MENOS_PREFE;
GO

/*  
6) Por tipo de evento, de manera historica, los 10 asientos menos preferidos.
Entrada: Ninguna
Salidas: Para cada tipo de evento, se listan los 10 asientos que nunca fueron reservados, o que tienen la menor cantidad de compras.

*/
CREATE PROCEDURE BT_SP_ASIENTOS_MENOS_PREFE
AS
BEGIN
 BEGIN TRY
  DECLARE @TableA TABLE(
   Id_Tiquete int, 
   FK_Asiento int,
   FK_Tanda int,
   NumeroAsiento int,
   FechaHora datetime,
   NombreEvento varchar(150),
   NombreTipoEvento varchar(150)
  );

  DECLARE @TableAux TABLE(
   TotalComprado int,
   NumeroAsiento int,
   NombreTipoEvento varchar(150)
  );

  BEGIN TRANSACTION 
   INSERT @TableA
   (Id_Tiquete,FK_Asiento,FK_Tanda,NumeroAsiento,FechaHora,NombreEvento,NombreTipoEvento)
     SELECT X.ID,AT.FK_Asiento,AT.FK_Tanda,A.Numero,T.FechaHora,E.Nombre,TE.Nombre
   FROM BoleteriaTeatroDB.dbo.BT_Tiquete X
   INNER JOIN  BoleteriaTeatroDB.dbo.BT_AsientoXTanda AT ON AT.Id = X.FK_AsientoXTanda
   INNER JOIN  BoleteriaTeatroDB.dbo.BT_Tanda T ON T.Id = AT.FK_Tanda
   INNER JOIN BoleteriaTeatroDB.dbo.BT_Evento E ON E.Id = T.FK_Evento
   INNER JOIN  BoleteriaTeatroDB.dbo.BT_TipoEvento TE ON TE.Id = E.FK_TipoEvento
   INNER JOIN  BoleteriaTeatroDB.dbo.BT_Asiento A ON A.Id = AT.FK_Asiento

   INSERT @TableAux
   (TotalComprado,NumeroAsiento,NombreTipoEvento)
   SELECT COUNT(NumeroAsiento) AS TotalComprado,NumeroAsiento,NombreTipoEvento FROM @TableA 
   GROUP BY NumeroAsiento,NombreTipoEvento

   SELECT * FROM @TableAux ta
   /*SELECT TOP 10 TotalComprado,NumeroAsiento,NombreTipoEvento
   FROM @TableAux 
   GROUP BY NombreTipoEvento*/
   --ORDER BY TotalComprado,NombreTipoEvento DESC
   /*
   SELECT TOP 10 TotalComprado,NumeroAsiento FROM @TableAux ORDER BY TotalComprado DESC*/
 
  IF @@TRANCOUNT > 0
   COMMIT TRANSACTION;

  RETURN 1;
 END TRY
 BEGIN CATCH
  EXEC BT_SP_GetErrorInfo;
  IF @@TRANCOUNT > 0
   ROLLBACK TRANSACTION;
  RETURN @@ERROR*-1;
 END CATCH
END
GO

EXEC BT_SP_ASIENTOS_MENOS_PREFE



Horas Trabajadas: 2.5 hora
Autor: Edward Ovares Villegas

Procedure: Problema 3 y Problema 4 Luis



DESCRIPCION:

3) Para un rango de fechas, Los 5 eventos que han atraido la mayor cantidad de asistentes.
Entradas: fecha inicio, fecha fin
Salidas: Los 5 eventos, en orden descendente de cantidad de asistentes.
Para cada evento mostrar: Nombre del evento, fecha inicio, fecha fin, cantidad de asistentes.

4) Los 10 asientos preferidos para eventos tipo Opera, en un rango de fechas.
Entradas: fecha inicio, fecha fin Salidas: Numero de asiento, cantidad de veces comprado. En orden
descesdente de la cantidad de veces.


PROBLEMAS:
Error: Msg 8120
No era posible poner todos los atributos requeridos debido que al aplicar una función count, avg o sum Sql server no lo permitía, por lo que se debió usar tablas variables.

Error: Msg 147
Usar where cuando lo que debía usarse having, esto sucedió en diversas ocasiones

CODIGO:



-----------------------------------------------------------------------------------------------------------------------

-- Verifica si el store procedure existe, para eliminarlo
IF OBJECT_ID ( N'BT_SP_CANTIDAD_ASISTENTES_EVENTO', N'P' ) IS NOT NULL 
    DROP PROCEDURE BT_SP_CANTIDAD_ASISTENTES_EVENTO;
GO

/*  
3) Para un rango de fechas, Los 5 eventos que han atraido la mayor cantidad de asistentes.
Entradas: fecha inicio, fecha fin
Salidas: Los 5 eventos, en orden descendente de canditad de asistentes.
Para cada evento mostrar: Nombre del evento, fecha inicio, fecha fin, cantidad de asistentes.
*/
CREATE PROCEDURE BT_SP_CANTIDAD_ASISTENTES_EVENTO
@FechaInicio datetime,
@FechaFin datetime
AS
BEGIN
 BEGIN TRY
  Declare @temporal Table(NombreEvento varchar(150), IDTiquete int );
  Declare @CantidadXEvento Table (Nombre varchar(150), Id int);

  BEGIN TRANSACTION 
     Insert into @temporal(NombreEvento,IDTiquete)
   (SELECT BT_Evento.Nombre, BT_Tiquete.Id
   from BT_Tiquete
   inner join BT_AsientoXTanda on BT_Tiquete.FK_AsientoXTanda = BT_AsientoXTanda.Id
   inner join BT_Tanda on BT_AsientoXTanda.FK_Tanda = BT_Tanda.Id
   inner join BT_Evento on BT_Tanda.FK_Evento = BT_Evento.Id
   where FechaHora between @FechaInicio and @FechaFin)
   
   insert into @CantidadXEvento(Nombre,Id)
   select NombreEvento,count(distinct IDTiquete) as Cantidad  from @temporal
   group by NombreEvento --order by Cantidad desc
   
   select top 5 Nombre,Id  from @CantidadXEvento order by ID 

  IF @@TRANCOUNT > 0
   COMMIT TRANSACTION;

  RETURN 1;
 END TRY
 BEGIN CATCH
  EXEC BT_SP_GetErrorInfo;
  IF @@TRANCOUNT > 0
   ROLLBACK TRANSACTION;
  RETURN @@ERROR*-1;
 END CATCH
END
GO

--EXEC BT_SP_CANTIDAD_ASISTENTES_EVENTO '2014-11-21 00:00:00.000', '2015-07-13 00:00:00.000'


----------------------------------------------------------------------------------------------------------------------

-- Verifica si el store procedure existe, para eliminarlo
IF OBJECT_ID ( N'BT_SP_ASIENTOS_PREFE_OPERA', N'P' ) IS NOT NULL 
    DROP PROCEDURE BT_SP_ASIENTOS_PREFE_OPERA;
GO

/*  
4) Los 10 asientos preferidos para eventos tipo Opera, en un rango de fechas.
Entradas: fecha inicio, fecha fin 
Salidas: Numero de asiento, cantidad de veces comprado. En orden
descesdente de la cantidad de veces.
*/
CREATE PROCEDURE BT_SP_ASIENTOS_PREFE_OPERA
@FechaIni datetime,
@FechaFin datetime
AS
BEGIN
 BEGIN TRY
  DECLARE @TableA TABLE(
   Id_Tiquete int, 
   FK_Asiento int,
   FK_Tanda int,
   NumeroAsiento int,
   FechaHora datetime,
   NombreEvento varchar(150),
   NombreTipoEvento varchar(150)
  );

  DECLARE @TableAux TABLE(
   TotalComprado int,
   NumeroAsiento int
  );

  BEGIN TRANSACTION 
   INSERT @TableA
   (Id_Tiquete,FK_Asiento,FK_Tanda,NumeroAsiento,FechaHora,NombreEvento,NombreTipoEvento)
     SELECT X.ID,AT.FK_Asiento,AT.FK_Tanda,A.Numero,T.FechaHora,E.Nombre,TE.Nombre
   FROM BoleteriaTeatroDB.dbo.BT_Tiquete X
   INNER JOIN  BoleteriaTeatroDB.dbo.BT_AsientoXTanda AT ON AT.Id = X.FK_AsientoXTanda
   INNER JOIN  BoleteriaTeatroDB.dbo.BT_Tanda T ON T.Id = AT.FK_Tanda
   INNER JOIN BoleteriaTeatroDB.dbo.BT_Evento E ON E.Id = T.FK_Evento
   INNER JOIN  BoleteriaTeatroDB.dbo.BT_TipoEvento TE ON TE.Id = E.FK_TipoEvento
   INNER JOIN  BoleteriaTeatroDB.dbo.BT_Asiento A ON A.Id = AT.FK_Asiento
   WHERE TE.Nombre = 'Opera' AND (T.FechaHora BETWEEN @FechaIni AND @FechaFin)

   INSERT @TableAux
   (TotalComprado,NumeroAsiento)
   SELECT COUNT(NumeroAsiento) AS TotalComprado,NumeroAsiento FROM @TableA 
   GROUP BY NumeroAsiento

   SELECT TOP 10 TotalComprado,NumeroAsiento FROM @TableAux ORDER BY TotalComprado DESC

  IF @@TRANCOUNT > 0
   COMMIT TRANSACTION;

  RETURN 1;
 END TRY
 BEGIN CATCH
  EXEC BT_SP_GetErrorInfo;
  IF @@TRANCOUNT > 0
   ROLLBACK TRANSACTION;
  RETURN @@ERROR*-1;
 END CATCH
END
GO
--EXEC BT_SP_ASIENTOS_PREFE_OPERA '2014-11-21 00:00:00.000', '2015-11-20 00:00:00.000'




Horas Trabajadas: 3 hora
Autor: Luis Diego Flores

Procedure: problema 1 y problema 2 Edward



DESCRIPCION:

1) Los 3 número de semana del año (un valor entre 1 y 52), que en promedio (considerando todos los años de historia) asisten mas personas al teatro nacional.
Entradas: Ninguna.
Salidas: Numero de semana, Cantidad de asistentes promedio. En orden descendente de la cantidad.

2) Idem 1), pero no referido a la cantidad de personas, sino al ingreso total de la taquilla.

PROBLEMAS:

En este metodo se encontraron muchos problemas, en general por errores al insertar asientoXtanda ya que los fk los teniamos intercambiados y lo cual generaba muchos errores.

Otro problema es que estaba insertando los usuarios repetidos en la base de datos.

Entre los errores estaban que se intentaba llamar un querry dentro de otro generando errores.



El codigo de este procedimiento es el siguiente:



-- Verifica si el store procedure existe, para eliminarlo
IF OBJECT_ID ( N'BT_SP_ASISTENCIAS_SEMANAS_ANNO', N'P' ) IS NOT NULL 
    DROP PROCEDURE BT_SP_ASISTENCIAS_SEMANAS_ANNO;
GO

/* Los 3 número de semana del año (un valor entre 1 y 52), que en promedio 
(considerando todos los años de historia) asisten mas personas al teatro nacional.
Entradas: Ninguna.
Salidas: Numero de semana, Cantidad de asistentes promedio. En orden descendente de la cantidad.
*/
CREATE PROCEDURE BT_SP_ASISTENCIAS_SEMANAS_ANNO
AS
BEGIN
 BEGIN TRY
 
  DECLARE @Tabla TABLE (
   id int,
   Fecha datetime,
   NumSemana int
  );

  DECLARE @TablaSem TABLE(
   TotalAsist int,
   NumSemana int
  );

  DECLARE @TablaProm TABLE(
   NumSemana int,
   Promedio float
  );

  BEGIN TRANSACTION 
  
   INSERT @Tabla
   (id,Fecha,NumSemana)
   SELECT X.ID,T.FechaHora,DATEPART(week,T.FechaHora) AS Semana
   FROM BoleteriaTeatroDB.dbo.BT_Tiquete X
   INNER JOIN  BoleteriaTeatroDB.dbo.BT_AsientoXTanda AT ON AT.Id = X.FK_AsientoXTanda
   INNER JOIN  BoleteriaTeatroDB.dbo.BT_Tanda T ON T.Id = AT.FK_Tanda
   ORDER BY T.FechaHora ASC

   INSERT @TablaSem
   (TotalAsist,NumSemana)
   SELECT COUNT(NumSemana) AS TotalAsist,NumSemana FROM @Tabla GROUP BY NumSemana

   INSERT @TablaProm
   (NumSemana,Promedio)
   SELECT NumSemana,AVG(TotalAsist) AS Promedio 
   FROM @TablaSem  T GROUP BY TotalAsist,NumSemana

   SELECT TOP 3 * FROM @TablaProm tp ORDER BY Promedio DESC

  IF @@TRANCOUNT > 0
   COMMIT TRANSACTION;

  RETURN 1;
 END TRY
 BEGIN CATCH
  EXEC BT_SP_GetErrorInfo;
  IF @@TRANCOUNT > 0
   ROLLBACK TRANSACTION;
  RETURN @@ERROR*-1;
 END CATCH
END
GO
--EXEC BT_SP_ASISTENCIAS_SEMANAS_ANNO

-----------------------------------------------------------------------------------------------------------------------

-- Verifica si el store procedure existe, para eliminarlo
IF OBJECT_ID ( N'BT_SP_IGRESOS_SEMANAS_ANNO', N'P' ) IS NOT NULL 
    DROP PROCEDURE BT_SP_IGRESOS_SEMANAS_ANNO;
GO

/*  
Idem 1), pero no referido a la cantidad de personas, sino al ingreso total de la taquilla.
*/
CREATE PROCEDURE BT_SP_IGRESOS_SEMANAS_ANNO
AS
BEGIN
 BEGIN TRY
 
  DECLARE @Tabla TABLE (
   id int,
   Fecha datetime,
   NumSemana int,
   Precio money
  );

  DECLARE @TablaSem TABLE(
   TotalDinero money,
   NumSemana int
  );

  DECLARE @TablaProm TABLE(
   NumSemana int,
   PromedioDinero money
  );

  BEGIN TRANSACTION 
  
   INSERT @Tabla
   (id,Fecha,NumSemana,Precio)
   SELECT X.ID,T.FechaHora,DATEPART(week,T.FechaHora) AS Semana,X.PrecioTotal
   FROM BoleteriaTeatroDB.dbo.BT_Tiquete X
   INNER JOIN  BoleteriaTeatroDB.dbo.BT_AsientoXTanda AT ON AT.Id = X.FK_AsientoXTanda
   INNER JOIN  BoleteriaTeatroDB.dbo.BT_Tanda T ON T.Id = AT.FK_Tanda
   ORDER BY T.FechaHora ASC

   INSERT @TablaSem
   (TotalDinero,NumSemana)
   SELECT SUM(Precio) AS TotalDinero,NumSemana FROM @Tabla GROUP BY NumSemana

   INSERT @TablaProm
   (NumSemana,PromedioDinero)
   SELECT NumSemana,AVG(TotalDinero) AS Promedio 
   FROM @TablaSem  T GROUP BY TotalDinero,NumSemana

   SELECT TOP 3 * FROM @TablaProm tp ORDER BY PromedioDinero DESC

  IF @@TRANCOUNT > 0
   COMMIT TRANSACTION;

  RETURN 1;
 END TRY
 BEGIN CATCH
  EXEC BT_SP_GetErrorInfo;
  IF @@TRANCOUNT > 0
   ROLLBACK TRANSACTION;
  RETURN @@ERROR*-1;
 END CATCH
END
GO
--EXEC BT_SP_IGRESOS_SEMANAS_ANNO


Horas Trabajadas: 3.5 hora
Autor: Edward Ovares Villegas

lunes, 24 de noviembre de 2014

Fin de la migración



Descripcion:

Lo que se trabajó en esta sección de la migración fue la parte del archivo de movimientos, que tuvo que ser adaptada al diagrama, puesto que no contenía información esencial
para la venta de los tiquetes del teatro.
Problemas:
El principal problema radica en que el precio de los tiquetes estaba calculado previamente y no daba lugar a los cálculos que éste requería para efecto de las inserciones, ya que
no tomaba en cuenta el precio de cada localidad del escenario ni el precio que varia dependiendo de cada evento.
También se tuvo problemas con los usuario extraídos por los archivos, ya que no contenían id que los asociaran con los tiquetes respectivos a las funciones




-----------------------------------------------------------------------------------------------------------------------

-- Verifica si el store procedure existe, para eliminarlo
IF OBJECT_ID ( N'BT_SP_AJUSTE', N'P' ) IS NOT NULL 
    DROP PROCEDURE BT_SP_AJUSTE;
GO

CREATE PROCEDURE BT_SP_AJUSTE
AS
BEGIN
 BEGIN TRY
  DECLARE @counter int,@max int; -- Contador del while y max
  DECLARE @ElementA nvarchar(MAX),@ElementB nvarchar(MAX);
  SET @counter = 1;
  SET @max = (SELECT COUNT(*) FROM [XMLBoleteriaTeatroDB].[dbo].[XMLMovimientos] xg)+1;
  --Inicio del ciclo de while
  WHILE @counter < @max
  BEGIN
    SET @ElementA = (SELECT NombreComprador FROM [XMLBoleteriaTeatroDB].[dbo].[XMLMovimientos] WHERE ID = @counter);

    SET @ElementB = (SELECT Id FROM [BoleteriaTeatroDB].dbo.BT_Usuario bu WHERE bu.Nombre = @ElementA);
  
    UPDATE [XMLBoleteriaTeatroDB].[dbo].[XMLMovimientos]
    SET
    NombreComprador = @ElementB
    WHERE Id = @counter

    SET @counter = @counter + 1;
  END
 RETURN 1;
 END TRY
 BEGIN CATCH
  EXEC BT_SP_GetErrorInfo;
  RETURN @@ERROR*-1;
 END CATCH
END
GO

-----------------------------------------------------------------------------------------------------------------------

-- Verifica si el store procedure existe, para eliminarlo
IF OBJECT_ID ( N'BT_SP_INSERTAR_MOVIMIENTO', N'P' ) IS NOT NULL 
    DROP PROCEDURE BT_SP_INSERTAR_MOVIMIENTO;
GO

CREATE PROCEDURE BT_SP_INSERTAR_MOVIMIENTO
AS
BEGIN
 BEGIN TRY
  INSERT INTO [BoleteriaTeatroDB].[dbo].[BT_MedioPago]
  (Nombre)
  VALUES('Tarjeta de Credito')

  BEGIN TRANSACTION 
  
  -- Insert del Medio de Pago
  
  -- Insert AsientoXTanda
  INSERT INTO [BoleteriaTeatroDB].[dbo].[BT_AsientoXTanda]
  (FK_Tanda,FK_Asiento)
  SELECT FKTanda,FKAsiento FROM dbo.XMLMovimientos x
  WHERE X.TipoOperacion = 'insercionMovimientos';

  -- Insert Tiquetes
  INSERT INTO [BoleteriaTeatroDB].[dbo].[BT_Tiquete]
  (FK_AsientoXTanda,FK_MedioPago,FK_Usuario,FechaCompra,PrecioTotal,MontoCancelado)
  SELECT (L.Id),1 ,X.NombreComprador,X.FechaCompra,L.PrecioTotal,L.PrecioTotal
  FROM [XMLBoleteriaTeatroDB].[dbo].[XMLMovimientos] X
  INNER JOIN
  (SELECT AT.Id, AT.FK_Asiento, AT.FK_Tanda,(E.Precio+L.Precio) AS PrecioTotal
  FROM [BoleteriaTeatroDB].[dbo].[BT_AsientoXTanda] AT
  INNER JOIN [BoleteriaTeatroDB].[dbo].[BT_Tanda] T ON T.Id = AT.FK_Tanda
  INNER JOIN [BoleteriaTeatroDB].[dbo].[BT_Evento] E ON E.Id = T.FK_Evento
  INNER JOIN [BoleteriaTeatroDB].[dbo].[BT_Asiento] A ON A.Id = AT.FK_Asiento
  INNER JOIN [BoleteriaTeatroDB].[dbo].[BT_Localidad] L ON  L.Id = A.FK_Localidad)
  L ON L.Id = X.ID
  
  IF @@TRANCOUNT > 0
   COMMIT TRANSACTION;

  SELECT * FROM [BoleteriaTeatroDB].[dbo].[BT_AsientoXTanda]
  SELECT * FROM [BoleteriaTeatroDB].[dbo].[BT_Tiquete]

  RETURN 1;
 END TRY
 BEGIN CATCH
  EXEC BT_SP_GetErrorInfo;
  IF @@TRANCOUNT > 0
   ROLLBACK TRANSACTION;
  RETURN @@ERROR*-1;
 END CATCH
END
GO



Horas Trabajadas: 2.5 hora
Autores:
Edward Ovares Villegas
Luis Diego Flores

Migracion de Usuarios y Eventos



Descripcion:

Se dificultó la migración esencialmente por los pocos nombres proveídos por archivos de prueba, además que la información
era muy limitada al contar únicamente con un atributo nombre, por lo que no se podía registrar un usuario conforme se esperaba
en el diagrama elaborado previamente. Esto en vista que para efectos reales el teatro nacional, éste cuenta con usuarios registrados
para la compra de entradas a los eventos.


-----------------------------------------------------------------------------------------------------------------------

-- Verifica si el store procedure existe, para eliminarlo
IF OBJECT_ID ( N'BT_SP_INSERTAR_EVENTO', N'P' ) IS NOT NULL 
    DROP PROCEDURE BT_SP_INSERTAR_EVENTO;
GO

CREATE PROCEDURE BT_SP_INSERTAR_EVENTO
AS
BEGIN
 BEGIN TRY
  BEGIN TRANSACTION 
   -- Insert datos de Tipo Evento
   INSERT INTO [BoleteriaTeatroDB].[dbo].[BT_TipoEvento]
   (Nombre)
   SELECT Nombre FROM dbo.XMLDatosGenerales DG
   WHERE DG.TipoOperacion = 'insercionTipoShow' AND NOT EXISTS(
   (SELECT 1 FROM [BoleteriaTeatroDB].[dbo].[BT_TipoEvento] TE WHERE TE.Nombre = DG.Nombre))

   -- Insert datos de Evento
   INSERT INTO [BoleteriaTeatroDB].[dbo].[BT_Evento]
   (FK_TipoEvento,Nombre,Precio,Descripcion)
   SELECT FKTipoShow, Nombre, Precio, Descripcion FROM dbo.XMLDatosGenerales DG
   WHERE DG.TipoOperacion = 'insercionShow' AND NOT EXISTS(
   (SELECT 1 FROM [BoleteriaTeatroDB].[dbo].[BT_TipoEvento] TE WHERE TE.Nombre = DG.Nombre))

   -- Insert datos de Tanda
   INSERT INTO [BoleteriaTeatroDB].[dbo].[BT_Tanda]
   (FK_Evento,FechaHora,Duracion)
   SELECT FKTipoShow,Fecha,Hora FROM dbo.XMLDatosGenerales DG
   WHERE DG.TipoOperacion = 'insercionTandas' AND NOT EXISTS(
   (SELECT 1 FROM [BoleteriaTeatroDB].[dbo].[BT_Tanda] T 
   WHERE T.FK_Evento = DG.FKTipoShow AND T.FechaHora = DG.Fecha AND T.Duracion = DG.Hora))
  
  IF @@TRANCOUNT > 0
   COMMIT TRANSACTION;

  SELECT * FROM [BoleteriaTeatroDB].[dbo].[BT_TipoEvento]
  SELECT * FROM [BoleteriaTeatroDB].[dbo].[BT_Evento]
  SELECT * FROM [BoleteriaTeatroDB].[dbo].[BT_Tanda]

  RETURN 1;
 END TRY
 BEGIN CATCH
  EXEC BT_SP_GetErrorInfo;
  IF @@TRANCOUNT > 0
   ROLLBACK TRANSACTION;
  RETURN @@ERROR*-1;
 END CATCH
END
GO

-----------------------------------------------------------------------------------------------------------------------

-- Verifica si el store procedure existe, para eliminarlo
IF OBJECT_ID ( N'BT_SP_INSERTAR_USUARIO', N'P' ) IS NOT NULL 
    DROP PROCEDURE BT_SP_INSERTAR_USUARIO;
GO

CREATE PROCEDURE BT_SP_INSERTAR_USUARIO
AS
BEGIN
 BEGIN TRY
  BEGIN TRANSACTION 
   -- Insert datos de localidad
   INSERT INTO [BoleteriaTeatroDB].[dbo].[BT_Usuario]
   (Nombre,Contrasena)
   SELECT DISTINCT NombreComprador,NombreComprador FROM dbo.XMLMovimientos

  IF @@TRANCOUNT > 0
   COMMIT TRANSACTION;

  SELECT * FROM [BoleteriaTeatroDB].[dbo].[BT_Usuario]

  RETURN 1;
 END TRY
 BEGIN CATCH
  EXEC BT_SP_GetErrorInfo;
  IF @@TRANCOUNT > 0
   ROLLBACK TRANSACTION;
  RETURN @@ERROR*-1;
 END CATCH
END
GO

Horas Trabajadas: 2.5 hora
Autor: Edward Ovares Villegas