Ver Mensaje Individual
  #2  
Antiguo 08-10-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola jose.ingnacio.ve.
Cita:
Empezado por jose.ignacio.ve Ver Mensaje
...
¿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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita