Error guardado en formulario Access

Tengo un formulario independiente con todos sus textbox y cuadros combinados independientes, también tengo los botones de editar, guardar y eliminar registros, me funciona todo perfectamente pero llega un punto que tengo muchos registros y entonces he diseñado un cuadro combinado que me traiga los registros de la tabla al formulario para poder editar y guardar los registros. El código de dicho cuadro combinado es: (pongo solo una linea de un textbox porque si no es muy pesado).

Private Sub FILTRO_AfterUpdate()

Me.EXPEDIENTE = Nz(DLookup("[EXPEDIENTE]", "[TDatos]", "ID=" & Me.FILTRO & ""), "")

End sub

Me funciona bien y me trae dichos registros a todos los textbox y cuadros combinados, pero el problema viene cuando por ejemplo traigo un registro al formulario mediante el cuadro combinado y le quiero modificar algún dato o rellenar algún textbox que estaba vacío y le doy al botón de guardar, entonces ahí me salta el error “error de conversión en tipos de datos” y me lleva al código de guardado del botón que lo he cogido de un ejemplo de internet:

Private Sub GuardaDatos()

     If bolNuevo = False Then

        rsDatos.Edit

        rsDatos("EXPEDIENTE") = Nz(Me.EXPEDIENTE)

        rsDatos.Update

    Exit Sub

    Else

        rsDatos.AddNew

        rsDatos("EXPEDIENTE") = Nz(Me.EXPEDIENTE)

        rsDatos.Update

    End If

    CargaDatos

SALIDA:

    Exit Sub

    Resume SALIDA

End Sub

Si pudieran ayudarme.

3 respuestas

Respuesta
2

Ese código tiene toda la pinta de que lo sacaste de un ejemplo mío de la web de Neckkito (Datos en forms independientes).. jejeje

El error lo tienes en el primer código, en el que traes los datos, pues si expediente es numérico en la tabla, no le puedes cargar en el cuadro de texto un valor de texto con el Nz() en caso de que esté vacío en la tabla, es decir, tendrías que dejarlo así:

Me.EXPEDIENTE = Nz(DLookup("[EXPEDIENTE]", "[TDatos]", "ID=" & Me.FILTRO & ""))

a menos que como indico en el ejemplo, le quieras dar un valor por defecto:

Me.EXPEDIENTE = Nz(DLookup("[EXPEDIENTE]", "[TDatos]", "ID=" & Me.FILTRO & ""), 0)

Jacinto, puedes usar Nz() sin pasarle un valor por defecto, y dejar que access se encargue de manejar el dato "ya no nulo". En ese ejemplo lo hice así para facilitar la "generalidad" del código.

Un saludo a ambos.


je je así es, eres un crack e intento seguir tus ejemplos para aprender un poco, bueno he cambiado lo que me has dicho y bien pero ahora me da un error extraño, os explico: ahora cuando busco con el cuadro combinado y le doy a guardar me da el problema que crearía valores duplicados(el focus está centrado en EXPEDIENTE y en la tabla quiero como condición no tener resultados duplicados(indexado sin duplicados)) y me salta un error en la línea :

Private Sub GuardaDatos()

     If bolNuevo = False Then

        rsDatos.Edit

        rsDatos("EXPEDIENTE") = Nz(Me.EXPEDIENTE)

        rsDatos.Update

    Exit Sub

    Else

        rsDatos.AddNew.........

Y si no hago nada y le doy a finalizar y vuelvo a pulsar el botón de guardado me manda a otra línea con el error de variable de objeto o bloque with no establecido. Y me salta aquí:

Private Sub GuardaDatos()

     If bolNuevo = False Then

        rsDatos.Edit

        rsDatos("EXPEDIENTE") = Nz(Me.EXPEDIENTE)

        rsDatos.Update

    Exit Sub

    Else

        rsDatos.AddNew.........

Este es el código que uso que igual tiene algo de relación al cargar el formulario:

Private Sub Form_Load()

    Set rsDatos = CurrentDb.OpenRecordset("SELECT * FROM TDatos", dbOpenDynaset)

    misRegistros = rsDatos.RecordCount

    If misRegistros = 0 Then  ' Si no hay registros

        bolNuevo = True

        modoLectura False

        Me.EXPEDIENTE.SetFocus

    Else

        modoLectura True

    End If

End Sub

Gracias, espero puedan ayudarme!

El error tiene toda la pinta de que no te estás colocando en el registro a editar, sino en uno nuevo, y por eso te da el error de clave duplicada.

El error 91 que te da a continuación es porque con el error previo, se pierde el valor de la variable rsDatos (u otra variable que tiene un objeto) y no puede continuar.

y como lo puedo solucionar?

No colocándote en un nuevo ...

Más no te puedo decir sin analizar las modificaciones que hayas hecho sobre el ejemplo original.

Prueba a ejecutar el código paso a paso a ver si localizas donde se te va a un registro nuevo. Y verifica, aunque lo veo improbable, que no tengas ya dos valores iguales para el campo.

Creo que se me acaba de ocurrir por qué no te funciona, y el "fallo" lo debes tener en el código para cargar el registro desde el combo:

Por lo que mencionas en la pregunta original, usas Nz para buscar los datos de la tabla y cargarlos en el formulario, pero no veo que te muevas por el recordset para ello, con lo que en realidad, lo que haces al guardar es modificar un registro (el primero, el último o el último que hayas cargado con los botones de navegación) pero no el que estás viendo en pantalla y por eso te da error de que ya existe ese valor para EXPEDIENTE. (No sé si me explico)

Intentaré ponerte un ejemplo con los datos de mi ejemplo original, suponiendo que el campo Nombre no admita duplicados. Recordemos que tenemos registrados a Sherlock Holmes, Homer Simpson, Tony Stark y Don Pimpon, si mal no recuerdo.

1º/ Cargas el formulario y con el cargas el recordset (con Set rsDatos = CurrentDb.OpenRecordset("SELECT * FROM....") ). A continuación, si hay datos, cargas los del primer registro (con cargaDatos). Por ejemplo los de Tony.

2º/ En tu cuadro combinado, seleccionas a Homer, y cargas sus datos (con DLookup(...) ), con lo que en el formulario ves todos sus datos. PERO! En el recordset sigues estando en el registro de Tony.

3º/ Al pulsar "Guardar", como no le has indicado que es un registro nuevo, intenta sobreescribir el regsitro actual (el de Tony) con lso datos de pantalla (los de Homer). Al llegar al update, se encuentra que hay dos Homer y ¡ZAS! Te tira el error.

Solución: en el código de tu combo, pon esto en vez de lo que tienes:

Private Sub FILTRO_AfterUpdate()
rsDatos.FindFirst  "ID=" & Me.FILTRO 
bolNuevo = False  'Por asegurarse
cargaDatos
End sub

O, si quieres controlar que realmente encuentra resultados:

Private Sub FILTRO_AfterUpdate()
rsDatos.FindFirst  "ID=" & Me.FILTRO 
If rsDatos.NoMAtch Then
MsgBox "No se ha encontrado el registro"
Else
bolNuevo = False  'Por asegurarse
cargaDatos
End If
End sub

Creo que con eso solucionas el tema.

Un saludo.


¡Gracias! lo entendí perfectamente el error, y estabas en lo cierto, como siempre un crack, mil gracias. funciona a la perfección.

Respuesta
2

Iñigo: En éste caso estás intentando guardar un Campo de Texto en uno numérico o algo parecido.

Has de repasar que los datos que intentas guardar se correspondan con los de la Tabla.

Eso solo lo puedes hacer tú que tienes la BD.

Lo que no veo muy claro es >> rsDatos("EXPEDIENTE") = Nz(Me.EXPEDIENTE)

Si Expediente es número >> rsDatos("EXPEDIENTE") = Nz(Me.EXPEDIENTE,0)

Si es Texo >> rsDatos("EXPEDIENTE") = Nz(Me.EXPEDIENTE,"")

Otra cuestión es donde citas >>

Me.EXPEDIENTE = Nz(DLookup("[EXPEDIENTE]", "[TDatos]", "ID=" & Me.FILTRO & ""), "")

que también lo veo raro.

Me.EXPEDIENTE = Nz(DLookup("[EXPEDIENTE]", "[TDatos]", "ID='" & Me.FILTRO & "'"), "")

Para texto

Me.EXPEDIENTE = Nz(DLookup("[EXPEDIENTE]", "[TDatos]", "ID=" & Me.FILTRO ),0)

Para Número.

Mis saludos >> Jacinto

Respuesta
-1

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas