En Access 2013 necesito me avise si el número de póliza ya existe (solo que me avise) pero que me deje guardarlo.

Necesito en un formulario saber que existen expedientes con un mismo "número de póliza", por tanto lo que quiero es que busque duplicados, me avise con texto "número de póliza ya registrado", pero que se guarde el campo. He probado a ponerlo como clave o "indexado si", pero entonces me avisa, pero no me deja duplicarlo.

Tengo Access 2013 con tabla Registro y Formulario ("Registro"), varios campos (fecha, siniestro,...) y existe el campo "número de póliza". Al introducir registros, quiero que me avise si está duplicado pero que me deje duplicarlo porque puede existir varios registros con el mismo número de póliza, solo necesito que me avise, nada más.

2 respuestas

Respuesta
2

De entre otros métodos, te cito uno usando DCount.

Dim Veces As Integer

Veces =Nz(DCount("[número de póliza]","Registro","[número de póliza] = '" & Me.TxtPoliza & "'"),0)

If Veces > 0 Then

MsgBox "Esta póliza ya está registrada   " & Veces & " veces anteriores",vbInformation,"EXISTEN REGISTROS"

End If

Como puedes apreciar he supuesto que el control del formulario que muestra el [número de póliza] se llama TxtPoliza. Si no es así has de cambiarlo. También he supuesto que ese campo en la Tabla es Texto

Si fuera un número cambia la línea de veces por ésta otra

Veces =Nz(DCount("[número de póliza]","Registro","[número de póliza] = " & Me.TxtPoliza ),0)

Y por último si copias y pegas éste código casi seguro que tendrás que reescribir las Comillas, porque éstas no coinciden con las del Editor de VBA. Mis saludos >> Jacinto

Gracias pruebo y te comento.

Mil perdones pero no sé dónde agregar lo que me indicas. No entiendo tampoco lo de TxPoliza.

Indicarte que el campo se llama "Número Póliza". El origen de control es Número Póliza, y si es texto.

Gracias

Has de ponerlo en un procedimiento de evento, preferiblemente en el de BeforeUpdate (Antes de Actualizar) del Control de modo que con la corrección del Nombre que me envías sería así.

Private Sub Número_Póliza_BeforeUpdate(cancel As Integer)
Veces =Nz(DCount("[Número Póliza]","Registro","[Número Póliza] = '" & Me.[Número Póliza] & "'"),0)
If Veces > 0 Then
         MsgBox "Esta póliza ya está registrada   " & Veces & " veces anteriores",vbInformation,"EXISTEN REGISTROS"
End If
End Sub

He visto que Icue te ha contestado y justo con la misma solución. Ten en cuenta la observación que te hace de los nombres sin espacios y yo añado "Sin acentos", "Sin dieresis", Sin.. signos extraños. VBA no es para enseñar gramática. Otra cosa es lo que el usuario ve, donde si que conviene cuidar la misma. Un saludo >> Jacinto.

PD: Por susupuesto saca lo de Indexado y si copias y pegas éste código no te olvides de activarlo en las Propiedades del Formulario >> Eventos >> Antes de Actualizar >> [Procedimiento de evento]

Estoy probando tanto con su respuesta como la de Icue González, pero no me funciona, algo debo estar haciendo mal:

Private Sub Número_Póliza_BeforeUpdate(Cancel As Integer)
Veces = Nz(DCount("[Número Póliza]", "Registro", "[Número Póliza] = '" & Me.[Número Póliza] & "'"), 0)
If Veces > 0 Then
         MsgBox "Esta póliza ya está registrada   " & Veces & " veces anteriores", vbInformation, "EXISTEN REGISTROS"
End If
End Sub

Cuando dices que no te funciona: ¿Te da algún error?, ¿No te hace nada?.

Asegura:

Que realmente hayas activado el Procedimiento de Evento. Los nombres etc. Si tienes duda, crea el Procedimiento con el asistente, y site genera de nuevo dos líneas es que algo raro hay. Si fuera así, copia en el que te genere las dos líneas de arriba. Lo que hay entre el Private Sub y el End Sub.

Quizá y digo solo quizá si en lugar de esos nombres tuvieras por ejemplo NumPoliza el repaso sería menos costoso. Mis saludos Jacinto

No hace nada, registra normal, pero estoy metiendo un número de póliza que ya existe y sigue sin hacer nada.

Mil perdones por mi torpeza.

Veo dificil el llegar a una solución después de lo ya escrito, y lo único que se me ocurre más directo, es que menvíes, evidentemente si quieres, tu BD o parte de ella suficiente para poder ver donde se produce el fallo. Por supuesto si tienes datos personales y/o confidenciales, deberías de cambiarlos por otros inventadoos. Con unos cuantos hay suficiente.

Puedes hacerlo a [email protected]

Mis saludos >> Jacinto

Respuesta
2

En el evento Antes de actualizar del cuadro de texto Número de Póliza, con el generador de código crea un procedimiento de evento y entre Private Sub y End Sub pon

If dcount("numpoliza","registro","[numero de póliza]=" & me.[numero de póliza] & "")>=1 then

msgbox"Ese número de póliza ya existe en la tabla"

end if

Permíteme un consejo, procura poner siempre los nombre juntos, así no hay que estar encerrándolos entre corchetes.

¿Ok pero "numpoliza" a qué se refiere?, el resto creo entenderlo "registro" se refiere a la tabla registro [numero de póliza] el campo...

Gracias

Es un error mío al escribir, tienes que ponerlo como [número de póliza]

Es que tengo la costumbre, ventajosa por cierto, de poner los nombres de los campos todo junto y sin acentos. Cuando estás poniendo una instrucción en código VB, no tienes que preocuparte de estar encerrándolo entre corchetes, por ejemplo, en la instrucción de arriba, si el nombre fuera Numpoliza podrías ponerla como

if dcount("numpoliza","registro,"numpoliza=" & me.numpoliza & "")

Al igual que no le pongo acentos a nada, para no tener que volver atrás para ver si le puse acento en el nombre del campo, control, etc.

Por último, si vas a escribir una instrucción en VB, escríbela siempre en minúsculas. Al terminar, si está bien escrita, el propio editor de VB te pone la mayúsculas en su sitio y así sabes que lo has hecho bien. Por ejemplo, si tu escribes

Docmd. Openform"clientes",... y al terminar, el propio editor te pone

DoCmd. OpenForm "clientes"... te dice que la has puesto bien.

Algo debo estar haciendo mal. Te pego lo que he puesto:

Private Sub Form_Open(Cancel As Integer)
If DCount([número de póliza], "registro", "[número de póliza]=" & Me.[número de póliza] & "") >= 1 Then
MsgBox "Ese número de póliza ya existe en la tabla"
End If
End Sub
Private Sub Número_Póliza_BeforeUpdate(Cancel As Integer)
End Sub

Algo debo estar haciendo mal. Te pego lo que he puesto:

Private Sub Form_Open(Cancel As Integer)
If DCount([número de póliza], "registro", "[número de póliza]=" & Me.[número de póliza] & "") >= 1 Then
MsgBox "Ese número de póliza ya existe en la tabla"
End If
End Sub
Private Sub Número_Póliza_BeforeUpdate(Cancel As Integer)
End Sub

En vista diseño del formulario haz clic sobre el cuadro de texto donde se pone el número de póliza y mira en sus propiedades-otras-nombre como se llama dicho cuadro.

O si el campo número de póliza lo tuvieras como texto, entones la instrucción sería

......[número de póliza]='" & me.[número de póliza] & "'")

De todas formas, si quieres, repito, si quieres, mándame un mensaje(sólo el mensaje) a [email protected] y te mando un ejemplo. Si lo haces, en el asunto del mensaje pon tu alias Rulopez, ya que si no sé quien me escribe ni los abro.

Lo primero darte las gracias. Disculpa que sea tan torpe.

Acabo de enviarte e-mail

Gracias

Enviado.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas