Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Insercion automatica de datos a tabla

Estas en el tema de Insercion automatica de datos a tabla en el foro de Mysql en Foros del Web. Hola que tal amigos, pues se me presento el siguiente proyecto, el cual se trata de un control de asistencia de empleados de una empresa. ...
  #1 (permalink)  
Antiguo 23/10/2012, 12:51
 
Fecha de Ingreso: septiembre-2012
Ubicación: Mexico
Mensajes: 58
Antigüedad: 11 años, 7 meses
Puntos: 2
Pregunta Insercion automatica de datos a tabla

Hola que tal amigos, pues se me presento el siguiente proyecto, el cual se trata de un control de asistencia de empleados de una empresa. El detalle aquí es que la tabla tiene que tener los campos L,M,M,J,V,S,D que son los días de la semana.

El problema viene a que estos campos se necesitan llenar automáticamente cada día, con un dato cualquiera, por ejemplo un "X" con el cual identificar que el trabajador si asistió y así consecutivamente cada día de la semana.

Tal vez suene tonto, pero así es como me lo están pidiendo :S

Esta es mi tabla:

Código SQL:
Ver original
  1. puesto VARCHAR (50),
  2. plaza VARCHAR (15),
  3. n_empleado VARCHAR (25),
  4. rpe VARCHAR (15),
  5. area VARCHAR (10) DEFAULT 'DP090',
  6. cuenta VARCHAR (10) DEFAULT 'B9X',
  7. L VARCHAR (10),
  8. M VARCHAR (10),
  9. M VARCHAR (10),
  10. J VARCHAR (10),
  11. V VARCHAR (10),
  12. S VARCHAR (10),
  13. D VARCHAR (10);

No se si me explique, pero ya he buscado y no encuentro la forma de hacerlo, alguien ya lo ha hecho o sabe como hacerlo? Agradeceré mucho su ayuda.
  #2 (permalink)  
Antiguo 23/10/2012, 13:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Insercion automatica de datos a tabla

¿Y en qué consistiría el "automático" de ese llenado?
En el contexto de lo que describes, ese campo debería contener esa "X" si y sólo si el empelado concurrió a trabajar, por lo que en realidad hay una interacción con algún sistema que provee el dato.
Otro asunto es que en ese modelo, ¿el registro se debe crear por cada semana laboral, o se trata de un registro fijo de uso semanal que luego se consolida en otra parte?

En definitiva, el modelo es poco práctico y nada eficiente, pero dime las respuestas a esto que te planteo, y veremos qué se puede hacer.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 23/10/2012, 13:19
 
Fecha de Ingreso: septiembre-2012
Ubicación: Mexico
Mensajes: 58
Antigüedad: 11 años, 7 meses
Puntos: 2
Respuesta: Insercion automatica de datos a tabla

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Y en qué consistiría el "automático" de ese llenado?
En el contexto de lo que describes, ese campo debería contener esa "X" si y sólo si el empelado concurrió a trabajar, por lo que en realidad hay una interacción con algún sistema que provee el dato.
Otro asunto es que en ese modelo, ¿el registro se debe crear por cada semana laboral, o se trata de un registro fijo de uso semanal que luego se consolida en otra parte?

En definitiva, el modelo es poco práctico y nada eficiente, pero dime las respuestas a esto que te planteo, y veremos qué se puede hacer.
Muchas gracias por responder amigo!

Lo se el modelo no es nada eficiente, la mejor manera de hacerlo seria manualmente indicando si asistió o no a trabajar, pero para ellos es mas fácil que esa tabla se llene automáticamente cada día insertando una "X" o cualquier otra letra que indicaría la asistencia, esto seria a diario, todos los días de la semana.

Esto esta en viceversa, porque cuando el empleado no asista a trabajar ahí si se deberá de cambiar manualmente ese registro del día, es decir si un Martes no asiste a trabajar se deberá de explicar porque no lo hizo y darle una especie de incidencia, pero bueno esa es otra parte que se hará en PHP con la cual se modificara el registro.

Por el momento es eso, no se si me explico bien, si no estoy aquí para cualquier otra cosa, de nuevo gracias!
  #4 (permalink)  
Antiguo 23/10/2012, 15:37
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Insercion automatica de datos a tabla

Hola Mauk:

Vayamos por partes... de entrada, la tabla tal como la planteas ni siguiera puede ser creada, pues no puedes tener dos campos con el mismo nombre (M)... además, tal como lo hace notar gnzsoloyo, no es para nada eficiente... pero si como suele suceder, no puedes cambiar tu modelo podrías hacer algo así:

Supongamos que que los registros los vas vas a capturar por semana, el primer día tendrías que hacer un insert a la tabla, pero los subsecuentes tendrían que ser actualizaciones...

