Hola jose.ingnacio.ve.
Cita:
Empezado por jose.ignacio.ve
...
¿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
[-]
CREATE TABLE ALUMNOS (
ID INTEGER NOT NULL,
NOMBRE VARCHAR(15),
APELLIDO VARCHAR(15),
NOMAPELL COMPUTED BY (NOMBRE || ' ' || APELLIDO)
);
ALTER TABLE ALUMNOS ADD CONSTRAINT PK_ALUMNOS PRIMARY KEY (ID);
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;
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'));
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
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