Formularios

Espero que pueda ayudarme ya que e intentando buscar alguna solución por la red y no he encontrado nada.
Tengo una base de datos relacional creada con una tabla principal edificios relacionada de 1 a N con otras tablas como titular, calle, etc... Tengo un formulario menu del cual puedo acceder a 2 formularios "añadir alta" y "buscar y modificar". Tengo 2 problemas:
1.- Mi primer problema es en el formulario "añadir alta", tengo cuadros de texto y cuadros combinaos en los cuales se ingresa la información adecuada para insertar nuevos registros en la base de datos. Una vez escrito la información correspondiente de cada campo tengo un botón "insertar" para añadir esa información, para que cuando lo pulse lo inserte. Ese botón tiene el siguiente código asociado que dejo de funcionarme de una semana para otra(al principio funcionaba ahora ya no):
Private Sub Boton_Click()
DoCmd.RunSQL "Insert Into NombreTabla (NombreAtributo) Values(form!NombreCuadrodeTexto)"
End Sub
2.- El segundo problema es que no se como realizar el formulario de "buscar y modificar". Quiero buscar por medio de 2 criterios(cuadro combinao de "Calles" y cuadro de texto de "Tipo Actividad") la lista de los edificios que cumplan los criterios introducidos, que me los saque en una lista y que en esa lista pueda modificar cualquiera de sus atributos y quede guardado en la base de datos.

1 respuesta

Respuesta
1
OK,
a lo primero. ¿El formulario está vinculado a una tabla o los controles son independientes?
Si están vinculados a una tabla, no hace falta ninguna instrucción SQL, sino simplemente ir a un nuevo registro con por ejemplo :
DoCmd. GoToRecord acDataForm, "nombredelformulario", acNewRec
Si son controles independientes declara el Recordset (Tabla) y agregar el valor así:
Dim BBDD As Database
Dim NOMBRETABLA As Recordset
Set BBDD=CurrentDb
Set NOMBRETABLA=BBDD.OpenRecordset ("NOMBRETABLA")
NOMBRETABLA.AddNew
NOMBRETABLA!campo1=Forms!NOMBREFORMULARIO!Control1
NOMBRETABLA!campo2=Forms!NOMBREFORMULARIO!Control2
.....
NOMBRETABLA.Update
Nombretabla. Close
Para la segunda parte de tu pregunta:
Has una consulta de Access utilizando la tabla donde está la información. Te comento que si haces la consulta utilizando campos que están en varias tablas, no te dejará editar los registros que te resulten, sólo podrán ser de lectura. Si quieres modificar alguno tendrá que ser vía consultas de actualización o mediante código SQL.
Así que para esta parte es importante saber si la consulta utilizará una sola tabla o varias.
Pero no sé exactamente cual es tu duda en este punto. Si es hacer la consulta basad en campos del formulario o editar el resultado de la misma.
Ante todo gracias por echarme una mano en esto.Te explico un poco mejor:
Tengo una tabla principal Edificio con ciertos atributos(bastantes) y algunas claves externas que serán las claves primarias de las otras tablas(TITULAR(DNI, Nombre, apellidos), EXTINTORES(cod_extintor, denom_extintor), CLASIFICACION_ACTIVIDAD(cod_clas, denom_clas), etc).
1.En el formulario los controles son independientes exceptuando los cuadros combinados que están vinculados a las tablas(EXTINTORES, CALSIFIACION_ACTIVIDAD,..)para que me salga el listado y elegir el deseado.Y al lado de los cuadros combinados tengo un botón que me redirige a otro formulario por si se quiere añadir un nuevo extintor por ejemplo y así luego poder elegirlo desde la lista. En cambio la tabla TITULAR no esta vinculada a ningún cuadro combinado, hay 3 cuadros de texto pa insertar el dni, nombre y apellidos. Resumiendo, ¿en el formulario alta se obtendrán todos los datos de todos los campos de todas las tablas rellenando la ficha y pulsando el botón que se inserte en sus respectivas tablas.Por tanto el código que me as mencionao que va vinvulado al botón insertar?
2.En este formulario lo que quiero es visualizar toda la información de todas las tablas buscando en las tablas(CALLE(cod_calle, denom_calle) y la tabla principal EDIFICIO(nº,..., tipo_actividad, cod_clas, DNI, cod_calle, cod_extintor,...)) el nombre de la calle y el tipo de actividad.Es decir elegir de un cuadro combinado la calle y en un cuadro de lista insertar el tipo actividad y que me visualice las tuplas que cumplan dichos requisitos.Una vez visualizado los datos me gustaría poder modificar algunos de ellos, no todos. Solo se modificaran algunos datos de la tabla principal EDIFICIO y los datos de la tabla TITULAR, de las demás tablas no habrá ninguna modificación.Lo que quiero saber es como construir el formulario, si se necesitan subformularios o que, o que código debo incluir. Siento tanta ignorancia pero soy un iniciao del access, aunque tengo conocimientos de sql. Espero que pueda ayudarme.
Muchas gracias de antemano.
Por cierto he utilizado el código que me has comentado y no me añade ningún campo, quizás lo este utilizando en el sitio erróneo ¿? Estoy ala espera, un saludo y gracias.
1. El código que te dí con la instrucción SQL la colocas en el botón para grabar todos los registros que hayas introducido en el formulario. Es como un botón grabar. A este código le puedes añadir antes comprobaciones de que se han rellenado todos los campos (si tuvieras campos obligatorios), antes de que intente ejecutar la acción de grabar.
Dim BBDD As Database
Dim NOMBRETABLA As Recordset
Set BBDD=CurrentDb
Set NOMBRETABLA=BBDD.OpenRecordset ("NOMBRETABLA")
NOMBRETABLA.AddNew
NOMBRETABLA!campo1=Forms!NOMBREFORMULARIO!Control1
NOMBRETABLA!campo2=Forms!NOMBREFORMULARIO!Control2
... ( Los puntos suspensivos indican que puedes añadir todos los campos que quieras grabar que contenga la tabla y estén definidos en el formulario)
NOMBRETABLA.Update
Nombretabla. Close
Este código (sustitut¡Yendo los nombres por los que usas en tu Base debe grabar los registros en el recordset correspondiente). Revisa si la tabla tiene campos requeridos que hayan quedado vacíos, ya que esto no permitirá grabar el registro.
El segundo punto te lo dejo para mañana, que ahora se me ha complicado el día.
Pero se me ocurre para que vayas probando, que tengas un formulario con los dos controles (campo y tipo de actividad) con dos subformularios (uno para la tabla EDIFICIOS y otro para la tabla TITULAR), vinculados a los campos del formulario. EL aistente te preguntará como quieres asociarlos. Inténtalo y me avisas para explicártelo si es necesario o intentarlo de otra manera.
Te comento, he agregado el siguiente código en el botón para añadir una nueva actividad en la tabla "Clasificacion_Actividad" que tiene (cod_clas_activ, denom_clas_activ) para hacer una prueba antes de hacerlo con la tabla principal "Edificio":
Private Sub N_Actividad_Click()
DoCmd.GoToRecord acDataForm, "Nueva_Actividad", acNewRec
Dim ControlActividadesFinal As Database
Dim ClasificacionActividad As Recordset
Set ControlActividadesFinal = CurrentDb
Set ClasificacionActividad = BBDD.OpenRecordset("ClasificacionActividad")
ClasificacionActividad.AddNew
ClasificacionActividad!Denom_Clas_Activ = Forms!Nueva_Actividad!NuevAct
ClasificacionActividad.Update
ClasificacionActividad.Close
End Sub
el caso es que no inserta nada en las tablas,que he hecho mal??
La segunda parte me he puesto a ello como tu me has dicho, si me surge algún problema te comento. Espero tu respuesta.Mil gracias por tu ayuda
Sólo por probar, cambia los nombres de tablas, formularios y campos quitándole el espacio. Estoy 99,9% seguro que el problema es de identificación de nombres. El Access es un poco caprichoso con nombres que contengan espacios, caracteres especiale, comillas simple o dobles, etc.
Prueba y me dices. El código está correcto.
También puedes intentar con otra sintaxis equivalente
ClasificacionActividad("Denom_Clas_Activ")
Forms("Nueva_Actividad"). Controls("NuevAct")
Hola buenas
1.- He hecho alguna prueba cambiando los nombres de las tablas y los formularios y aun así no me funciona el código.Les he quitado los espacios y no llevan ni guiones bajos. ¿Tengo qué cambiarle los nombres de los atributos de cada tabla? ¿Y los nombres de los cuadros de texto que los tengo con guiones bajos? Los atributos los tengo con guiones bajos en plan: cod_calle, denom_calle, etc.(igual que los cuadros de texto) en ese formulario es lo único que no me funciona.
2.- El segundo formulario lo tengo hecho ya pero sin que funcione el botón de buscar. He puesto un cuadro de texto para introducir el tipo de actividad y un cuadro combinao para seleccionar la calle y al lao el botón buscar y debajo e insertao un subformulario de Edificios que ahora mismo cada vez que entro me visualiza todas las tuplas que tengo en su tabla. ¿QUÉ código debo asociar al botón buscar para que me visualice las tuplas que cumplan los requisitos introducidos en el cuadro de texto y en el cuadro combinao?
Un saludoooooooooo, gracias por la ayuda!
1.- Te pongo para la prueba que tiene que ver con el código de arriba los nombres que debes cambiar.
El nombre del Formulario Nueva_Actividad, cambialo a NuevaActividad
el nombre de la tabla Clasificacion_Actividad cámbialo a ClasificacionActividad, el del formulario Nueva_Actividad cámibialo a NuevaActividad y el nombre del campo Denom_Clas_Activ de la tabla CalsificacionActividad, también cámbialo a DenomClasActiv
Luego modifica estos nombres también en el código de arriba y prueba.
2.- Los subformularios no funcionan con botones de búsqueda, sino con vinculaciones de campos equivalentes entre el formulario principal y el subformulario. Si entras en la vista diseño del subformulario en la ventana de datos, encontrarás dos líneas que te permiten vincular un campo que contenga el subformulario con un campo del formulario principal, de tal manera que el filtro lo hace automáticamente y cambia según cambies de registro en el formulario principal.
Hola,
te parecerá increíble pero sigue sin funcionar.He cambiado todo lo que me dijiste y nada sigue sin hacer nada. Esto es lo que e puesto en el botón:
Private Sub NActividad_Click()
DoCmd.GoToRecord acDataForm, "NuevaActividad", acNewRec
Dim ControlActividadesFinal As Database
Dim ClasificacionActividad As Recordset
Set ControlActividadesFinal = CurrentDb
Set ClasificacionActividad = ControlActividadesFinal.OpenRecordset("ClasificacionActividad")
ClasificacionActividad.AddNew
ClasificacionActividad!DenomClasActiv = Forms!NuevaActividad!NuevAct
ClasificacionActividad.Update
ClasificacionActividad.Close
End Sub
Donde NuevaActividad es el formulario, ControlActividadesFinal es el nombre de la base de datos, ClasificacionActividad es la tabla, DenomClasActiv es el campo de la tabla donde se introducirá el nuevo valor y NuevAct que es el cuadro de texto donde se introduce el valor a añadir en la tabla.
2.En cuanto a la segunda parte, tengo el formulario principal y dentro el subformulario donde salen todos los datos.Voy a la parte donde están las 2 líneas que te permiten vincular un campo (donde tu me decías) y cuando voy a vinvularlos me dice lo siguiente: No se puede generar un vínculo entre formularios independientes. No se que hacer ya...
Un saludo y gracias
Releyendo hacia arriba ya se por qué no te graba nada.
Es que la tabla Clasificación actividad tiene dos campos (según tu mismo escribiste) y en el código que escribiste sólo estás añadiendo datos a un campo.
Codclasactiv y denomclasactiv
En el recordset estamos guardando uno sólo y seguro que el campo código es o clave o requerido o las dos cosas. Así que para hacer la prueba o borras de la tabla ese campo o incluyes en el campo en el código asignándole un valor fijo o variable. Te debería quedar algo así:
Private Sub NActividad_Click()
DoCmd.GoToRecord acDataForm, "NuevaActividad", acNewRec
Dim ControlActividadesFinal As Database
Dim ClasificacionActividad As Recordset
Set ControlActividadesFinal = CurrentDb
Set ClasificacionActividad = ControlActividadesFinal.OpenRecordset("ClasificacionActividad")
ClasificacionActividad.AddNew
ClasificacionActividad!CodClasActiv= Forms!NuevaActividad!CodAct
ClasificacionActividad!DenomClasActiv = Forms!NuevaActividad!NuevAct
ClasificacionActividad.UpdateClasificacionActividad.Close
End Sub
2.- Efectivamente, el vínculo entre formulario y subformulario son a través de campos comunes entre ambos. El error es lógico.
Tengo una idea, pero voy a hacer una base de datos de prueba para comprobarlo y te digo algo hoy.
Lo he conseguido. A ver te explico.
En la vista diseño del formulario abres el cuadro de propiedades y pinchas justo en el vértice superior izquierdo del subformulario (probablemente dos veces "no es doble click"), de forma que quede un punto negro en dicho vértice.
La ventana de propiedades deberá tener en la primera fila "Origen del registro" un SELECT que es la consulta en la que se basa el Subformulario (En este caso basada en la tabla EDIFICIO)
En esta instrucción SELECT que termina seguramente en un FROM EDIFICIO; le quitas el punto y coma del final y añades a continuación lo siguiente:
WHERE EDIFICIOS.CODCALLE=CTRCALLE AND EDIFICIOS.ACTIVIDAD=CTRACTIVIDAD;
Donde, en este caso CTRCALLE es el nombre del control del formulario en el que seleccionarás la calle y CTRACTIVIDAD es el control en el que seleccionarás la actividad.
Así cada vez que cambies (en la vista normal de formulario) el valor de estos datos en el Subformulario te mostrará sólo los que cumplan ambas condiciones. (Ya lo he probado y funciona)
Si tienes que modificas datos basados en estos campos en otra tabla, debes añadir tantos subformularios como tablas quieras modificar, pero todos los subformularios los podrás relacionar igualmente con los dos controles del formulario y trabajarán simultáneamente.
Hola buenas,
hasta el lunes no puedo verificar nada porque tengo la base de datos en el trabajo pero en cuanto al punto uno efectivamente la tabla ClasificacionActividad tiene dos campos cod y denom (en el cual cod es la clave principal) pero cod esta declarao para que automáticamente asigne el código, por eso solo añado un campo, ¿entonces debería de funcionar bien insertando solo uno no? ¿O tengo también que añadir el del código?
Muchísimas gracias por la ayuda, un saludo!
En la primera intervención que hice te he comenté que había una diferencia en la forma de grabar los registros si los controles del formulario eran dependientes (basta con rellenar los campos y al final ir a un nuevo registro), pero si los controles son independientes es que se hace necesario utilizar el código.
1.- Si los controles son dependientes, el que corresponde al código autonumérico de la tabla, lo rellena el sistema automáticamente cuando empiezas a escribir datos en un campo. En este caso el único código que necesitas es:
DoCmd. GoToRecord acDataForm, "NuevaActividad", acNewRec
Este código lo asocias a un botón grabar o al perder el enfoque del último campo a rellenar en el formulario.
2.- Si los controles son independientes (en el formulario no tienen como origen de datos el correspondiente campo de la tabla) el código del punto anterior no sirve de nada y es donde hace falta el que te dí, pero con alguna corrección (no hace falta posicionarse en un nuevo registro) y en este caso el autonumérico se rellena en la tabla automáticamente y no hace falta incluirlo en el código de VB. Quedaría así:
Private Sub NActividad_Click()
Dim ControlActividadesFinal As Database
Dim ClasificacionActividad As Recordset
Set ControlActividadesFinal = CurrentDb
Set ClasificacionActividad = ControlActividadesFinal.OpenRecordset("ClasificacionActividad")
ClasificacionActividad.AddNew
ClasificacionActividad!DenomClasActiv = Forms!NuevaActividad!NuevAct
ClasificacionActividad.Update
ClasificacionActividad.Close
End Sub
Si no funciona hay algo que no me estás diciendo. He hecho una BBDD con tus ejemplos para probar yo mismo el funcionamiento de lo que te he dicho. Sigo a la espera de seguir por acá hasta que funcione.
Hola buenas,
en principio la parte de buscar y modificar esta solucionada y funciona perfectamente, en cambio la otra parte no ace la función que quiero. ¿Quizás este haciendo algo mal? Te explico como tengo el formulario exactamente:
Pa empezar tengo las siguientes tablas:
Edificio(NFicha,DenomActividad,TipoActividad,RazonSocial,CodClasActiv,CodCalle,CodHorario,DNITitular,etc)
ClasificacionActividad(CodClasActiv,DenomClasActiv)
Calle(CodCalle,DenomCalle)
Horarios(CodHorario,Horario,Ley)
Titular(DNITitular,NombreTitular,ApellidosTitular)
existen más tablas pero todas del tipo como ClasificacionActividad (cod,denom).
El caso es, el formulario donde voy a insertar los datos todos son cuadros de texto exceptuando algunos que son cuadros combinados, me explico:
NFicha,DenomActividad,TipoActividadRazonSocial son cuadros de texto independientes(no tienen origen de datos) en los q introducire los datos a guardar.
CodClasActiv,CodCalle,CodHorario en el formulario aparecen como cuadro combinado en el cual solo se visualiza denom y no el cod(por tanto son dependientes)de la tabla correspondiente.Es decir sale una lista desplegable y en vez de introducir los datos como en el cuadro de texto,simplemente lo elijo de la lista.y al lado de la lista desplegable hay un boton con el cual accedes a otro formulario en el cual podras añadir un nuevo dato si esq el dato q necesitas no este guardado ya en la tabla y por tanto no te aparezca en la lista.
Resumiendo tengo en el menu de nuevas altas cuadros de texto no dependientes y cuadros combinados dependientes ya que me cargan todos los datos de la tabla en una lista, ¿y para añadir nuevos datos a esas listas tengo un submenú para cada uno con cuadros de texto independientes.He probado con el código que me as dicho y nada.En estos submenus que solo tengo un cuadro de texto que es independiente no me ace nada.Si ati te funciona y ami no cual puede ser el problema?
Un saludo y gracias por la ayuda
Hola,
una cosilla, ¿un cuadro de texto no puede ser dependiente no? ¿En tal caso como se aria? Porque lo único parecido que encuentro es origen de control pero eso no es porque me carga el primer atributo de la tabla.
Saludos.
Si ese recuadro lo dejas vacío el control será independiente. No se si es eso lo que preguntas. Lo que carga es el campo que escojas de la tabla que esté asociada al formulario (si lo estuviera).
Ok, estoy releyendo tu penúltima consulta y creo que tienes un problema de conceptos.
Los cuadros de texto, cuadros de lists, cuadros de selección o los cuadros combinados pueden ser dependientes o independientes.
Son dependientes no porque presente información de una tabla para escoger entre los registros, sino cuando están asociados en el Origen del Control alguno de los campos de la tabla que está aosicada en el Origen del Registro del formulario que los contiene.
Si en origen del control del formulario has seleccionado una tabla o consulta y en el origen del control de este formulario has seleccinoado un campo de dicha tabla o consulta el campo es dependiente y en este caso te mostrará el dato que pertenezca al registro donde esté posicionado el formulario. En este caso si todos los campos (controles) tienen un campo asociado bastará que una vez rellenada la información (bien sea escrita o selccionada de una lista) vayas a un nuevo registro y el registro anterior quedará automáticamente guardado en la tabla.
En este caso no hace falta el código que te he puesto arriba.
La explicación está en mi última respuesta antes de tus últimas preguntas.
Hola buenas,
he hecho lo siguiente.He abierto un formulario y e pinchao en la esquina para seleccionar el formulario y e puesto el origen del registro la tabla "ClasificacionActividad". Después e seleccionao el cuadro de texto donde se insertara el dato a guardar en el campo "DenomClasActiv" y en el Origen del control e seleccionao DenomClasActiv. He agregado el siguiente código al botón "Agregar nueva actividad" y me pasa lo siguiente:
Me aparece en el cuadro de texto el primer atributo de la tabla que si lo borro y escribo cualquier cosa me sobreescribe. Pero haciendo pruebas, e dao al tabulador y me va pasando por todos y cada uno de los atributos guardados en la tabla(me van apareciendo en el cuadro de texto uno a uno cada vez que doy al tabulador). Cuando paso el ultimo se me queda el cuadro de texto en blanco(q es lo q quiero q me pase desde un principio) y ahí si escribo el nuevo atributo a ingresar en la tabla, pulso el botón y me lo ingresa correctamente. ¿Cómo puedo hacer para q directamente me salga el cuadro en blanco para poder añadir nuevos atributos sin antes tener q aber pasado por todos los anteriores?
Si quieres puedo pasarte la base de datos pa q le eches un vistazo. Gracias por toda la ayuda q me estas brindando. Saludos!
Perdona que no te había escrito el código del botón "Agregar nueva actividad":
Private Sub BotonNuevaActividad_Click()
    DoCmd.GoToRecord acDataForm, "NuevaActividad", acNewRec
End Sub
En el evento "Al abrir" del formulario escribe exactamente el mismo código que escribiste en el botón "Agregar nueva actividad". Con eso está resuelto.
Por cierto, lo que ves no son los atributos sino los registros. En estos foros es importante el lenguaje, ya que si entendemos cosas distintas es complicado dar con una solución que es muy sencilla.
Esta instrucción se llama de hecho ir a un nuevo registro.
Los atributos son propiedades como visible, bloqueado, colores, tamaños, etc.
Hola,
si, cierto, me quería referir a registro.Se me visualiza el primer registro, después el siguiente y así asta el ultimo.
Entonces si añado el mismo código, seleccionando el formulario, ¿en el evento "Al abrir" me aparecerá vacío el cuadro de texto listo pa insertar un nuevo alta? Ya mñn tendré que probarlo y te digo como me ha ido.
Saludos y gracias.
Hola buenas,
acabo de probar a escribir : DoCmd.GoToRecord acDataForm, "NuevaActividad", acNewRec
En el evento "Al abrir" del formulario como me dijiste y me sige apareciendo en el cuadro de texto el primer registro de la tabla.Si lo borro y escribo algo me sobreescribe el registro. ¿Cómo soluciono esto?
Saludos
¿Verificaste si el nombre del formulario donde pusiste el código se llama NuevaActividad y está bien escrito?
Nada tranquilo, ya lo e solucionado mediante una macro porque con el código no me funcionaba. ¿Solo me falta compilar el programa para convertirlo en un ejecutable (para poder utilizarlo en ordenadores sin necesidad de tener access) y por lo que he leído existen programas que te lo hacen automáticamente no? Porque en el access no he encontrado ninguna manera.
Muchas gracias por toda la ayuda que me as prestao, y si conoces algún programilla para recomendarme pa crear el ejecutable te lo agradecería. Gracias por todo. Saludos
Access tiene en el menú Herramientas, Macros, una opción de convertir Macros a VB. Me alegro que lo hayas podido solucionar, en cuanto te sea posible

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas