Problema en la comparación para evitar valores duplicados desde ribbon access

Tengo una aplicación con su ribbon personalizado y ahora que estoy mejorando ciertas cosas al intentar que se me dupliquen registros le he puesto este código en el botón guardar del ribbon:

Sub rbGuardar4(control As IRibbonControl)
Dim vAccion, vAccionB As Variant
Dim resp As Integer
    vAccion = Forms!FAcciones.Accion
    If IsNull(vAccion) Then Exit Sub
    vAccionB = DLookup("Accion", "TAcciones", "[Accion]='" & vAccion & "'")
'    vCompruebo = DLookup("Pass", "TPass", "NomUser='" & vUser & "'")
    If vAccionB = vAccion Then
         MsgBox "Esta acción ya esta disponible", vbInformation, "AVISO"
         Forms!FAcciones.Accion = Null
         Forms!FAcciones.idAccion.SetFocus
         Forms!FAcciones.Accion.SetFocus
        Else
            DoCmd.RunCommand acCmdSaveRecord
            MsgBox "Guardado Correctamente", vbInformation, "AVISO"
            Forms!FAcciones.AllowEdits = False
     End If
End Sub

Lo he puesto hay porque en el formulario solo hay un campo que se llama Accion ya que el id lo tengo oculto.

No se donde puedo tener el error ya que escriba lo que escriba ano hace nada y me guarda los registro si cierro el formulario.

2 Respuestas

Respuesta
1

Kike, coloca un punto de interrupción en esta línea:

vAccion = Forms!FAcciones.Accion

y ejecuta paso a paso con F8 para ver si se ejecuta y los valores que toman tus variables. Además, deberías quitar las lineas que te sobran en el código...

He colocado el punto de interrupción como me dijiste en esa lía al dar al cmd me salta esa línea lo voy ejecutando con F8 y me marca

If IsNull(vAccion) Then

le doy otra vez Exit Sub y hay acaba no me marca más ya.

Pues ahí tienes el problema, la variable vAcción no te coge ningún valor.

Tendrás que revisar la línea en la que se lo asignas, que uses los nombres y sintaxis correctos

Ya he solucionado la parte de la variable:

Sub rbGuardar4(control As IRibbonControl)
Dim vAccion, vAccionB As Variant
    vAccion = Nz(Forms!FAcciones.Accion.Value)
    If IsNull(vAccion) Then Exit Sub
    vAccionB = DLookup("Accion", "TAcciones", "Accion='" & vAccion & "'")
    If vAccionB = vAccion Then
         MsgBox "Esta acción ya esta disponible", vbInformation, "AVISO"
         Forms!FAcciones.Accion = Null
         Forms!FAcciones.idAccion.SetFocus
         Forms!FAcciones.Accion.SetFocus
         DoCmd.RunCommand acCmdUndo
        Else
            DoCmd.RunCommand acCmdSaveRecord
            MsgBox "Guardado Correctamente", vbInformation, "AVISO"
            Forms!FAcciones.AllowEdits = False
     End If
End Sub

Y ahora al colocar la interrupción pasa por todo pero al llegar a esta línea

If vAccionB = vAccion Then

no entra en el if y pasa directamente al else donde siempre entra y guarda el registro es como si no compara las variables y la tabla se llama TAcciones y el campo Accion

Realmente no estás solucionando nada con la función Nz, pues vAcción sigue sin coger el valor del formulario (aparentemente)

Ahora no sale en el primer If, porque vAcción tiene un valor de cadena vacía y no de nulo, por eso no se cumple al condición IF IsNull() y sigue con el código, pero al llegar al segundo If, como no se cumple la condición de que vAccionB sea igual a vAccion, siempre pasa a la parte del Else y te guarda el registro.

Cuando tienes el código pausado por un punto de interrupción, puedes comprobar el valor que tienen las variables. Puedes hacerlo de varias formas: poniendo el cursor encima de ella, con la ventana de locales... Mira a ver si te están cogiendo los valores que esperas.

Respuesta
1

No salgo de mi asombro. Verás, defines resp as integer. ¿Dónde la usas?. Si en el cuadro de texto acción del formulario hay texto tendrás que definirla como string. Si el cuadro de texto Acción está en el formulario es

Forms! Facciones! Accion no con punto

Forms! Facciones! Id etc

Pero puedes poner me. Accion

Como no puede cumplir la primera condición, cumple la segunda

Docmd. Runcommand accmdsaverecord

Tampoco as definido vcompruebo

El código que coloque tenía más cosas porque intentaba posteriormente una vez que comprobara todo usar resp para lanzar otro msgbox preguntando si deseo salir o continuar nada más.

La línea de VCompruebo la pegue de otra parte de la aplicación para ver si me faltaba algo o no por eso la tenía comentada. El código esta así:

Sub rbGuardar4(control As IRibbonControl)
Dim vAccion, vAccionB As Integer
    vAccion = Forms!FAcciones.Accion
    If IsNull(vAccion) Then Exit Sub
    vAccionB = DLookup("Accion", "TAcciones", "[Accion]='" & vAccion & "'")
    If vAccionB = vAccion Then
         MsgBox "Esta acción ya esta disponible", vbInformation, "AVISO"
         Forms!FAcciones.Accion = Null
         Forms!FAcciones.idAccion.SetFocus
         Forms!FAcciones.Accion.SetFocus
        Else
            DoCmd.RunCommand acCmdSaveRecord
            MsgBox "Guardado Correctamente", vbInformation, "AVISO"
            Forms!FAcciones.AllowEdits = False
     End If
End Sub

El me no lo puedo usar desde el ribbon y hasta ahora ponia Forms!FAcciones.Accion o lo que necesitaba con el . en lugar ! y me funcionaba por eso os solicite ayuda.

Pues lo siento me dejas de piedra.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas