Instrucción Insert Into no funciona

Una vez más recurro a vuestra sabiduría en demanda de ayuda coon un problemilla que tengo.

Tengo un formulario independiente que uso para insertar datos en una tabla,

En el evento al hacer clic del botón GRABAR  le tengo puesto el siguiente código:

Private Sub Comando35_Click()
Dim respuesta As Byte
Dim Instruccion As String
respuesta = MsgBox("¿Desea Grabar Esta ficha de Cuota Anual?", vbYesNo + vbQuestion, "ATENCIÓN")
If respuesta = vbYes Then

If Nz(DCount("*", "T_CuotasSociosAño", "Año='" & Me.Año.Value & "'")) >= 1 And Nz(DCount("*", "T_CuotasSociosAño", "DNI='" & Me.DNI.Value & "'")) >= 1 Then
MsgBox ("Este Socio ya Tiene Creada su Ficha de Cuota anual para ese Año"), vbOKOnly, "No se guardará"
DoCmd.CancelEvent

Else

DoCmd.SetWarnings False
DoCmd.RunSQL "Insert into T_CuotasSociosAño(Año,Nroconsec,F_Alta,DNI,Nombre,Apellidos,Cuota_Anual,Forma_Pago,Observaciones)" _
& "VALUES(Año,Nroconsec,FechaAlta,DNI,Nombre,Apellidos,Cuota_Anual,Forma_Pago,Observaciones)"
MsgBox ("La Ficha ha sido creada Correctamente, Gracias")

End If

If respuesta = vbNo Then
MsgBox "Operación cancelada, Hasta Pronto"
End If
End If
Exit Sub

End Sub

La idea es que cuando el usuario haga clic en el botón, que primero compruebe si ya existe ese registro en la tabla según los criterios AÑO Y DNI . Si ya existe, que salga del procedimiento y si no existe que lo inserte en la tabla.

El problema es que al hacer clic en el botón, siempre me dice que ya existe el registro y no me lo inserta en la tabla,, por lo que supongo que el error debe estar en la consulta pero no se como solucionarlo..

2 respuestas

Respuesta
1

El planteamiento es incorrecto, se esta evaluando de forma independiente que el año o el DNI existan y seguro que algún registro habrá con ese año y el DNI puede existir si pago una cuota un año anterior (ambos datos obtenidos de registros diferentes).

Se han de unir ambas condiciones para que las evalúe sobre el mismo registro.

La función DCount devuelve siempre un valor numérico por lo que el NZ es innecesario y la propiedad VALUE es la que se aplica por defecto (salvo raras ocasiones)

Modificaría así la línea:

If DCount("*", "T_CuotasSociosAño", "Año='" & Me.Año & "' And DNI='" & Me.DNI & "'") Then

No es imprescindible verificar el valor que devuelve DCount ya que Acccess asume como True cualquier valor que sea diferente de cero, pero de utilizarlo basta que lo que devuelva el DCount 'no sea un cero' y queda así:

If DCount("*", "T_CuotasSociosAño", "Año='" & Me.Año & "' And DNI='" & Me.DNI & "'") <> 0 Then

Se aprecia que a los campos (DNI y AÑO) se les trata como texto y (me parece recordar por otros ejemplos) que al DNI no se le aplica el/un carácter de control y el año puede ser perfectamente un dato numérico (personalmente utilizaría sus 'equivalentes' numerícos).

Respuesta
1

Trate en lo posible definir el criterio en una variable texto, por ejemplo:

  Dim strCriterio As String
   strCriterio = "Año='" & Me.Año.Value & "'" & " AND DNI='" & Me.DNI.Value & "'"  'Si Año es texto
   'strCriterio = "Año=" & Me.Año.Value & " AND DNI='" & Me.DNI.Value & "'"  'SI Año es numérico
   If DCount("*", "T_CuotasSociosAño", strCriterio) > 0 Then
    MsgBox "yA ESTA"
   End If

De esta forma puede verificar el contenido del criterio.

No obstante, nunca utilizo funciones de dominio porque no sirven para nada cuando la conexión del back end es a un servidor de datos como PostgreSQL y no hay tablas vinculadas, es decir se trabaja con recordset desconectados. Esto lo reemplazo por funciones o procedimientos almacenados que retornan el resultado de una consulta SQL.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas