¿Cómo realizar un generador de turnos en access?
Que tal un saludo a todos. Tengo una pregunta . Quiero realizar en access una aplicación que me ayude a pasar por turnos a personas que se encuentren en una fila de espera a ser atendidos a 3 ventanillas. En mi modo de entender, realice dos formularios con 3 tablas diferentes, cada tabla es un modulo de atención y estas se ligan a un formulario, este cuando se actualiza despliega el numero de caja y posteriormente lo oculta. Pero mue gustaría hacer algo que se fuera registrando el dato o el turno en orden conforme los de la ventanilla vallan llamando al usuario y este se despliegue en pantalla . Gracias de antemano, e buscado y todo me manda a un tipo de base de datos dinámica o algo así .
2 Respuestas
... Y todo me manda a un tipo de base de datos dinámica o algo así ...
Presupongo que es porque no acostumbra a ser necesario guardar el registro de turnos (al igual que los turnos con boleto de papel) una vez cumplida su misión: a la papelera.
El atributo de dinamismo se lo otorga el proceso continuo de creación de registros y su posterior eliminación.
¿Cuál es la idea que no llega a plasmarse en la práctica?.
Solo el que conoce el entorno y la necesidad, puede hacer un análisis que permita diseñar una solución y quienes más ideas pueden aportar cara a la solución son los destinatarios (los cajeros) para quienes va destinada la aplicación, intenta dialogar con ellos: conociendo las necesidades y los problemas puede llegar la solución.
Tras ojear tu respuesta, me intriga que pantalla se utilizara para presentar esos datos.
Si se admiten consejos un bosquejo:
Utilizaría un ordenador independiente, uno que este descartado por actualización de hardware (pero aun funcional), sin teclado ni ratón, solo la pantalla.
Tendría un sistema operativo sencillo (puede ser un Windows 7) con el runtime de Access como única aplicación y una base sencilla, el acceso: remoto.
Una única tabla y tantos registros como cajas (o una tabla, un solo registro y tantos campos como cajas) y un solo formulario para visualizar las llamadas.
Con SQL se accede a esa tabla para actualizar los datos en tiempo real.
En el formulario (su único formulario), un Timer se encargaría de hacer el refresco de la pantalla.
Algo así es como lo tengo, tal cual lo comentas el refreco en al timer, cambia el numero de caja a pantalla roja
Gracias amigos por sus respuestas, pero sigo atorado ahí, subiré más específicamente como lo e hecho y como me gustaría que quedara gracias
Aprecio más preocupación por la estética que por lo que debería ser prioritario: la utilidad.
Creo que tan importante como indicar que caja esta libre, es indicar a quien va dirigido el aviso.
O están en una fila única (y visualmente saben cuál va quedando libre) o están diseminados y quien esté más próximo (o de mejores codazos, que prisa la tienen todos) será el agraciado.
- Compartir respuesta
Ricardo, lo ideal sería que pusieras una imagen de como, más o menos, lo quieres, ya que se puede hacer de mil formas( y no exagero nada). Por ejemplo, supongamos que tengo una tabla Pacientes, aunque el código se podría abreviar prefiero dejarlo así porque creo que es más didáctico.
También tengo un formulario con las tres "ventanillas", C1, C2 y C3 donde aparecerán sus nombre y le pongo unos botones, que también se podrían reducir pero...
Cuando pulso Empezar consultas me pasa a cada consulta un paciente( los tres primeros de la cola)
Vamos a suponer que lo de Ana Trujillo era algo simple y ha terminado la consulta. Pulso el botón Finalizado y siguiente debajo de su nombre y
Me pasa el siguiente paciente a la consulta 2. Vamos a suponer que María ha terminado. Pulso el botón debajo de su nombre y
Me pasa a la consulta 1 el siguiente paciente. Y mientras me va dejando la tabla como
En este caso, repito, en este caso, pero se podría hacer de otras formas, el código del formulario es
Private Sub Comando12_Click() DoCmd.RunSQL "update pacientes set finalizado=-1 where paciente='" & Me.C2 & "'" C2 = DFirst("paciente", "pacientes", "atendido=0") DoCmd.RunSQL "Update pacientes set atendido=-1 where paciente='" & Me.C2 & "'" End Sub Private Sub Comando15_Click() DoCmd.RunSQL "update pacientes set finalizado=-1 where paciente='" & Me.C3 & "'" C3 = DFirst("paciente", "pacientes", "atendido=0") DoCmd.RunSQL "Update pacientes set atendido=-1 where paciente='" & Me.C3 & "'" End Sub Private Sub Comando6_Click() DoCmd.RunSQL "update pacientes set finalizado=-1 where paciente='" & Me.C1 & "'" C1 = DFirst("paciente", "pacientes", "atendido=0") DoCmd.RunSQL "Update pacientes set atendido=-1 where paciente='" & Me.C3 & "'" End Sub Private Sub Comando9_Click() C1 = DLookup("paciente", "pacientes", "atendido=0 and idpaciente=1") DoCmd.RunSQL "update pacientes set atendido=-1 where paciente='" & Me.C1 & "'" C2 = DLookup("paciente", "pacientes", "atendido=0 and idpaciente=2") DoCmd.RunSQL "update pacientes set atendido=-1 where paciente='" & Me.C2 & "'" C3 = DLookup("paciente", "pacientes", "atendido=0 and idpaciente=3") DoCmd.RunSQL "update pacientes set atendido=-1 where paciente='" & Me.C3 & "'" End Sub
Me explico. La única vez que se pulsa el botón Empezar, busca los tres primeros pacientes y pasa sus nombre a los controles C1, C2 y C3, y en la tabla los marca como atendidos.
Cuando termina algún paciente, si pulsas el botón Finalizado y siguiente correspondiente a su nombre
1º En la tabla Pacientes marca el campo Finalizado de ese paciente.
2º Busca el primer paciente no atendido y pone su nombre el la consulta correspondiente
3º En la tabla Pacientes marca ese nuevo paciente como atendido.
Mi idea es, que en una pantalla aparesa en un formulario un mensaje estático que diga PASE A CAJA. Y en un recuadro aparezca el numero de caja de la cual le están hablando para atender a la persona, tengo dos formularios, un formulario para el cajero, quien atenderá y otra que se despliega en una pantalla aparte que es la que ven las personas que están en la fila, pero como no e logrado que cuando los cajeros le piquen su numero para que pase a su caja el usuriao lo hice así
tengo 9 tablas. cada tabla esta vinculada con cada cuadrito, cuando el cajero le pica al boton llamar usuario, aparece el numero de caja en el recuadro. esos cuadritos son los que me quisiera evitar, solo me gustaria que apareciera el numero de caja de donde le llaman al usuario , y por ejemplo si dos cajeros a la vez le pican para llamar a ventanilla, que uno de ellos aparesca en la pantalla miestras el otro esta en espera, ya que atienda que aparezca el siguiente dato, tal cual como es cuando llaman en las ventanillas de los bancos, de antemano mil gracias,. nota cuento con una maquina que uso como servidor , es donde tengo las tablas.
Yo sólo voy a los bancos cuando voy a atracarlos( y no quiero que me reconozcan). Al menos aquí, cuando entras en un banco te diriges a una máquina y seleccionas las gestión que vas a realizar, Ingresar, Retirar, Pagar, Atracar, Varios, etc., y en función de eso te dan un número tipo, por ejemplo, ING0003, RET0001, etc. Y eso es lo que aparece en las pantallas, el código y la ventanilla donde debes dirigirte, por ejemplo
01-Var0015
Como no sé que códigos usáis vosotros dejaré el nombre, a fin de cuentas también es texto.
Si tengo la tabla Clientes donde se van reflejando los diferentes clientes a medida que llegan( la famosa Cola)
He construido un formulario( que sería lo que se viera en la pantalla) y le he puesto dos subformularios, aunque en realidad no estarían. Serían los que tendría el operario de cada caja en su pantalla. Por ejemplo Pepe López tendría en su pantalla sólo el formulario Caja1, Carlos Sánchez sólo tendría el formulario Caja2. Pero lo he puesto así para que que se vea como trabajan.
Vamos a suponer que Pepe tiene ganas de trabajar y pulsa el botón azul. Automáticamente
En la pantalla de Caja 1 aparecería que citan al primer cliente de la cola( aunque no haría falta) y debajo, como te dije no sé los códigos muestra su nombre. Vamos a suponer que Carlos todavía no ha empezado a trabajar( deberían despedirlo) y Pepe ha terminado con María. Pulsa su botón y
En la pantalla indica que la segunda persona de la cola, en este caso Ana vaya a Caja1.
Cuando, por fin, al amigo Carlos le da por trabajar pulsa su botón y
O sea, a la caja 2 va la tercera persona de la cola.
El código del formulario Caja1 es
Private Sub Comando0_Click() Cliente = DFirst("cliente", "clientes", "atendido=0") IdCliente = DLookup("idcliente", "clientes", "cliente='" & Me.Cliente & "'") Me.Parent!Cliente1 = Cliente Me.Parent!Caja1 = IdCliente DoCmd.RunSQL "update clientes set atendido=-1, caja=1 where cliente='" & Me.Cliente & "'" End Sub
Ese cuadradito con número que se ve a la derecha del nombre del cliente no haría falta pero, si se dejara, convendría ponerlo como oculto. Es el que le dice a la pantalla de la izquierda el número de cliente en la cola que debe ir a una caja determinada. Pero como te decía, en las pantallas sólo deberían aparecer los códigos.
Ok, ya estoy entendiendo, la cuestión aquí es que es una fila de espera de " a como van llegando" es como si quisieras comprar un boleto para entrar al cine, llegas haces fila y en la pantalla te mostrara en que ventanilla desocupada te atenderán y el usuario no le picara a nada. Solo llega al a fila se forma, llega a donde esta la pantalla de donde le dirá a que caja pasar y pasa a la indicada.
E estado haciendo pruebas con el código que me envías, te agradezco en el alma el apoyo y la ayuda :),
Aquí la dinámica es llega a la fila sin picarle a ningún modulo que te de un ticket, el de la ventanilla que le dio ganas de trabajar como dices le pica, y en la pantalla le aparecerá,, " pasa a ventanilla 3"
Y si el compañero de el quiere trabnajar igual le picara asu formulario y atenderá a la siguiente persona y en la pantalla aparecerá " pasa a ventanilla 2" y se borra el letrero anterior
Ricardo, si quieres, repito si quieres, mándame un mensaje a [email protected] y, o bien me mandas tu base, con datos inventados, o bien te mando un ejemplo y sobre eso hablamos.
Si lo haces, en el asunto del mensaje pon tu alias Ricardo, ya que si no sé quien me escribe ni los abro.
Me había olvidado de decirte que no necesitas una tabla por cada formulario, y que si quieres, al final del día laboral, puedes borrar(no aconsejable) la tabla y que al día siguiente empiece de cero.
Bastaría con usar
Docmd. Runsql"delete * from Clientes"
Eso es exactamente lo que quiero hacer, que cada vez que le pique uno de ventanilla ( las ventanillas están numeradas del 1 al 15) aparezca en a pantalla, pase a caja 1 o depende de donde le picaron, pero si le picaron más de dos ventanillas que el dato se valla a una "tabla de espera" que al tiempo se borre el numero de la caja y automáticamente jale el consecutivo, se borre y jale otro numero que este en espera y así sucesivamente.
Por ejemplo
Caja 1 llamo a una persona que esta en la fila, en la pantalla aparece pase a caja 1
Al tiempo se borra. Si nadie más llamo a alguien que se quede en blanco. Pero ahora supongamos que ahí varia gente en la fila y la caja 1,2 y 3, le picaron para llamar gente. En este caso que aparezca,. Pase a caja 1. al tiempo se borra, y aparece automáticamente el segundo que le pico que en ese caso aparecerá en pantalla pase a caja 2, y así mismo con el 3 hasta quedar en blanco la pantalla. Es que lo que quiero lograr.
´Pues en los ejemlos que te envíe en las imágenes esto lo hace todo de forma manual, no puedo mistrar solamente un dato de pase a caja 1 o caja 2 así como única información en pantalla. Como aparece en esta ultima imagen que te mando, si no tuve que poner todos los cuadritos que son cada caja y cuando dos o más le pican a la vez, este aparece que pasen a ese numero de caja, y aho es donde las personas se confunden, solo quiero que aparezca de una caja a la vez como en la ultima imagen.
No lo entiendo, porque si hay 40 personas en el interior del banco y yo el último que llegó y aparece en la pantalla simplemente PASE A CAJA1, me voy a la caja y sin un ticket o algo, quien me va a demostrar que estaba antes que yo. Pero...
Más sencillo no puede ser y aquí lo dejo. Tengo una tabla Cajas como
Y un formulario como
Vamos a suponer que el de la caja 2 quiere citar a alguien. Pulsa su botón y
A los cinco segundos ( me.timerinterval=5000) se borra(apaga") y además me deja la tabla Cajas como
Es decir, que en ese momento el cliente numero1 está en la caja 2, que está ocupada pero no ha finalizado.
Si el cajero 2 volviera a pulsar el botón de citar, aparecería lo de la pantalla Ir a caja 2 durante 5 segundos y la tabla quedaría como
Es decir, terminó con el cliente 1, por eso está marcado lo de finalizado y ahora está con el cliente 2 de la cola.
Si voy pulsando los botones de las diferentes cajas me dejaría la tabla como
Al final del día, con borrar los registros de la tabla Cajas, empieza de nuevo.
El código de cualquiera de los botones, voy a poner como ejemplo el de Caja 1 es
Private Sub Comando3_Click() Dim i As Integer i = Nz(DMax("orden", "cajas")) + 1 If Nz(DCount("*", "cajas", "caja=1")) = 0 Then Pantalla = "PASE A CAJA " + vbCrLf + "1" DoCmd.RunSQL "insert into cajas(caja,orden,ocupado)values(1," & i & ",-1)" ElseIf DCount("*", "cajas", "caja=1 and ocupado=true and finalizado=false") > 0 Then DoCmd.RunSQL "update cajas set finalizado=true where caja=1 and finalizado=false" Pantalla = "PASE A CAJA " + vbCrLf + "1" DoCmd.RunSQL "insert into cajas(caja,orden,ocupado)values(1," & i & ",-1)" End If Me.TimerInterval = 5000 End Sub
Y en el evento Al cronómetro del formulario le tengo puesto
Private Sub Form_Timer() Pantalla = Null End Sub
esta es mi tabla para seguir tu ejemplo
La caja para desplegar el mensaje es un cuadro de texto independiente llamado pantalla.
Me aparece esto a la hora de dar click.
Y aparece el mensaje y me manda así en a tabla
Cuando le pico a caja 2
Me sale el mismo mensaje de anexar
y la tabla queda asi
Y luego se bloquea... y ya no me deja hacer nada :(
Ahí amigo en verdad me has ayudado bastante gracias por el apoyo y ayuda, hasta aquí esta genial. Pero por ejemplo. Supongamos que ya atendieron ellos a una persona pero
Ejemplo
Tenemos 5 cajas ok
Caja 1 manda llamar a una persona ( pase a caja 1)
Al mismo tiempo el cajero de la dos también llama a que pase a su caja ( pase a caja 2)
Y el de la caja 3 también llama a otra persona ( pase a caja 3)
Si todos llamaron a un tiempo pero el primer mensaje de ( pase a caja 1) fue el primero en picarle al botón, mi idea es que los otros 2 se vallan a una especie de "cola de espera en la tabla"
Y que posteriormente en el orden en que le picaron aparezca el mensajito de " pase a caja 2" luego que se borre y que automáticamente jale al próximo en la lista de la tabla que en este caso seria " pase a caja 3" y así sucesivamente según se vallan metiendo en orden de espera y una vez que se acabaron los llamados a cajas que comience otra vez con el que le pique de nuevo
Por ejemplo le pica caja 1,3,2, y 4
Aparecerá en pantalla pase a caja 1 al cronometro se borra, y automáticamente que jale y aparezca en pantalla... pase a caja tres, al tiempo se borra,. Jala el próximo de la lista pase a caja dos .. se borra y pasa al próximo de la lista pase a caja 4 ... y ahí queda, no importa si se borran los registros,
En verdad disculpa tanta molestia, pero estoy super atorado ahí ...
Es que en la configuración de Access, yo tengo deshabilitado el pedir confirmaciones
Pero no te aconsejo que lo hagas hasta que no tengas mucha soltura.
Lo que tienes que hacer es que cuando vayas a escribir cualquier instrucción en cualquier evento le pongas como primera línea
Docmd.setwarnings False
y como última línea
Docmd.Setwarnings True
Me explico, cuando vaya a ejecutar una consulta de acción( Actualización, anexar datos, eliminación, etc.) no te pregunta, y después de ejecutar lo que tenga que ejecutar activas los avisos.
- Compartir respuesta