Manual del Programador Simulation Bank Queue Manual del Programador Simulation Bank Queue Herramienta de Simulación para Analizar el comportamiento de línea de espera o Cola en una Institución Bancaria Manual del Programador INDICE Simulation Bank Queue II NN DD II CC EE TTeemmaa PPáágg.. INTRODUCCION ................................................................................ 1 DEFINICIÓN DE LA BASE DE DATOS............................................ 2 FORMULARIOS ................................................................................... 7 PROCEDIMIENTOS.......................................................................... 10 FUNCIONES ....................................................................................... 12 CONSTANTES GLOBALES.............................................................. 13 VARIABLES GLOBALES................................................................... 14 CODIGO FUENTE.............................................................................. 15 Índice Manual del Programador BASE DE DATOS Simulation Bank Queue 1 IINNTTRROODDUUCCCCIIOONN SSiimmuullaa tt iioonn BBaannkk QQuueeuuee,, conocido también como SS iimmuuBBQQ Ver.2.003 diseñado como trabajo de tesis bajo una plataforma de Windows 98, utilizando Microsoft Visual Basic 6, por su ambiente grafico, Microsoft Access 2000, para implementar la base de datos y Segate Crystal Reports como generador de los distintos reportes. El manual del programador se encuentra descrito de la siguiente forma: ü Definición de la base de Datos. ü Formularios. ü Procedimiento. ü Funciones. ü Constantes Globales. ü Variables Globales. A continuación se presenta una breve descripción de cada uno de los items antes mencionados: Introducción. Manual del Programador BASE DE DATOS Simulation Bank Queue 2 DDEEFFIINNIICCIIÓÓNN DDEE LLAA BBAASSEE DDEE DDAATTOOSS Tipo de base de datos: Aplicación de Microsoft Access Nombre de archivo: VeVsSimuColas.mdb Descripción de tablas: Bancos Columnas Nombre Tipo Tamaño Bco_Codigo Entero largo 4 Bco_Nombre Texto 255 Índices de tabla Nombre Numero de campo Campos Pk_Bancos 1 Ascendente Cajeros Columnas Nombre Tipo Tamaño Bco_Codigo Entero largo 4 Suc_Codigo Entero largo 4 Dia Entero largo 4 NumCajero Entero 2 Índices de tabla Nombre Numero de campo Campos Idx_Bco_Codigo 1 Ascendente Idx_Dia 1 Ascendente Idx_NumCajero 1 Ascendente Idx_Suc_Codigo 1 Ascendente PrimaryKey 4 Ascendente Ascendente Ascendente Ascendente Cajeros Posición Columnas Nombre Tipo Tamaño Bco_Codigo Entero largo 4 Suc_Codigo Entero largo 4 Dia Entero 2 NumCajero Entero 2 Indice Entero 2 Índices de tabla Nombre Numero de campo Campos Idx_Bco_Codigo 1 Ascendente Idx_Dia 1 Ascendente Idx_NumCajero 1 Ascendente Idx_Suc_Codigo 1 Ascendente Suc_Codigo 1 Ascendente SucursalesCajerosPosicion 2 Ascendente Ascendente Base de Datos Manual del Programador BASE DE DATOS Simulation Bank Queue 3 CajerosTiempoE Columnas Nombre Tipo Tamaño Bco_Codigo Entero largo 4 Suc_Codigo Entero largo 4 NumCliente Entero largo 4 Dia Entero largo 4 NumCajero Entero 2 Hora Texto 2 HoraEntradaCliente Fecha/Hora 8 VEntCola Doble 8 VSalCola Doble 8 VEntServ Doble 8 VSalServ Doble 8 Índices de tabla Nombre Numero de campo Campos Bco_Codigo 1 Ascendente Idx_HoraEntradaCliente 1 Ascendente Idx_NumCajero 1 Ascendente PrimaryKey 4 Ascendente Ascendente Ascendente Ascendente Idx_NumCliente 1 Ascendente Suc_Codigo 1 Ascendente CajerosTransacciones Columnas Nombre Tipo Tamaño Bco_Codigo Entero largo 4 Suc_Codigo Entero largo 4 NumCliente Entero largo 4 Dia Entero largo 4 NumCajero Entero 2 NoTrans Entero 2 Índices de tabla Nombre Numero de campo Campos CajerosCajerosTransac ciones 4 Ascendente Ascendente Ascendente Ascendente Idx_Bco_Codigo 1 Ascendente Idx_Dia 1 Ascendente Idx_NoTrans 1 Ascendente NumCliente 1 Ascendente PromTransCajerosTran sacciones 2 Ascendente Ascendente Suc_Codigo 1 Ascendente ClienteAtendido Columnas Nombre Tipo Tamaño Bco_Codigo Entero largo 4 Suc_Codigo Entero largo 4 Dia Entero largo 4 4 NumCliente Entero largo 4 Índices de tabla Nombre Numero de campo Campos Idx_Bco_Codigo 1 Ascendente Idx_NumCliente 1 Ascendente Idx_Suc_Codigo 1 Ascendente Manual del Programador BASE DE DATOS Simulation Bank Queue 4 Coeficientes A de Entrada/Salida en Cola. Tablas de Entrada/Salida en Cola. CoefAEntCola Columnas Nombre Tipo Tamaño Bco_Codigo Entero largo 4 Suc_Codigo Entero largo 4 Dia Entero 2 Hora Entero 2 Entiqueta Texto 5 CoeficienteA Doble 8 Índices de tabla Nombre Numero de campo Campos Idx_Bco_Codigo 1 Ascendente Idx_Dia 1 Ascendente Idx_Hora 1 Ascendente PrimaryKey 4 Ascendente Ascendente Ascendente Ascendente Idx_Suc_Codigo 1 Ascendente SucursalesCoefA_EntCola 2 Ascendente Ascendente CoefASalCola Columnas Nombre Tipo Tamaño Bco_Codigo Entero largo 4 Suc_Codigo Entero largo 4 Dia Entero 2 Hora Entero 2 Entiqueta Texto 5 CoeficienteA Doble 8 Índices de tabla Nombre Numero de campo Campos Idx_Bco_Codigo 1 Ascendente Idx_Dia 1 Ascendente Idx_Hora 1 Ascendente PrimaryKey 4 Ascendente Ascendente Ascendente Ascendente Idx_Suc_Codigo 1 Ascendente SucursalesCoefA_SalCola 2 Ascendente Ascendente EntCola Columnas Nombre Tipo Tamaño Bco_Codigo Entero largo 4 Suc_Codigo Entero largo 4 Dia Entero 2 Hora Entero 2 Tiempo TiempoE Fecha/Hora Doble 8 8 Índices de tabla Nombre Numero de campo Campos Idx_Bco_Codigo 1 Ascendente Idx_Dia 1 Ascendente Idx_Hora 1 Ascendente Idx_Suc_Codigo 1 Ascendente SucursalesEntCola 2 Ascendente Ascendente SalCola Columnas Nombre Tipo Tamaño Bco_Codigo Entero largo 4 Suc_Codigo Entero largo 4 Dia Entero 2 Hora Entero 2 Tiempo TiempoS Fecha/Hora Doble 8 8 Índices de tabla Nombre Numero de campo Campos Idx_Bco_Codigo 1 Ascendente Idx_Dia 1 Ascendente Idx_Hora 1 Ascendente Idx_Suc_Codigo 1 Ascendente SucursaleSalCola 2 Ascendente Ascendente Manual del Programador BASE DE DATOS Simulation Bank Queue 5 Tablas : Horas, Sucursales, PromTrans, Promedios Adicionales y PromediosVEntCola PromediosAdicionales Columnas Nombre Tipo Tamaño Bco_Codigo Entero largo 4 Suc_Codigo Entero largo 4 Dia Entero largo 4 Hora Texto 50 NumAdiionales Entero 2 Veco Doble 8 Vsca Doble 8 Índices de tabla Nombre Numero de campo Campos Bco_Codigo 1 Ascendente Suc_Codigo 1 Ascendente SucursalesCajerosPosicion 2 Ascendente Ascendente Horas Columnas Nombre Tipo Tamaño Id Fecha/Hora 8 Horas Fecha/Hora 8 Índices de tabla Nombre Numero de campo Campos Id 1 Ascendente Sucursales Columnas Nombre Tipo Tamaño Bco_Codigo Entero largo 4 Suc_Codigo Entero largo 4 Suc_Nombre Texto 255 Índices de tabla Nombre Numero de campo Campos Idx_Bco_Codigo 1 Ascendente BancosSucursales 1 Ascendente Idx_Suc_Codigo 1 Ascendente PK_Sucursales 2 Ascendente Ascendente PromediosVEntCola Columnas Nombre Tipo Tamaño Bco_Codigo Entero largo 4 Suc_Codigo Entero largo 4 Dia Entero largo 4 Hora Texto 50 NumPersonasSalPorCajer o Entero 2 Valor Doble 8 Valor2 Doble 8 VentradaServ Doble 8 VsalidaServ Doble 8 Índices de tabla Nombre Numero de campo Campos Bco_Codigo 1 Ascendente Suc_Codigo 1 Ascendente PromTrans Columnas Nombre Tipo Tamaño Bco_Codigo Entero largo 4 No.Trans Entero 2 Nombre_Transaccion Texto 255 Promedios Fecha/Hora 8 TpromSegs Entro largo 4 Porcentaje Doble 8 Índices de tabla Nombre Numero de campo Campos Idx_Bco_Codigo 1 Ascendente BancosPromTrans 1 Ascendente PrimaryKey 2 Ascendente Ascendente Manual del Programador BASE DE DATOS Simulation Bank Queue 6 GeneracionEncabezado Columnas Nombre Tipo Tamaño Bco_Codigo Entero largo 4 Bco_Codigo Entero largo 4 DiaCalendario Fecha/Hora 8 Id Entero largo 4 Dia Entero 2 HoraInicio Entero 2 HoraFin Entero 2 NumServidores Entero 2 CantPersonasEntran Entero 2 Deserciones Entero 2 CantTransacciones Entero largo 4 CantTransCaja1 Entero largo 4 CantTransCaja2 Entero largo 4 CantTransCaja3 Entero largo 4 CantTransCaja4 Entero largo 4 CantTransCaja5 Entero largo 4 CantTransCaja6 Entero largo 4 CantTransCaja7 Entero largo 4 CantTransCaja8 Entero largo 4 CantTransCaja9 Entero largo 4 CantTransCaja10 Entero largo 4 CantTransCaja11 Entero largo 4 CantTransCaja12 Entero largo 4 CantTransCaja13 Entero largo 4 CantTransCaja14 Entero largo 4 CantTransCaja15 Entero largo 4 Índices de tabla Nombre Número de campos Campos: Id 1 Ascendente Idx_Bco_Codigo 1 Ascendente Idx_Suc_Codigo 1 Ascendente pkGeneracionEncabezado 4 Ascendente Ascendente Ascendente Ascendente SucursalesGeneracionEncabezado 2 Ascendente Ascendente Manual del Programador FORMULARIOS Simulation Bank Queue 7 FFOORRMMUULLAARRIIOOSS Lenguaje de programación: Visual Basic 6.0 Nombre de archivo de proyecto: VeVsSimuColas.vbp Nombre FrmGraficas Archivo frmGraficas.frm Descripción Muestra en diferentes formatos gráficos la representación de la cantidad de personas que entran a la cola, salen de la cola y la cantidad de personas atendidas por cajeros. Nombre FrmImportar Archivo frmImportar.frm Descripción En este formulario se selecciona un archivo en formato de Microsoft Excel el cual contendrá la siguiente información: - Entrada y salida de cola - Transacciones del banco Existe la posibilidad de seleccionar de estas tres opciones cual es la que se desea importar, siendo completadas manualmente por el usuario la información no importada. Nombre frmInicioSimulacion Archivo frmInicioSimulacion.frm Descripción Formulario de confirmación de si se inicia o no una simulación Nombre frmParametros Archivo frmParametros.frm Descripción Formulario mediante el cual se obtienen los parámetros iniciales de una simulación los cuales son: la fecha, hora inicial, hora final y la cantidad de servidores Nombre FrmPress Archivo FrmPress.frm Descripción Formulario de presentación del sistema de simulación Nombre frmProgreso Formularios Manual del Programador FORMULARIOS Simulation Bank Queue 8 Archivo frmProgreso.frm Descripción Formulario que muestra el avance del proceso de adición de la información digitada por el usuario o importada mediante un archivo de Microsoft Excel relacionada a la entrada y salida de cola y servicio y a las transacciones del banco. Nombre frmRecepcionDeDatos Archivo frmRecepcionDeDatos.frm Descripción Formulario en el cual se introduce la información de campo referente a la entrada y salida de cola, y de transacciones. En esta forma se presenta también la información importada del archivo de Microsoft Excel. Nombre frmRecepcionDeDatos Archivo frmRecepcionDeDatos.frm Descripción Formulario en el cual se introduce la información de campo referente a la entrada y salida de cola y de transacciones. En esta forma se presenta también la información importada del archivo de Microsoft Excel. Esta información es completada ya sea que se esté creando un nuevo banco, una nueva sucursal ó si se desea redefinir la información de campo utilizada para la generación de los coeficientes utilizados en el proceso de simulación. Nombre frmReportes Archivo frmReportes.frm Descripción Contiene los diferentes reportes que genera el sistema, como por ejemplo: - Promedio de Entrada/Salida en cola - Promedio de Entrada/Salida en servicio - Cantidad de personas atendidas por cajero - Cantidad de transacciones por cajero - Tipos de transacciones - Tiempo en sistema de personas seleccionadas Nombre FrmResultados Archivo frmResultados.frm Descripción Muestra los resultados generados de cada simulación, entre la información que presenta se tiene: Fecha, hora inicial, hora final, cantidad de personas que entran, cantidad de personas que salen, número de cajeros, número de deserciones y cantidad de transacciones. Nombre FrmSeleccionAnalisis Archivo frmSeleccionAnalisis.frm Descripción Permite elegir una nueva simulación (efectuando una nueva entrada de información de campo) o realizar la simulación con la información ya almacenada en la base de datos. Nombre frmSeleccionAnalisis Manual del Programador FORMULARIOS Simulation Bank Queue 9 Archivo frmSeleccionAnalisis.frm Descripción Permite elegir una nueva simulación (efectuando una nueva entrada de información de campo) o realizar la simulación con la información ya almacenada en la base de datos. Nombre frmSeleccionBanco Archivo frmSeleccionBanco.frm Descripción Permite crear un banco y una sucursal, una sucursal ó ingresar al sistema seleccionando una existente. Nombre frmSimulacion Archivo frmSimulacion.frm Descripción Es el formulario principal del sistema, su función es presentar en forma gráfica la simulación de la cola y la atención por parte de los cajeros, este formulario integra además el acceso a las opciones de: - Resultados de simulación - Gráficos representativos de la información generada - Generación de reportes - Almacenamiento en la base de la información de la simulación - Adición y retiro de cajeros - Toma del tiempo de una persona en el sistema - Introducción de casos especiales Nombre frmSimulacionPersona Archivo frmSimulacionPersona.frm Descripción Muestra el número de la persona que ha entrado al sistema desde que inicio la simulación, y a la cual se le tomara el tiempo total que estará en el sistema. Nombre frmThem Archivo scroll1.frm Descripción Presenta el acerca de… del sistema Manual del Programador PROCEDIMIENTOS Simulation Bank Queue 10 PPRROOCCEEDDIIMMIIEENNTTOOSS Nombre del procedimiento Parámetros que recibe Descripción de su función Vinculación Objeto de base de datos, nombre del vinculo a crear, cadena de conexión a Excel, nombre de la Hoja de Excel Crea los vínculos a las hojas del libro de Excel según el archivo seleccionado. ExisteTabla Objeto de base de datos, nombre de la tabla Elimina los vínculos anteriores a las hojas de un libro de Excel importado con anterioridad. Main Crea el DSN de usuario en computadora utilizando el DBEngine de Microsoft DAO y realiza la conexión a la base de datos VsSimuColas.mdb mediante ADO v2.5(Activex Data Object) Espera Tipo de puntero Cambia el puntero del ratón de reloj de arena a flecha y viceversa procCerrarRecordset Objeto tipo recordset Cierra un objeto recordset pasado como argumento procConvMayusculas Valor entero as cii de la tecla presionada Convierte de mayúscula a minúsculas CerrarSistema Objeto tipo conexión ADO Cierra la variable de conexión de la base de datos del sistema GrabarInformacionDeNuevoBanco Tiene como función la creación de un nuevo banco y sucursal, una nueva sucursal y una nueva información de campo de entrada y salida de cola y servicio y tipos de transacción CoeficientesDeCola Código de banco, código de sucursal, tipo de cola (entrada o salida), nombre del Calcula los coeficientes A de entrada y salida de cola. Guarda además la Procedimientos Manual del Programador PROCEDIMIENTOS Simulation Bank Queue 11 coeficiente información de coeficientes en la base de datos. procCalcularPromediosVelocidad_E_S_ColaServicio Dia, número de cajero Calcula la velocidad promedio de entrada/salida de la cola y el servicio procGenerarTransacciones Dia de la simulación Genera las transacciones por cada cajero basando se en el tiempo promedio de servicio y en el tiempo que dura cada transacción haciendo referencia a la tabla PromTrans procCalcularPromediosVelocidad_S_Cola Dia, número de cajeros Calcula la velocidad promedio de salida de la cola la cual varia de pendiendo del número de cajeros en servicio procCalcularPromediosTiempoEnServicio Dia, número de cajeros Calcula el tiempo promedio en servicio para un día especifico procCalculosAdicionales Dia Calcula los nuevos valores de velocidades en cola para los clientes que no son atendidos en su hora de ingreso procCreacionDePromedios Crea los promedios de entrada / salida de cola para la presentación en reporte al finalizar cada simulación Manual del Programador FUNCIONES Simulation Bank Queue 12 FFUUNNCCIIOONNEESS Nombre de la función Parámetros que recibe Parámetros que devuelve Descripción de su función fncHoraValida Hora en formato dd/mm/yyyy Valor booleano, FALSE la fecha no es válida, TRUE la fecha es válida Indica si una fecha es válida o no fncFORMATO_HORA Valor de hora Formato de hora Devuelve la hora pasada como argumento en formato hh:mm:ss AM / PM fncFORMATO_HORAMMSS Valor de hora Formato de hora Devuelve la hora pasada como argumento en formato mm:ss Lee_Campo Valor de cadena o valor nulo Valor de cadena pasada como argumento o carácter en blanco Si el valor que recibe como argumento es nulo devuelve un carácter en blanco de lo contrario devuelve el mismo valor de cadena fncNumeroTransacciones Dia Número de transacciones Devuelve el número de transacciones realizadas en total por todos los cajeros para una fecha en particular procNuevaSimulacion Dia de simulación Id de simulación Devuelve el Id de Simulación para la fecha pasada como argumento en caso exista una simulación anterior en la misma fecha Funciones Manual del Programador CONSTANTES Simulation Bank Queue 13 CCOONNSSTTAANNTTEESS GGLLOOBBAALLEESS Nombre de constante Tipo de dato Función NOMBRE_BASEDATOS String Representa el nombre físico del archivo de base de datos del sistema MSGVALI String Representa la cadena de titulo ‘Mensaje de validación’ en los mensajes del sistema MSGCONF String Representa la cadena de titulo ‘Mensaje de confirmación’ en los mensajes del sistema MSGINFO String Representa la cadena de titulo ‘Mensaje de información’ en los mensajes del sistema Constantes Manual del Programador CODIGO Simulation Bank Queue 14 VVAARRIIAABBLLEESS GGLLOOBBAALLEESS Nombre de constante Tipo de dato Función gCodBanco Long Código del Banco seleccionado para efectuar la simulación gCodSucur Long Código de la sucursal seleccionada para efectuar la simulación gblnSimulacionAnterior Boolean Indica si se realiza la simulación con datos actuales o con nuevos gstrNombreBanco String Nombre del banco seleccionado para efectuar la simulación gstrNombreSucursal String Nombre de la sucursal seleccionada para efectuar la simulación gIdSimulacion Long Id de la simulación en proceso Variables Manual del Programador CODIGO Simulation Bank Queue 15 CCOODDIIGGOO FFUUEENNTTEE FrmComparacion Option Explicit Sub procIdSimulacionesPasadas() Dim rstSimus As New ADODB.Recordset rstSimus.Open "SELECT Id " _ & "From GeneracionEncabezado " _ & "Where Bco_Codigo = " & CStr(gCodBanco) & " And Suc_Codigo = " & CStr(gCodSucur) & " And DiaCalendario = #" & frmSimulacion.lblFecha.Tag & "# And Id <> " & gIdSimulacion & " " _ & "ORDER BY Id", gCn, adOpenStatic, adLockOptimistic, adCmdText With rstSimus While Not .EOF cbxId.AddItem CStr(.Fields(0)) .MoveNext Wend End With If cbxId.ListCount > 0 Then cbxId.ListIndex = 0 procCerrarRecordset rstSimus End Sub Private Sub cbxId_Click() 'Mostrar información de la Simulacion seleccionada Dim rstInfo As New ADODB.Recordset rstInfo.Open "SELECT HoraInicio, HoraFin, NumServidores, " _ & "CantPersonasEntran, CantPersonasSalen, " _ & "Deserciones, CantTransacciones, " _ & "CantCola, VEntCola, " _ & "VSalCola, VEntServ, VSalServ " _ & "From GeneracionEncabezado " _ & "WHERE Bco_Codigo=" & CStr(gCodBanco) & " AND " _ & "Suc_Codigo=" & CStr(gCodSucur) & " AND " _ & "DiaCalendario=#" & frmSimulacion.lblFecha.Tag & "# AND " _ & "Id=" & cbxId & ";", gCn, adOpenStatic, adLockOptimistic, adCmdText With rstInfo If Not .EOF Then If .Fields(0) >= 12 Then Select Case .Fields(0) Case 12 lblHoraIni(1) = "12:00 PM" Case 13 lblHoraIni(1) = "01:00 PM" Case 14 lblHoraIni(1) = "02:00 PM" Case 15 lblHoraIni(1) = "03:00 PM" Case 16 lblHoraIni(1) = "04:00 PM" Case 17 lblHoraIni(1) = "05:00 PM" End Select Else lblHoraIni(1) = Format(.Fields(0), "0#") & ":00 AM" End If If .Fields(1) >= 12 Then Select Case .Fields(1) Case 12 lblHoraFin(1) = "12:00 PM" Case 13 Codigo Manual del Programador CODIGO Simulation Bank Queue 16 lblHoraFin(1) = "01:00 PM" Case 14 lblHoraFin(1) = "02:00 PM" Case 15 lblHoraFin(1) = "03:00 PM" Case 16 lblHoraFin(1) = "04:00 PM" Case 17 lblHoraFin(1) = "05:00 PM" End Select Else lblHoraFin(1) = Format(.Fields(1), "0#") & ":00 AM" End If lblCantEntrado(1) = .Fields(3) lblCantSalida(1) = .Fields(4) lblCantServ(1) = .Fields(2) lblNumDeserciones(1) = .Fields(5) lblNumTransacciones(1) = .Fields(6) lblCantCola(1) = !CantCola lblVPromEntCola(1) = Format(Int(!VEntCola / 60), "0#") & ":" & Format(!VEntCola - (Int(!VEntCola / 60) * 60), "0#") & " min" lblVPromSalCola(1) = Format(Int(!VSalCola / 60), "0#") & ":" & Format(!VSalCola - (Int(!VSalCola / 60) * 60), "0#") & " min" lblVPromEntServ(1) = Format(Int(!VEntServ / 60), "0#") & ":" & Format(!VEntServ - (Int(!VEntServ / 60) * 60), "0#") & " min" lblVPromSalServ(1) = Format(Int(!VSalServ / 60), "0#") & ":" & Format(!VSalServ - (Int(!VSalServ / 60) * 60), "0#") & " min" End If End With procCerrarRecordset rstInfo End Sub Private Sub cbxId_KeyDown(KeyCode As Integer, Sh ift As Integer) HacerTab KeyCode End Sub Private Sub cmbSimu_Click(Index As Integer) If Index = 0 Then With CrystalReport1 .ReportFileName = App.Path & "\repComparacion.rpt" .Formulas(0) = "NUMSIMU1='" & lblId & "'" .Formulas(1) = "HORAINI1='" & lblHoraIni(0) & "'" .Formulas(2) = "HORAFIN1='" & lblHoraFin(0) & "'" .Formulas(3) = "CANTENTRAN1='" & lblCantEntrado(0) & "'" .Formulas(4) = "CANTSALEN1='" & lblCantSalida(0) & "'" .Formulas(5) = "CANTCOLA1='" & lblCantCola(0) & "'" .Formulas(6) = "CANTSERV1='" & lblCantServ(0) & "'" .Formulas(7) = "DESERCIONES1='" & lblNumDeserciones(0) & "'" .Formulas(8) = "TRANSACCIONES1='" & lblNumTransacciones(0) & "'" .Formulas(9) = "VENTCOLA1='" & lblVPromEntCola(0) & "'" .Formulas(10) = "VSALCOLA1='" & lblVPromSalCola(0) & "'" .Formulas(11) = "VENTSERV1='" & lblVPromEntServ(0) & "'" .Formulas(12) = "VSALSERV1='" & lblVPromSalServ(0) & "'" .Formulas(13) = "NUMSIMU2='" & cbxId & "'" .Formulas(14) = "HORAINI2='" & lblHoraIni(1) & "'" .Formulas(15) = "HORAFIN2='" & lblHoraFin(1) & "'" .Formulas(16) = "CANTENTRAN2='" & lblCantEntrado(1) & "'" .Formulas(17) = "CANTSALEN2='" & lblCantSalida(1) & "'" .Formulas(18) = "CANTCOLA2='" & lblCantCola(1) & "'" .Formulas(19) = "CANTSERV2='" & lblCantServ(1) & "'" .Formulas(20) = "DESERCIONES2='" & lblNumDeserciones(1) & "'" .Formulas(21) = "TRANSACCIONES2='" & lblNumTransacciones(1) & "'" .Formulas(22) = "VENTCOLA2='" & lblVPromEntCola(1) & "'" .Formulas(23) = "VSALCOLA2='" & lblVPromSalCola(1) & "'" .Formulas(24) = "VENTSERV2='" & lblVPromEntServ(1) & "'" .Formulas(25) = "VSALSERV2='" & lblVPromSalServ(1) & "'" .Formulas(26) = "BANCO='" & gstrNombreBanco & "'" .Formulas(27) = "SUCURSAL='" & gstrNombreSucursal & "'" Manual del Programador CODIGO Simulation Bank Queue 17 .Formulas(28) = "FECHA='" & lblFecha & "'" .Action = 1 End With Else Unload frmComparacion End If End Sub Private Sub Form_Load() 'Presentar información de simulación actual lblNomBanco = gstrNombreBanco lblNomSucursal = gstrNombreSucursal lblFecha = frmSimulacion.lblFecha lblId = gIdSimulacion lblHoraIni(0) = frmSimulacion.lblHoraIni lblHoraFin(0) = frmSimulacion.lblHoraFin lblCantEntrado(0) = frmSimulacion.lblCantEntrado lblCantSalida(0) = frmSimulacion.lblCantSalida lblCantServ(0) = frmSimulacion.lblCantServ lblNumDeserciones(0) = frmSimulacion.lblDeserciones lblNumTransacciones(0) = fncNumeroTransacciones(Val(frmSimulacion.lblDia)) lblCantCola(0) = frmSimulacion.lblCantCola lblVPromEntCola(0) = Format(Int(frmSimulacion.lng_VEntCola / 60), "0#") & ":" & Format(frmSimulacion.lng_VEntCola - (Int(frmSimulacion.lng_VEntCola / 60) * 60), "0#") & " min" lblVPromSalCola(0) = Format(Int(frmSimulacion.lng_VSalCola / 60), "0#") & ":" & Format(frmSimulacion.lng_VSalCola - (Int(frmSimulacion.lng_VSalCola / 60) * 60), "0#") & " min" lblVPromEntServ(0) = Format(Int(frmSimulacion.lng_VEntServ / 60), "0#") & ":" & Format(frmSimulacion.lng_VEntServ - (Int(frmSimulacion.lng_VEntServ / 60) * 60), "0#") & " min" lblVPromSalServ(0) = Format(Int(frmSimulacion.lng_VSalServ / 60), "0#") & ":" & Format(frmSimulacion.lng_VSalServ - (Int(frmSimulacion.lng_VSalServ / 60) * 60), "0#") & " min" 'Obtener Id de las simulaciones pasadas procIdSimulacionesPasadas End Sub FrmGraficosExcel Option Explicit Public vntValorTipoGrafico Dim Iniciando As Boolean Sub procConfigurarGrafico() 'Configurar gráfico On Error GoTo ErrHandler Kill App.Path & "\Graficos.xls" CrearHojaExcel cbxTipoInfo.ListIndex, frmSimulacion.lblFecha.Tag Exit Sub ErrHandler: If Err.Number = 53 Then Resume Next Else MsgBox Err.Description End If End Sub Private Sub cbxTipoGrafico_Click() Select Case cbxTipoGrafico.ListIndex Case 0 vntValorTipoGrafico = xl3DColumnClustered Case 1 vntValorTipoGrafico = xl3DBarClustered Case 2 vntValorTipoGrafico = xlLine Case 3 vntValorTipoGrafico = xl3DArea Manual del Programador CODIGO Simulation Bank Queue 18 Case 4 vntValorTipoGrafico = xl3DPieExploded End Select procConfigurarGrafico OLE1.Action = 1 End Sub Private Sub cbxTipoGrafico_KeyDown(KeyCode As Integer, Shift As Integer) HacerTab KeyCode End Sub Private Sub cbxTipoInfo_Click() If Not Iniciando Then Select Case cbxTipoGrafico.ListIndex Case 0 vntValorTipoGrafico = xl3DColumnClustered Case 1 vntValorTipoGrafico = xl3DBarClustered Case 2 vntValorTipoGrafico = xlLine Case 3 vntValorTipoGrafico = xl3DArea Case 4 vntValorTipoGrafico = xl3DPieExploded End Select Private Sub cbxTipoGrafico_Click() Select Case cbxTipoGrafico.ListIndex Case 0 vntValorTipoGrafico = xl3DColumnClustered Case 1 vntValorTipoGrafico = xl3DBarClustered Case 2 vntValorTipoGrafico = xlLine Case 3 vntValorTipoGrafico = xl3DArea Case 4 vntValorTipoGrafico = xl3DPieExploded End Select procConfigurarGrafico OLE1.Action = 1 End Sub Private Sub cbxTipoGrafico_KeyDown(KeyCode As Integer, Shift As Integer) HacerTab KeyCode End Sub Private Sub cbxTipoInfo_Click() If Not Iniciando Then Select Case cbxTipoGrafico.ListIndex Case 0 vntValorTipoGrafico = xl3DColumnClustered Case 1 vntValorTipoGrafico = xl3DBarClustered Case 2 vntValorTipoGrafico = xlLine Case 3 vntValorTipoGrafico = xl3DArea Case 4 vntValorTipoGrafico = xl3DPieExploded End Select If cbxTipoInfo.ListIndex = 2 And cbxTipoGrafico.ListCount = 4 Then cbxTipoGrafico.AddItem "Pastel" procConfigurarGrafico OLE1.Action = 1 Else If cbxTipoGrafico.ListCount = 5 And cbxTipoInfo.ListIndex <> 2 Then cbxTipoGrafico.RemoveItem 4 cbxTipoGrafico.ListIndex = 0 Manual del Programador CODIGO Simulation Bank Queue 19 Else procConfigurarGrafico OLE1.Action = 1 End If End If If cbxTipoInfo.ListIndex = 2 Then 'Mostrar tabla de transacciones Dim db_local As Database Dim rstTrans As DAO.Recordset Dim itm As ListItem lsvTransacc.ListItems.Clear Set db_local = OpenDatabase(App.Path & "\VeVsSimuColas.mdb") Set rstTrans = db_local.OpenRecordset("SELECT PromTrans.NoTrans, PromTrans.[Nombre Transacción] " _ & "FROM PromTrans INNER JOIN CajerosTransacciones ON (PromTrans.NoTrans = CajerosTransacciones.NoTrans) AND (PromTrans.Bco_Codigo = CajerosTransacciones.Bco_Codigo) " _ & "Where (((PromTrans.Bco_Codigo) = " & gCodBanco & ") And ((CajerosTransacciones.NumCajero) <> -1)) " _ & "GROUP BY PromTrans.NoTrans, PromTrans.[Nombre Transacción] ORDER BY PromTrans.NoTrans;", dbOpenSnapshot) With rstTrans While Not .EOF Set itm = lsvTransacc.ListItems.Add(, , , , 0) itm.SubItems(1) = .Fields(0) itm.SubItems(2) = .Fields(1) .MoveNext Wend .Close End With Set rstTrans = Nothing db_local.Close Set db_local = Nothing chkTrans.Visible = True Else 'Ocultar tabla de transacciones lsvTransacc.Visible = False chkTrans.Visible = False chkTrans.Value = 0 End If End If End Sub Private Sub cbxTipoInfo_KeyDown(KeyCode As Integer, Shift As Integer) HacerTab KeyCode End Sub Private Sub chkTrans_Click() If chkTrans.Value = 0 Then lsvTransacc.Visible = False Else lsvTransacc.Visible = True End If End Sub Private Sub cmbCerrar_Click() Unload frmGraficosExcel Set frmGraficosExcel = Nothing frmSimulacion.Show End Sub Private Sub Form_Load() Iniciando = True frmSimulacion.Hide With cbxTipoInfo .AddItem "Personas que entran/salen de la cola" .AddItem "Cantidad de personas atendidas por cajero" .AddItem "Transacciones realizadas" .AddItem "Promedio de entrada/salida en cola" .AddItem "Promedio de entrada/salida en servicio" .ListIndex = 0 End With Manual del Programador CODIGO Simulation Bank Queue 20 Iniciando = False With cbxTipoGrafico .AddItem "Columnas" .AddItem "Barras" .AddItem "Líneas" .AddItem "Áreas" .ListIndex = 0 End With End Sub FrmImportar OOppttiioonn EExxpplliicciitt SSuubb CCaarrggaarrIInnffoorrmmaacciióónnDDeeEExxcceell((BByyVVaall ssttrrTTiippoo AAss IInntteeggeerr)) DDiimm iittmm AAss LLiissttIItteemm DDiimm ddbbllooccaall AAss DDAAOO..DDaattaabbaassee DDiimm rrssttIInnffoo AAss DDAAOO..RReeccoorrddsseett SSeett ddbbllooccaall == OOppeennDDaattaabbaassee((AApppp..PPaatthh && ""\\VVeeVVssSSiimmuuCCoollaass..mmddbb"",, FFaallssee,, FFaallssee)) SSeelleecctt CCaassee ssttrrTTiippoo CCaassee 00 ''CCoollaass ((EEnnttrraaddaa//SSaalliiddaa)) VViinnccuullaacciióónn ddbbllooccaall,, ""EEnnttCCoollaa11"",, ""EEXXCCEELL 88..00;;DDAATTAABBAASSEE=="" && ttxxttAArrcchhiivvoo,, ""EEnnttCCoollaa$$"" SSeett rrssttIInnffoo == ddbbllooccaall..OOppeennRReeccoorrddsseett((""EEnnttCCoollaa11"",, ddbbOOppeennSSnnaappsshhoott)) WWiitthh rrssttIInnffoo ffrrmmRReecceeppcciioonnDDeeDDaattooss..llssvvTTbbll((00))..LLiissttIItteemmss..CClleeaarr WWhhiillee NNoott ..EEOOFF SSeett iittmm == ffrrmmRReecceeppcciioonnDDeeDDaattooss..llssvvTTbbll((00))..LLiissttIItteemmss..AAdddd((ffrrmmRReecceeppcciioonnDDeeDDaattooss..llssvvTTbbll((00))..LLiissttIItteemmss..CCoouunntt ++ 11,, ,, ,, ,, 00)) iittmm..SSuubbIItteemmss((11)) == ..FFiieellddss((00)) iittmm..SSuubbIItteemmss((22)) == ..FFiieellddss((11)) iittmm..SSuubbIItteemmss((33)) == MMiidd((FFoorrmmaatt((..FFiieellddss((22)),, ""hhhh::mmmm::ssss"")),, 44,, 55)) iittmm..SSuubbIItteemmss((44)) == MMiinnuuttee((..FFiieellddss((22)))) ** 6600 ++ SSeeccoonndd((..FFiieellddss((22)))) DDooEEvveennttss ..MMoovveeNNeexxtt WWeenndd ..CClloossee EEnndd WWiitthh SSeett rrssttIInnffoo == NNootthhiinngg VViinnccuullaacciióónn ddbbllooccaall,, ""SSaallCCoollaa11"",, ""EEXXCCEELL 88..00;;DDAATTAABBAASSEE=="" && ttxxttAArrcchhiivvoo,, ""SSaallCCoollaa$$"" SSeett rrssttIInnffoo == ddbbllooccaall..OOppeennRReeccoorrddsseett((""SSaallCCoollaa11"",, ddbbOOppeennSSnnaappsshhoott)) WWiitthh rrssttIInnffoo ffrrmmRReecceeppcciioonnDDeeDDaattooss..llssvvTTbbll((11))..LLiissttIItteemmss..CClleeaarr WWhhiillee NNoott ..EEOOFF SSeett iittmm == ffrrmmRReecceeppcciioonnDDeeDDaattooss..llssvvTTbbll((11))..LLiissttIItteemmss..AAdddd((ffrrmmRReecceeppcciioonnDDeeDDaattooss..llssvvTTbbll((11))..LLiissttIItteemmss..CCoouunntt ++ 11,, ,, ,, ,, 00)) iittmm..SSuubbIItteemmss((11)) == ..FFiieellddss((00)) iittmm..SSuubbIItteemmss((22)) == ..FFiieellddss((11)) iittmm..SSuubbIItteemmss((33)) == MMiidd((FFoorrmmaatt((..FFiieellddss((22)),, ""hhhh::mmmm::ssss"")),, 44,, 55)) iittmm..SSuubbIItteemmss((44)) == MMiinnuuttee((..FFiieellddss((22)))) ** 6600 ++ SSeeccoonndd((..FFiieellddss((22)))) DDooEEvveennttss ..MMoovveeNNeexxtt WWeenndd ..CClloossee EEnndd WWiitthh SSeett rrssttIInnffoo == NNootthhiinngg CCaassee 11 ''TTrraannssaacccciioonneess VViinnccuullaacciióónn ddbbllooccaall,, ""TTrraannssaacccciioonneess11"",, ""EEXXCCEELL 88..00;;DDAATTAABBAASSEE=="" && ttxxttAArrcchhiivvoo,, ""TTrraannssaacccciioonneess$$"" SSeett rrssttIInnffoo == ddbbllooccaall..OOppeennRReeccoorrddsseett((""TTrraannssaacccciioonneess11"",, ddbbOOppeennSSnnaappsshhoott)) WWiitthh rrssttIInnffoo ffrrmmRReecceeppcciioonnDDeeDDaattooss..llssvvTTbbll((44))..LLiissttIItteemmss..CClleeaarr WWhhiillee NNoott ..EEOOFF SSeett iittmm == ffrrmmRReecceeppcciioonnDDeeDDaattooss..llssvvTTbbll((44))..LLiissttIItteemmss..AAdddd((ffrrmmRReecceeppcciioonnDDeeDDaattooss..llssvvTTbbll((44))..LLiissttIItteemmss..CCoouunntt ++ 11,, ,, LLeeee__CCaammppoo((..FFiieellddss((00)))),, ,, 00)) iittmm..SSuubbIItteemmss((11)) == MMiidd((FFoorrmmaatt((..FFiieellddss((11)),, ""hhhh::mmmm::ssss"")),, 44,, 55)) iittmm..SSuubbIItteemmss((22)) == MMiinnuuttee((..FFiieellddss((11)))) ** 6600 ++ SSeeccoonndd((..FFiieellddss((11)))) iittmm..SSuubbIItteemmss((33)) == ..FFiieellddss((22)) DDooEEvveennttss Manual del Programador CODIGO Simulation Bank Queue 21 ..MMoovveeNNeexxtt WWeenndd ..CClloossee EEnndd WWiitthh SSeett rrssttIInnffoo == NNootthhiinngg EEnndd SSeelleecctt ddbbllooccaall..CClloossee SSeett ddbbllooccaall == NNootthhiinngg EEnndd SSuubb PPrriivvaattee SSuubb cchhkkSSiimmuu__KKeeyyDDoowwnn((IInnddeexx AAss IInntteeggeerr,, KKeeyyCCooddee AAss IInntteeggeerr,, SShhiifftt AAss IInntteeggeerr)) HHaacceerrTTaabb KKeeyyCCooddee EEnndd SSuubb PPrriivvaattee SSuubb ccmmbbRRuuttaa__CClliicckk(()) CCoommmmoonnDDiiaalloogg11..DDiiaallooggTTiittllee == ""SSeelleecccciioonnaannddoo aarrcchhiivvoo"" CCoommmmoonnDDiiaalloogg11..FFiilltteerr == ""AArrcchhiivvoo ddee MMiiccrroossoofftt EExxcceell ((**..xxllss))||**..xxllss"" CCoommmmoonnDDiiaalloogg11..SShhoowwOOppeenn ttxxttAArrcchhiivvoo == CCoommmmoonnDDiiaalloogg11..FFiilleeNNaammee IIff DDiirr((ttxxttAArrcchhiivvoo,, vvbbAArrcchhiivvee)) <<>> """" AAnndd ttxxttAArrcchhiivvoo <<>> """" AAnndd RRiigghhtt((ttxxttAArrcchhiivvoo,, 44)) == ""..xxllss"" TThheenn cchhkkSSiimmuu((00))..EEnnaabblleedd == TTrruuee cchhkkSSiimmuu((11))..EEnnaabblleedd == TTrruuee ccmmbbSSiimmuu((00))..EEnnaabblleedd == TTrruuee EEllssee cchhkkSSiimmuu((00))..EEnnaabblleedd == FFaallssee cchhkkSSiimmuu((11))..EEnnaabblleedd == FFaallssee ccmmbbSSiimmuu((00))..EEnnaabblleedd == FFaallssee EEnndd IIff EEnndd SSuubb PPrriivvaattee SSuubb ccmmbbSSiimmuu__CClliicckk((IInnddeexx AAss IInntteeggeerr)) IIff IInnddeexx == 00 TThheenn IIff TTrriimm((ttxxttAArrcchhiivvoo)) == """" TThheenn MMssggBBooxx ""DDeebbee eessppeecciiffiiccaarr llaa rruuttaa ddeell aarrcchhiivvoo ddee EExxcceell"",, vvbbIInnffoorrmmaattiioonn,, MMSSGGVVAALLII ttxxttAArrcchhiivvoo..SSeettFFooccuuss EEllssee IIff DDiirr((ttxxttAArrcchhiivvoo,, vvbbAArrcchhiivvee)) <<>> """" AAnndd ttxxttAArrcchhiivvoo <<>> """" AAnndd RRiigghhtt((ttxxttAArrcchhiivvoo,, 44)) == ""..xxllss"" TThheenn IIff cchhkkSSiimmuu((00))..VVaalluuee == 00 AAnndd cchhkkSSiimmuu((11))..VVaalluuee == 00 TThheenn MMssggBBooxx ""DDeebbee sseelleecccciioonnaarr aallgguunn ddaattoo aa iimmppoorrttaarr"",, vvbbIInnffoorrmmaattiioonn,, MMSSGGVVAALLII cchhkkSSiimmuu((00))..SSeettFFooccuuss EEllssee EEssppeerraa FFrraammee22..VViissiibbllee == TTrruuee IIff cchhkkSSiimmuu((00))..VVaalluuee == 11 TThheenn CCaarrggaarrIInnffoorrmmaacciióónnDDeeEExxcceell 00 EEnndd IIff IIff cchhkkSSiimmuu((11))..VVaalluuee == 11 TThheenn CCaarrggaarrIInnffoorrmmaacciióónnDDeeEExxcceell 11 EEnndd IIff FFrraammee22..VViissiibbllee == FFaallssee EEssppeerraa 11 ffrrmmRReecceeppcciioonnDDeeDDaattooss..ccmmbbSSiimmuu((33))..EEnnaabblleedd == FFaallssee UUnnllooaadd ffrrmmIImmppoorrttaarr EEnndd IIff EEllssee MMssggBBooxx ""AArrcchhiivvoo nnoo eexxiissttee"",, vvbbIInnffoorrmmaattiioonn,, MMSSGGVVAALLII ttxxttAArrcchhiivvoo..SSeettFFooccuuss EEnndd IIff EEnndd IIff EEllssee UUnnllooaadd ffrrmmIImmppoorrttaarr EEnndd IIff EEnndd SSuubb PPrriivvaattee SSuubb FFoorrmm__KKeeyyDDoowwnn((KKeeyyCCooddee AAss IInntteeggeerr,, SShhiifftt AAss IInntteeggeerr)) IIff KKeeyyCCooddee == 2277 TThheenn UUnnllooaadd ffrrmmIImmppoorrttaarr EEnndd IIff EEnndd SSuubb PPrriivvaattee SSuubb FFoorrmm__LLooaadd(()) SSeett ccmmbbRRuuttaa..PPiiccttuurree == IImmaaggee11..PPiiccttuurree EEnndd SSuubb Manual del Programador CODIGO Simulation Bank Queue 22 PPrriivvaattee SSuubb ttxxttAArrcchhiivvoo__KKeeyyDDoowwnn((KKeeyyCCooddee AAss IInntteeggeerr,, SShhiifftt AAss IInntteeggeerr)) HHaacceerrTTaabb KKeeyyCCooddee EEnndd SSuubb PPrriivvaattee SSuubb ttxxttAArrcchhiivvoo__VVaalliiddaattee((CCaanncceell AAss BBoooolleeaann)) IIff DDiirr((ttxxttAArrcchhiivvoo,, vvbbAArrcchhiivvee)) <<>> """" AAnndd ttxxttAArrcchhiivvoo <<>> """" AAnndd RRiigghhtt((ttxxttAArrcchhiivvoo,, 44)) == ""..xxllss"" TThheenn cchhkkSSiimmuu((00))..EEnnaabblleedd == TTrruuee cchhkkSSiimmuu((11))..EEnnaabblleedd == TTrruuee ccmmbbSSiimmuu((00))..EEnnaabblleedd == TTrruuee cchhkkSSiimmuu((00))..SSeettFFooccuuss EEllssee cchhkkSSiimmuu((00))..EEnnaabblleedd == FFaallssee cchhkkSSiimmuu((11))..EEnnaabblleedd == FFaallssee ccmmbbSSiimmuu((00))..EEnnaabblleedd == FFaallssee EEnndd IIff EEnndd SSuubb FrmParametros Option Explicit Dim blnCambioFecha As Boolean Private Sub cbxHora_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer) HacerTab KeyCode End Sub Private Sub cmbSimu_Click(Index As Integer) Dim Dia As Byte Dim dblocal As DAO.Database If Index = 0 Then If Val(cbxHora(0)) >= Val(cbxHora(1)) Then MsgBox "Hora inicial no puede ser mayor o igual que hora final", vbInformation, MSGVALI cbxHora(0).SetFocus Else If Val(txtSimu) = 0 Then MsgBox "La cantidad de servidores no puede ser cero", vbInformation, MSGVALI txtSimu.SetFocus Exit Sub End If If Val(txtSimu) > 15 Then MsgBox "La cantidad de servidores no puede ser mayor de 15", vbInformation, MSGVALI txtSimu.SetFocus Exit Sub End If Set dblocal = OpenDatabase(App.Path & "\VeVsSimuColas.mdb", False, False) 'Estableciendo el Id de la Simulación a generar procNuevaSimulacion drpCalendario.Value 'Grabando en Encabezado dblocal.Execute "INSERT INTO GeneracionEncabezado " _ & "(Bco_Codigo, Suc_Codigo, Dia, HoraInicio, HoraFin, NumServidores, DiaCalendario, Id) " _ & "VALUES(" & CStr(gCodBanco) & "," & CStr(gCodSucur) & "," _ & Day(drpCalendario.Value) & "," & cbxHora(0) & "," & cbxHora(1) & "," & txtSimu & ",#" & Format(drpCalendario.Value, "mm/dd/yyyy") & "#," & gIdSimulacion & ");" 'Configurando el día seleccionado en caso 'sea mayor a 15 Dia = Day(drpCalendario.Value) frmSimulacion.gDiaReal = Dia If Dia > 15 Then If Dia = 31 Then Dia = 15 Else Dia = Dia - 15 End If End If dblocal.Execute "DELETE * " _ & "FROM ClienteAtendido " _ Manual del Programador CODIGO Simulation Bank Queue 23 & "WHERE Bco_Codigo = " & CStr(gCodBanco) & " And Suc_Codigo = " & CStr(gCodSucur) & " AND Dia = " & Dia dblocal.Close Set dblocal = Nothing Screen.MousePointer = 11 frmSimulacion.gintDia = Dia frmSimulacion.gintNumcajeros = Val(txtSimu) frmSimulacion.gPerfilTransacc = cbxHora(2).ListIndex Load frmSimulacion frmSimulacion.Show frmParametros.Hide End If Else Unload frmParametros frmSeleccionBanco.Show End If End Sub Private Sub drpCalendario_Change() blnCambioFecha = True End Sub Private Sub drpCalendario_KeyDown(KeyCode As Integer, Shift As Integer) HacerTab KeyCode End Sub Private Sub drpCalendario_LostFocus() Dim i% If blnCambioFecha Then If Weekday(drpCalendario.Value) = 7 Then cbxHora(0).Clear cbxHora(1).Clear For i = 8 To 12 cbxHora(0).AddItem CStr(i) Next i cbxHora(0).ListIndex = 0 For i = 8 To 12 cbxHora(1).AddItem CStr(i) Next i cbxHora(1).ListIndex = 1 Else cbxHora(0).Clear cbxHora(1).Clear For i = 8 To 17 cbxHora(0).AddItem CStr(i) Next i cbxHora(0).ListIndex = 0 For i = 8 To 17 cbxHora(1).AddItem CStr(i) Next i cbxHora(1).ListIndex = 1 End If frmParametros.Refresh cmbSimu(0).Refresh cmbSimu(1).Refresh DoEvents blnCambioFecha = False End If End Sub Private Sub drpCalendario_Validate(Cancel As Boolean) If Weekday(drpCalendario.Value) = 1 Then MsgBox "La simulación no se puede efectuar para un día Domingo", vbInformation, MSGVALI drpCalendario.SetFocus Cancel = True End If Manual del Programador CODIGO Simulation Bank Queue 24 End Sub Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 27 Then Unload frmParametros End If End Sub Private Sub Form_Load() Dim i& Dim rstInfo As ADODB.Recordset blnCambioFecha = False drpCalendario.Value = Date If Weekday(drpCalendario.Value) = 1 Then drpCalendario.Value = drpCalendario.Value + 1 cbxHora(0).Clear cbxHora(1).Clear For i = 8 To 17 cbxHora(0).AddItem CStr(i) Next i cbxHora(0).ListIndex = 0 For i = 8 To 17 cbxHora(1).AddItem CStr(i) Next i cbxHora(1).ListIndex = 1 Else If Weekday(drpCalendario .Value) = 7 Then cbxHora(0).Clear cbxHora(1).Clear For i = 8 To 12 cbxHora(0).AddItem CStr(i) Next i cbxHora(0).ListIndex = 0 For i = 8 To 12 cbxHora(1).AddItem CStr(i) Next i cbxHora(1).ListIndex = 1 Else cbxHora(0).Clear cbxHora(1).Clear For i = 8 To 17 cbxHora(0).AddItem CStr(i) Next i cbxHora(0).ListIndex = 0 For i = 8 To 17 cbxHora(1).AddItem CStr(i) Next i cbxHora(1).ListIndex = 1 End If End If With cbxHora(2) .AddItem "(Ninguna)" .AddItem "Por mayor frecuencia" .ListIndex = 0 End With If gblnSimulacionAnterior Then 'Mostrar datos de la última generación Set rstInfo = New ADODB.Recordset rstInfo.Open "SELECT * FROM GeneracionEncabezado " _ & "WHERE Bco_Codigo = " & CStr(gCodBanco) & " And Suc_Codigo = " & CStr(gCodSucur), gCn, adOpenStatic, adLockOptimistic, adCmdText If Not rstInfo.EOF Then drpCalendario.Value = rstInfo!DiaCalendario If Weekday(drpCalendario.Value) = 1 Then Manual del Programador CODIGO Simulation Bank Queue 25 drpCalendario.Value = drpCalendario.Value + 1 cbxHora(0).Clear cbxHora(1).Clear For i = 8 To 17 cbxHora(0).AddIt em CStr(i) Next i cbxHora(0).ListIndex = 0 For i = 8 To 17 cbxHora(1).AddItem CStr(i) Next i cbxHora(1).ListIndex = 1 Else If Weekday(drpCalendario.Value) = 7 Then cbxHora(0).Clear cbxHora(1).Clear For i = 8 To 12 cbxHora(0).AddItem CStr(i) Next i cbxHora(0).ListIndex = 0 For i = 8 To 12 cbxHora(1).AddItem CStr(i) Next i cbxHora(1).ListIndex = 1 Else cbxHora(0).Clear cbxHora(1).Clear For i = 8 To 17 cbxHora(0).AddItem CStr(i) Next i cbxHora(0).ListIndex = 0 For i = 8 To 17 cbxHora(1).AddItem CStr(i) Next i cbxHora(1).ListIndex = 1 End If End If txtSimu = Trim(CStr(rstInfo!NumServidores)) End If procCerrarRecordset rstInfo End If End Sub Private Sub Form_Unload(Cancel As Integer) gblnSimulacionAnterior = False End Sub Private Sub txtSimu_GotFocus() If txtSimu = "0" Then txtSimu = "" End If End Sub Private Sub txtSimu_KeyDown(KeyCode As Integer, Shift As Integer) HacerTab KeyCode End Sub Private Sub txtSimu_KeyPress(KeyAscii As Integer) If (Chr(KeyAscii) >= "0" And Chr(KeyAscii) <= "9") Then 'Ok Else If KeyAscii >= 32 Or KeyAscii = 13 Then KeyAscii = 0 End If End Sub Private Sub txtSimu_LostFocus() If Trim(txtSimu) = "" Then txtSimu = "0" End If If Not IsNumeric(txtSimu) Then MsgBox "El campo no posee un valor numérico", vbInformation, MSGVALI Manual del Programador CODIGO Simulation Bank Queue 26 txtSimu.SetFocus Exit Sub End If txtSimu = Trim(CStr(Val(txtSimu))) End Sub FrmInicioSimulacion Option Explicit Private Sub cmbSimu_Click(Index As Integer) If Index = 0 Then Load frmParametros frmParametros.Show Unload frmInicioSimulacion Else Unload frmInicioSimulacion gblnSimulacionAnterior = False frmSeleccionBanco.Show End If End Sub Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 27 Then Unload frmInicioSimulacion frmSeleccionBanco.Show End If End Sub FrmPress Option Explicit ''''''''''''''''''''''''' 'Pantalla de presentación 'inicial ''''''''''''''''''''''''' Private Sub Form_Activate() Espera 1 End Sub Private Sub Timer1_Timer() frmPress.Hide Load frmSeleccionBanco frmSeleccionBanco.Show End Sub FrmProgreso Option Explicit Public gTipo As Byte Private Sub Form_Activate() Select Case gTipo Case 0 GrabarInformacionDeNuevoBanco End Select Unload frmProgreso End Sub Private Sub Form_Load() Espera End Sub Private Sub Form_Unload(Cancel As Integer) Espera 1 End Sub Manual del Programador CODIGO Simulation Bank Queue 27 FrmRecepcionDeDatos Option Explicit Public gTipo As Byte Public gLngIdBanco& Function HoraYaIntroducida(ByRef lsvLista As ListView, ByVal Dia As Integer, ByVal Hora As Integer) As Boolean Dim i& HoraYaIntroducida = False For i = 1 To lsvLista.ListItems.Count If CInt(lsvLista.ListItems(i).ListSubItems(1)) = Dia And CInt(lsvLista.ListItems(i).ListSubItems(2)) = Hora Then HoraYaIntroducida = True Exit For End If Next i End Function Function Validar(ByVal Tipo As Integer) As Boolean Validar = False Select Case Tipo 'Colas Case 0 'Entrada If Trim(txtSimu(2)) = "" Then MsgBox "Debe digitar el día", vbInformation, MSGVALI txtSimu(2).SetFocus Exit Function End If If Trim(txtSimu(3)) = "" Then MsgBox "Debe digitar la hora", vbInformation, MSGVALI txtSimu(3).SetFocus Exit Function End If If mskSimu(3).Text = "__:__" Then MsgBox "Debe digitar el tiempo en minutos/segundos", vbInformation, MSGVALI mskSimu(3).SetFocus Exit Function End If If Val(txtSimu(2)) < 1 Or Val(txtSimu(2)) > 31 Then MsgBox "Día debe estar en el rango de 1 y 30 días", vbInformation, MSGVALI txtSimu(2).SetFocus Exit Function End If If Val(txtSimu(3)) < 0 Or Val(txtSimu(3)) > 24 Then MsgBox "Día debe estar en el rango de 0 y 24 horas", vbInformation, MSGVALI txtSimu(3).SetFocus Exit Function End If Case 1 'Salida If Trim(txtSimu(5)) = "" Then MsgBox "Debe digitar el día", vbInformation, MSGVALI txtSimu(5).SetFocus Exit Function End If If Trim(txtSimu(6)) = "" Then MsgBox "Debe digitar la hora", vbInformation, MSGVALI txtSimu(6).SetFocus Exit Function End If If mskSimu(4).Text = "__:__" Then MsgBox "Debe digitar el tiempo en minutos/segundos", vbInformation, MSGVALI mskSimu(4).SetFocus Exit Function End If If Val(txtSimu(5)) < 1 Or Val(txtSimu(5)) > 31 Then MsgBox "Día debe estar en el rango de 1 y 30 días", vbInformation, MSGVALI txtSimu(5).SetFocus Manual del Programador CODIGO Simulation Bank Queue 28 Exit Function End If If Val(txtSimu(6)) < 0 Or Val(txtSimu(6)) > 24 Then MsgBox "Día debe estar en el rango de 0 y 24 horas", vbInformation, MSGVALI txtSimu(6).SetFocus Exit Function End If 'Transacciones Case 4 If Trim(txtSimu(14)) = "" Then MsgBox "Debe digitar el nombre de la transacción", vbInformation, MSGVALI txtSimu(14).SetFocus Exit Function End If If Trim(mskSimu(15)) = "__:__" Then MsgBox "Debe digitar el tiempo en minutos/segundos", vbInformation, MSGVALI mskSimu(15).SetFocus Exit Function End If End Select Validar = True End Function Sub MostrarFrame(ByVal Indice As Integer) Dim i% For i = Frame2.LBound To Frame2.UBound Frame2(i).Visible = False Next i Frame2(Indice).ZOrder Frame2(Indice).Top = 2640 Frame2(Indice).Left = 2520 Frame2(Indice).Visible = True End Sub Private Sub cmbAdd_Click(Index As Integer) Dim itm As ListItem Select Case Index Case 0 If Validar(0) Then If HoraYaIntroducida(lsvTbl(0), CInt(txtSimu(2)), CInt(txtSimu(3))) Then MsgBox "No se puede introducir una hora más de una vez en un mismo día", vbCritical, MSGVALI txtSimu(2).SetFocus Exit Sub End If Set itm = lsvTbl(0).ListItems.Add(lsvTbl(0).ListItems.Count + 1, , , 0) itm.SubItems(1) = txtSimu(2) itm.SubItems(2) = txtSimu(3) itm.SubItems(3) = mskSimu(3) itm.SubItems(4) = txtSimu(4) txtSimu(2) = "" txtSimu(3) = "" mskSimu(3) = "__:__" txtSimu(4) = "0" txtSimu(2).SetFocus End If Case 1 If Validar(1) Then If HoraYaIntroducida(lsvTbl(1), CInt(txtSimu(5)), CInt(txtSimu(6))) Then MsgBox "No se puede introducir una hora más de una vez en un mismo día", vbCritical, MSGVALI txtSimu(5).SetFocus Exit Sub End If Set itm = lsvTbl(1).ListItems.Add(lsvTbl(1).ListItems.Count + 1, , , 0) itm.SubItems(1) = txtSimu(5) itm.SubItems(2) = txtSimu(6) Manual del Programador CODIGO Simulation Bank Queue 29 itm.SubItems(3) = mskSimu(4) itm.SubItems(4) = txtSimu(7) txtSimu(5) = "" txtSimu(6) = "" mskSimu(4) = "__:__" txtSimu(7) = "0" txtSimu(5).SetFocus End If Case 4 If Validar(4) Then Set itm = lsvTbl(4).ListItems.Add(lsvTbl(4).ListItems.Count + 1, , txtSimu(14), 0) itm.SubItems(1) = mskSimu(15) itm.SubItems(2) = txtSimu(15) itm.SubItems(3) = IIf(Trim(txtSimu(16)) = "", 0, txtSimu(16)) txtSimu(14) = "" mskSimu(15) = "__:__" txtSimu(15) = "0" txtSimu(16) = "" txtSimu(14).SetFocus End If End Select End Sub Private Sub cmbSimu_Click(Index As Integer) Select Case Index Case 0 Select Case True Case Frame2(1).Visible MostrarFrame 0 cmbSimu(0).Enabled = False cmbSimu(1).Enabled = True cmbSimu(4).Enabled = False End Select Case 1 Select Case True Case Frame2(0).Visible MostrarFrame 1 cmbSimu(0).Enabled = True Case Frame2(1).Visible MostrarFrame 2 cmbSimu(1).Enabled = False cmbSimu(4).Enabled = True End Select cmbSimu(4).Enabled = True cmbSimu(1).Enabled = False Case 2 If MsgBox("Si cierra esta ventana perderá la informacion introducida. Desea continuar?", vbQuestion + vbYesNo, MSGCONF) = vbYes Then Unload frmRecepcionDeDatos frmSeleccionBanco.Show End If Case 3 Load frmImportar frmImportar.Show 1 Case 4 If Frame2(1).Visible Then 'Validar información y grabar txtSimu(0) = Trim(txtSimu(0)) txtSimu(1) = Trim(txtSimu(1)) If txtSimu(0) = "" Then MsgBox "Debe introducir el nombre del banco", vbInformation, MSGVALI Manual del Programador CODIGO Simulation Bank Queue 30 txtSimu(0).SetFocus Exit Sub End If If txtSimu(1) = "" Then MsgBox "Debe introducir el nombre de la sucursal", vbInformation, MSGVALI txtSimu(1).SetFocus Exit Sub End If If lsvTbl(0).ListItems.Count = 0 Then MsgBox "Debe introducir datos de entrada de cola", vbInformation, MSGVALI cmbSimu_Click 0 cmbSimu_Click 0 txtSimu(3).SetFocus Else If lsvTbl(1).ListItems.Count = 0 Then MsgBox "Debe introducir datos de salida de cola", vbInformation, MSGVALI cmbSimu_Click 0 cmbSimu_Click 0 txtSimu(6).SetFocus Else If lsvTbl(4).ListItems.Count = 0 Then MsgBox "Debe introducir las transacciones del banco", vbInformation, MSGVALI txtSimu(14).SetFocus Else gstrNombreBanco = txtSimu(0) gstrNombreSucursal = txtSimu(1) frmProgreso.gTipo = 0 Load frmProgreso frmProgreso.Show 1 Unload frmRecepcionDeDatos Load frmInicioSimulacion frmInicioSimulacion.Show End If End If End If End If End Select End Sub Private Sub Form_Activate() Espera 1 End Sub Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 27 Then Unload frmRecepcionDeDatos frmSeleccionBanco.Show End If End Sub Private Sub Form_Load() Espera Select Case gTipo Case 0 frmRecepcionDeDatos.Caption = "Creando banco" Case 1 frmRecepcionDeDatos.Caption = "Creando sucursal" txtSimu(0) = frmSeleccionBanco.cbxBanco txtSimu(0).Enabled = False Case 2 txtSimu(0) = gstrNombreBanco txtSimu(0).Enabled = False txtSimu(1) = gstrNombreSucursal txtSimu(1).Enabled = False frmRecepcionDeDatos.Caption = "Capturando nuevos datos" End Select MostrarFrame 0 End Sub Manual del Programador CODIGO Simulation Bank Queue 31 Private Sub mskSimu_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer) HacerTab KeyCode End Sub Private Sub mskSimu_Validate(Index As Integer, Cancel As Boolean) Dim intTiempo As Long If mskSimu(Index).ClipText <> "" Then If Not fncHoraValida("00:" & mskSimu(Index)) Then MsgBox "Hora no válida", vbExclamation, MSGVALI Cancel = True Select Case Index Case 0 txtSimu(10) = "0" Case 1 txtSimu(13) = "0" Case 3 txtSimu(4) = "0" Case 4 txtSimu(7) = "0" Case 15 txtSimu(15) = "0" End Select mskSimu(Index).SetFocus Else mskSimu(Index) = fncFORMATO_HORAMMSS(dtpHora.Value) intTiempo = Minute(dtpHora.Value) * 60 + Second(dtpHora.Value) Select Case Index Case 0 txtSimu(10) = intTiempo Case 1 txtSimu(13) = intTiempo Case 3 txtSimu(4) = intTiempo Case 4 txtSimu(7) = intTiempo Case 15 txtSimu(15) = intTiempo End Select End If End If End Sub Private Sub txtSimu_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer) HacerTab KeyCode End Sub Private Sub txtSimu_KeyPress(Index As Integer, KeyAscii As Integer) Select Case Index Case 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 If (Chr(KeyAscii) >= "0" And Chr(KeyAscii) <= "9") Then 'Ok Else If KeyAscii >= 32 Or KeyAscii = 13 Then KeyAscii = 0 End If Case Else procConvMayusculas KeyAscii End Select End Sub Private Sub txtSimu_LostFocus(Index As Integer) Select Case Index Case 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 If Not IsNumeric(txtSimu(Index)) And Trim(txtSimu(Index)) <> "" Then MsgBox "El campo no posee un valor numérico", vbInformation, MSGVALI txtSimu(Index).SetFocus Exit Sub End If End Select End Sub FrmReportes Manual del Programador CODIGO Simulation Bank Queue 32 Option Explicit Sub ProcPromedios(ByVal intTipo As Integer) Dim db_local As DAO.Database Dim rstInfo As DAO.Recordset Dim rstDatosGraficos As DAO.Recordset Set db_local = OpenDatabase(App.Path & "\VeVsSimuColas.mdb", False, False) If intTipo = 0 Then db_local.Execute "DELETE * FROM _PromediosCola;" Set rstDatosGraficos = db_local.OpenRecordset("SELECT Hora, VPromEntCola, VPromSalCola FROM _PromediosCola", dbOpenDynaset) Set rstInfo = db_local.OpenRecordset("SELECT * " _ & "FROM Qry_PromedioEntradaCola " _ & "WHERE Bco_Codigo=" & gCodBanco & " AND Suc_Codigo=" & gCodSucur & " AND Fecha=#" & frmSimulacion.lblFecha.Tag & "#", dbOpenSnapshot) While Not rstInfo.EOF rstDatosGraficos.FindFirst "Hora = '" & rstInfo!Hora & "'" If rstDatosGraficos.NoMatch Then rstDatosGraficos.AddNew rstDatosGraficos!Hora = rstInfo!Hora rstDatosGraficos!VPromEntCola = Round(rstInfo!PromedioDeVEntCola, 0) rstDatosGraficos!VPromSalCola = 0 End If rstDatosGraficos.Update rstInfo.MoveNext Wend Set rstInfo = db_local.OpenRecordset("SELECT * " _ & "FROM Qry_PromedioSalidaCola " _ & "WHERE Bco_Codigo=" & gCodBanco & " AND Suc_Codigo=" & gCodSucur & " AND Fecha=#" & frmSimulacion.lblFecha.Tag & "#", dbOpenSnapshot) While Not rstInfo.EOF rstDatosGraficos.FindFirst "Hora = '" & rstInfo!Hora & "'" If rstDatosGraficos.NoMatch Then rstDatosGraficos.AddNew rstDatosGraficos!Hora = rstInfo!Hora rstDatosGraficos!VPromEntCola = 0 rstDatosGraficos!VPromSalCola = Round(rstInfo!PromedioDeVSalCola, 0) Else rstDatosGraficos.Edit rstDatosGraficos!VPromSalCola = rstDatosGraficos!VPromSalCola + Round(rstInfo!PromedioDeVSalCola, 0) End If rstDatosGraficos.Update rstInfo.MoveNext Wend Else db_local.Execute "DELETE * FROM _PromediosServicio;" Set rstDatosGraficos = db_local.OpenRecordset("SELECT Hora, VPromEntServ, VPromSalServ FROM _PromediosServicio", dbOpenDynaset) Set rstInfo = db_local.OpenRecordset("SELECT * " _ & "FROM Qry_PromedioEntradaServ " _ & "WHERE Bco_Codigo=" & gCodBanco & " AND Suc_Codigo=" & gCodSucur & " AND Fecha=#" & frmSimulacion.lblFecha.Tag & "#", dbOpenSnapshot) While Not rstInfo.EOF rstDatosGraficos.FindFirst "Hora = '" & rstInfo!Hora & "'" If rstDatosGraficos.NoMatch Then rstDatosGraficos.AddNew rstDatosGraficos!Hora = rstInfo!Hora rstDatosGraficos!VPromEntServ = Round(rstInfo!PromedioDeVEntServ, 0) rstDatosGraficos!VPromSalServ = 0 End If rstDatosGraficos.Update rstInfo.MoveNext Wend Set rstInfo = db_local.OpenRecordset("SELECT * " _ & "FROM Qry_PromedioSalidaServ " _ Manual del Programador CODIGO Simulation Bank Queue 33 & "WHERE Bco_Codigo=" & gCodBanco & " AND Suc_Codigo=" & gCodSucur & " AND Fecha=#" & frmSimulacion.lblFecha.Tag & "#", dbOpenSnapshot) While Not rstInfo.EOF rstDatosGraficos.FindFirst "Hora = '" & rstInfo!Hora & "'" If rstDatosGraficos.NoMatch Then rstDatosGraficos.AddNew rstDatosGraficos!Hora = rstInfo!Hora rstDatosGraficos!VPromEntServ = 0 rstDatosGraficos!VPromSalServ = Round(rstInfo!PromedioDeVSalServ, 0) Else rstDatosGraficos.Edit rstDatosGraficos!VPromSalServ = rstDatosGraficos!VPromSalServ + Round(rstInfo!PromedioDeVSalServ, 0) End If rstDatosGraficos.Update rstInfo.MoveNext Wend End If db_local.Close Set db_local = Nothing End Sub Private Sub cmbSimu_Click(Index As Integer) If Index = 0 Then Select Case List1.ListIndex Case 0 ProcPromedios 0 With CrystalReport1 .Reset .WindowState = crptMaximized .ReportFileName = App.Path & "\repPromedioEntSalCola.rpt" .WindowTitle = List1 .Formulas(0) = "BANCO='" & gstrNombreBanco & "'" .Formulas(1) = "SUCURSAL='" & gstrNombreSucursal & "'" .Action = 1 End With Case 1 ProcPromedios 1 With CrystalReport1 .Reset .WindowState = crptMaximized .ReportFileName = App.Path & "\repPromedioEntSalServ.rpt" .WindowTitle = List1 .Formulas(0) = "BANCO='" & gstrNombreBanco & "'" .Formulas(1) = "SUCURSAL='" & gstrNombreSucursal & "'" .Action = 1 End With Case 2 With CrystalReport1 .Reset .WindowState = crptMaximized .ReportFileName = App.Path & "\repEntradaSalidaPorHora.rpt" .WindowTitle = List1 .Formulas(0) = "BANCO='" & gstrNombreBanco & "'" .Formulas(1) = "SUCURSAL='" & gstrNombreSucursal & "'" .Action = 1 End With Case 3 With Cryst alReport1 .Reset .WindowState = crptMaximized .ReportFileName = App.Path & "\repCantPersonasCajero.rpt" .WindowTitle = List1 .Formulas(0) = "BANCO='" & gstrNombreBanco & "'" Manual del Programador CODIGO Simulation Bank Queue 34 .Formulas(1) = "SUCURSAL='" & gstrNombreSucursal & "'" .SelectionFormula = "{PersonasPorCajero.Bco_Codigo}=" & gCodBanco & " AND " & _ "{PersonasPorCajero.Suc_Codigo}=" & gCodSucur .Action = 1 End With Case 4 With CrystalReport1 .Reset .WindowState = crptMaximized .ReportFileName = App.Path & "\repCantPersonasCajeroPorHora.rpt" .WindowTitle = List1 .Formulas(0) = "BANCO='" & gstrNombreBanco & "'" .Formulas(1) = "SUCURSAL='" & gstrNombreSucursal & "'" .SelectionFormula = "{PersonasPorCajeroFto2.Bco_Codigo}=" & gCodBanco & " AND " & _ "{PersonasPorCajeroFto2.Suc_Codigo}=" & gCodSucur .Action = 1 End With Case 5 With CrystalReport1 .Reset .WindowState = crptMaximized .ReportFileName = App.Path & "\repTransaccionesPorCajero.rpt" .WindowTitle = List1 .Formulas(0) = "BANCO='" & gstrNombreBanco & "'" .Formulas(1) = "SUCURSAL='" & gstrNombreSucursal & "'" .SelectionFormula = "{QryTransaccionesPorCajero.Bco_Codigo}=" & gCodBanco & " AND " & _ "{QryTransaccionesPorCajero.Suc_Codigo}=" & gCodSucur & " AND " & _ "{QryTransaccionesPorCajero.Dia}=" & frmSimulacion.lblDia .Action = 1 End With Case 6 With CrystalReport1 .Reset .WindowState = crptMaximized .ReportFileName = App.Path & "\repTransacciones.rpt" .WindowTitle = List1 .Formulas(0) = "BANCO='" & gstrNombreBanco & "'" .SelectionFormula = "{PromTrans.Bco_Codigo}=" & gCodBanco .Action = 1 End With Case 7 With CrystalReport1 .Reset .WindowState = crptMaximized .ReportFileName = App.Path & "\repTiempoSistemaPersonasSelecc.rpt" .WindowTitle = List1 .Formulas(0) = "BANCO='" & gstrNombreBanco & "'" .Formulas(1) = "SUCURSAL='" & gstrNombreSucursal & "'" .Action = 1 End With Case 8 With CrystalReport1 .Reset .WindowState = crptMaximized .ReportFileName = App.Path & "\repTransaccionesPorHora.rpt" .WindowTitle = List1 .Formulas(0) = "BANCO='" & gstrNombreBanco & "'" .Formulas(1) = "SUCURSAL='" & gstrNombreSucursal & "'" .Action = 1 End With End Select Else Unload frmReportes Manual del Programador CODIGO Simulation Bank Queue 35 If Not frmResultados.Visible Then frmSimulacion.Show End If End If End Sub Private Sub Form_Load() If frmSimulacion.Visible Then frmSimulacion.Hide End If With List1 .AddItem "Promedio de Entrada/Salida en cola" .AddItem "Promedio de Entrada/Salida en servicio" .AddItem "Cantidad de personas que entran por hora y salen" .AddItem "Cantidad de personas atendidas por cajero" .AddItem "Cantidad de personas atendidas por cajero por hora" .AddItem "Cantidad de transacciones por cajero" .AddItem "Tipos de transacciones" .AddItem "Tiempo en sistema de personas seleccionadas" .AddItem "Transacciones por hora" .ListIndex = 0 End With End Sub Private Sub List1_KeyDown(KeyCode As Integer, Shift As Integer) HacerTab KeyCode End Sub FrmResultados Option Explicit Private Sub cmbResultados_Click(Index As Integer) Select Case Index Case 0 With CrystalReport1 .ReportFileName = App.Path & "\repResultados.rpt" .Formulas(0) = "DIA='" & lblFecha & "'" .Formulas(1) = "HORAINICIAL='" & lblHoraIni & "'" .Formulas(2) = "HORAFINAL='" & lblHoraFin & "'" .Formulas(3) = "CANTENTRAN='" & lblCantEntrado & "'" .Formulas(4) = "CANTATENDIDAS='" & lblCantSalida & "'" .Formulas(5) = "SERVIDORES='" & lblCantServ & "'" .Formulas(6) = "DESERCIONES='" & lblNumDeserciones & "'" .Formulas(7) = "TRANSACCIONES='" & lblNumTransacciones & "'" .Formulas(8) = "BANCO='" & gstrNombreBanco & "'" .Formulas(9) = "SUCURSAL='" & gstrNombreSucursal & "'" .Formulas(10) = "CANTENCOLA='" & CInt(lblCantEntrado) - CInt(lblCantSalida) & "'" .Action = 1 End With Case 1 'Grabar resultados de la simulacion gCn.Execute "UPDATE GeneracionEncabezado " _ & "SET NumServidores=" & lblCantServ & ", " _ & "CantPersonasEntran=" & lblCantEntrado & ", " _ & "CantPersonasSalen=" & lblCantSalida & ", " _ & "Deserciones=" & lblNumDeserciones & ", " _ & "CantTransacciones=" & lblNumTransacciones & " " _ & "WHERE Bco_Codigo=" & CStr(gCodBanco) & " AND " _ & "Suc_Codigo=" & CStr(gCodSucur) & " AND " _ & "DiaCalendario=#" & frmSimulacion.lblFecha.Tag & "# AND " _ & "Id=" & gIdSimulacion & ";" MsgBox "La informacion se grabo existosamente", vbInformation, MSGINFO frmSimulacion.mnuComparacion.Enabled = True frmSimulacion.gGrabadaSimulacion = True Case 2 Load frmReportes Manual del Programador CODIGO Simulation Bank Queue 36 frmReportes.Show 1 Case 3 Unload frmResultados frmSimulacion.Show End Select End Sub Private Sub Form_Load() On Error GoTo ErrHandler frmSimulacion.Hide lblDia = frmSimulacion.lblDia lblHoraIni = frmSimulacion.lblHoraIni lblHoraFin = frmSimulacion.lblHoraFin lblFecha = frmSimulacion.lblFecha lblCantEntrado = frmSimulacion.lblCantEntrado lblCantSalida = frmSimulacion.lblCantSalida lblCantServ = frmSimulacion.lblCantServ lblNumDeserciones = frmSimulacion.lblDeserciones lblNumTransacciones = Format(fncNumeroTransacciones(Val(frmSimulacion.lblDia)), "###,###,###,###,###") Exit Sub ErrHandler: Resume Next End Sub FrmSeleccionAnalisis Option Explicit Private Sub cmbSimu_Click(Index As Integer) Select Case Index Case 0 Unload frmSeleccionAnalisis gblnSimulacionAnterior = True Load frmInicioSimulacion frmInicioSimulacion.Show Case 1 Unload frmSeleccionAnalisis gblnSimulacionAnterior = False frmRecepcionDeDatos.gTipo = 2 Load frmRecepcionDeDatos frmRecepcionDeDatos.Show Case 2 Unload frmSeleccionAnalisis gblnSimulacionAnterior = False frmSeleccionBanco.Show End Select End Sub Private Sub Form_Activate() Espera 1 End Sub Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 27 Then Unload frmSeleccionAnalisis frmSeleccionBanco.Show End If End Sub Manual del Programador CODIGO Simulation Bank Queue 37 FrmSeleccionBanco Option Explicit 'Procedimiento que muestra los nombres 'de los bancos en el DataCombo de bancos Sub MostrarBancos() Dim rstBancos As New ADODB.Recordset rstBancos.Open "SELECT Bco_Nombre FROM Bancos ORDER BY Bco_Nombre;", gCn, adOpenStatic, adLockReadOnly, adCmdText If Not rstBancos.EOF Then While Not rstBancos.EOF cbxBanco.AddItem rstBancos.Fields(0) rstBancos.MoveNext Wend cbxBanco.ListIndex = 0 Else cmbSimu(1).Enabled = False cmbSimu(2).Enabled = False cmbSimu(0).Default = True End If procCerrarRecordset rstBancos End Sub 'Procedimiento que muestra los nombres 'de las sucursales según el banco seleccionado Sub MostrarSucursales() Dim rstSucursales As New ADODB.Recordset cbxSucursal.Clear rstSucursales.Open "SELECT Sucursales.Suc_Nombre " _ & "FROM Bancos INNER JOIN Sucursales ON Bancos.Bco_Codigo = Sucursales.Bco_Codigo " _ & "Where Bancos.Bco_Nombre = '" & cbxBanco & "' ORDER BY Sucursales.Suc_Nombre", gCn, adOpenStatic, adLockReadOnly, adCmdText If Not rstSucursales.EOF Then cmbSimu(2).Enabled = True While Not rstSucursales.EOF cbxSucursal.AddItem rstSucursales.Fields(0) rstSucursales.MoveNext Wend cbxSucursal.ListIndex = 0 Else cmbSimu(2).Enabled = False End If procCerrarRecordset rstSucursales End Sub Private Sub cbxBanco_Click() MostrarSucursales End Sub Private Sub cbxBanco_KeyDown(KeyCode As Integer, Shift As Integer) HacerTab KeyCode End Sub Private Sub cbxSucursal_KeyDown(KeyCode As Integer, Shift As Integer) HacerTab KeyCode End Sub Private Sub cmbSimu_Click(Index As Integer) Dim rstCodigos As ADODB.Recordset Select Case Index Case 0, 1 'Formulario para captura de nuevo banco, nueva sucursal 'y tablas generales If Index = 0 Then frmRecepcionDeDatos.gTipo = 0 Else Set rstCodigos = New ADODB.Recordset rstCodigos.Open "SELECT Bancos.Bco_Codigo " _ & "From Bancos " _ & "WHERE Bancos.Bco_Nombre='" & cbxBanco & "'", gCn, adOpenStatic, adLockOptimistic, adCmdText If Not rstCodigos.EOF Then gCodBanco = rstCodigos.Fields(0) Manual del Programador CODIGO Simulation Bank Queue 38 End If procCerrarRecordset rstCodigos frmRecepcionDeDatos.gTipo = 1 End If Load frmRecepcionDeDatos frmRecepcionDeDatos.Show frmSeleccionBanco.Hide Case 2 'Formulario para realizar el análisis Set rstCodigos = New ADODB.Recordset rstCodigos.Open "SELECT Bancos.Bco_Codigo " _ & "From Bancos " _ & "WHERE Bancos.Bco_Nombre='" & cbxBanco & "'", gCn, adOpenStatic, adLockOptimistic, adCmdText If Not rstCodigos.EOF Then gCodBanco = rstCodigos.Fields(0) End If procCerrarRecordset rstCodigos Set rstCodigos = New ADODB.Recordset rstCodigos.Open "SELECT Sucursales.Suc_Codigo " _ & "FROM Bancos INNER JOIN Sucursales ON Bancos.Bco_Codigo = Sucursales.Bco_Codigo " _ & "WHERE Sucursales.Bco_Codigo=" & gCodBanco & " AND Sucursales.Suc_Nombre='" & cbxSucursal & "'", gCn, adOpenStatic, adLockOptimistic, adCmdText If Not rst Codigos.EOF Then gCodSucur = rstCodigos.Fields(0) End If procCerrarRecordset rstCodigos gstrNombreBanco = cbxBanco gstrNombreSucursal = cbxSucursal Load frmSeleccionAnalisis frmSeleccionAnalisis.Show frmSeleccionBanco.Hide Case 3 CerrarSistema End Select End Sub Private Sub Form_Load() Unload frmPress MostrarBancos End Sub FrmSimulacion Option Explicit 'Variables públicas Public gintDia As Integer Public gintNumcajeros As Integer Public gdblVEntCola# Public gdblVSalCola# Public gGrabadaSimulacion As Boolean Public gPerfilTransacc As Byte Public gDiaReal% 'Variables locales Dim mdteHoraSistema As Date Dim mdteHoraSistemaFinal As Date 'Dim arrayCajero(0 To 14) As typeCajero Dim mblnAgregarClientes As Boolean Dim mlngCantIngresoUnaHora& Dim mintPersonasEntranColaUnaHora% Dim mPromedioIngresoSeisMin% Dim mintPersonasEntranCola% Dim mintPersonasSalenCola% Dim mFinalizarSimulacionas As Boolean Dim mContinuarCasoEspecial As Boolean Manual del Programador CODIGO Simulation Bank Queue 39 Dim mmbteImagenAleatoria& Dim mmlngUltimoVisible& Dim mlngCantSalidaUnaHora& Dim mintPersonasSalenColaUnaHora% Dim mblnCambiarCajeros As Boolean Dim mblnDesertar As Boolean Dim mblnCasoEsp As Boolean Dim mPromedioSalidaSeisMin% Dim mtmpClientesPasarocajero% Dim intHoraTemp As Date Dim TiempoSimuDesercion As Double Dim TiempoSimuCasoEspecial As Double Dim dteHoraFiltro1 As Date Dim dteHoraFiltro2 As Date Dim db_local As DAO.Database Public lng_VEntCola& Public lng_VSalCola& Public lng_VEntServ& Public lng_VSalServ& Sub ClientesCola(ByVal lngClientes As Long) Dim i& For i = imgCliente.LBound To imgCliente.UBound If lngClientes > 0 Then imgCliente(i).Visible = True lngClientes = lngClientes - 1 Else imgCliente(i).Visible = False End If Next i End Sub Function SimulaciónFinalizada() As Boolean Dim rstComprob As DAO.Recordset Dim i% If lblHoraFin <> "05:00 PM" Then 'Hora de finalización antes del final del dia If Format(mdteHoraSistema, "hh:mm AM/PM") = lblHoraFin Then SimulaciónFinalizada = True End If Else If mdteHoraSistemaFinal >= #5:00:00 PM# Then 'Hora de finalización al final del día Set rstComprob = db_local.OpenRecordset("SELECT Bco_Codigo, HanSalidoDeCola, Desercion " _ & "From CajerosTiemposES " _ & "WHERE HanSalidoDeCola=False AND Desercion=False AND " _ & "Bco_Codigo=" & gCodBanco & " AND " _ & "Suc_Codigo=" & gCodSucur & " AND Dia=" & lblDia & " AND " _ & "Fecha=#" & lblFecha.Tag & "#;", dbOpenSnapshot) If Not rstComprob.EOF Then If IsNull(rstComprob!Bco_Codigo) Then For i = imgAtendCajero.LBound To imgAtendCajero.UBound imgAtendCajero(i).Visible = False Next i SimulaciónFinalizada = True End If Else For i = imgAtendCajero.LBound To imgAtendCajero.UBound imgAtendCajero(i).Visible = False Next i SimulaciónFinalizada = True End If rstComprob.Close End If End If End Function Sub CambiarHoraAuxiliar() db_local.Execute "UPDATE CajerosTiemposES " _ & "SET HoraAuxiliar = '" & Format(mdteHoraSistema, "hh:mm:ss") & "' " _ Manual del Programador CODIGO Simulation Bank Queue 40 & "WHERE DebenSalirDeCola=False AND HanSalidoDeCola=FALSE AND Hora=" & Hour(mdteHoraSistema) - 1 End Sub Function fncIdUltimaPersonaNoHaEntrado() As Long Dim i& For i = 0 To 250000 If Not gArregloClientes(i).EntroACola Then fncIdUltimaPersonaNoHaEntrado = i Exit For End If Next i End Function Sub MarcarLasPersonasQueSaldranEnUnaHora() Dim lngCantPersonasSalenUnaHora& Dim rstMarcar As DAO.Recordset Dim strHoraIni$ Dim strHoraFin$ 'Inicio de una hora, calcular la velocidad de salida de cola 'promedio en base a la relación del número de cajeros lngCantPersonasSalenUnaHora = Round(360000 / fncPromedioSalCola(mdteHoraSistema, CInt(lblDia)) * 10, 0) * (CInt(lblCantServ) / 5) 'Marcar el número de personas que saldran en la hora actual strHoraIni = Left(Format(mdteHoraSistema, "HH:MM"), 2) & ":00:00" strHoraFin = Left(Format(mdteHoraSistema, "HH:MM"), 2) & ":59:59" Set rstMarcar = db_local.OpenRecordset("SELECT HanSalidoDeCola, DebenSalirDeCola, Desercion " _ & "From CajerosTiemposES " _ & "WHERE Bco_Codigo=" & gCodBanco & " AND " _ & "Suc_Codigo=" & gCodSucur & " AND Dia=" & lblDia & " AND " _ & "Fecha=#" & lblFecha.Tag & "# AND " _ & "HoraAuxiliar Between #12/30/1899 " & strHoraIni & "# And #12/30/1899 " & strHoraFin & "# AND Desercion = False " _ & "ORDER BY NumCliente", dbOpenDynaset) With rstMarcar If Format(mdteHoraSistema, "hh:mm AM/PM") = lblHoraFin Then While Not .EOF If !Desercion = False Then .Edit !DebenSalirDeCola = True .Update End If .MoveNext Wend Else While Not .EOF If lngCantPersonasSalenUnaHora > 0 Then .Edit !DebenSalirDeCola = True .Update Else If !HanSalidoDeCola = False Then .Edit !DebenSalirDeCola = False .Update End If End If lngCantPersonasSalenUnaHora = lngCantPersonasSalenUnaHora - 1 .MoveNext Wend End If .Close End With Set rstMarcar = Nothing End Sub Function PrimeraPersonaNoVisible() As Variant Dim i& PrimeraPersonaNoVisible = Null Manual del Programador CODIGO Simulation Bank Queue 41 For i = imgCliente.LBound To imgCliente.UBound If Not imgCliente(i).Visible Then PrimeraPersonaNoVisible = i Exit For End If Next i End Function Function UltimaPersonaVisible() As Variant Dim i& ' UltimaPersonaVisible = Null ' For i = imgCliente.LBound To imgCliente.UBound ' If Not imgCliente(i).Visible Then ' If i - 1 >= 0 Then ' UltimaPersonaVisible = i - 1 ' Else ' Exit For ' End If ' Exit For ' End If ' Next i UltimaPersonaVisible = Null For i = imgCliente.LBound To imgCliente.UBound If imgCliente(i).Visible Then UltimaPersonaVisible = i Exit For End If Next i End Function '********* PROCEDIMIENTOS ******* Function fncSoloUnCajero() As Integer Dim i% fncSoloUnCajero = 0 For i = imgCajeros.LBound To imgCajeros.UBound If imgCajeros(i).Visible Then fncSoloUnCajero = fncSoloUnCajero + 1 End If Next i End Function Sub ProcAdi_QuitarCajero(ByVal blnAdicionar As Boolean) Dim i% If blnAdicionar Then For i = imgCajeros.LBound To imgCajeros.UBound If Not imgCajeros(i).Visible Then imgCajeros(i).Visible = True imgAtendCajero(i).Visible = False arrayCajero(i).Habilitado = True arrayCajero(i).Ocupado = False arrayCajero(i).NumCaja = i Exit For End If Next i Else For i = imgCajeros.LBound To imgCajeros.UBound If imgCajeros(i).Visible Then imgCajeros(i).Visible = False imgAtendCajero(i).Visible = False arrayCajero(i).Habilitado = False arrayCajero(i).Ocupado = False arrayCajero(i).NumCaja = 0 Exit For End If Next i End If DoEvents Manual del Programador CODIGO Simulation Bank Queue 42 End Sub Sub procReiniciarCajeros() Dim i% For i = 0 To 14 'Liberar cajeros arrayCajero(i).Ocupado = False arrayCajero(i).Habilitado = False arrayCajero(i).Limite = 0 arrayCajero(i).Contador = 0 'Liberar clientes imgAtendCajero(i).Visible = False imgAtendCajero(i).Picture = LoadResPicture(102, vbResBitmap) imgAtendCajero(i).Tag = "N" Next i End Sub Sub procLineasDeFrente() Dim i% For i = Line1.LBound To Line1.UBound Line1(i).ZOrder Next i End Sub Sub procOcultarClientesCola() Dim i% For i = imgCliente.LBound To imgCliente.UBound imgCliente(i).Visible = False Next i End Sub Sub procOcultarClientesEnServicio() Dim i% For i = imgAtendCajero.LBound To imgAtendCajero.UBound imgAtendCajero(i).Visible = False Next i End Sub Sub procAumentarMinutos(ByVal intNumMinutos As Integer) If Not lblHoraFin = Format(mdteHoraSistema, "hh:mm AM/PM") Then 'Adicionar x minutos a la hora mdteHoraSistema = DateAdd("n", intNumMinutos, mdteHoraSistema) Else db_local.Execute "UPDATE CajerosTiemposES SET DebenSalirDeCola = TRUE;" End If mdteHoraSistemaFinal = DateAdd("n", intNumMinutos, mdteHoraSistemaFinal) lblHoraSimu = Format(mdteHoraSistemaFinal, "hh:mm AM/PM") DoEvents End Sub Sub procObtenerCoeficientes() Dim rstCoefA As ADODB.Recordset Dim i% Set rstCoefA = New ADODB.Recordset rstCoefA.Open "SELECT CoeficienteA " _ & "FROM CoefA_EntCola " _ & "WHERE Bco_Codigo = " & CStr(gCodBanco) & " And Suc_Codigo = " & CStr(gCodSucur) & " And Dia = " & CStr(gintDia) & " ORDER BY Hora;", gCn, adOpenStatic, adLockOptimistic, adCmdText With rstCoefA For i = 0 To 9 mCoefAEntCola(i) = .Fields(0) .MoveNext Next i End With procCerrarRecordset rstCoefA Set rstCoefA = New ADODB.Recordset rstCoefA.Open "SELECT CoeficienteA " _ & "FROM CoefA_SalCola " _ & "WHERE Bco_Codigo = " & CStr(gCodBanco) & " And Suc_Codigo = " & CStr(gCodSucur) & " And Dia = " & CStr(gintDia) & " ORDER BY Hora;", gCn, adOpenStatic, adLockOptimistic, adCmdText With rstCoefA Manual del Programador CODIGO Simulation Bank Queue 43 For i = 0 To 9 mCoefASalCola(i) = .Fields(0) .MoveNext Next i End With procCerrarRecordset rstCoefA End Sub Sub procConfiguracionInicialDeCajeros() Dim rstCajerosPos As New ADODB.Recordset Dim CajeroNoHallado As Boolean Dim NumCajero% Dim i% 'Mostrando aleatoriamente los cajeros activos 'tomar posición respectiva de la base de datos 'si existiese rstCajerosPos.Open "SELECT Indice " _ & "From CajerosPosicion " _ & "Where Bco_Codigo = " & CStr(gCodBanco) & " And Suc_Codigo = " & CStr(gCodSucur) & " And Dia = " & Day(frmParametros.drpCalendario) & " And NumerosCajeros = " & frmParametros.txtSimu & " " _ & "ORDER BY Indice;", gCn, adOpenStatic, adLockOptimistic, adCmdText If Not rstCajerosPos.EOF Then While Not rstCajerosPos.EOF imgCajeros(rstCajerosPos.Fields(0)).Visible = True arrayCajero(rstCajerosPos.Fields(0)).Habilitado = True arrayCajero(rstCajerosPos.Fields(0)).TiempoInicial = mdteHoraSistemaFinal rstCajerosPos.MoveNext Wend Else For i = 0 To Val(frmParametros.txtSimu) - 1 CajeroNoHallado = True Randomize NumCajero = Int((15 * Rnd) + 0) While CajeroNoHallado If Not imgCajeros(NumCajero).Visible Then 'Mostrando imagen de cajero imgCajeros(NumCajero).Visible = True arrayCajero(NumCajero).Habilitado = True arrayCajero(NumCaje