Base de datos en access

Hola que tal
Tengo una base de datos de Audiovisuales. El problema que tengo es que la hora de inicio de una sala y la del final. Ejemplo
Record 1 1:00 P.M. A 2:00 P.M.
Record 2 1:50 P.M. A 3:00 P.M.
El campo inicio y final son Key, al igual que los de la sala y la fecha para que no se repiran. Pero como hago para que la misma base de datos se de cuenta de que 1:50 no se repite pero esta cogida de 1 a 2.
Respuesta
1
No puedes hacerlo directamente, tendrás que prohibir mediante código que no se de este caso, o bien definirte una consulta para controlar estos casos anómalos. Aunque no te vas a librar de codificar en VB.
Ok lo se pero me podrías dar un ejemplo
La consulta que debes tener es la siguiente:
Select b.key1 as IniB,b.key2 as FinB,a.key1 as IniA,a.key2 as FinA from tabla a, tabla b where b.key1>a.key1 and b.key1<=a.key2
te dará los registros que se solapan con otros ya existentes y que deberás corregir.

5 respuestas más de otros expertos

Respuesta
1
Access tiene buenas maneras de realizar restricción pero para esta si te toca tirar código, antes de guardar realiza una consulta en la que pregusntas si el valor de inicio que quieres ingresar se encuentra entre los valores inicio y final de alguno de los registros que ya tiene la tabla para la sala y la fecha especificada, seria algo como
SELECT *
FROM Tabla
WHERE (Hora_A_Validar BETWEEN inicio AND final)
AND Fecha=Fecha_A_Validar
AND Sala=Sala_A_Validar
Si esta consulta retorna algo la sala esta ocupada y puedes restringir la inserción del nuevo registro, obviamente la conaulta hay que hacerla para la hora inicial y final
SAM
Todos los datos están dentro de la misma tabla. No entiendo a que te refieres que pregunte el valor de inicio.
Todos los datos están en la misma tabla
Campos
Día mes a~o sala hora inicial hora final
Me podrías explicar un poco más
Si me dices que salga un tipo de pop up y que pregunte me podrías dar una idea.
Muchas gracias
Entiendo perfectamente tu punto.
Pregunta que te hago
Este código va en el formulario va en un bon o bajo que evento
SELECT *
FROM Tabla
WHERE (Hora_A_Validar BETWEEN inicio AND final)
AND Fecha=Fecha_A_Validar
AND Sala=Sala_A_Validar
Cuando escribo SELECT * me tira un error de compilación
La consulta que te envío es una consulta de validación, en algún momento tu programa debe de ingresar los datos en la tabla que me describiste, bues bueno antes de hacer la inserción realiza la consulta SQL como la que te mande, esta consulta determina si existe un registro previo que tenga la misma sala, la misma hora y que la hora de los datos que quieres ingresar, ademas determina si la hora inicial que quieres ingresar se encuentra entre un rango previamente escogido. La consulta en si no te restringe pero te dice que existe al menos un registro en de la tabla que tiene reservada a la hora en cuestión
PEJ
Existe el registro
Sala Fecha Inicio Fin
1 1/1/3 1:00 1:45
Y quieres ingresar
Sala Fecha Inicio Fin
1 1/1/3 1:15 1:30
La condicion WHERE del select busca los resgistros que:
Tengan la misma Fecha (cierto)
Tengan la misna Salsa (cierto)
La hora inicial ainsertar este dentro del rango de algún registro en este caso 1:15 esta dentro del rango del registro que ya esta grabado, como la consulta y con que esta me retorne algún registro ya estoy determinando que no se puede inserta a la 1:15 en esa sala en esa fecha, obviamente hay que validar de la misma manera la hora final a insertar.
SAM
Ahhhhh,
Esa es una instrucción sql, no corre directamente en código VBA, access y VBA utilizan ADO (ActiveX Data Object) para interactuar con la base de datos, mira en la ayuda como crear un recordset y sigue los ejemplos.
En la ayda de VB tambie ncuentras mucha informacion.
Si tienes alguna duda al respecto me escribes (el tema es algo grande para tratarlo por aquí)
Ahora si entiendo el código porque es algo como visual basic. Tratare de crear un find y usar lo que me distes. Pero sigo con la duda de donde va ese código si lo creo.
Creo que no me estas entendiendo, entendí lo del código, la pregunta que te hago es en donde inserto el código que cree.
Necesito que me digas como y donde insertar esa consulta (código)
Si tienes msn dajamelo saber pa que me ayudes.
Entiendo lo que me dices pero donde va el código que escriba.
Tengo conocimientos en Visual Basic (cogí un curso mientras hacia mi barchiller en Sistemas de Información)
La idea de utilizar find me parece muy buena es prácticamente lo mismo, lo que haces es buscar lo que esta en la clausula where y si eng\cuentra alguno pues no se puede insertar (esto obviamente lo restringes por código), es decir en el find buscas que se cumpla
(Hora_A_Validar BETWEEN inicio AND final)
AND Fecha=Fecha_A_Validar
AND Sala=Sala_A_Validar
Lo que pasa es que te respondo sin saber hasta donde conoces VB y Access y en ese sentido aveces peco de explicar mucho o poco según el conocimiento o dreztesa en la aplicación por parte de quien pregunta.
SAM
Me estoy volviendo loco, no se donde va el código y no me sirve donde lo pongo.
No se si me puedas hacer el favor y enviarme como lo harías con los campos que te dije a mi email. Algo sencillo solo fecha, sala, hora inicial y hora final.
mi email es [email protected]
[email protected]
P.D. Se que estoy molestando mucho pero es que de este programa depende mucho mi trabajo.
Hice la consulta que me distes
¿Pero no existe una manera de que se restringa a ingresar los datos?
Desde el form puedo ingresar los datos y no me dice que existe un record, como podría hacerle pa que me dijera que esta tomado y que no puedo ingresarlo porque ya esta tomado.
Que yo conozca no existe en access, en SQL server o oracle puedes usar un trigger, pero este se basaría en al consulta que te digo (bueno esa es una forma).
Mira enviame la estructura de la tabla con datos en un .zip a [email protected]
(Crea una DB nueva e importa la tabla en cuesntion)
Y tranquilo no es ninguna molestia si no, simplemente no me incribiria aquí, siempre que tenga algo de tiempoe es bueno ayudar a los demás.
SAM
Respuesta
1
Perdona el retraso.
Debes crear campos de fecha con el formato largo, de modo que tengas inicio y fin con día y hora.
Así, tendrás que hacer una consulta cada vez que metas un registro que verifique si tu periodo coincide con el que ya está cogido...
La consulta es:
inicio<=fin_nuevo AND fin>Inicio_nuevo
Si devuelve algún registro es que existe solapamiento de recursos, si quieres hacerlo por código, podrías hacer un evento Antes de Actualizar y algo así como:
if dcount("campo","tabla_reservas","[aula]=" & me![aula] & " and [inicio]<= " & me![inicio] & " and [fin]>" & me![fin])>0 then
msgbox ("hay solapamiento")
docmd.cancelevent
end if
Esta es la teoría... en el formulario meterías la nueva reserva (aula, inicio y fin) y este if te contrasta si con esos datos hay algún registro en la tabla de reservas.
Respuesta
1
¿Si los campos inicio y fin son 2 campos independientes? Si fuera así la solución sería poner una regla de validación, ya sea en el control de un formulario o en la definición de la tabla.
Si los campos son independientes
Me podrías explicar como hacerlo, no tengo ni la menor idea de como hacerlo.
Tengo conocimientos en Visual Basic pero no programando en Access.
En la tabla (definición) click F6, parado en el campo que te interesa y vas las propiedades del campo.
Ahí hay una propiedad que es regla de validación, ahí mismo la definís, fíjate en el help como.
Ok y me podrías como podría escribir un código para resolver mi duda
Tendría que internarme más en el problema, con los datos que tengo me es muy difícil imaginarlo. Si quieres mandame la base de datos y bien, bien explicado que es lo que querés a [email protected] y veo si hago un rato para mirarlo.
Ok te enviare el programa y detalles de lo que quiero hacer
Buena respuesta pero lo solicione de otro modo
¿Y? No mandaste nada, y tampoco me calificaste...
Respuesta
1
¿Sabes VB?
Por otro lado, he estado mirando la ayuda de access y existe una función llamada datediff que te permite sacar la diferencia entre dos fechas incluyendo horas.
También existen otras funciones como dateadd dateserial, timeserial, que deberías mirar pues creo que con esto podrías hacer la rutina.
Deberías plnatearte primero la solución en un papel, en pseudocódigo y luego intentar traducirla a vba.
Si entiendo lo que me dices. El problema esta que no se como hacerlo en access
La verdad es que directamente no se puede hacer ya que las claves no pueden ser rangos.
Sólo valores concretos.
La única forma de hacerlo es que al validar el registro en la base de datos apliques algún procedimiento de comprobación de errores, ya que una cosa es la integridad referencial de los datos y otra la integridad semántica. La primera se resuelve mediante el uso de claves y diseños adecuados y la segunda mediante rutinas de comprobación de errores.
La rutina tendría que verificar antes de procesar un nuevo registro que las datos de inicio y final del nuevo registro no se solapan con los ya existentes mediante la llamada a un procedimiento o función, de tal forma que si existe dicho solapamiento no te permita grabar los datos.
Respuesta
1
Podrías ampliarme un poco más tu pregunta porque creo que si record2 es 1:50 a 3:00 no se podría escoger 1 a 2

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas