Como realizar un tablero para ver el estatus de maquinas en determinadas horas

449 views
Skip to first unread message

acmc

unread,
Jan 15, 2015, 6:12:54 PM1/15/15
to publice...@googlegroups.com
Hola Foxeros,

Voy a empezar a realizar un control de piso, tengo 25 maquinas, las cuales se operan en 3 turnos, la idea es poder ver en una especie de tablero todas las maquinas, por ejemplo si fuera excel, en la columna A estarían mis 25 maquinas, en las columnas posteriores en intervalos de 30 minutos el estatus de la maquina conforme se vaya capturando información la cual sería interactiva, en esos lapsos de tiempo la idea es mostrar 3 estatus:

verde = produciendo
amarillo = cambio de trabajo
rojo = parado por mantenimiento

De momento no se me ocurre como hacer para que el usuario puedo mover la linea de tiempo.. obvio tendría que ser hacia atras, por si quiere ver que ha pasado en otros turnos o en otros dias.. sería algo como esto

MAQUINA   07:00 | 07:30 | 08:00 | 08:30 | 09:00 | 09:30 | 10:00 | 10:30 | 11:00 | 11:30 | 12:00 | 12:30 | 13:00 1
IMP01          ____                                                                                                                                                  
IMP02                                                                                                                                                                    
REF01                                                                                                                                                                   
REV01                                                                                                                                                                  

La idea es que conforme vayan capturando evento por maquina, en otra tabla se vaya registrando por lapsos de 30 minutos uno de los 3 estatus, y que el usuario puedo estarse moviento sobre una linea de tiempo, alguien ha hecho algo parecido?, ideas son bienvendias..

Salu2!!

Fernando D. Bozzo

unread,
Jan 15, 2015, 6:51:16 PM1/15/15
to publice...@googlegroups.com
Hola:

Yo no veo realmente que sea tan complicado. Obviamente no cuento con ponerle efectos especiales, porque lo haría inutilizable por lo lento, pero sí que se puede hacer una navegación bastante fluida por tramos.

Yo guardaría los datos horarios por máquina en una tabla (DBF o SQL, a tu gusto), y luego el tramo horario a mostrar solo sería un SQL que abarque un desde/hasta con cierta cantidad de horas, donde el usuario solo elija la hora desde (o hasta, pero no ambas).
Si no elige ninguna hora, por defecto el sistema podría elegir la hora "hasta" como la actual, ya que no existe información más allá de la hora actual, y de ahí mostrar cierta cantidad de horas hacia atrás.

Respecto de cómo mostrarlo, si el gráfico lo podés mostrar rotado 90º (o sea, las máquinas arriba y los horarios son los registros), podrías usar un simple grid y tener la máxima velocidad de navegación, ya que la tendrías resuelta totalmente.

Ahora, si quisieras mostrarlo en ese formato exacto, muy probablemente tengas que crearte un control específico junto a toda la lógica de navegación.

Yo optaría por el grid, donde podés aprovechar lo del DynamicBackColor/DynamicForeColor y solo tendrías que crear o reemplazar valores en una tabla.


Saludos.-

Angel Perez

unread,
Jan 15, 2015, 8:07:26 PM1/15/15
to publice...@googlegroups.com
Gracias Fernando, 
También había pensado en utilizar un grid, se que puedo cambiar de color todo el renglon, pero no se si es posible en un mismo renglón, ir cambiando de color las columnas para dar el efecto que busco.

Salu2

Fernando D. Bozzo

unread,
Jan 16, 2015, 1:04:50 AM1/16/15
to publice...@googlegroups.com

Lo del color dinámico es una propiedad de la columna, así que no deberías tener problemas

Alejandro Isla

unread,
Jan 16, 2015, 1:56:45 PM1/16/15
to publice...@googlegroups.com
Tenes 25 máquinas, tomas elestado cada 30 minutos, es decir que tenes 48 datos por día por cada máquina, 1200 datos por día, creo que se podría hacer la grilla completa del día sin que la performaqnce se destruya.

Supongamos una tabla datos algo asi
maquina
fecha
hora  (acá tendrias 00:00, 00:30, 01.00....23:30)
estado

haces una consulta tipo
SELECT maquina,;
MAX(IIF(hora="00:00",estado,0)) as t0000,MAX(IIF(hora="00:30",estado,0)) as t0030,;
MAX(IIF(hora="01:00",estado,0)) as t0100,MAX(IIF(hora="01:30",estado,0)) as t0130,;
MAX(IIF(hora="02:00",estado,0)) as t0200,MAX(IIF(hora="02:30",estado,0)) as t0230,;
MAX(IIF(hora="03:00",estado,0)) as t0300,MAX(IIF(hora="03:30",estado,0)) as t0330,;
MAX(IIF(hora="04:00",estado,0)) as t0400,MAX(IIF(hora="04:30",estado,0)) as t0430,;
MAX(IIF(hora="05:00",estado,0)) as t0500,MAX(IIF(hora="05:30",estado,0)) as t0530,;
MAX(IIF(hora="06:00",estado,0)) as t0600,MAX(IIF(hora="06:30",estado,0)) as t0630,;
MAX(IIF(hora="07:00",estado,0)) as t0700,MAX(IIF(hora="07:30",estado,0)) as t0730,;
MAX(IIF(hora="08:00",estado,0)) as t0800,MAX(IIF(hora="08:30",estado,0)) as t0830 ;
...
...
FROM datos GROUP BY maquina WHERE fecha=DATE()

Es un poco tedioso poner las 48 "horas", pero te da un cursor  que directamente lo podes poner en un grid, con los scrollbar del mismo; usas dinamic color para las celdas y te queda igual que el "excel". Lógicamente embellece el grid a tu gusto.

Saludos, Alejandro

Angel Perez

unread,
Jan 16, 2015, 10:05:14 PM1/16/15
to publice...@googlegroups.com
Gracias Alejandro..
Esa es la base que voy a tomar

Fidel Charny

unread,
Jan 18, 2015, 11:07:44 AM1/18/15
to publice...@googlegroups.com
Como me llamó la atención el tema, estuve construyendo una pequeña librería. A mi me gusta más la recomendación de Fernando. Generas un cursor transpuesto del cursor obtenido,  un campo para el Datetime y los restantes con las máquinas; de modo que te queda en una fila, el datetime y luego los números de color de estado de cada máquina. En el control grid, hay que agregarle como CurrentControl un control shape transparente (para que no se vean los números) a las columnas que corresponden a colores de estado. Y la única solución que encontré para que el highlight no perjudique el color, es .grid.lockcolumn=1 (datetime). Para poder reemplazar los números de colores por el estado, utilizo un array de estado/color.

La libería está en modo texto (Foxbin2prg). Puedes generar los binarios con Foxbin2prg (de Fernando D. Bozzo). Está hecha con controles de base y tiene los métodos que necesita. Para funcionar debes agregarla a algún proyecto. Si no, tal vez tengas que modificar todas las referencias a la vcx en los newobject.
La secuencia para ver la prueba, una vez agregada, es:
obj=NEWOBJECT("cust_Implem","zzgraf.vcx")
obj.get_frmgraf()       && este método crea el form ppal y llama al último turno que generó el método cursor_create (datos de prueba)
obj=null           && esto es importante para liberar la librería.

Los datos de prueba se generan desde el 1/12/2014 y hasta la media hora anterior a la que ejecutas la librería de prueba. Los estados de las 25 máquinas se determinan por un Rand(), por lo que , graciosamente, siempre serán distintos. Esto es solamente para ahorrame el trabajo de generar manualmente un cursor de prueba (je, je). Los turnos se determinan con el método det_turno, tomando como base el valor que figura en el spinner del form ppal, que inicia siempre con 6. Representa la primer hora del turno Mañana.
El form ppal genera en la apertura un gráfico de estado  hecho con containers, shapes, labels (es algo feo) y tiene el botón "frm" para mostrar un form con el grid al que apuntamos.
Por los containers, decidí hacer esta prueba basada en turnos. Verás que son muy lentos y la conducción es problemática. (container_graphic.jpg)
En cambio la generación del transpuesto y el reemplazo de los valores es muy rápida. En la versión que uses podrás liberarte de los turnos y mostrar lo que sea conveniente. (grid_graphic.jpg)
zzgraf.vc2
Container_graphic.jpg
grid_graphic.jpg

Fernando D. Bozzo

unread,
Jan 18, 2015, 1:05:17 PM1/18/15
to publice...@googlegroups.com
Muy bueno, Fidel!

Esta es una de esas aplicaciones divertidas que a cualquiera le gustaría implementar :)

Alejandro Isla

unread,
Jan 18, 2015, 2:02:40 PM1/18/15
to publice...@googlegroups.com
Se me pasó por la cabeza y la tiro al aire (brainstorm) en ves del control shape transparente para que no se vean los número, que tal si en la base en ves de codificar 1,2,3,4, es con espacios " ","  ","   ","    "

Con un len(campo) recuperas el estado y me parece que 1 o 2 o 3 espacios se ven iguales en el grid.

¿funcionaria?

Fidel Charny

unread,
Jan 19, 2015, 7:20:28 AM1/19/15
to publice...@googlegroups.com
Alejandro:
Si vas a mostrar colores para qué poner otra cosa que no sean colores?. En el cursor transpuesto, se reemplaza el código de estado de cada máquina (campo máquina) para cada segmento temporal (campo datetime) por el número de color asignado a cada estado. Entonces, todo el trabajo lo haces de entrada en el cursor transpuesto y el DynamicBackColor tiene una implementación muy sencilla:
for i=2 to .ColumnCount
        .Columns(i).dynamicBackColor= .Columns(i).ControlSource
next

* Nota (Fe de Erratas): En el modelo enviado se ve un error (leve) que es tratar de averiguar el campo del ControlSource. Eso es totalmente innecesario y hasta inconveniente. Además ahí está también asignado .DynamicForecolor, porque en principio mantenía los textbox como CurrentControl. Con los controles Shape, nos podemos ahorrar la línea, ya que no prestará ningún servicio.

Esto le confiere al pseudográfico una presentación instantanea, sin batateos. De otra forma tienes que hacer que DynamicBackColor dependa de un ICASE(), que si bien es rápido, nunca será tan rápido como en este planteo.

Por eso decía que me gustaba la idea de Fernando (cursor transpuesto), porque le confiere al gráfico una flexibilidad y velocidad de funcionamiento que no pueden tener los containers (+ containers + shapes + labels ).     

En una idea un poco más avanzada, puede que la presentación en Containers resulte necesaria, si es que se quieren mostrar estados intermedios.
Podría ser otro cargo para la velocidad de presentación (que puede llegar a ser horrible) con la dudosa ventaja de lograr más refinamiento sobre la visión de de los horarios de ocurrencia de los eventos. Dicho de otro modo, dentro de una columna va un solo color, pero en un container se pueden agregar todos los shape que se necesiten con sus respectivos colores intermedios. Para esto se necesita proporcionar el width de cada shape al tiempo de duración del evento con respecto al intervalo medido (en el caso, 1800 segundos). Para mi modo de ver, en un caso como el que se apunta, podría mostrar más errores de ingreso de datos que realidades. O sea, la información tiene que ser veraz (no siempre tiene que ser precisa, sino más bien correcta), pero fundamentalmente relevante y oportuna.
Reply all
Reply to author
Forward
0 new messages