es decir, tendrías que hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE tabla (puesto VARCHAR (50), L VARCHAR (10),
  2.     -> Ma VARCHAR (10), Mi VARCHAR (10), J VARCHAR (10),
  3.     -> V VARCHAR (10), S VARCHAR (10), D VARCHAR (10));
  4. Query OK, 0 rows affected (0.13 sec)
  5.  
  6. mysql> INSERT INTO tabla VALUES ('puesto',
  7.     -> IF(DAYOFWEEK(CURDATE()) = 2, 'X', NULL),
  8.     -> IF(DAYOFWEEK(CURDATE()) = 3, 'X', NULL),
  9.     -> IF(DAYOFWEEK(CURDATE()) = 4, 'X', NULL),
  10.     -> IF(DAYOFWEEK(CURDATE()) = 5, 'X', NULL),
  11.     -> IF(DAYOFWEEK(CURDATE()) = 6, 'X', NULL),
  12.     -> IF(DAYOFWEEK(CURDATE()) = 7, 'X', NULL),
  13.     -> IF(DAYOFWEEK(CURDATE()) = 1, 'X', NULL));
  14. Query OK, 1 row affected (0.05 sec)
  15.  
  16. mysql> SELECT * FROM tabla;
  17. +--------+------+------+------+------+------+------+------+
  18. | puesto | L    | Ma   | Mi   | J    | V    | S    | D    |
  19. +--------+------+------+------+------+------+------+------+
  20. | puesto | NULL | X    | NULL | NULL | NULL | NULL | NULL |
  21. +--------+------+------+------+------+------+------+------+
  22. 1 row in set (0.00 sec)
  23.  
  24. mysql> UPDATE tabla SET
  25.     -> L = IF(DAYOFWEEK('2012-10-26') = 2, 'X', L),
  26.     -> Ma = IF(DAYOFWEEK('2012-10-26') = 3, 'X', Ma),
  27.     -> Mi = IF(DAYOFWEEK('2012-10-26') = 4, 'X', Mi),
  28.     -> J = IF(DAYOFWEEK('2012-10-26') = 5, 'X', J),
  29.     -> V = IF(DAYOFWEEK('2012-10-26') = 6, 'X', V),
  30.     -> S = IF(DAYOFWEEK('2012-10-26') = 7, 'X', S),
  31.     -> D = IF(DAYOFWEEK('2012-10-26') = 1, 'X', D)
  32.     -> WHERE puesto = 'puesto';
  33. Query OK, 1 row affected (0.04 sec)
  34. Rows matched: 1  Changed: 1  Warnings: 0
  35.  
  36. mysql> SELECT * FROM tabla;
  37. +--------+------+------+------+------+------+------+------+
  38. | puesto | L    | Ma   | Mi   | J    | V    | S    | D    |
  39. +--------+------+------+------+------+------+------+------+
  40. | puesto | NULL | X    | NULL | NULL | X    | NULL | NULL |
  41. +--------+------+------+------+------+------+------+------+
  42. 1 row in set (0.00 sec)

Observa que en el caso del update estoy utilizando la fecha del 26 de Octubre en vez de la fecha actual (CURDATE()).

Saludos
Leo.
  #5 (permalink)  
Antiguo 24/10/2012, 09:11
 
Fecha de Ingreso: septiembre-2012
Ubicación: Mexico
Mensajes: 58
Antigüedad: 11 años, 7 meses
Puntos: 2
Respuesta: Insercion automatica de datos a tabla

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola Mauk:

Vayamos por partes... de entrada, la tabla tal como la planteas ni siguiera puede ser creada, pues no puedes tener dos campos con el mismo nombre (M)... además, tal como lo hace notar gnzsoloyo, no es para nada eficiente... pero si como suele suceder, no puedes cambiar tu modelo podrías hacer algo así:

Supongamos que que los registros los vas vas a capturar por semana, el primer día tendrías que hacer un insert a la tabla, pero los subsecuentes tendrían que ser actualizaciones...

es decir, tendrías que hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE tabla (puesto VARCHAR (50), L VARCHAR (10),
  2.     -> Ma VARCHAR (10), Mi VARCHAR (10), J VARCHAR (10),
  3.     -> V VARCHAR (10), S VARCHAR (10), D VARCHAR (10));
  4. Query OK, 0 rows affected (0.13 sec)
  5.  
  6. mysql> INSERT INTO tabla VALUES ('puesto',
  7.     -> IF(DAYOFWEEK(CURDATE()) = 2, 'X', NULL),
  8.     -> IF(DAYOFWEEK(CURDATE()) = 3, 'X', NULL),
  9.     -> IF(DAYOFWEEK(CURDATE()) = 4, 'X', NULL),
  10.     -> IF(DAYOFWEEK(CURDATE()) = 5, 'X', NULL),
  11.     -> IF(DAYOFWEEK(CURDATE()) = 6, 'X', NULL),
  12.     -> IF(DAYOFWEEK(CURDATE()) = 7, 'X', NULL),
  13.     -> IF(DAYOFWEEK(CURDATE()) = 1, 'X', NULL));
  14. Query OK, 1 row affected (0.05 sec)
  15.  
  16. mysql> SELECT * FROM tabla;
  17. +--------+------+------+------+------+------+------+------+
  18. | puesto | L    | Ma   | Mi   | J    | V    | S    | D    |
  19. +--------+------+------+------+------+------+------+------+
  20. | puesto | NULL | X    | NULL | NULL | NULL | NULL | NULL |
  21. +--------+------+------+------+------+------+------+------+
  22. 1 row in set (0.00 sec)
  23.  
  24. mysql> UPDATE tabla SET
  25.     -> L = IF(DAYOFWEEK('2012-10-26') = 2, 'X', L),
  26.     -> Ma = IF(DAYOFWEEK('2012-10-26') = 3, 'X', Ma),
  27.     -> Mi = IF(DAYOFWEEK('2012-10-26') = 4, 'X', Mi),
  28.     -> J = IF(DAYOFWEEK('2012-10-26') = 5, 'X', J),
  29.     -> V = IF(DAYOFWEEK('2012-10-26') = 6, 'X', V),
  30.     -> S = IF(DAYOFWEEK('2012-10-26') = 7, 'X', S),
  31.     -> D = IF(DAYOFWEEK('2012-10-26') = 1, 'X', D)
  32.     -> WHERE puesto = 'puesto';
  33. Query OK, 1 row affected (0.04 sec)
  34. Rows matched: 1  Changed: 1  Warnings: 0
  35.  
  36. mysql> SELECT * FROM tabla;
  37. +--------+------+------+------+------+------+------+------+
  38. | puesto | L    | Ma   | Mi   | J    | V    | S    | D    |
  39. +--------+------+------+------+------+------+------+------+
  40. | puesto | NULL | X    | NULL | NULL | X    | NULL | NULL |
  41. +--------+------+------+------+------+------+------+------+
  42. 1 row in set (0.00 sec)

Observa que en el caso del update estoy utilizando la fecha del 26 de Octubre en vez de la fecha actual (CURDATE()).

Saludos
Leo.

Que tal Leo, primero que nada muchas gracias por tu aportación y ayuda, ahora bien te platico que entiendo muy bien el planteamiento que me haces, como lo he dicho antes, créeme que yo se que no es nada eficiente esta forma de hacerlo, pero pues como dicen "Lo que el cliente pida", yo ya les explique que no es nada conveniente hacerlo de esa forma pero su postura sigue igual.

Bueno voy a la parte del código, ya había pensado en hacer un tipo ciclo con IF's donde comparara si el día de hoy fuera L, Ma, Mi, J, etc. pero aun no sabia bien como funcionaba la función de CURDATE().

En la parte de IF(DAYOFWEEK(CURDATE()) = 2, 'X', NULL), no entiendo la parte donde igualas a 2, entiendo que te refieres al numero de día de la semana, pero no entiendo muy bien esa parte.

Por otra parte, aun haciéndolo de esta forma se le tendría que dar alguna entrada como de un botón o algo para que comience hacer el primer INSERT y después como dices se harán las actualizaciones para los demás días.

Agradezco mucho tu ayuda y espero seguir contando con tu apoyo gracias!
  #6 (permalink)  
Antiguo 24/10/2012, 10:09
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Insercion automatica de datos a tabla

Hola de nuevo Mauk:

Vayamos por partes: es conveniente que antes de todo le des un vistazo a las
Funciones de Fecha y Hora de MySQL, para que veas exactamente qué es lo que hace cada función, por ejemplo:

Código:
aun no sabia bien como funcionaba la función de CURDATE().
CURDATE() obtiene la fecha actual, podrías utilizarla así o enviar cualquier fecha.

Cita:
En la parte de IF(DAYOFWEEK(CURDATE()) = 2, 'X', NULL), no entiendo la parte donde igualas a 2, entiendo que te refieres al numero de día de la semana, pero no entiendo muy bien esa parte.
DAYOFWEEK(date): Retorna el índice del día de la semana para date (1 = domingo, 2 = lunes, ..., 7 = sábado)

Al hacer la comparación con el número 2, me estoy refiriendo al día LUNES, es por eso que en UPDATE tengo algo similar:

Código:
L = IF(DAYOFWEEK('2012-10-26') = 2, 'X', L),
Lo mismo ocurre para todos los días de la semana:

Ahora bien estoy de acuerdo cuando dices "Lo que el cliente pida", sin embargo al cliente NO LE DEBE IMPORTAR COMO LO HAGAS, ese es tu trabajo... Creo que lo que quieres es simplemente un reporte visual, el cual podrías armar de muchas otras maneras más eficientes, observa este ejemplo:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+----------+------------+--------------------+
  3. | id   | empleado | fecha      | comentario         |
  4. +------+----------+------------+--------------------+
  5. |    1 | LEO      | 2012-10-20 | Reunion Bar        |
  6. |    2 | LEO      | 2012-10-22 | Hacer Reporte      |
  7. |    3 | LEO      | 2012-10-24 | Junta Prooveedores |
  8. |    4 | LEO      | 2012-10-26 | Pago Servicios     |
  9. |    5 | MAUK     | 2012-10-24 | Publicar Post      |
  10. |    6 | MAUK     | 2012-10-27 | Modificar BD       |
  11. +------+----------+------------+--------------------+
  12. 6 rows in set (0.00 sec)
  13.  
  14. mysql> SELECT
  15.     -> empleado,
  16.     -> MAX(IF(DAYOFWEEK(fecha) = 2, comentario, NULL)) Lunes,
  17.     -> MAX(IF(DAYOFWEEK(fecha) = 3, comentario, NULL)) Martes,
  18.     -> MAX(IF(DAYOFWEEK(fecha) = 4, comentario, NULL)) Miercoles,
  19.     -> MAX(IF(DAYOFWEEK(fecha) = 5, comentario, NULL)) Jueves,
  20.     -> MAX(IF(DAYOFWEEK(fecha) = 6, comentario, NULL)) Viernes,
  21.     -> MAX(IF(DAYOFWEEK(fecha) = 7, comentario, NULL)) Sabado,
  22.     -> MAX(IF(DAYOFWEEK(fecha) = 1, comentario, NULL)) Domingo
  23.     -> FROM tabla
  24.     -> GROUP BY empleado;
  25. 2 rows in set (0.00 sec)

Código:
+----------+---------------+--------+--------------------+--------+----------------+--------------+---------+
| empleado | Lunes         | Martes | Miercoles          | Jueves | Viernes        | Sabado       | Domingo |
+----------+---------------+--------+--------------------+--------+----------------+--------------+---------+
| LEO      | Hacer Reporte | NULL   | Junta Prooveedores | NULL   | Pago Servicios | Reunion Bar  | NULL    |
| MAUK     | NULL          | NULL   | Publicar Post      | NULL   | NULL           | Modificar BD | NULL    |
+----------+---------------+--------+--------------------+--------+----------------+--------------+---------+
Es decir, una cosa es cómo almacenas la información y otra muy distinta es cómo se la presentas al cliente. Mucho ojo con eso, el usuario ¿Qué es lo que está pidiendo?, si es sólo cuestión de presentación (qué creo sería el caso) es preferible que realices una consulta algo compleja a que la complejidad la dejes a la hora de insertar o modificar los datos. Pero bueno, eso también es cuestión de gustos.

Saludos
Leo.
  #7 (permalink)  
Antiguo 24/10/2012, 11:08
 
Fecha de Ingreso: septiembre-2012
Ubicación: Mexico
Mensajes: 58
Antigüedad: 11 años, 7 meses
Puntos: 2
Respuesta: Insercion automatica de datos a tabla

Gracias Leo ahora entiendo bien la funcion de CURDATE(), he visto demas funciones que tiene SQL para este tipo de situaciones.

Asi es, estoy de acuerdo contigo, al cliente no le importa como lo haga, para el lo importante es que funcione y de eso me encargo yo.

Entiendo muy bien el ejemplo que me das, pero permiteme darte mas información al respecto de lo que estoy haciendo para que lo puedas entender mejor:

Uso phpMyAdmin para la administración de la base de datos, es decir ahí es donde creo todas las tablas que necesitare en mi BD.

Como te comente anteriormente usare paginas PHP, para presentarle al usuario las tablas de la base de datos, en donde el podrá ver la lista de los empleados y los días de la semana los cuales estarán marcados con una "X" para identificar si asistió o no.

El detalle aquí es que nadie tendrá que darle alguna entrada, es decir hacer un INSERT a la tabla o clickear un botón, es decir el sistema lo tendrá que hacer automáticamente por si mismo, ejemplo que a las 4 pm, se marque el campo del día automáticamente.

Cuando el usuario detecte que un empleado falto, ahí si se podrá hace un INSERT a la tabla donde especificara cual fue la razón (tengo una lista de razones).

Quisiera que me siguieras ayudando ya que si me estas entendiendo que es lo se debe de hacer, ya tengo una parte hecha, si gustas puedo enviarte mi código para que lo revises y quizá así entiendas mucho mejor y se mas fácil, por mi no hay ningún problema.

De nuevo agradezco mucho tu ayuda LEO.

Etiquetas: automatico
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:10.