Este proyecto tiene como objetivo implementar una base de datos en Microsoft Access que será para una clínica de especialidades y tiene como finalidad llevar el control de citas de los diferentes médicos. La base de datos tiene tres tablas, Citas, Médicos y Pacientes, a continuación se describen los campos que contendrá cada tabla.
- Médicos: idMedico, nombre, apellidoPaterno, especialidad
- Pacientes: idPaciente, nombre, apellidoPaterno, apellidoMaterno, género, numeroDeExpediente, calleYNumero, colonia, codigoPostal, entidadFederativa, telefono, correoElectronico
- Citas: idCita, idMedico, idPaciente, fechaCita, horaCita, costoCita, observaciones
El desarrollo de esta base de datos se describe a continuación.
Creación de tablas
La creación de las tablas se realizó por medio de lenguaje SQL. Es importante recordar que la ejecución de sentencias SQL se realiza por medio de la pestaña Crear, grupo Consultas, opción Diseño de consulta y después en la ventana de consulta tenemos que elegir Vista SQL por medio del uso de clic derecho. A continuación se muestran los códigos utilizados para crear cada una de estas tablas.
CREATE TABLE Medicos(
idMedico INTEGER,
nombre CHAR(40) NOT NULL,
apellidoPaterno CHAR(40) NOT NULL,
especialidad CHAR(40) NOT NULL,
CONSTRAINT PK_enlace_medico PRIMARY KEY (idMedico)
);
CREATE TABLE Pacientes(
idPaciente INTEGER,
nombre CHAR(40) NOT NULL,
apellidoPaterno CHAR(40) NOT NULL,
apellidoMaterno CHAR(40) NOT NULL,
sexo CHAR(20) NOT NULL,
numeroDeExpediente NOT NULL,
calleYNumero CHAR(40) NOT NULL,
colonia CHAR(40) NOT NULL,
codigoPostal CHAR(5) NOT NULL,
entidadFederativa CHAR(40) NOT NULL,
telefono CHAR(20),
correoElectronico CHAR(40),
CONSTRAINT PK_enlace_pacientes PRIMARY KEY (idPaciente)
);
CREATE TABLE Citas(
idCita INTEGER NOT NULL,
idMedico INTEGER NOT NULL,
idPaciente INTEGER NOT NULL,
fechaCita DATETIME NOT NULL,
horaCita CHAR(10) NOT NULL,
costoCita MONEY NOT NULL,
observaciones CHAR(80),
CONSTRAINT PK_enlace_citas PRIMARY KEY (idCita)
);
Configuración de relaciones entre tablas
El siguiente paso es establecer la relación entre estas tablas, para esto tenemos que hacer uso de las restricciones, esto se puede lograr por medio de las sentencia ALTER TABLE y CONSTRAINT. Las instrucciones usadas para lograr esto se muestran en seguida.
ALTER TABLE Citas ADD CONSTRAINT FK_citas_pacientes FOREIGN KEY (idPaciente)
REFERENCES Pacientes(idPaciente);
ALTER TABLE Citas ADD CONSTRAINT FK_citas_medicos FOREIGN KEY (idMedico)
REFERENCES Medicos(idMedico);
Access genera un diagrama entidad-relación que resulta de la ejecución de las instrucciones anteriores, este se muestra en la siguiente imagen.
Desde luego, la creación de tablas, relaciones y el diagrama entidad-relación también se puede generar por medio del uso de la interfaz gráfica de usuario de Access.
Inserción de registros
Ya que se tiene la estructura de la base de datos entonces podemos proceder a realizar la inserción de registros en las tablas correspondientes, para ellos tenemos que hacer uso de la instrucción INSERT INTO pero se hará una excepción, es decir, se usarán las macros de VBA en Access para realizar la inserción de varios registros debido a que la ventana de consultas de este software solo permite insertar un registro a la vez pero por medio de las macros podemos introducir gran cantidad de registros usando una sola subrutina. Esta subrutina se muestra a continuación.
Sub conectarConDbActual()
Dim conexionDB As New ADODB.Connection
Set conexionDB = CurrentProject.Connection
'Inserción de registros en tabla Medicos
conexionDB.Execute ("INSERT INTO Medicos VALUES(1, 'Julio', 'Rodriguez', 'Cardiología')")
conexionDB.Execute ("INSERT INTO Medicos VALUES(2, 'Pedro', 'Estrada', 'Neurología')")
conexionDB.Execute ("INSERT INTO Medicos VALUES(3, 'Mariana', 'Hurtado', 'Dermatología')")
conexionDB.Execute ("INSERT INTO Medicos VALUES(4, 'Luis', 'Fernández', 'Oncología')")
conexionDB.Execute ("INSERT INTO Medicos VALUES(5, 'Sonia', 'Martínez', 'Radiología')")
'Inserción de registros en tabla Pacientes
conexionDB.Execute ("INSERT INTO Pacientes VALUES(1, 'Alberto', 'Ramírez', 'Camarena', 'Masculino', 10, 'Calle 3, No 9', 'Valle de Bravo', '99502', 'CDMX', '0987640123', 'alberto@micorreo.com')")
conexionDB.Execute ("INSERT INTO Pacientes VALUES(2, 'Maria', 'Juarez', 'López', 'Femenino', 30, 'Calle 9, No 8', 'Valle de Anáhuac', '88412', 'Estado de México', '8904321456', 'maria@micorreo.com')")
conexionDB.Execute ("INSERT INTO Pacientes VALUES(3, 'Adriana', 'Domínguez', 'Antulio', 'Femenino', 36, 'Calle 13, No 90', 'Héreoes', '89022', 'CDMX', '5589098901', 'adriana@micorreo.com')")
conexionDB.Execute ("INSERT INTO Pacientes VALUES(4, 'Fernando', 'Jiménez', 'Fernández', 'Masculino', 45, 'Calle 23, No 4', 'Laureles', '09789', 'CDMX', '550000000021', 'fernando@micorreo.com')")
conexionDB.Execute ("INSERT INTO Pacientes VALUES(5, 'Antonio', 'Perales', 'Ochoa', 'Masculino', 48, 'Calle 33, No 2', 'Cedros', '09034', 'Estado de México', '0923567891', 'kevin@micorreo.com')")
'Inserción de registros en tabla Citas
conexionDB.Execute ("INSERT INTO Citas VALUES(1, 1, 1, '2025-05- 25', '10:00', 70, 'Ninguna')")
conexionDB.Execute ("INSERT INTO Citas VALUES(2, 2, 1, '2025-06- 25', '13:00', 70, 'Ninguna')")
conexionDB.Execute ("INSERT INTO Citas VALUES(3, 1, 2, '2025-01- 25', '16:00', 80, 'Ninguna')")
conexionDB.Execute ("INSERT INTO Citas VALUES(4, 2, 2, '2025-02- 25', '09:00', 80, 'Ninguna')")
conexionDB.Execute ("INSERT INTO Citas VALUES(5, 1, 3, '2025-03- 25', '14:00', 90, 'Ninguna')")
conexionDB.Execute ("INSERT INTO Citas VALUES(6, 2, 3, '2025-04- 25', '15:00', 90, 'Ninguna')")
conexionDB.Execute ("INSERT INTO Citas VALUES(7, 1, 4, '2025-11- 25', '16:00', 100, 'Ninguna')")
conexionDB.Execute ("INSERT INTO Citas VALUES(8, 2, 4, '2025-12- 25', '15:00', 100, 'Ninguna')")
conexionDB.Execute ("INSERT INTO Citas VALUES(9, 1, 5, '2025-10- 25', '15:00', 50, 'Ninguna')")
conexionDB.Execute ("INSERT INTO Citas VALUES(10, 2, 5, '2025-11- 25', '17:00', 50, 'Ninguna')")
End Sub
La siguiente imagen muestra los registros colocados en las tablas de este proyecto de Access (Clic en cada imagen para ampliarla).
Pruebas y resultados
Para probar la correcta estructuración de la base de datos podemos ejecutar algunas consultas multitabla que nos permitan observar las relaciones que fueron creadas, para esto se tiene la opción de usar uniones, específicamente se va usar INNER JOIN para obtener los datos comunes a dos o más tablas. Por ejemplo, vamos a realizar una consulta para obtener la fecha de la cita, la hora y el costa de la misma, también vamos a extraer el nombre del paciente de esa cita, su entidad federativa y el nombre del médico que va atender a ese paciente. El código para llevar a cabo esto es el siguiente.
SELECT
Citas.fechaCita, Citas.horaCita, Citas.costoCita, Pacientes.nombre, Pacientes.entidadFederativa, Medicos.nombre
FROM
(Citas
INNER JOIN
Pacientes ON Citas.idPaciente = Pacientes.idPaciente)
INNER JOIN
Medicos ON Citas.idMedico = Medicos.idMedico;
El resultado (Vista de hoja de datos) que devuelve esta consulta se muestra en la siguiente imagen.
Otra consulta que puede ser muy útil es extraer todas las citas que tiene un médico junto con datos del paciente asociado, para esto podemos usar la clausula INNER JOIN y la clausula WHERE para definir la condición de extraer solo los datos de columnas de un id de médico específico. El código de esta consulta se muestra en seguida.
SELECT
Citas.fechaCita, Citas.horaCita, Medicos.nombre, Medicos.idMedico
FROM
Citas
INNER JOIN
Medicos ON Citas.idMedico = Medicos.idMedico
WHERE
Medicos.idMedico = 1;
Esta consulta devuelve la tabla de datos que se muestra en la siguiente imagen.
También podemos hacer uso de uniones de tipo LEFT JOIN para extraer todos los médicos o pacientes que no tienen ninguna cita pero que están presentes en la base de datos, esto puede ser útil para casos como contactar a clientes con los que no se ha tenido comunicación o que no han tenido la oportunidad de asistir a la clínica y por tanto no tienen citas recientes en el sistema, o bien, puede se útil para asignar citas y pacientes a médicos que por el momento están más libres de tiempo. En seguida se proporcionan dos consultas del tipo descrito.
SELECT Pacientes.nombre, Pacientes.apellidoPaterno, Pacientes.telefono, Citas.idCita
FROM
Pacientes
LEFT JOIN
Citas ON Pacientes.idPaciente = Citas.idPaciente;
SELECT Medicos.nombre, Medicos.apellidoPaterno, Citas.idCita
FROM
Medicos
LEFT JOIN
Citas ON Medicos.idMedico = Citas.idMedico;
Los resultados de estas consultas se muestran en las siguientes imágenes.
En estas imágenes se puede ver que aquellos pacientes sin citas y médicos sin citas muestran una casilla vacía de id de citas, esto se debe a que LEFT JOIN devuelve los resultados propios de cada tabla (registros sin cita) y los comunes a ambas tablas (registros con cita).
Además, de las consultas multitabla que se usaron previamente, podemos usar RIGHT JOIN para traer todos los registros de la tabla de citas (definida como tabla derecha) junto con los registros coincidentes de la tabla de médicos o pacientes, en este caso, en el sistema todas las citas están asignadas, por tanto no se van a devolver resultados vacíos de parte de la tabla de citas. La consulta RIGHT JOIN se describe a continuación y contiene los id de cada cita pero también el nombre y apellido de cada paciente relacionado con esa cita.
SELECT citas.idCita, Pacientes.nombre, Pacientes.apellidoPaterno
FROM
Pacientes
RIGHT JOIN
Citas ON Pacientes.idPaciente = Citas.idPaciente;
El resultado devuelto por esta consulta se muestra a continuación.
Finalmente, la estructura del proyecto creada con los procesos anteriores se puede observar en la siguiente imagen, los objetos que están presentes son las tablas, consultas y los módulos que contienen los códigos de VBA.

