jueves, 27 de junio de 2013


Conclusiones del Proyecto

A continuación se presentaran las conclusiones y resultados finales del proyecto "Control_Cine" elaborado en el curso Bases de Datos de la carrera Ingeniería en Computación del Instituto Tecnológico de Costa Rica, a cargo del Profesor Franco Quiros.

La elaboración del proyecto anterior fue muy provechosa a nivel académico, ya que este es el primer curso de Bases de Datos que cursamos algunos de los estudiantes, en este caso estamos incluidos, por lo tanto al inicio del curso no contábamos con casi ningún conocimiento del tema, conocimientos que se fueron adquiriendo con el transcurso del curso, pero con mas intensidad en la elaboración del proyecto ya que teníamos que enfrentarnos a los problemas en un "ambiente real".

A lo largo del proyecto se tuvieron varios inconvenientes por la falta de experiencia y conocimiento, pero fueron solucionados consultando conocimiento experto del profesor, así como de profesionales en el tema. También hubo la necesidad de acudir a fuentes de información en Internet para poder capacitarse en la solución del problema.

Para el desarrollo del proyecto se decidió programar la aplicación web en ASP.NET, por lo que se tuvo que llevar a cabo una capacitación en ASP.NET, la cual resulto un poco complicada al inicio para generar la conexión con la Base de Datos.

El desarrollo de la aplicación de escritorio no causo mayor problema del que se tenia planeado, ya que se contaban con los conocimientos suficientes para su elaboración.

Por ultimo, la generación de la Base de Datos y en especial de los Store Procedures fue la parte que se complico mas, por la falta de conocimientos señalada anteriormente, como también algunos aspectos en los cálculos, que no se tenían claros en la especificación. Uno de los mayores inconvenientes fue el constante cambio de la versión de la Base de Datos no normalizada que había que migrar, ya que esto no deja avanzar correctamente el proyecto y había que estar retrocediendo a generar cambios en el diseño de la Base de Datos y el los script de migración y procedimientos.

Los resultados finales del proyecto fueron positivos, se pudo completar el proyecto al 90%, fue un trabajo muy laborioso por todos los aspectos en los que hubo que capacitarse tanto en el uso de la herramienta de SQL, como en los lenguajes SQL y ASP.NET. La duracion total del proyecto fue de 33 horas

Modificaciones a la consulta nº3


Se modifica la consulta numero 3 debido a que no se había implementado en la base de datos y no se habrían hecho las pruebas respectivas para probar que funcionaran correctamente las consultas asi quedo la modificación de la primera parte:

CREATE PROC FBSP_GetEstaciones2Prioridad
@fecha DATE
AS
BEGIN


SELECT E.Nombre,COUNT(F.Id_Ficha) Tiquetes, S.Nombre,EXS.Prioridad
FROM FB_Estacion E
INNER JOIN FB_EstacionXServicio EXS ON EXS.FK_Estacion=E.Id_Estacion
INNER JOIN FB_TipoServicio S ON S.Id_TipoServicio=EXS.FK_TipoServicio AND EXS.Prioridad=2
INNER JOIN FB_Ficha F ON F.FK_TipoServicio=S.Id_TipoServicio
GROUP BY E.Nombre,S.Nombre,EXS.Prioridad,F.TiempoInicioServicio,S.Nombre
HAVING (DATEPART(WEEK,F.TiempoInicioServicio))=(DATEPART(WEEK,@fecha))
ORDER BY Tiquetes DESC

END


La segunda parte que no se había realizado quedo de la siguiente manera  probado he implementado:

CREATE PROC FBSP_GetCajeros3Prioridad
@fecha DATE
AS
BEGIN

--declare @fecha date= '2013-01-14'
SELECT DISTINCT C.Nombre Cajero,E.Nombre Estacion,COUNT(F.Id_Ficha) Tiquetes,S.Nombre TipoServicio,EXS.Prioridad
,(DATEPART(WEEK,F.TiempoInicioServicio)) Fecha
FROM FB_Cajero C
INNER JOIN FB_CajeroXEstacion CXE ON CXE.FK_Cajero=C.Id_Cajero
INNER JOIN FB_Estacion E ON E.Id_Estacion=CXE.FK_Estacion
INNER JOIN FB_EstacionXServicio EXS ON EXS.FK_Estacion=E.Id_Estacion
INNER JOIN FB_TipoServicio S ON S.Id_TipoServicio=EXS.FK_TipoServicio AND EXS.Prioridad=3
INNER JOIN FB_Ficha F ON F.FK_TipoServicio=S.Id_TipoServicio
GROUP BY C.Nombre,E.Nombre,F.TiempoInicioServicio,S.Nombre,EXS.Prioridad
HAVING (DATEPART(WEEK,F.TiempoInicioServicio))=(DATEPART(WEEK,@fecha))
ORDER BY Tiquetes DESC

END

Duracion 4 horas

Consulta nº2


Para la consulta numero 2 se noto que en esta no se devolvían lo que solicitaba por esto se analizo el problema y se decidió modificar la primera parte y realizar la segunda en base a esta. Asi quedo la primera parte:






CREATE PROC FBSP_getEstacionEsperaLargaPromedio
AS
BEGIN
SELECT DISTINCT E.Nombre Estacion,C.Nombre Cajero,SUM(EXE.Duracion) Duracion
,AVG(F.TiempoEspera) Espera

FROM FB_EventoXEstacion EXE
INNER JOIN FB_CajeroXEstacion CXE ON CXE.FK_Cajero= EXE.FK_CajeroXEstacion
INNER JOIN FB_Cajero C ON C.Id_Cajero=CXE.FK_Cajero
INNER JOIN FB_Estacion E ON E.Id_Estacion=CXE.FK_Estacion
INNER JOIN FB_EstacionXServicio EXS ON EXS.FK_Estacion=E.Id_Estacion
INNER JOIN FB_TipoServicio S ON S.Id_TipoServicio=EXS.FK_TipoServicio AND EXS.Prioridad=3
INNER JOIN FB_Ficha F ON F.FK_TipoServicio=S.Id_TipoServicio
GROUP BY E.Nombre,C.Nombre
ORDER BY Espera DESC
END





Asi quedo la segunda parte :






CREATE PROC FBSP_get3CajeroEsperaLargaPromedio
AS
BEGIN

SELECT DISTINCT C.Nombre Cajero,E.Nombre Estacion,SUM(EXE.Duracion) Duracion
,AVG(F.TiempoEspera) Espera
FROM FB_EventoXEstacion EXE
INNER JOIN FB_CajeroXEstacion CXE ON CXE.FK_Cajero= EXE.FK_CajeroXEstacion
INNER JOIN FB_Cajero C ON C.Id_Cajero=CXE.FK_Cajero
INNER JOIN FB_Estacion E ON E.Id_Estacion=CXE.FK_Estacion
INNER JOIN FB_EstacionXServicio EXS ON EXS.FK_Estacion=E.Id_Estacion
INNER JOIN FB_TipoServicio S ON S.Id_TipoServicio=EXS.FK_TipoServicio AND EXS.Prioridad=3
INNER JOIN FB_Ficha F ON F.FK_TipoServicio=S.Id_TipoServicio
GROUP BY C.Nombre,E.Nombre
ORDER BY Estacion

END






Duracion 3 horas

Consulta Nº3


Consulta 3:
Entradas: Una fecha
Partiendo de lunes anterior mas cercano, para cada dia de la semana,
a) liste las estaciones que recibe más tiquetes o fichas que corresponden al tramite de segunda prioridad.
b) Liste los funcionarios a cargo que recibe más tiquetes o fichas que corresponden al tramite de tercera prioridad, respecto la estacion en donde laboran durante el dia.


La cual queda asi en SQL:

/* 2HORAS
Consutla 3: 
Entradas: Una fecha

Partiendo de lunes anterior mas cercano, para cada dia de la semana, 

a) liste las estaciones que recibe más tiquetes o fichas que corresponden al tramite de segunda prioridad.
*/
ALTER PROC FBSP_GetEstaciones2Prioridad
@fecha DATE
AS
BEGIN


SELECT E.Nombre,COUNT(F.Id_Ficha) Tiquetes, S.Nombre,EXS.Prioridad
FROM FB_Estacion E 
INNER JOIN FB_EstacionXServicio EXS ON EXS.FK_Estacion=E.Id_Estacion
INNER JOIN FB_TipoServicio S ON S.Id_TipoServicio=EXS.FK_TipoServicio AND EXS.Prioridad=2
INNER JOIN FB_Ficha F ON F.FK_TipoServicio=S.Id_TipoServicio
GROUP BY E.Nombre,S.Nombre,EXS.Prioridad,F.TiempoInicioServicio,S.Nombre
HAVING (DATEPART(WEEK,F.TiempoInicioServicio))=(DATEPART(WEEK,@fecha))
ORDER BY Tiquetes DESC

END
/*
b) Liste los funcionarios a cargo que recibe más tiquetes o fichas que corresponden al
 tramite de tercera prioridad, respecto la estacion en donde laboran durante el dia.
*/
ALTER PROC FBSP_GetCajeros3Prioridad
@fecha DATE
AS
BEGIN

--declare @fecha date= '2013-01-14'
SELECT DISTINCT C.Nombre Cajero,E.Nombre Estacion,COUNT(F.Id_Ficha) Tiquetes,S.Nombre TipoServicio,EXS.Prioridad
,(DATEPART(WEEK,F.TiempoInicioServicio)) Fecha
FROM FB_Cajero C 
INNER JOIN FB_CajeroXEstacion CXE ON CXE.FK_Cajero=C.Id_Cajero
INNER JOIN FB_Estacion E ON E.Id_Estacion=CXE.FK_Estacion
INNER JOIN FB_EstacionXServicio EXS ON EXS.FK_Estacion=E.Id_Estacion
INNER JOIN FB_TipoServicio S ON S.Id_TipoServicio=EXS.FK_TipoServicio AND EXS.Prioridad=3
INNER JOIN FB_Ficha F ON F.FK_TipoServicio=S.Id_TipoServicio
GROUP BY C.Nombre,E.Nombre,F.TiempoInicioServicio,S.Nombre,EXS.Prioridad
HAVING (DATEPART(WEEK,F.TiempoInicioServicio))=(DATEPART(WEEK,@fecha))
ORDER BY Tiquetes DESC
END


Duración 4horas

Consulta Nº2

Para la consulta nº 2 se solicito lo siguiente:


Consulta 2:
Entradas: Un rango de fechas.
a) Para cada estacion, listar los nombres 3 funcionarios que estando a cargo de esa estacion de trabajo, producen las esperas mas largas y el tiempo de espera promedio, ordenadas e mayor a menor respecto del tiempo de espera/
b) Los 3 funcionarios que estando a cargo de esa estacion de trabajo, producen las esperas mas largas y el tiempo de espera promedio

La cual quedo asi en sql:


/*SELECT  E.Nombre, C.Nombre
FROM FB_Estacion E 
INNER JOIN FB_EstacionXServicio EXS ON EXS.FK_Estacion=E.Id_Estacion
INNER JOIN FB_TipoServicio S ON S.Id_TipoServicio=EXS.FK_TipoServicio
INNER JOIN FB_Ficha F ON F.FK_TipoServicio=S.Id_TipoServicio
INNER JOIN FB_CajeroXEstacion CXE ON CXE.FK_Estacion = E.Id_Estacion
INNER JOIN FB_Cajero C ON CXE.FK_Cajero = C.Id_Cajero
GROUP BY E.Nombre, C.Nombre
ORDER BY E.Nombre
--HAVING COUNT(C.Nombre)= 3
*/
DECLARE @TEMP TABLE (NombreEstacion varchar(50),NombreEmpleado varchar(50))
DECLARE @Estaciones int
set @Estaciones = (SELECT COUNT(*)
FROM FB_Estacion
)
While(@Estaciones!=0)
BEGIN
--INSERT INTO @TEMP
SELECT TOP 3 E.Nombre,C.Nombre,MAX(F.TiempoEspera),AVG(F.TiempoEspera)
FROM FB_Estacion E 
INNER JOIN FB_EstacionXServicio EXS ON EXS.FK_Estacion=E.Id_Estacion
INNER JOIN FB_TipoServicio S ON S.Id_TipoServicio=EXS.FK_TipoServicio
INNER JOIN FB_Ficha F ON F.FK_TipoServicio=S.Id_TipoServicio
INNER JOIN FB_CajeroXEstacion CXE ON CXE.FK_Estacion = E.Id_Estacion
INNER JOIN FB_Cajero C ON CXE.FK_Cajero = C.Id_Cajero
WHERE E.Id_Estacion = @Estaciones
GROUP BY E.Nombre,C.Nombre
SET @Estaciones = @Estaciones -1 
END
SELECT * FROM @TEMP

Duracion 4 horas




Simulación de la Operación de Bases de Datos

Para la simulación de la base de datos se acordó realizar varios store procedures estas son las especificaciones necesarias:


Datos de operación. Usada para la simulación de la operación de la BD. Tiene las siguientes operaciones:

a) Un cliente solicitud de ficha: Entrada: Fecha y hora de la solicitud, tipo de solicitud. Operación: Se registra acción en la BD, se asigna una ficha (ej:S25).

b) Cajero (empleado) solicita cliente: Entrada: Identificador de estación, Fecha y hora. Operación: El sistema (un procedimiento almacenado que ejecuta la operación) saca de la cola de “fichas” sin atender y asigna el tiquete a la estación, tomando en cuenta reglas según tipo de servicio de la estación y prioridades. La asignación de la “ficha” a la estación tiene una hora de inicio y una hora de fin. Cuando el cajero solicita cliente, asigna hora de fin a la “ficha” previa y hora de inicio a la nueva ficha asignada.

c) Cierre de Estación: Entrada: Fecha y hora, Identificador de Estación. Operación: la estación se cierra, en la base de datos se registra la fecha/hora fin de operación de la estación. Si la estación tenia asignada un cajero, este automáticamente queda “fuera”, de tal manera que se actualiza la fecha-hora-fin, del empleado asignado a la estación.

d) Inicio servicio de empleado en estación. Entrada: Identificador de empleado, Identificador de estación. Operación: Si la estación esta cerrada, esta se abre (fecha-hora-inicio), se asigna al empleado (actualizando adecuadamente la fecha-hora-inicio del empleado en la estación). Si la estación está abierta y asignada a otro empleado, se cierra la asignación empleado – estación (actualizando adecuada la fecha-hora-cierre del empleado en la estación), y se asigna al nuevo empleado.


Se logro escribir el siguiente store procedure:
--CREATE PROCEDURE FBCP_AgregarFicha

Declare @Prefijo varchar(1),@TipodeServicio varchar(20), @Numero int, @codigo varchar(10),
@FKTipoServico INT

SET @Prefijo = (Select TS.Prefijo FROM FB_TipoServicio TS WHERE TS.Nombre = @TipodeServicio)
SET @Numero = (SELECT COUNT(*) FROM FB_Ficha F INNER JOIN FB_TipoServicio TS ON F.FK_TipoServicio = TS.Id_TipoServicio 
AND TS.Prefijo = @Prefijo
WHERE GETDATE()=F.TiempoSolicitud)
SET @codigo = @Prefijo + @Numero
SET @FKTipoServico = (SELECT TS.Id_TipoServicio FROM FB_TipoServicio TS WHERE TS.Prefijo = @Prefijo)
INSERT INTO FB_Ficha(FK_TipoServicio,Codigo,TiempoSolicitud,TiempoInicioServicio,TiempoFinServicio)
VALUES(@FKTipoServico,@codigo,GETDATE(),DEFAULT,DEFAULT)

Duración 3 horas

Migración de la Base de Datos no normalizada


Creación del script de migración de la base de datos no normalizada a la base de datos que se utilizar en el proyecto a continuación se presenta el codigo escrito en MS SQL:

DECLARE @ErrorNumber INT, @ErrorSeverity INT, @ErrorState INT,
@Message VARCHAR(200)
BEGIN

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRAN
BEGIN TRY
INSERT INTO FB_Cajero(Nombre)
SELECT DISTINCT E.EMPLEADO
FROM Fila.dbo.asignacion E

INSERT INTO FB_TipoServicio(Nombre,Prefijo)
VALUES('USUARIO_ESPECIAL','E')

INSERT INTO FB_TipoServicio(Nombre,Prefijo)
VALUES('UN_SOLO_TRAMITE','A')

INSERT INTO FB_TipoServicio(Nombre,Prefijo)
VALUES('MULTIPLES_TRAMITES','M')

INSERT INTO FB_TipoServicio(Nombre,Prefijo)
VALUES('SERVICIO_CLIENTE','S')


INSERT INTO FB_Estacion(Nombre)
SELECT C.ESTACION
FROM Fila.dbo.configuracion C

 --Prioridad Uno Estacion
 INSERT INTO FB_EstacionXServicio(FK_Estacion,FK_TipoServicio,Prioridad)
 SELECT E.Id_Estacion,TP.Id_TipoServicio,1
 FROM Fila.dbo.configuracion C INNER JOIN FB_Estacion E ON C.ESTACION = E.Nombre
 INNER JOIN FB_TipoServicio TP ON TP.Nombre = C.TIPO_TRAMITE_PRIMERA_PRIORIDAD
  --Prioridad Dos Estacion
  
 INSERT INTO FB_EstacionXServicio(FK_Estacion,FK_TipoServicio,Prioridad)
 SELECT E.Id_Estacion,TP.Id_TipoServicio,2
 FROM Fila.dbo.configuracion C INNER JOIN FB_Estacion E ON C.ESTACION = E.Nombre
 INNER JOIN FB_TipoServicio TP ON TP.Nombre = C.TIPO_TRAMITE_SEGUNDA_PRIORIDAD
   --Prioridad Tres Estacion
   
 INSERT INTO FB_EstacionXServicio(FK_Estacion,FK_TipoServicio,Prioridad)   
 SELECT E.Id_Estacion,TP.Id_TipoServicio,3
 FROM Fila.dbo.configuracion C INNER JOIN FB_Estacion E ON C.ESTACION = E.Nombre
 INNER JOIN FB_TipoServicio TP ON TP.Nombre = C.TIPO_TRAMITE_TERCERA_PRIORIDAD
INSERT INTO  FB_CajeroXEstacion(FK_Estacion,FK_Cajero,FechaHoraAbre,FechaHoraCierra)
 SELECT  E.Id_Estacion,C.Id_Cajero ,
 (CONVERT (varchar(10),A.FECHA) +' '+CONVERT(varchar(10), A.HORA_INICIO)),
 (CONVERT (varchar(10),A.FECHA) +' '+CONVERT(varchar(10), A.HORA_FIN))
 FROM Fila.dbo.asignacion A INNER JOIN FB_Cajero C ON C.Nombre = A.EMPLEADO
 INNER JOIN FB_Estacion E ON E.Nombre = A.ESTACION
  
INSERT INTO FB_Ficha(FK_TipoServicio,Codigo,TiempoSolicitud,TiempoInicioServicio,TiempoFinServicio,)
SELECT DISTINCT
TS.Id_TipoServicio,
AF.FICHA,
(CONVERT (varchar(10),AF.FECHA) +' '+CONVERT(varchar(10), AF.HORA_EMISION)),
(CONVERT (varchar(10),AF.FECHA) +' '+CONVERT(varchar(10), AF.HORA_ATENCION)),
(CONVERT (varchar(10),AF.FECHA) +' '+CONVERT(varchar(10), AF.HORA_FIN))
  FROM Fila.dbo.atencion_ficha AF 
  INNER JOIN FB_TipoServicio TS ON AF.FICHA LIKE TS.Prefijo+'%'
  
 INSERT INTO FB_EventoXEstacion(FK_Ficha,FK_Estacion,Codigo,Duracion)
SELECT DISTINCT F.Id_Ficha,
E.Id_Estacion,
AF.FICHA,
DATEDIFF(MINUTE,AF.HORA_ATENCION,AF.HORA_EMISION)
  FROM Fila.dbo.atencion_ficha AF 
  INNER JOIN FB_TipoServicio TS ON AF.FICHA LIKE TS.Prefijo+'%'
  INNER JOIN FB_Ficha F ON AF.FICHA = F.Codigo
  INNER JOIN FB_Estacion E ON AF.ESTACION = E.Nombre
  
 COMMIT
  
END TRY
BEGIN CATCH
SET @ErrorNumber = ERROR_NUMBER()
SET @ErrorSeverity = ERROR_SEVERITY()
SET @ErrorState = ERROR_STATE()
SET @Message = ERROR_MESSAGE()
ROLLBACK
RAISERROR(@Message, @ErrorSeverity, @ErrorState)
END CATCH

END


Duración 4 horas 

Creacion de la base de datos fisica


La base de datos fisica se crea apartir del modelo dado por el profesor en la clase

USE [master]
GO
/****** Object: Database [Fila_Banco] Script Date: 06/27/2013 08:24:59 ******/
CREATE DATABASE [Fila_Banco] ON PRIMARY
( NAME = N'Fila_Banco', FILENAME = N'C:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.WUXIA\MSSQL\DATA\Fila_Banco.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'Fila_Banco_log', FILENAME = N'C:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.WUXIA\MSSQL\DATA\Fila_Banco_log.ldf' , SIZE = 2304KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [Fila_Banco] SET COMPATIBILITY_LEVEL = 100
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [Fila_Banco].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [Fila_Banco] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [Fila_Banco] SET ANSI_NULLS OFF
GO
ALTER DATABASE [Fila_Banco] SET ANSI_PADDING OFF
GO
ALTER DATABASE [Fila_Banco] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [Fila_Banco] SET ARITHABORT OFF
GO
ALTER DATABASE [Fila_Banco] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [Fila_Banco] SET AUTO_CREATE_STATISTICS ON
GO
ALTER DATABASE [Fila_Banco] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [Fila_Banco] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [Fila_Banco] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [Fila_Banco] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [Fila_Banco] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [Fila_Banco] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [Fila_Banco] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [Fila_Banco] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [Fila_Banco] SET DISABLE_BROKER
GO
ALTER DATABASE [Fila_Banco] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [Fila_Banco] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [Fila_Banco] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [Fila_Banco] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [Fila_Banco] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [Fila_Banco] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [Fila_Banco] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [Fila_Banco] SET READ_WRITE
GO
ALTER DATABASE [Fila_Banco] SET RECOVERY SIMPLE
GO
ALTER DATABASE [Fila_Banco] SET MULTI_USER
GO
ALTER DATABASE [Fila_Banco] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [Fila_Banco] SET DB_CHAINING OFF
GO
USE [Fila_Banco]
GO
/****** Object: Table [dbo].[FB_TipoServicio] Script Date: 06/27/2013 08:25:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[FB_TipoServicio](
[Id_TipoServicio] [int] IDENTITY(1,1) NOT NULL,
[Nombre] [varchar](50) NOT NULL,
[Prefijo] [varchar](5) NOT NULL,
CONSTRAINT [PK_FB_TipoServicio] PRIMARY KEY CLUSTERED
(
[Id_TipoServicio] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[FB_Estacion] Script Date: 06/27/2013 08:25:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[FB_Estacion](
[Id_Estacion] [int] IDENTITY(1,1) NOT NULL,
[Nombre] [varchar](30) NOT NULL,
CONSTRAINT [PK_FB_Estacion] PRIMARY KEY CLUSTERED
(
[Id_Estacion] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[TipoEvento] Script Date: 06/27/2013 08:25:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TipoEvento](
[Id_TipoEvento] [int] NOT NULL,
[Nombre] [nchar](10) NOT NULL,
CONSTRAINT [PK_TipoEvento] PRIMARY KEY CLUSTERED
(
[Id_TipoEvento] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[FB_Cajero] Script Date: 06/27/2013 08:25:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[FB_Cajero](
[Id_Cajero] [int] IDENTITY(1,1) NOT NULL,
[Nombre] [varchar](256) NOT NULL,
CONSTRAINT [PK_FB_Cajero] PRIMARY KEY CLUSTERED
(
[Id_Cajero] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[FB_EstacionXServicio] Script Date: 06/27/2013 08:25:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[FB_EstacionXServicio](
[Id_EstacionXServicio] [int] IDENTITY(1,1) NOT NULL,
[FK_Estacion] [int] NOT NULL,
[FK_TipoServicio] [int] NOT NULL,
[Prioridad] [int] NOT NULL,
CONSTRAINT [PK_FB_EstacionXServicio] PRIMARY KEY CLUSTERED
(
[Id_EstacionXServicio] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: StoredProcedure [dbo].[FBSP_getCajeros] Script Date: 06/27/2013 08:25:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[FBSP_getCajeros]
AS
BEGIN

SELECT E.Id_Cajero, E.Nombre
FROM FB_Cajero E

END
GO
/****** Object: StoredProcedure [dbo].[FBSP_getEstaciones] Script Date: 06/27/2013 08:25:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[FBSP_getEstaciones]
AS
BEGIN

SELECT E.Id_Estacion, E.Nombre
FROM FB_Estacion E

END
GO
/****** Object: Table [dbo].[FB_CajeroXEstacion] Script Date: 06/27/2013 08:25:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[FB_CajeroXEstacion](
[Id_CajeroXEstacion] [int] IDENTITY(1,1) NOT NULL,
[FK_Estacion] [int] NOT NULL,
[FK_Cajero] [int] NOT NULL,
[FechaHoraAbre] [datetime] NOT NULL,
[FechaHoraCierra] [datetime] NULL,
CONSTRAINT [PK_FB_CajeroXEstacion] PRIMARY KEY CLUSTERED
(
[Id_CajeroXEstacion] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[FB_Ficha] Script Date: 06/27/2013 08:25:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[FB_Ficha](
[Id_Ficha] [int] IDENTITY(1,1) NOT NULL,
[FK_TipoServicio] [int] NOT NULL,
[Codigo] [varchar](15) NOT NULL,
[TiempoSolicitud] [datetime] NOT NULL,
[TiempoInicioServicio] [datetime] NOT NULL,
[TiempoFinServicio] [datetime] NOT NULL,
[TiempoEspera] [int] NOT NULL,
CONSTRAINT [PK_FB_Ficha] PRIMARY KEY CLUSTERED
(
[Id_Ficha] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[FB_EventoXEstacion] Script Date: 06/27/2013 08:25:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[FB_EventoXEstacion](
[Id_EventoXEstacion] [int] IDENTITY(1,1) NOT NULL,
[FK_Ficha] [int] NOT NULL,
[FK_CajeroXEstacion] [int] NOT NULL,
[Codigo] [varchar](20) NOT NULL,
[Duracion] [int] NOT NULL,
CONSTRAINT [PK_FB_EventoXEstacion] PRIMARY KEY CLUSTERED
(
[Id_EventoXEstacion] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: StoredProcedure [dbo].[FBSP_getEstaciones2Prioridad] Script Date: 06/27/2013 08:25:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROC [dbo].[FBSP_getEstaciones2Prioridad]
@fecha DATE
AS
BEGIN


SELECT E.Nombre,COUNT(F.Id_Ficha) Tiquetes, S.Nombre,EXS.Prioridad
FROM FB_Estacion E
INNER JOIN FB_EstacionXServicio EXS ON EXS.FK_Estacion=E.Id_Estacion
INNER JOIN FB_TipoServicio S ON S.Id_TipoServicio=EXS.FK_TipoServicio AND EXS.Prioridad=2
INNER JOIN FB_Ficha F ON F.FK_TipoServicio=S.Id_TipoServicio
GROUP BY E.Nombre,S.Nombre,EXS.Prioridad,F.TiempoInicioServicio,S.Nombre
HAVING (DATEPART(WEEK,F.TiempoInicioServicio))=(DATEPART(WEEK,@fecha))
ORDER BY Tiquetes DESC

END
GO
/****** Object: StoredProcedure [dbo].[FBSP_getCajeros3Prioridad] Script Date: 06/27/2013 08:25:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROC [dbo].[FBSP_getCajeros3Prioridad]
@fecha DATE
AS
BEGIN

--declare @fecha date= '2013-01-14'
SELECT DISTINCT C.Nombre Cajero,E.Nombre Estacion,COUNT(F.Id_Ficha) Tiquetes,S.Nombre TipoServicio,EXS.Prioridad
,(DATEPART(WEEK,F.TiempoInicioServicio)) Fecha
FROM FB_Cajero C
INNER JOIN FB_CajeroXEstacion CXE ON CXE.FK_Cajero=C.Id_Cajero
INNER JOIN FB_Estacion E ON E.Id_Estacion=CXE.FK_Estacion
INNER JOIN FB_EstacionXServicio EXS ON EXS.FK_Estacion=E.Id_Estacion
INNER JOIN FB_TipoServicio S ON S.Id_TipoServicio=EXS.FK_TipoServicio AND EXS.Prioridad=3
INNER JOIN FB_Ficha F ON F.FK_TipoServicio=S.Id_TipoServicio
GROUP BY C.Nombre,E.Nombre,F.TiempoInicioServicio,S.Nombre,EXS.Prioridad
HAVING (DATEPART(WEEK,F.TiempoInicioServicio))=(DATEPART(WEEK,@fecha))
ORDER BY Tiquetes DESC

END
GO
/****** Object: StoredProcedure [dbo].[FBSP_cierraEstacion] Script Date: 06/27/2013 08:25:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[FBSP_cierraEstacion]
@id int
AS
BEGIN
UPDATE FB_CajeroXEstacion
SET FechaHoraCierra= GETDATE()
WHERE Id_CajeroXEstacion=@id
END
GO
/****** Object: StoredProcedure [dbo].[FBSP_abreEstacion] Script Date: 06/27/2013 08:25:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[FBSP_abreEstacion]
@idEstacion int, @idCajero int
AS
DECLARE @Prefijo varchar(1),@FKTipoServico INT, @Numero int, @codigo varchar(10)
BEGIN
INSERT INTO FB_CajeroXEstacion(FK_Cajero,FK_Estacion,FechaHoraAbre)
VALUES(@idCajero,@idEstacion,GETDATE())
SELECT TOP 1 F.Id_CajeroXEstacion
FROM FB_CajeroXEstacion F
ORDER BY F.Id_CajeroXEstacion DESC
END
GO
/****** Object: StoredProcedure [dbo].[FBSP_getNextFicha] Script Date: 06/27/2013 08:25:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROC [dbo].[FBSP_getNextFicha]
@idCXE INT
AS
BEGIN

SELECT DISTINCT TOP 1 F.Id_Ficha,F.Codigo,EXS.Prioridad
FROM FB_Ficha F
INNER JOIN FB_EstacionXServicio EXS ON EXS.FK_TipoServicio=F.FK_TipoServicio
INNER JOIN FB_CajeroXEstacion CXE ON CXE.FK_Estacion=EXS.FK_Estacion AND
CXE.Id_CajeroXEstacion=@idCXE
INNER JOIN FB_Estacion E ON E.Id_Estacion=CXE.FK_Estacion
INNER JOIN FB_TipoServicio TS ON F.FK_TipoServicio=TS.Id_TipoServicio
WHERE F.TiempoInicioServicio='00:00:00'
ORDER BY EXS.Prioridad,F.Id_Ficha ASC

END
GO
/****** Object: StoredProcedure [dbo].[FBSP_getFicha] Script Date: 06/27/2013 08:25:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[FBSP_getFicha]
@TipodeServicio varchar(20)
AS
DECLARE @Prefijo varchar(2),@FKTipoServico INT, @Numero int, @codigo varchar(10)
BEGIN

SET @Prefijo = (Select TS.Prefijo FROM FB_TipoServicio TS WHERE TS.Nombre = @TipodeServicio)
SET @Numero = (SELECT COUNT(*) FROM FB_Ficha F INNER JOIN FB_TipoServicio TS ON F.FK_TipoServicio = TS.Id_TipoServicio
AND TS.Prefijo = @Prefijo
WHERE DATEPART(DAYOFYEAR,GETDATE())=DATEPART(DAYOFYEAR,F.TiempoSolicitud))
SET @codigo = @Prefijo + CONVERT(VARCHAR(20),@Numero+1)
SET @FKTipoServico = (SELECT TS.Id_TipoServicio FROM FB_TipoServicio TS WHERE TS.Prefijo = @Prefijo)
INSERT INTO FB_Ficha(FK_TipoServicio,Codigo,TiempoSolicitud,TiempoInicioServicio,TiempoFinServicio)
VALUES(@FKTipoServico,@codigo,GETDATE(),DEFAULT,DEFAULT)
SELECT TOP 1 F.Id_Ficha,F.Codigo
FROM FB_Ficha F
ORDER BY F.Id_Ficha DESC
END
GO
/****** Object: StoredProcedure [dbo].[FBSP_getEstacionEsperaLargaPromedio] Script Date: 06/27/2013 08:25:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROC [dbo].[FBSP_getEstacionEsperaLargaPromedio]
AS
BEGIN
SELECT DISTINCT E.Nombre Estacion,C.Nombre Cajero,SUM(EXE.Duracion) Duracion
,AVG(F.TiempoEspera) Espera
FROM FB_EventoXEstacion EXE
INNER JOIN FB_CajeroXEstacion CXE ON CXE.FK_Cajero= EXE.FK_CajeroXEstacion
INNER JOIN FB_Cajero C ON C.Id_Cajero=CXE.FK_Cajero
INNER JOIN FB_Estacion E ON E.Id_Estacion=CXE.FK_Estacion
INNER JOIN FB_EstacionXServicio EXS ON EXS.FK_Estacion=E.Id_Estacion
INNER JOIN FB_TipoServicio S ON S.Id_TipoServicio=EXS.FK_TipoServicio AND EXS.Prioridad=3
INNER JOIN FB_Ficha F ON F.FK_TipoServicio=S.Id_TipoServicio
GROUP BY E.Nombre,C.Nombre
ORDER BY Espera DESC
END
GO
/****** Object: StoredProcedure [dbo].[FBSP_get3CajeroEsperaLargaPromedio] Script Date: 06/27/2013 08:25:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROC [dbo].[FBSP_get3CajeroEsperaLargaPromedio]
AS
BEGIN
SELECT DISTINCT C.Nombre Cajero,E.Nombre Estacion,SUM(EXE.Duracion) Duracion
,AVG(F.TiempoEspera) Espera
FROM FB_EventoXEstacion EXE
INNER JOIN FB_CajeroXEstacion CXE ON CXE.FK_Cajero= EXE.FK_CajeroXEstacion
INNER JOIN FB_Cajero C ON C.Id_Cajero=CXE.FK_Cajero
INNER JOIN FB_Estacion E ON E.Id_Estacion=CXE.FK_Estacion
INNER JOIN FB_EstacionXServicio EXS ON EXS.FK_Estacion=E.Id_Estacion
INNER JOIN FB_TipoServicio S ON S.Id_TipoServicio=EXS.FK_TipoServicio AND EXS.Prioridad=3
INNER JOIN FB_Ficha F ON F.FK_TipoServicio=S.Id_TipoServicio
GROUP BY C.Nombre,E.Nombre
ORDER BY Estacion
END
GO
/****** Object: Default [DF_FB_Ficha_TiempoInicioSer] Script Date: 06/27/2013 08:25:02 ******/
ALTER TABLE [dbo].[FB_Ficha] ADD CONSTRAINT [DF_FB_Ficha_TiempoInicioSer] DEFAULT ('00:00') FOR [TiempoInicioServicio]
GO
/****** Object: Default [DF_FB_Ficha_TiempoFinSer] Script Date: 06/27/2013 08:25:02 ******/
ALTER TABLE [dbo].[FB_Ficha] ADD CONSTRAINT [DF_FB_Ficha_TiempoFinSer] DEFAULT ('00:00') FOR [TiempoFinServicio]
GO
/****** Object: Default [DF_FB_Ficha_TiempoEspera] Script Date: 06/27/2013 08:25:02 ******/
ALTER TABLE [dbo].[FB_Ficha] ADD CONSTRAINT [DF_FB_Ficha_TiempoEspera] DEFAULT ((0)) FOR [TiempoEspera]
GO
/****** Object: Default [DF_FB_EventoXEstacion_Duracion] Script Date: 06/27/2013 08:25:02 ******/
ALTER TABLE [dbo].[FB_EventoXEstacion] ADD CONSTRAINT [DF_FB_EventoXEstacion_Duracion] DEFAULT ('00:00') FOR [Duracion]
GO
/****** Object: ForeignKey [FK_FB_EstacionXServicio_FB_Estacion] Script Date: 06/27/2013 08:25:01 ******/
ALTER TABLE [dbo].[FB_EstacionXServicio] WITH CHECK ADD CONSTRAINT [FK_FB_EstacionXServicio_FB_Estacion] FOREIGN KEY([FK_Estacion])
REFERENCES [dbo].[FB_Estacion] ([Id_Estacion])
GO
ALTER TABLE [dbo].[FB_EstacionXServicio] CHECK CONSTRAINT [FK_FB_EstacionXServicio_FB_Estacion]
GO
/****** Object: ForeignKey [FK_FB_EstacionXServicio_FB_TipoServicio] Script Date: 06/27/2013 08:25:01 ******/
ALTER TABLE [dbo].[FB_EstacionXServicio] WITH CHECK ADD CONSTRAINT [FK_FB_EstacionXServicio_FB_TipoServicio] FOREIGN KEY([FK_TipoServicio])
REFERENCES [dbo].[FB_TipoServicio] ([Id_TipoServicio])
GO
ALTER TABLE [dbo].[FB_EstacionXServicio] CHECK CONSTRAINT [FK_FB_EstacionXServicio_FB_TipoServicio]
GO
/****** Object: ForeignKey [FK_FB_CajeroXEstacion_FB_Cajero] Script Date: 06/27/2013 08:25:02 ******/
ALTER TABLE [dbo].[FB_CajeroXEstacion] WITH CHECK ADD CONSTRAINT [FK_FB_CajeroXEstacion_FB_Cajero] FOREIGN KEY([FK_Cajero])
REFERENCES [dbo].[FB_Cajero] ([Id_Cajero])
GO
ALTER TABLE [dbo].[FB_CajeroXEstacion] CHECK CONSTRAINT [FK_FB_CajeroXEstacion_FB_Cajero]
GO
/****** Object: ForeignKey [FK_FB_CajeroXEstacion_FB_Estacion] Script Date: 06/27/2013 08:25:02 ******/
ALTER TABLE [dbo].[FB_CajeroXEstacion] WITH CHECK ADD CONSTRAINT [FK_FB_CajeroXEstacion_FB_Estacion] FOREIGN KEY([FK_Estacion])
REFERENCES [dbo].[FB_Estacion] ([Id_Estacion])
GO
ALTER TABLE [dbo].[FB_CajeroXEstacion] CHECK CONSTRAINT [FK_FB_CajeroXEstacion_FB_Estacion]
GO
/****** Object: ForeignKey [FK_FB_Ficha_FB_TipoServicio] Script Date: 06/27/2013 08:25:02 ******/
ALTER TABLE [dbo].[FB_Ficha] WITH CHECK ADD CONSTRAINT [FK_FB_Ficha_FB_TipoServicio] FOREIGN KEY([FK_TipoServicio])
REFERENCES [dbo].[FB_TipoServicio] ([Id_TipoServicio])
GO
ALTER TABLE [dbo].[FB_Ficha] CHECK CONSTRAINT [FK_FB_Ficha_FB_TipoServicio]
GO
/****** Object: ForeignKey [FK_FB_EventoXEstacion_FB_CajeroXEstacion] Script Date: 06/27/2013 08:25:02 ******/
ALTER TABLE [dbo].[FB_EventoXEstacion] WITH CHECK ADD CONSTRAINT [FK_FB_EventoXEstacion_FB_CajeroXEstacion] FOREIGN KEY([FK_CajeroXEstacion])
REFERENCES [dbo].[FB_CajeroXEstacion] ([Id_CajeroXEstacion])
GO
ALTER TABLE [dbo].[FB_EventoXEstacion] CHECK CONSTRAINT [FK_FB_EventoXEstacion_FB_CajeroXEstacion]
GO
/****** Object: ForeignKey [FK_FB_EventoXEstacion_FB_Ficha] Script Date: 06/27/2013 08:25:02 ******/
ALTER TABLE [dbo].[FB_EventoXEstacion] WITH CHECK ADD CONSTRAINT [FK_FB_EventoXEstacion_FB_Ficha] FOREIGN KEY([FK_Ficha])
REFERENCES [dbo].[FB_Ficha] ([Id_Ficha])
GO
ALTER TABLE [dbo].[FB_EventoXEstacion] CHECK CONSTRAINT [FK_FB_EventoXEstacion_FB_Ficha]
GO

Duración 2 horas

miércoles, 26 de junio de 2013

Consulta para la simulación de la operación de la base de datos

 Otra de las consultas necesarias para obtener la ficha siguiente en la fila dependiendo del cajero que esta libre y sus prioridades definidas anterioridad, se concluye que debe existir la siguiente consulta:

IF @idLastFicha IS NOT NULL
BEGIN
UPDATE FB_Ficha
SET TiempoFinServicio = GETDATE(),
TiempoSolicitud = DATEDIFF(MINUTE,TiempoFinServicio,TiempoInicioServicio)
WHERE Id_Ficha=@idLastFicha
END
CREATE TABLE #FichaTemporal( id INT,cod VARCHAR(10),Prioridad INT)

INSERT INTO #FichaTemporal( id ,cod ,Prioridad )
SELECT DISTINCT TOP 1 F.Id_Ficha,F.Codigo,EXS.Prioridad
FROM FB_Ficha F
INNER JOIN FB_EstacionXServicio EXS ON EXS.FK_TipoServicio=F.FK_TipoServicio
INNER JOIN FB_CajeroXEstacion CXE ON CXE.FK_Estacion=EXS.FK_Estacion AND
CXE.Id_CajeroXEstacion=@idCXE
INNER JOIN FB_Estacion E ON E.Id_Estacion=CXE.FK_Estacion
INNER JOIN FB_TipoServicio TS ON F.FK_TipoServicio=TS.Id_TipoServicio
WHERE F.TiempoInicioServicio='00:00:00'
ORDER BY EXS.Prioridad,F.Id_Ficha ASC

SET @id=#FichaTemporal.id
UPDATE FB_Ficha
SET TiempoInicioServicio = GETDATE()
WHERE Id_Ficha=@id

DROP TABLE #FichaTemporal

END

Duracion 3 horas

sábado, 22 de junio de 2013

Repartiendo quehaceres

Nos hemos reunido este día para repartir lo que cada uno deberá hacer como parte del proyecto a realizar, antes se analizan las 3 consultas descritas en la especificación del proyecto:

Consulta 1:
+ Entradas:  Una fecha.
Salidas: partiendo de lunes anterior mas cercano a la fecha, construya una "matriz", con los 6 dias de la semana de Lunes a sabado (suponga que cada dias es una columna), y las filas son las cajas. Cada columna muestra tres subcolumnas (minimo, maximo, promedio). Las filas representan estaciones, entonces parfa cada estacion X dias, debe indicar la tiempo minimo de atencion a una ficha, el tiempo maximo, y el tiempo promedio.

Consulta 2:
Entradas: Un rango de fechas.
a) Para cada  estacion, listar los nombres 3 funcionarios que estando a cargo de esa estacion de trabajo, producen las esperas mas largas y el tiempo de espera promedio, ordenadas e mayor a menor respecto del tiempo de espera/
b) Los 3 funcionarios que estando a cargo de esa estacion de trabajo, producen las esperas mas largas y el tiempo de espera promedio

Consulta 3:
Entradas: Una fecha
Partiendo de lunes anterior mas cercano, para cada dia de la semana,
a) liste las estaciones que recibe más tiquetes o fichas que corresponden al tramite de segunda prioridad.
b) Liste los funcionarios a cargo que recibe más tiquetes o fichas que corresponden al tramite de tercera prioridad, respecto la estacion en donde laboran durante el dia.

Ademas de la migración y la simulación del funcionamiento de la Base de Datos.
Se repartieron esta de la siguiente forma:
  • Fabián realizará la primera  y la segunda  consulta , la migracion, ademas de la creación de la base de datos física.
  • Keylin realizara las 3 consulta y la simulacion del funcionamiento de la base de datos, ademas cooperara con la migración de la base de datos no normalizada que sera brindada posteriormente por el profesor.
4 horas.

jueves, 20 de junio de 2013

Herramientas a Utilizar

En este proyecto al igual que en el anterior se decide usar la herramienta de bases de datos MS SQL Server  2008 para la creación de la base de datos.


Para la creación de la simulación del funcionamiento de la Base de Datos se utilizara la herramienta igualmente utilizada en el proyecto anterior Visual Studio  2010.

1 hora.

Comprendiendo el Problema



Tercer Proyecto

Objetivos: Implementar el diseño de una base de datos, construir un script de migración, y escribir procedimientos almacenados para procesar y consultar información; y simular la operación de la base de datos.

Descripción.

Diseño de la base de datos: Debe modelar e implementar una base de datos para resolver el problema de Administrar las filas en un banco.

Los clientes al ingresar solicitan un tiquete con un número, los dispensa una máquina, dependiendo del trámite que van a realizar, ya sea de servicio al cliente o servicios de cajas, si es de cajero indican si es para realizar menos de 3 transacciones, o más, y si es ciudadano de oro. Se pueden configurar otros servicios, especiales, por ejemplo: pago de marchamo, pago de impuestos. Para efectos de ejemplo: el sistema administra 4 colas (servicio al cliente, servicios de cajas con 3 transacciones o menos, servicio de cajas con 4 transacciones o más, servicio especial - ej:pago de marchamo, y ciudadanos de oro). Las estaciones de servicio (ya sea cajeros o servicio al cliente) tienen prioridades según el tipo de fila, por ejemplo: la estación 1, 2 y 3, tienen como prioridad atender la fila de servicio al cliente, pero si la cola está vacía, pueden atender la cola de servicios de cajero de menos de 3 transacciones, las estación 5 atiende pagos de marchamo pero si la cola está vacía puede atender la cola se servicios de cajero con 3 transacciones o menos. Hay una estación que tiene prioridad la de servicios a ciudadanos de oro. El sistema permite configurar las colas según los servicios que ofrece el banco, y para cada estación, configurar las prioridades para la atención cada cola.

El tiquete son una letra que identifica el servicio y el consecutivo, ejemplo: S25.

Una vez que un funcionario del banco termina de atender a un cliente, solicita al sistema un nuevo cliente, el sistema visualiza en la pantalla el número de tiquete y la estación a donde el cliente debe acudir. Para cada tipo transacción que realiza el cliente existe un código de transacción (ej: hacer retiro, cambiar un cheque, etc.), el sistema lleva un control de la duración de cada tramite, la duración total de la atención de un cliente en una estación de servicio, el tiempo de espera de un cliente, etc. y con base en esta información se realizan consultas y reportes, que permiten medir la efectividad de los cajeros, la necesidad de abrir nuevas estaciones en ciertas horas, etc.

Carga de datos de prueba.

Se proveerán dos bases de datos ( o conjunto de tablas). Una de datos base o otra de datos de operación.

Datos Base. Contiene información sobre las estaciones y el tipo de estación (Servicio al cliente, 3T, 4T+, especial). Nombres de los empleados cajeros.

Datos de operación. Usada para la simulación de la operación de la BD. Tiene las siguientes operaciones:

a) Un cliente solicitud de ficha: Entrada: Fecha y hora de la solicitud, tipo de solicitud. Operación: Se registra acción en la BD, se asigna una ficha (ej:S25).

b) Cajero (empleado) solicita cliente: Entrada: Identificador de estación, Fecha y hora. Operación: El sistema (un procedimiento almacenado que ejecuta la operación) saca de la cola de “fichas” sin atender y asigna el tiquete a la estación, tomando en cuenta reglas según tipo de servicio de la estación y prioridades. La asignación de la “ficha” a la estación tiene una hora de inicio y una hora de fin. Cuando el cajero solicita cliente, asigna hora de fin a la “ficha” previa y hora de inicio a la nueva ficha asignada.

c) Cierre de Estación: Entrada: Fecha y hora, Identificador de Estación. Operación: la estación se cierra, en la base de datos se registra la fecha/hora fin de operación de la estación. Si la estación tenia asignada un cajero, este automáticamente queda “fuera”, de tal manera que se actualiza la fecha-hora-fin, del empleado asignado a la estación.

d) Inicio servicio de empleado en estación. Entrada: Identificador de empleado, Identificador de estación. Operación: Si la estación esta cerrada, esta se abre (fecha-hora-inicio), se asigna al empleado (actualizando adecuadamente la fecha-hora-inicio del empleado en la estación). Si la estación está abierta y asignada a otro empleado, se cierra la asignación empleado – estación (actualizando adecuada la fecha-hora-cierre del empleado en la estación), y se asigna al nuevo empleado.

Se pide:

La BD física, el modelo conceptual, la bitácora, el script de carga de datos base, y ejecución de la simulación de operación sobre la base de datos, y la implemencion de 3 consultas, que se especificaran 5 días antes de la entrega del proyecto.


Se inicia el proyecto analizando la base de datos que el profesor elaboro en la clase para ver si servirá o abra que hacer algún tipo de cambio para facilitar la consulta lo cual implicaría hacer la inserción difícil se analizan ambas posibilidades para saber que camino tomar. 2 horas