Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Registro de asistencias (https://www.clubdelphi.com/foros/showthread.php?t=86813)

jose.ignacio.ve 07-10-2014 21:52:56

Registro de asistencias
 
Tengo una duda, quisiera hacer un registro de asistencia para un alumno. Donde al buscar el alumno me aparece un stringgrid con 30 mas o menos celdas dependiendo el mes actual que representan los dias. Lo que yo quisiera hacer es que al hacer click en el dia de hoy registre la asistencia de ese alumno!. Pero no se como hacer la base de datos. Osea tengo la tabla alumnos.
¿tendria que crear una tabla asistencia? con 31 campos ya que no hay mes con mas dias? por ejemplo: ID_asistencia; ID_alumnos;d1,d2,d3,d4...,d31; donde los d son los dias..
o alguien que me tire una ayuda!!

ecfisa 08-10-2014 05:37:28

Hola jose.ingnacio.ve.
Cita:

Empezado por jose.ignacio.ve (Mensaje 482663)
...
¿tendria que crear una tabla asistencia? con 31 campos ya que no hay mes con mas dias? por ejemplo: ID_asistencia; ID_alumnos;d1,d2,d3,d4...,d31; donde los d son los dias..

Si, podrías hacerlo de ese modo... Pero, si no deseas desperdiciar espacio dimensionando días por exceso, ignorar fines de semanas, feriados, etc., otra opción es armar tus tablas de forma similar a esta:
Código SQL [-]
/* TABLA ALUMNOS */
CREATE TABLE ALUMNOS (
    ID        INTEGER NOT NULL,
    NOMBRE    VARCHAR(15),
    APELLIDO  VARCHAR(15),
    NOMAPELL  COMPUTED BY (NOMBRE || ' ' || APELLIDO) 
    /* ,demás campos */
);
ALTER TABLE ALUMNOS ADD CONSTRAINT PK_ALUMNOS PRIMARY KEY (ID);


/* TABLA MESES */
CREATE TABLE MESES (
    ID         INTEGER NOT NULL,
    FECHA      DATE,
    ALUMNO_ID  INTEGER    
);
ALTER TABLE MESES ADD CONSTRAINT PK_MESES PRIMARY KEY (ID);
ALTER TABLE MESES ADD CONSTRAINT FK_MESES FOREIGN KEY (ALUMNO_ID)
  REFERENCES ALUMNOS (ID) ON DELETE CASCADE ON UPDATE CASCADE;


/* TABLA DIAS */
CREATE TABLE DIAS (
    ID        INTEGER NOT NULL,
    DIA       SMALLINT,
    PRESENTE  CHAR(1),
    MESES_ID  INTEGER
);
ALTER TABLE DIAS ADD CONSTRAINT PK_DIA CHECK(DIA > 0 AND DIA < 32);
ALTER TABLE DIAS ADD CONSTRAINT PK_PRESENTE CHECK(PRESENTE IN ('A', 'P')); /* 'A'usente / 'P'resente */
ALTER TABLE DIAS ADD CONSTRAINT PK_DIAS PRIMARY KEY (ID);
ALTER TABLE DIAS ADD CONSTRAINT FK_DIAS FOREIGN KEY (MESES_ID)
  REFERENCES MESES (ID) ON DELETE CASCADE ON UPDATE CASCADE;
Entonces para ver las asistencias de un alumno en determinado mes de determinado año la consulta sería:
Código SQL [-]
SELECT A.NOMAPELL, D.DIA,  D.PRESENTE /* , demás campos */
FROM ALUMNOS A
INNER JOIN MESES M ON M.ALUMNO_ID = A.ID
INNER JOIN DIAS D ON D.MESES_ID = M.ID
  AND A.ID = :ALUMNOID 
  AND EXTRACT (YEAR FROM M.FECHA)= :ANIO
  AND EXTRACT (MONTH FROM M.FECHA) = :MES
Si no deseas extraer año y día en las consultas, podes declarar dos columnas ANIO y MES de tipo entero en lugar de la columna FECHA (MESES). Depende de como prefieras organizar tu aplicación...

Saludos :)


La franja horaria es GMT +2. Ahora son las 02:06:07.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi