Botón agregar registro

Buenos días, estoy desarrollando una aplicación Access en el trabajo y me he encontrado un problema que no sé solucionar.
Tengo una BD con varias tablas y necesito crear varios formularios para ir cargando datos en las mismas o para hacer consultas.
En concreto mi problema surge con un botón que agrega registros a una tabla. Así, sin realizar ningún tipo de validación adicional el código funciona correctamente, introduce el contenido de los dos campos (un cuadro de texto y un combo que se alimenta de otra tabla).
En la tabla tengo definidos tres campos: Idcomprador autonumérico, Ncomprador (tipo texto, indexado sin duplicados) e IdZona (tipo texto, indexado con duplicados).
Quiero introducir un código en el botón que agrega los datos a la tabla que verifique si los datos introducidos en el formulario ya existen en la tabla y en caso afirmativo mostrar un mensaje de error debidamente formateado, para evitar que sea el propio Access quien lo muestre.
He probado el método findfirst para que recorra la tabla en busca del nombre y en caso de coincidencia realice la misma operación con el campo zona. Si encuentra en el mismo recordset los dos campos debe mostrar una advertencia, regresar el control al formulario y limpiar los campos. El caso es que aunque lo he probado de mil maneras distintas y siempre se da error.
¿Cuál sería la forma correcta de utilizarlo?, o ¿Debería usar otro método?.
El código que he puesto es el siguiente:
Texto7.SetFocus ' Fijo el foco en el control
Texto = Texto7.Text ' Vuelco el contenido del campo a la variable tipo String
rs.FindFirst "Texto = " & rs!Ncomprador
If rs.NoMatch Then
    MSG = MsgBox("No encontrado", vbOKOnly)
    rs.AddNew
    Texto7.SetFocus
    rs!Ncomprador = Texto7.Text
    Combo.SetFocus
    rs!IdZona = Combo.Text
    rs.Update
    rs.Close
    db.Close
Else
    MSG = MsgBox("Registro duplicado", vbOKOnly)
End If
Muchas gracias de antemano.

1 Respuesta

Respuesta
El foco no es necesario, (se que lo usas por el text) pero es que el text tampoco es necesario, si estas en el evento afterupdate
si estas en el beforeupdate si seria así
no me pones el openrecordset para ver si esta bien
y buscas un campo texto que por supuesto no existe, (mal)
deberia ser rs.FindFirst "Ncomprador='" & texto & "'"
¿Ademas esto lo realizas cuando? Al salir del primer campo aun no tienes el segundo
esto no esta muy bien
1ro hay que definir cuando ejecutar esto si es cuando sales del segundo puede faltarte el primero
ademas no dejas posibilidad de corregir
y si le pones un botón de actualizar igual esta mal ya que si lo agregaste no tienes remedio
mejor abre un sub y que agreguen directo a la tabla, ¿ya te daría el error de duplicado nombre
por cierto si es el mismo nombre y distinta zona que haces?
Para una consulta de un campo mejor usa
Dloookup es más corto y legible que todo ese trozo
Hola y gracias por la pronta respuesta.
En primer lugar el foco lo he puesto porque de no hacerlo, el programa da un error.
El evento en el que me encuentro es en el "AL HACER CLIC" del botón INSERTAR REGISTRO. Tal y como lo tengo pensado, el usuario debe introducir el nombre del comprador en el campo habilitado a tal fin, a continuación seleccionar la zona del combo que tira de una tabla y por último pulsar el botón que lanzará el código.
Después de enviar la consulta conseguí hacer funcionar el método findfirst, pero de una forma que no me ha terminado de convencer.
Si el usuario mete el mismo nombre, pero de una zona distinta, el registro debe agregarse a la tabla, ya que debe tenerse en cuenta como si de otro comprador se tratase.
Te pego el código para que puedas ver lo que he hecho.
Ahora, hace bien las comprobaciones de los valores introducidos, he metido mensajes como puntos de control para que me devueva información y ver qué punto del código se está ejecutando y si la cosa va bien. Sin embargo, cuando lanzo un recordcount, o un BOF, no me devuelve los valores esperados y se tira dando vueltas en el bucle durante un buen rato hasta que salta un mensaje de error de "No hay ningún registro activo".
¿Crees qué sería mejor ir introduciendo código en cada objeto para hacer las comprobaciones de forma independiente en lugar de hacerlo al pulsar el botón INSERTAR REGISTRO?.
Gracias de nuevo.
    Dim DBCompra As Database
    Dim RSCompra As Recordset
    Dim RSZona As Recordset
    Set DBCompra = CurrentDb
    Set RSCompra = DBCompra.OpenRecordset("SELECT * FROM COMPRADOR order by IDCOMPRADOR")
    Set RSZona = DBCompra.OpenRecordset("SELECT * FROM COMPRADOR")
   If Not RSCompra.BOF Then RSCompra.MoveFirst
   Do While cont = False
        Ncomprador.SetFocus
        If Ncomprador.Text <> "" Then
            Nzona1.SetFocus
            If Nzona1.Text <> "" Then
                Ncomprador.SetFocus
                comprador = Ncomprador.Text
                Nzona1.SetFocus
                zona = Nzona1.Text
                Ncomprador.SetFocus
                RSCompra.FindFirst "Ncomprador='" & comprador & "'"       
                If RSCompra.NoMatch Then
                    RSCompra.AddNew
                    Ncomprador.SetFocus
                    RSCompra!Ncomprador = comprador
                    Nzona1.SetFocus
                    RSCompra!IdZona = zona
                    RSCompra.Update
                    Ncomprador.SetFocus
                    Ncomprador.Text = ""
                    Nzona1.SetFocus
                    Nzona1.Text = ""
                    Ncomprador.SetFocus
                Else
                    RSZona.FindFirst "Idzona ='" & zona & "'"
                    If RSZona.NoMatch Then
                        RSCompra.AddNew
                        Ncomprador.SetFocus
                        RSCompra!Ncomprador = comprador
                        Nzona1.SetFocus
                        RSCompra!IdZona = zona
                        RSCompra.Update
                        Ncomprador.SetFocus
                        Ncomprador.Text = ""
                        Nzona1.SetFocus
                        Nzona1.Text = ""
                        Ncomprador.SetFocus
                    Else
                        MSG = MsgBox("EL COMPRADOR YA EXISTE", vbOKOnly)
                        Ncomprador.SetFocus
                        Ncomprador.Text = ""
                        Nzona1.SetFocus
                        Nzona1.Text = ""
                        Ncomprador.SetFocus
                    End If
                End If
            Else
                MSG = MsgBox("El campo ZONA es OBLIGATORIO", vbOKOnly, "PROGENEX")
                Ncomprador.SetFocus
            End If
        Else
            MSG = MsgBox("El campo NOMBRE COMPRADOR es OBLIGATORIO", vbOKOnly, "PROGENEX")
            Ncomprador.SetFocus
        End If
        cont = RSCompra.EOF
        RSCompra.MoveNext
        RSZona.MoveNext
   Loop
    RSCompra.Close
    DBCompra.Close
Si quieres enviame la base o parte de ella
para poder ayudarte mejor
a [email protected]
pon tu nick y el titulo de tu pregunta
si puedes copia la pregunta también
Si se puedes envíamelo en formato 2003
Pero creo que te estas complicando mucho para algo sencillo
en realidad el usuario podría agregar directamente en la tabla, pero tengo que verlo mejor

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas