Ayuda con el access

Pues resulta que se me da bastante mal el access... No me gusta como SGBD ni como parte del office pero en clase es lo que la profesora dice de usar y lo que dice la profesora va a misa (que remedio).

Tenemos que hacer una base de datos y tal... y tengo una tabla teatros que contiene un "CodigoTeatros", "nombre" "provincia" y mas datos...
Y quiero meter una regla de validacion en "CodigoTeatros" que obligue a ser codigo teatros una sema del contenido de "provincia + nombre".

Por ejemplo si tenemos provincia "Comunidad Valenciana" y teatro "Serpis" quiero que el CodigoTatro sea "Comunidad Valenciana: Serpis".
Y quiero meter una regla de validacion que obigue a que sea asi, si o si.


El porque de hacer esto es para que el codigo principal sea "CodigoTeatro" envez de "Nombre"+"Provincia", puesto que si lo hago de esta ultima manera luego no puedo relacionar la tabla sesiones.
klausus escribió:Pues resulta que se me da bastante mal el access... No me gusta como SGBD ni como parte del office pero en clase es lo que la profesora dice de usar y lo que dice la profesora va a misa (que remedio).

Tenemos que hacer una base de datos y tal... y tengo una tabla teatros que contiene un "CodigoTeatros", "nombre" "provincia" y mas datos...
Y quiero meter una regla de validacion en "CodigoTeatros" que obligue a ser codigo teatros una sema del contenido de "provincia + nombre".

Por ejemplo si tenemos provincia "Comunidad Valenciana" y teatro "Serpis" quiero que el CodigoTatro sea "Comunidad Valenciana: Serpis".
Y quiero meter una regla de validacion que obigue a que sea asi, si o si.


El porque de hacer esto es para que el codigo principal sea "CodigoTeatro" envez de "Nombre"+"Provincia", puesto que si lo hago de esta ultima manera luego no puedo relacionar la tabla sesiones.


La verdad es que estoy muy oxidado en Access (hace un cojón que no lo toco, no te voy a engañar xD) pero partimos de la base de que no puedes "enmascarar" una clave primaria en dos campos, sin embargo si que puedes filtrar en base a los subcampos de tu tabla, si lo que he leído lo he entendido bien tu lo que quieres es que cuando hagas una búsqueda te reemplace la PK por una suma de cadenas que son las que buscas. Sinceramente ahora mismo no se si se podrá hacer eso en Access (porque Micro$oft con sus cosas ya se sabe como es...) pero hablando en frío no puedes reemplazar una PK en caliente por una búsqueda, en todo caso podrías definir que los campos nombre y provincia sean SK (secondary keys) para poder tener algo de donde agarrar y luego currarte una consulta que tengas en cuenta esos campos, pero la primary key (PK) es invariable y si es codigoteatro será posiblemente autonumérica, la necesitas por cojones "estática" porque sino la bbdd no tiene nada con qué interrelacionar no se si me explico.

Puedes crearte un alias para que haga una búsqueda del nombre del teatro y su comunidad y luego utilizar ese alias en conjunto con el código del teatro para la consulta principal que quieras hacer.

Por otra parte, mirate los TRIGGERS (que no se si Access tenía de eso, SQL tiene por cojones, pero Access, no recuerdo) si pudieras crear triggers a lo mejor te facilita las cosas pero insisto sería todo a nivel de búsqueda, no podrías modificar los campos.

Me reitero, no te fíes mucho de lo que te digo porque hace más de 5 años que no toco Access pero bueno, quizá te valga como punto de partida y si algo de lo que he dicho está mal que alguien me corrija y santas pascuas XD

Nos vemos ;)
Crea la tabla y define como clave principal a nombre y provincia. De esta forma será la combinación de ambas lo que te determinará cada tupla.

Luego puedes crear una consulta (o vista) en la que código teatro es la concatenación de ambas, que como son clave principal pues no se repiten.
Nordal escribió:Crea la tabla y define como clave principal a nombre y provincia. De esta forma será la combinación de ambas lo que te determinará cada tupla.

Luego puedes crear una consulta (o vista) en la que código teatro es la concatenación de ambas, que como son clave principal pues no se repiten.



No me habeis entendido ninguno de los 2 ^^u
No tengo ni estoy usando todavia consultas ni formularios ni nada... (aun).

Yo tenia (y tengo ya que lo he vuelto a dejar asi) como clave principal a "Nombre de Teatro" + "Provincia".
Lo que pasa es que el puñetero ejercicio quiere que haya un codigo de teatro, y yo bueno pues vale...

Y pense en su momento que el codigo de teatro fuera una suma de ambas. Algo que no debe ser muy dificil de hacer con un formulario cuando el cliente meta datos con mi formulario...

Pero esque si el cliente es jilipoyas o tocapelotas y envez de introducir un teatro nuevo con mi formulario va a la tabla manualmente y mete los datos el quiero que haya una clave de validacion que por mis santos cohones no le deje poner el codigo que el quiera sino que tenga que ser la suma del contenido de nombreteatro+provincia (por ejemplo).


De todas maneras ahora mismo me da un poco igual ya que no me voy a calentar mas la cabeza he dicho que todos los teatros tienen 3 sesiones al dia y todos a la misma hora, para evitar tener que hacer relacion de sesiones con teatros.
Cosa que he hecho asi porque no podia relacionar la tabla sesiones con la tabla teatros ya que la clave principal no era codigoteatro.

Asi que le den por saco... a lo simple todos los teatros 1 sola sala y todos empiezan a las 16:00, 19:00 y 22:00. Solo hacen esos pases al dia ale...


Nota: A modo de curiosidad... Al crear un campo en una tabla sino lo marco como clave principal... hay alguna manera de marcarlo para evitar que se repita?? Esque en mysql taba tirao pero aqui es una puta mierda y no lo encuentro [buuuaaaa] [buuuaaaa] [buuuaaaa] [buuuaaaa] [buuuaaaa] .
Hola,

Si a la solucion que te he dado añades un campo autonumerico, tienes entonces el código único :)
Por otro lado, en la pestaña de diseño de la tabla, abajo, tienes las propiedades de cada campo y uno de ellos indica si puede ser único o con duplicados.
Nordal escribió:Hola,

Si a la solucion que te he dado añades un campo autonumerico, tienes entonces el código único :)
Por otro lado, en la pestaña de diseño de la tabla, abajo, tienes las propiedades de cada campo y uno de ellos indica si puede ser único o con duplicados.


Creo que es lo de indexado... Enfin... a cada minuto le siento mas asco a esto enserio XD XD XD
Con lo que me molaba el año pasado Bases de Datos (90% mysql + 10% access) y lo que lo estoy odiando este año (100% Access)... :o

Otra preguntita tonta... Si quiero crear una regla de validacion para un numero para decirl mayor a 0 y menor a 101 por ejemplo lo hago asi:
>0 Y <101
Pero claro... alomejor un teatro en cuestio tiene aforo "50" por eso me gustaria poner algo en plan
>0 Y <[Tabla].[Campo]
Obiamente estas 2 tablas estan relacionadas y con "integridad relacional"... Pero al ponerle eso me dice que tu tia la de albacete...

¿Alguna idea? Lo digo porque en el tema de "reglas de validacion", siempre se me queja...

Y el google encuentro menos informacion de hacer esto que de como recompilar el kernel de linux para noobs [+risas] [+risas] [+risas]
Joder que asquito le toy cojiendo enserio [qmparto] [qmparto] [qmparto]
klausus escribió:Creo que es lo de indexado... Enfin... a cada minuto le siento mas asco a esto enserio XD XD XD
Con lo que me molaba el año pasado Bases de Datos (90% mysql + 10% access) y lo que lo estoy odiando este año (100% Access)... :o

Otra preguntita tonta... Si quiero crear una regla de validacion para un numero para decirl mayor a 0 y menor a 101 por ejemplo lo hago asi:
>0 Y <101
Pero claro... alomejor un teatro en cuestio tiene aforo "50" por eso me gustaria poner algo en plan
>0 Y <[Tabla].[Campo]
Obiamente estas 2 tablas estan relacionadas y con "integridad relacional"... Pero al ponerle eso me dice que tu tia la de albacete...

¿Alguna idea? Lo digo porque en el tema de "reglas de validacion", siempre se me queja...

Y el google encuentro menos informacion de hacer esto que de como recompilar el kernel de linux para noobs [+risas] [+risas] [+risas]
Joder que asquito le toy cojiendo enserio [qmparto] [qmparto] [qmparto]

:)
Un consejo:
Olvida que es access.
No puedes argumentar que access o mysql o  sqlserver o postgree es mejor o peor base de datos. Estás aprendiendo (o eso entiendo) y deberías centrarte en los conceptos.
Por ejemplo, no puedes poner una restriccion apuntanto a un campo de una tabla porque esa tabla tiene (puede tener) miles de entradas y por tanto miles de ese campo. ¿cual usará la restricción? Es imposible saberlo.
La regla que necesitas es tan simple como "Entre 0 y 100"
Si deseas algo más complejo (el valor máximo tomado de otra tabla como mencionas) tendras que tirar de programación capturando eventos antes del insert o update (como los triggers pero con visual basic)
Bueno ya me voy apañando mas con el access gracias al visualbasic... sin visualbasic esto esta mas cojo que otra cosa [+risas] [+risas] [+risas] .

Me ha surgido una dudita tonta (de nuevo!! xD), si tengo un menu contextual (cuadro combinado lo llaman aqui) de los que apretas y te sale un desplegable con las opciones posibles...
Pues bien si tengo 1 de estos que toma de origen una consulta...

Existe alguna manera posible para que cada vez que le pinches para que se te despliguen las opciones, haga la consulta??
Esque la consulta lo hace la primera vez que lo despliegas y el resto de veces te saca los valores obtenidos en la consulta que hizo...
Pero quiero que la lista se actualize y haga la consulta cada vez que despliego la lista...

He provado mediante visualbasic a desativar y activar el cuadro (Enabled), y ahora toy tratando de probar con el origen de control (ControSource)...
Un menú contextual no es lo mismo que un cuadro combinado.
Para hacer lo que deseas, ve a eventos del cuadro combinado y en el evento de "Al recibir el enfoque" escribes

=[nombre del campo].requery

De esta forma, cada vez que se pinche en el para desplegar o se llegue por tabulación y por tanto recibe enfoque, se re-hace la consulta asociada al campo.
Nordal escribió:Un menú contextual no es lo mismo que un cuadro combinado.
Para hacer lo que deseas, ve a eventos del cuadro combinado y en el evento de "Al recibir el enfoque" escribes

=[nombre del campo].requery

De esta forma, cada vez que se pinche en el para desplegar o se llegue por tabulación y por tanto recibe enfoque, se re-hace la consulta asociada al campo.


Te quierooooooo!!! XD XD XD

Estube tratando algo en plan "reload" pero al ver que no estaba pense tal vez desactivandolo y activandolo (no funciono) o cambiandole el origen (tampoco me fue) y resulta que si habia una funcion en plan lo que buscaba (reload) que era "Requery" Muchas Gracias tio...

En mi caso lo tengo puesto en el evento de "al cambiar" de otro "Cuadro Combinado" ya que la consulta depende del valor de este cuandro...
Entonces cuando cambia el valor pues la consulta la rehago...

Muchas gracias tio.
Por cierto tienes razon no es lo mismo menu contextual que cuadro combinado... Me cole y bien colado [+risas] [+risas]


PD: No estamos usando access como SGBD, (bueno si...), la cosa esque es para una asignatura de diseño (DFD's, Diccionario de datos, E-R...)
Y la chica quiere usar el access para hacer "Prototipos" de programas... asi en plan rapido y facil y nos toca tragarnos hacer la bdo en access tb pero en fin... Ya va mejorando la cosa ;)
De nada.
Entiendo tu postura y "odio" hacia access, ya que yo me encontré en una situación similar hace unos años.
Sin embargo, cuando te deshagas de los pre-juicios que tienes, encontrarás una gran herramienta de trabajo y prototipado rápido. Simplemente aprende, la informatica no son los programas si no el programador.
Siento ser tan pesado pero tengo otra duda...
Tengo un formulario y varios cuadros combinados los cuales vas seleccionando "varias opciones" y al final hay un boton que ejecuta una consulta.

Pues bien cuando el boton ejecuta la consulta (de actualizacion) esta no cojer los valores de los cuadros combinados...

Es decir mi consulta alomejor tiene 8 campos y quiero actualizar 1 campo siempe y cuando los otros 7 campos "coincidan" con los seleccionados en el formulario, ya que me interesa actualizar una sola entrada de toda la tabla... Y como la tabla tiene 7 Claves primarias pues por eso se seleccionan en el formulario...

Pero cuando lo ejecuto es como si al darle al boton se abriera la consulta fuera del formulario (no dentro), osea como si le doy doble clicl a la consulta @_@


Imagen
Imagen
La "consulta" que has puesto no hace referencia al formulario. Ese es el problema.
Cuando la llamas desde el botón, access no "sabe" de donde coger los datos.
Se soluciona poniendo el formulario delante de cada campo que pasas como parámetro, por ejemplo:

En lugar de [Teatro_]
debes poner [nombreFormulario]![Teatro_]
Nordal escribió:La "consulta" que has puesto no hace referencia al formulario. Ese es el problema.
Cuando la llamas desde el botón, access no "sabe" de donde coger los datos.
Se soluciona poniendo el formulario delante de cada campo que pasas como parámetro, por ejemplo:

En lugar de [Teatro_]
debes poner [nombreFormulario]![Teatro_]


Esto ya lo probe antes utilizando como separador un punto... Voy a probar con el simbolo de exclamacion "!".

Edit: Me temo que no va... Esto solo sirve para hacer referencia a campos de tablas (y/o consultas) pero me temo que formulario no [buuuaaaa] [buuuaaaa]



Imagen
Imagen
Prueba con:

[Formularios]![Tabla1]![Campo1]

(el ejemplo anterior te lo puse de memoria, este ultimo lo he creado con el generador de expresiones)
Nordal escribió:Prueba con:

[Formularios]![Tabla1]![Campo1]

(el ejemplo anterior te lo puse de memoria, este ultimo lo he creado con el generador de expresiones)


Me temo que esto es inviable puesto que no proceden los datos de ninguna tabla.
En el caso expuesto provienen todos de consultas... pero esque tengo este mismo problema en algun otro formulario el cual el valor no viene de ninguna tabla ni consulta sino que es una caja de texto independiente sin origen ni destino que ha introducido el usuario.
Pásame el programa por megaupload y te lo miro con tranquilidad. Si no voy a ir dando posibles soluciones y tu me vas a ir dando detalles cada vez... no entiendo como tienes desplegables que no dependen de información almacenada... eso es limitar la aplicacion en gran medida, ¿no crees?
Nordal escribió:Pásame el programa por megaupload y te lo miro con tranquilidad. Si no voy a ir dando posibles soluciones y tu me vas a ir dando detalles cada vez... no entiendo como tienes desplegables que no dependen de información almacenada... eso es limitar la aplicacion en gran medida, ¿no crees?


Al final lo solucione (pastelosament mal, desastroso... xD) pero lo solucione...
Como no podia en la consulta obtener los datos de un formulario, me toco decirle que los cojiera de una nueva tabla que llame "Entradas_Temp" (que no esta relacionada con nada es una copia de Reservas pero vacia).

Entonces lo que hice es a la hora de "ejecutar" la consulta, previamente metia los datos a la tabla (Entradas_Temp), realizaba la consulta de actualizacion que toma los datos de "Entradas_Temp" y actualiza la tabla "Entradas" (mediante la consulta), acto seguido otra consulta que me borraba todos los datos de la tabla temporal llamada "Entras_Temp".

Como ya he dicho lo solucione, No me ha gustado mucho (bueno a decir verdad no me ha gustado nada...) pero habia que entregar/enseñar hoy el prototipo y tenia que funcionar asi que por a o por b... Si no podia hacerlo bien pues.... ¿mal? :o :o


Luego tenia 2 consultas que actualizan esa misma tabla (entradas) 1 campo o 2 en concreto (de tipo bolean: Si/No) pero necesitaba saber el dni que me lo metia el usuario manualmente y no hacia referencia a ninguna tabla ni nada... si existe la consulta lo encuentra y hace la actualizacion pertinente y si no lo encuentra la consulta pues no realiza las actualizacioes ya que no hay nada que actualizar...
Todo bien hasta que de nuevo la consulta no me coje los datos del formulario TT______TT
En este caso como era 1 simple campo (DNI) lo que hice es que le saliera el cuadro ese de error que te pide el campo y lo metiera ahi... Como es 1 solo campo...


Como ya has visto necesitaba en 2 ocasiones hacer referencia a un formulario desde una consulta de actualizaciony como no pude pues lo solucione patateramente.
No estoy orgulloso desde luego, pero no conozo ninguna otra manera (con acces, o access + VBA).

Respecto al proyecto si quieres te lo paso comprimido que son como unso 200KB (descomprimid 10Mb) pero ya te digo las dudas las pregunte por necesdad ya que tenia que entregar un trabajo... ahora ya esta entregado... Asi que si te la paso y me lo solucionas simplemente seria en plan didactico.

Pero no hace falta, ya te he molestado demasiado.

Gracias por todo de antemano.
Bye.
No es molestia, si quieres que te lo repase y te de alguna solucion alternativa a esa de la tabla temporal por mi encantado de ser de ayuda.

Por otro lado, me alegro de que resolvieras el problema. En informática esa es la clave, la versatilidad del programador.
OK...

Aqui tienes el link esta comprimido: http://www.mediafire.com/?mytk2nmgytj

Un ejemplo simple que puedes probar es el formulario "Taquilla - Cancelar o Formalizar Reservas" el cual tiene 2 Botones que llaman a consultas distintas que en funcion a un parametro (DNI) cancela todas sus reservas (las deja libres sin reservar) en la tabla "Entradas" o bien las marca como vendidas.

Ahora bien tienes que conseguir que las consultas de actualizacion que llamas ("Comprar - Comprar Reserva" y "Comprar - Cancelar Reserva") obtengan del dni de un campo del formulario que las llama ("Taquilla - Cancelar o Formalizar Reservas"), el campo quiero que sea de tipo "textbox" (caja de texto) para introducir manualmente el dni (o codreserva como lo quieras llamar).

Me interesa eso que el dni lo introduzcas manualmente y no que los tome de una tabla o consulta de los posibles que hayan reservado ya que si han reservado 300 personas no quiero un desplegable largo de cojones que me saque 300 posibilidades... Quiero meterlo a mano con posibilidad de error y decirle un dni que no exista.
Obiamente si hacemos esto ultimo y le mandamos a la consulta un dni que no esta en la tabla al no encontrar nada no actualiza nada y lo deja como esta.

Haber si lo consigues y si lo haces me explicas como ;)


Nota:
Actualmente creo que la bdo no tiene ninguna reserva activa, puedes realizar alguna mediante el formulario "Taquilla - Reservar Entrada", eso si selecciona una fecha mayor a 2 dias de la actual, ya que si hoy en 25 y haces una reserva para antes del 27 (o el 27 inclusive) se debe autocancelar... de manera que si pones que la reserva es pa dentro de 1 mes mismo pues te ahorras lios...

Solo puedes Reservar entradas para las actuaciones posterioes a 2 dias de la fecha actual como te he dicho antes (si hoy es 25, pues puedes reservar actuaciones para el dia 28 pero no del dia 27 ni 26 ni 25 ni anteriores), si no te sale ninguna fecha esque no hay ninguna actuacion valida para esa obra interpretada por ese grupo teatral en ese teatro...
Puedes crear actuaciones con el formulario: "Admin- Añadir Actuaciones".
Dime si he acertado con la interpretación.

http://www.mediafire.com/?tnftmz2xooq

nota: solo he modificado el comportamiento de cancelar la reserva.
Nordal escribió:Dime si he acertado con la interpretación.

http://www.mediafire.com/?tnftmz2xooq

nota: solo he modificado el comportamiento de cancelar la reserva.


si lo has conseguido... he revisado la consulta y por lo que veo lo que hacia falta para referenciar a la consulta es el valor [Formulario] osea hay que decirle que le vamos a dar un formulario previamente y no una tabla/cosulta como esta acostumbrado... vaya era esa tonteria...

AHora ya se hacerlo.
Muchas Gracias... ya he aprendido a manejar un poquito mejor el access por si lo necesito algun dia :p :p
21 respuestas