Guardar registros de cuadros combinados independientes

¿Cómo guardar nuevos registros en un formulario de Access 2003?
Estoy trabajando en access 2003 y lo que quiero hacer es guardar un nuevo registro en un formulario. El chiste es que en el formulario tengo cuadros combinados (independientes con código de consulta como SELECT DISTINCT tabla1. Campo FROM tabla1;) en los cuales puedo escribir una nueva opción y también seleccionar opciones ya existentes en tablas que ya genere. Cada cuadro combinado llama las opciones de tablas distintas que están relacionadas mediante claves principales, por ejemplo, en la tabla1 tengo 4 marcas de carros con su respectivo ID, y en la tabla2 tengo 10 modelos de carros con su ID, pero en una columna se relaciona con la tabla1 al escribir el ID de la marca a la que corresponde cada modelo del carro. Quiero poder guardar nuevos modelos y marcas mediante el formulario y que se guarden automáticamente en las tablas distintas y que se relacionen mediante sus ids, para que con otro formulario de consulta si ya guarde un registro nuevo, ahí pueda ver los que se van guardando y ademas de los que ya tengo registrados.

2 respuestas

Respuesta
2
No se si entendí bn, pero para guardar directamente, los valores podrías, usar el orgen del registro de la tabla en el formulario, y en el origen del control de un text, seleccinoar el campo en el que quieras guardar.
La otra forma es, usando una instruccion sql, mas concretamente un INSERT INTO para guardar los valores, que necesitas.
Para mostrar, los datos en otro form, podes crear una consulta y usarla con el objeto subform en el formulario.
Gracias por la respuesta, creo que seria mejor con el insert into. Es que mira, el formulario de consulta o búsqueda con cuadros combinados ya lo tengo porque ya tengo datos en tablas, pero el problema es que si el usuario quiere guardar un registro nuevo. Y hay aun más problema porque como todos los datos están en tablas diferentes, por ejemplo: Un registro consta de "proyecto, proceso, marca del equipo, equipo". Tengo una tabla donde tengo los diferentes proyectos existentes con sus claves principales; en otra tabla tengo los procesos que existen con sus claves principales y en una tercera columna tengo el id del proyecto al que pertenece, y así sucesivamente con la tabla marca del equipo y la tabla equipo. Con esto lo que hice fue que en cada proyecto hay determinados procesos y en cada proceso hay diferentes marcas de equipo, y por cada marca de equipo podemos tener diferentes tipos de equipos. Ejemplo: Proyecto: Construcción de edificios, Proceso: Cimentación, Marca de equipo: Caterpillar, Equipo: Grúa.
Tengo como 3150 registros de este tipo. Y lo que quiero ahora es que el usuario pueda introducir nuevos. Pero como los cuadros combinados tienen las siguientes propiedades:
Origen del control : vacía (porque si le ponía el campo de la tabla a la que pertenece me salían las opciones pero no se podía seleccionar ninguna)
tipo de origen de la fila: Tabla o consulta
origen de la fila: SELECT DISTINCT Proyectos.Proyecto FROM Proyectos;
Limitar a la lista: no (para que se pueda seleccionar de la lista y aparte escribir un nuevo dato)
Como tienen esas propiedades y ningún cuadro combinado o combobox están relacionados (es decir todos son independientes) quisiera saber que código puedo usar en un botón para que al darle clic, se guarde lo que esta escrito en los combobox en cada tabla de donde saque el origen de la fila, esto para que estén presentes cuando vuelva a realizar una búsqueda de registros en mi formulario de búsqueda o consulta.
Muchas gracias por todo espero no causarte muchos problemas, Saludos.
Tienes una base de datos con 3150 registros ya ingresos, realizaste bien la consulta pero no sabes como ingresar nuevos registros a la base de datos. Ok, de ser correcta mi deducción lo que debes hacer es lo siguiente, crear un nuevo formulario para agregar registros para cada tabla(marcas, equipo, proceso y proyecto), es un poco trabajoso pero creo que es la mejor forma. Entonces tendrías 4 formularios más. Por ejemplo para el formulario de nueva marca, tendrías dos caja de texto(textbox), una para el id y otra para la marca, un botón para guardar, en el evento click del botón debe ir lo siguiente:
'variable de tipo estring q contendra la consulta
Dim qdf as string 
'asignamos la consulta a la variable
qdf="INSERT INTO Marcas(Marca_Id,Marca) VALUES("& me.MarcaId &".'"&  me.Descripcion &"' ) "
'ejecutamos la consulta
currentdb.execute qdf
'enviamos un mensaje para confirmar q el registro se guardo
Msgbox "El registro ha sido guardado.",vbinformation,"Registro Guardado"
En este ejemplo yo asumo que la tabla se llama Marcas, los campos marca_Id y marca y los nombres de los controles textbox marcaid y descripción.
Bien, me imagino que te preguntaras como hacer con las demás tablas que tiene llaves foráneas pues bien, en el formulario de equipo por ejemplo tendríamos igual que en el anterior, tendrías dos caja de texto(textbox), una para el id y otra para el equipo en si, un cuadro combinado para seleccionar la marca, a continuación detallo las propiedades en las que vamos a modificar los valores que trae por defecto el control
Nombre
Marcaid
Origen de la fila
Tendremos la siguiente consulta("SELECT marca_id, marca FROM Marcas")
Numero de conlumnas
Valor por defecto:1
Valor a establecer:2
Ancho de columnas
<span style="font-weight: normal;">valor por defecto:vacia
valor a establecer:0;1</span>

<span style="font-weight: normal;">Ok con esto el valor que tomara el cuadro combinado sera del del id y mostrara la descripcion de la marcar.</span>
Un boton para guardar.
En el evento click del boton debe ir lo siguiente:
'variable de tipo estring q contendra la consulta
Dim qdf as string 
'asignamos la consulta a la variable
qdf="INSERT INTO Marcas(Equipo_Id,Equipo, Marca_Id ) VALUES("& me.EquipoId &".'"&  me.Descripcion &"', "& me.marcaid &" ) "
'ejecutamos la consulta
currentdb.execute qdf
'enviamos un mensaje para confirmar q el registro se guardo
Msgbox "El registro ha sido guardado.",vbinformation,"Registro Guardado"
Con esto te guardara la información del equipo y a que marca pertenece.
Nota1:
Si tienes más campos solo tienes que agregarlos en el paréntesis que esta después de la tabla, y también los controle que contrendran los valores para cada campo, estos los agregaras en VALUES().
Nota2:
"& &", esto lo que hace es que saca el valor del contro o variable que este entre lo operadores. Ejemplo si en la ejecución del formulario ingreso en el control EquipoId 5, y en el botón tengo "& me.equipoid &" esto es igual a tener 5 porque saca el valir, esto con los datos numéricos con los datos de cadenas de caracteres usamos '"& &"', antepones apostrofes para que en el uso lo que extraigamos nos aparezca con apostrofes, porque así se tratan las cadenas en vba. Ejemplo '"& me.equipo &"' = 'Grua' si ejecucion en el control equipo escribimo grua.
Hola que tal, lo que me escribiste realmente me ayudo mucho. Gracias. Pero decidí hacer un pequeño cambio para que sea más funcional mi base de datos. Quiero que todo se meta en el mismo formulario, es decir, que no tenga que hacer 4 formularios como dices. Estoy usando funciones como SELECT, WHERE, etc. Y ya puedo guardar datos en mis tablas aunque sean diferentes, el problema que ahora tengo es que se duplican los datos, por ejemplo si ya guarde con anterioridad la marca "Reebok" con equipo "Chivas", al querer hacer otro registro con la misma marca "Reebok" pero con otro equipo por ejemplo "Pumas", se vuelve a guardar la marca reebok pero con otro ID. Lo que quiero es poner algún IF para que no pase esto de que se dupliquen los datos.
Este es el código que llevo:
Option Compare Database
Option Explicit
Dim rs As New ADODB.Recordset
Dim conn As ADODB.Connection
Dim sql As String
Dim sql1 As String
Private Sub Comando27_Click()
Forms.Principal!Equipos.Visible = False
End Sub
Private Sub Comando37_Click()
Set conn = CurrentProject.Connection
' Hacemos la Consulta
sql = "insert into proyectos (proyecto) values ('" & Proyecto & "')"
sql1 = "insert into naves (ID_Proyecto,nave) SELECT (ID_Proyecto),('" & Nave & "') FROM Proyectos WHERE Proyectos.Proyecto=('" & Proyecto & "')"
If rs.State = adStateOpen Then rs.Close
rs.Open sql, conn
rs.Open sql1, conn
MsgBox "El registro ha sido guardado.", vbInformation, "Registro Guardado"
End Sub
Private Sub Descripción_MAXIMO_AfterUpdate()
End Sub
Private Sub Descripción_Operación_AfterUpdate()
End Sub
Private Sub Id_Equipo_AfterUpdate()
End Sub
Private Sub Línea_AfterUpdate()
End Sub
Private Sub Nave_AfterUpdate()
End Sub
Private Sub Marca_AfterUpdate()
End Sub
Private Sub No_de_Serie_AfterUpdate()
End Sub
Private Sub Nombre_en_línea_AfterUpdate()
End Sub
Private Sub Operación_GENERAL_AfterUpdate()
End Sub
Private Sub Proyecto_AfterUpdate()
End Sub
Private Sub SalirBusqueda_Click()
On Error GoTo Err_SalirBusqueda_Click
    Dim stDocName As String
    stDocName = "Cerrar Equipos"
    DoCmd.RunMacro stDocName
Exit_SalirBusqueda_Click:
    Exit Sub
Err_SalirBusqueda_Click:
    MsgBox Err.Description
    Resume Exit_SalirBusqueda_Click
End Sub
Como podras ver estoy empezando por Proyecto y Nave. Con eso ya puedo guardar pero como te comente me pasa eso de que se duplican los datos aunque tengan claves principales. Otro problema con este codigo es que si se llega a relacionar el ID de proyecto en la tabla de Nave con su respectiva Nave, pero se guardan 2 registros a la vez, uno donde se escribe el Id de proyecto nada mas y deja vacio el campo de nave, y otro donde si se guarda tanto la nave como el id del proyecto al que corresponde.
Me has ayudado mucho con lo que me dijiste, espero tu respuesta sobre ahora estos 2 problemas que tengo, o a ver si me podrías dar tu correo provisionalmente para poder comunicarnos mejor. El mio es [email protected]
Muchas gracias por todo, espero no molestarte mucho. Saludos
Podes usar la función Dcount(), la cual determina el número de registros que están en un conjunto de registros especificado (un dominio (dominio: conjunto de registros que se define por una tabla, una consulta o una expresión SQL.
Para saber si ya hay más de un registro de la marca entonces que no guarde.
El código va más o menos así:
'si no hay ningun registro que coincida con la marca
if dcount("marca","marcas","marca='"& me.marcadescripcion &"'")=0 then
   'codigo para insertar
end if
donde marca es el campo que queremos contar, marcas la tabla y me.marcadescripcion el control en el q se ingresara el valor de la marca.
Excelente, me ha ayudado mucho todo lo que me has dicho. Pude hacer lo que quería con tu ayuda. Muchas gracias por todo y cuando necesites algo me lo haces saber. Saludos
Respuesta
1
Veamos, hay que diferenciar entre las opciones disponibles en un cuadro combinado, y el resultado final del mismo.
Eso puedes verlo en dos propiedades del cuadro combinado:
- Origen de la fila: es de qué lugar se leen los datos para presentar en el desplegable
- Origen del control: en qué campo o variable se guarda la elección hecha
Supongamos que tienes una tabla con marcas de coches, y otra con clientes de un hotel, en la que un campo es que marca de coche llevan. Para elegir la marca de coche de los clientes tienes que hacer que el origen de la fila sea, por ejemplo:
SELECT MarcaCoche FROM Marcas ORDER BY MarcaCoche ASC;
Al formulario en el que pones este desplegable tienes que asociarle como origen de datos la tabla ClientesHotel, y en el desplegable asociar, en Origen del Control, el campo MarcaCocheCliente de la tabla ClientesHotel.
Si lo que quieres es trabajar con el resultado del desplegable pero sin guardarlo en ningún sitio, es decir, usarlo como variable, no asignes origen del control, pero ponle nombre (pestaña Otros, Nombre)
Excelente respuesta, me ayudo mucho y es una solución muy sencilla. ¿Sera qué me puedas pasar tu msn? Es que estoy trabajando como practicante de una empresa en un proyecto y lo estoy sacando en access 2003, pero pues esto que te pregunte es solo una de las cosas que debe hacer la base de datos, y si he avanzado pero me surgen nuevos problemas y quería ver si me puedes dar asesoría por messenger. El mio es [email protected] Muchas gracias por todo. Saludos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas