PDA

Ver la Versión Completa : Ingresando al Teatro


ASAPLTDA
21-10-2012, 00:06:52
Hola Foristas
Me han encomendado un software que consiste en la venta de boletos para ingresar al teatro. Todo parece sencillo excepto por el manejo de las casillas de ventas.
El teatro tiene 300 sillas las cuales deben ser vendidas por 2/4 taquilleras.
Cada taquillera debe tener el mapa del teatro y ofrecer las sillas libres a los clientes.
El cliente puede escoger la silla que quiere comprar para ver su película en el teatro.
Es posible que en las diferentes taquillas clientes quieran escoger las mismas sillas .

-El apoyo que requiero es que como hago para mantener el mapa actualizado a las taquilleras en forma inmediata de los asientos que se han vendido , si que ellas este pendientes de presionar un boton de actualizar mapa?,
-o diferente a un timer que este preguntando sobre el estado de las sillas?
-Algo parecido que el servidor de datos le informe a los clientes conectados que la base de datos ha cambiado?
Se que son muchas dudas , pero me gustaria me orientaran en:
que tecnologia podria usar?
que componentes podria usar?

cualquier comentario, sugerencia, orientacion sera bien venida

Gracias

Casimiro Notevi
21-10-2012, 01:45:49
Hola, amigo, ¿esto es un debate? ;). Lo paso a "Varios".

Tienes muchísimas opciones posibles, no has dado ninguna información de las herramentas a usar, supongo que delphi+firebird.
Yo crearía una tabla con las butacas y las representaría gráficamente con la forma del teatro para ir marcándolas y "vendiéndolas".
Tan simple como un uno o un cero. 1.ocupada/vendida y 0.libre
No requieres timer ni cosas raras, simplemente se cambian los ceros por unos de las sillas vendidas, es un simple update para actualizar y un simple select para leerlas y presentar en pantalla.


OOOOO__XXXXX__OOOXX__OOOOO
OOOOO__OOOXX__OOOOO__OOOOO
OOOOO__OOOOO__XXXOO__OOOOO
OOOOO__OOOXX__OOOOO__OOOOO
OOOOO__OOOOO__XOOOO__OOOOO

OOOOO__XXXXX__OOOXX__OOOOO
OOOOO__OOOXX__OOOOO__OOOOO
OOOOO__OOOOO__XXXOO__OOOOO
OOOOO__OOOXX__OOOOO__OOOOO
OOOOO__OOOOO__XOOOO__OOOOO

OOOOO__XXXXX__OOOXX__OOOOO
OOOOO__OOOXX__OOOOO__OOOOO
OOOOO__OOOOO__XXXOO__OOOOO
OOOOO__OOOXX__OOOOO__OOOOO
OOOOO__OOOOO__XOOOO__OOOOO

ASAPLTDA
21-10-2012, 03:46:47
Gracias Casimiro
Trabajo con delphi 5, delphi profesional xe2 y firebird

La idea del mapa es muy buena,
pero en caso de que lleguen 3 clientes simultáneamente a las ventanillas de ventas de tiquetes y quieran el mismo asiento, y asimiento que una de las taquilleras inicia el proceso (algunos segundos) antes que las otras expedendoras de tiquetes como lo informo a las otras 2 taquillas que el asiento se acaba de vender?

Casimiro Notevi
21-10-2012, 11:56:14
Hola, veamos, tenemos a taquillera1 (T1), taquillera2 (T2), cliente1 (C1) y cliente2 (C2)

Llegan los C1 y C2 al mismo tiempo ante la T1 y la T2, la situación en ese momento de la 1ª fila es esta:
1ª fila: XXXXX__XXXXX__OOOXX__XXXXX

C1. hola, quiero 2 asientos en 1ª fila
C2. hola, quiero 2 asientos en 1ª fila
T1. pincha en las dos butacas de pasillo que están libres y se cambia su valor a ocupado (se hace un post_event para que se actualice la pantalla de las demás taquilleras), por lo que verán todas esto:
1ª fila: XXXXX__XXXXX__XXOXX__XXXXX
T2. Lo siento, en 1ª fila sólo queda una butaca libre


Otro caso:
Llegan los C1 y C2 al mismo tiempo ante la T1 y la T2, la situación en ese momento de la 1ª fila es esta:
1ª fila: XXXXX__XXXXX__OOOXX__XXXXX

C1. hola, quiero 2 asientos en 1ª fila
C2. hola, quiero 2 asientos en 1ª fila
T1. mira la pantalla y dice, muy bien hay 2 butacas libres, ¿las quiere?
T2. pincha en las dos butacas de pasillo que están libres y se cambia su valor a ocupado (se hace un post_event para que se actualice la pantalla de las demás taquilleras), por lo que verán todas esto:
1ª fila: XXXXX__XXXXX__XXOXX__XXXXX
C1. Sí, quiero las 2 butacas de primera fila
T1. Lo siento, justo se han vendido, sólo queda una butaca, tendrá que ser en otra fila.

Resumiendo, las taquilleras no deben decir si está libre o están ocupadas, sólo deben marcarlas y si el sistema (tu programa) las acepta es que ha sido la primera en vender esas butacas, a las demás se les actualiza la pantalla y verán que ahora están ocupadas.

post_event es un evento de la BD firebird que se dispara al hacer post y puedes interceptarlo para hacer lo que quieras, en este caso lo usas para hacer un refresh de los datos que muestran la representación gráfica de las butacas.

Neftali [Germán.Estévez]
21-10-2012, 19:22:39
Para generar los mapas, yo utilizaría TSimpleGraph (DelphiArea); Yo lo he utilizado para cosas similares en varias ocasiones.
Para las actualizaciones de los puestos, utilizaría una tabla de operaciones de forma que, todas las operaciones que se van realizando se guardan en esa tabla. Cada uno de los puestos es responsable de ver cada X tiempo qué operaciones tiene pendientes de "actualizar" en su mapa y deberá hacerlo.
También podrías hacerlo (de forma automática) al acabar cada operación, para tenerlo actualizado antes de la nueva.

Yo marcaría los asientos como vendidos, una vez que la taquillera los selecciona, aunque todavía no hayan sido pagados ni la operación haya terminado (teniendo en cuenta que se pueden "anular"), porque si lo haces al acabar, es posible que otra taquillera le falle la venta cuando ya tiene todo el proceso hecho. Es similar a un bloqueo "PESIMISTA".

ASAPLTDA
22-10-2012, 16:08:33
[QUOTE=
post_event es un evento de la BD firebird que se dispara al hacer post y puedes interceptarlo para hacer lo que quieras, en este caso lo usas para hacer un refresh de los datos que muestran la representación gráfica de las butacas.[/QUOTE]

Hola casimiro ya mes has dado el 100% de la solucion del problema , muchas gracias.

Solo quisiera preguntar por ultimo: Como capturo el post event, uso los componentes sql-direct para leer los datos de firebird y estos no tienen el componente para capturar el post-event, me podrías indicar como lo capturo, no se que componente para capturar los mensajes (podria ser los indy aunque no los conosco) me podrias dar una orientacion :p

Casimiro Notevi
22-10-2012, 16:22:37
Mira este documento (http://www.intitec.com/varios/Firebird_uso_de_eventos.pdf) pdf, también puedes hacer una búsqueda por post_event, se ha tratado en diversas ocasiones y encontrarás ejemplos y dudas de otros usuarios que se han solucionado.
Y si todavía tienes dudas, pues aquí estamos :)

gatosoft
22-10-2012, 17:08:30
Amigo ASAPLTDA,

Espero que la solución dada por casimiro te sirva. Por mi parte voy a contarte una experiencia personal sobre el tema...

Una vez tuve que lidiar con un sistema cuya concurrencia sobre un registro era alta... y tuvimos que implementar unos controles adicionales... el que mas nos ayudó fue la "confirmación con retardo",

La situación era mas o menos la siguiente:

Cuando un usuario seleccionaba un registro libre, éste se marcaba con el código del usuario para bloquearlo (los demás lo veian no disponible)... pero las transacciones eran tan rápidas (en SQL server) que uno o mas usuarios podían marcar un registro en el mismo instante y el sistema les confirmaba transacción exitosa aunque al final la tabla mostraba solo a uno (El último que procesó la BD)

La transacción era algo asi como:

¿El registro esta libre? ==>
Seleccinarlo
¿El registro quedó marcado con el usuario? ==>
Mensaje al usuario: "OK. Ud. seleccionó el registro"


Como te decia, a varios usuarios les aparecía el OK al tiempo.... entonces implementamos la "Confirmación con retardo",la cual consistia en dejar pasar un segundo para hacer la pregunta ¿El registro quedó marcado con el usuario?, asi:

¿El registro esta libre? ==>
Seleccinarlo
Sleep(1 segundo)
¿El registro quedó marcado con el usuario? ==>
Mensaje al usuario: "OK. Ud. seleccionó el registro"

De esta manera la confirmación llegaba solo a un usuario... El segundo de retrado es irrelavante al lado de los problemas que te ahorras...

Espero que esta experiencia te sirva

un saludo,

Casimiro Notevi
22-10-2012, 17:54:34
Hombre, algo raro/especial/extraño tenía el software, eso que explicas no puede ser, salvo que sea un fallo de MS sql server, que aunque ese sistema no sea de mi agrado, estoy casi convencido de que no puede fallar en eso.