Comprobas valor campo matrícula
Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=85124
Fecha de impresión: 26/Marzo/2026 a las 19:21
Tema: Comprobas valor campo matrícula
Publicado por: fredy8alc
Asunto: Comprobas valor campo matrícula
Fecha de publicación: 03/Abril/2020 a las 18:04
|
Como ahora tengo mucho tiempo libre pues me ha dado por revisar algún programa que tenía por aquí y quería hacer algo que no soy capaz, por eso recurro atra vez al foro:
Vereis tengo un campo en un formulario donde se introduce la matrícula de un vehículo. Unos usuarios introducen la matrícula con guiones intermedios, como 1234-AAA o R-1234-AAA Otros usuarios introducen la matrícula sin guiones intermedios, como 1234AAA o R1234AAA. Esto a la hora de comprobar si la matrícula introducida existe ya en la base de datos o no supone un problema.
Lo que había pensado era crear un campo oculto en el que, si la matrícula se introduce con guiones, la ponga en este campo quitandole los guiones así:
Dim L As Integer Dim a As Integer L = Len(Matricula) MatLimpia = "" For a = 1 To L If Mid(Matricula, a, 1) = "-" Then MatLimpia = MatLimpia Else MatLimpia = MatLimpia & Mid(Matricula, a, 1) End If Next
Entonces miro que ninguna de las dos exista ya en la base de datos.
Pero el problema surge si se mete sin guiones y pudiera haber sido metida anteriormente con guiones.
Como puedo saber si la misma matrícula existe ya pero con guiones entre letras y números.
Gracias y salud a todos.
|
Respuestas:
Publicado por: xavi
Fecha de publicación: 03/Abril/2020 a las 18:33
|
Utiliza alguna función de "limpieza" para realizar la comprobación.
Function LimpiaTexto(strTexto As String) As String Dim i As Integer For i = 1 To Len(strTexto) Select Case Asc(Mid(strTexto, i, 1)) Case 48 To 57, 65 To 90, 97 To 122 LimpiaTexto = LimpiaTexto & Mid(strTexto, i, 1) Case Else End Select Next End Function
|
Opción A. Mantener la posibilidad de que los usuarios sigan metiendo las matriculas con disparidad de criterios y no tocar el histórico.
Cuando haces la comprobación, utiliza la función para ambos lados del criterio.
Opción B: Impedir que, a futuro, se metan más matriculas con caracteres que no sean letras y numeros. Sin tocar el histórico
Utilizar en el evento Change del campo matricula para, llamado a esa función, quitar todo lo que no proceda. La comparación deberá seguir haciéndose con la función para los registros antiguos.
Opción C: como la B pero depurando el histórico
Pasar una consulta de actualización sobre la tabla histórica utilizando la función para depurar todos los datos. El evento Change como en la opción B.
Si optas por la C, ya no será necesario utilizar la función para compara cadenas ya que tanto los registros históricos como los nuevos estarán "limpios"
Un saludo
------------- Xavi, un minyó de Terrassa
http://www.llodax.com" rel="nofollow - Mi web
|
Publicado por: fredy8alc
Fecha de publicación: 03/Abril/2020 a las 20:28
|
Gracias Xavi.
He cogido el concepto. Voy a ver si soy capaz de aplicarlo.
Muchas gracias.
|
Publicado por: 01loko
Fecha de publicación: 03/Abril/2020 a las 20:33
|
yo utilice durante un tiempo este codigo sacado de la web de Narkive y escrita por Victor Delgadillo
va muy bien (la utilizo sobretodo cuando quiero crear carpetas con datos de un campo, ya sabeis que microsoft es bastante especias con eso de los caracteres raros)
Public Function PuroTexto(cadena As String) ' cadena se elimina todo que no sea letras a-z y A-Z y espacios. Dim iX As Integer Dim iC As Integer Dim iZ As Integer Dim cS As String
For iX = 1 To Len(cadena) iC = Asc(Mid(cadena, iX, 1)) If (iC >= (Asc("a")) And iC <= (Asc("z"))) Or iC = 32 _ Or (iC >= (Asc("A")) And iC <= (Asc("Z"))) Then cS = cS & Chr(iC) End If Next PuroTexto = cS End Function
-- Victor Delgadillo [MVP Access] Miami, Florida
------------- Recordar de que soy nuevo y estoy aprendiendo.
|
Publicado por: xavi
Fecha de publicación: 03/Abril/2020 a las 21:02
|
01loko,
Ese código de Victor (que ya tiene unos cuantos años) eliminará también los números por lo que no nos serviría para lo que el usuario pide.
Y, en esencia, hace lo mismo: utilizar el ASC del carácter para ver si está dentro del rango.
Un saludo
------------- Xavi, un minyó de Terrassa
http://www.llodax.com" rel="nofollow - Mi web
|
Publicado por: 01loko
Fecha de publicación: 03/Abril/2020 a las 21:58
|
Si, eso ya lo pone, pero supongo que no es dificil de modificar en esta zona (Ojo, nunca lo intente, ya que no me hizo falta)
If (iC >= (Asc("a")) And iC <= (Asc("z"))) Or iC = 32 _ Or (iC >= (Asc("A")) And iC <= (Asc("Z"))) Then cS = cS & Chr(iC) End If
Pero es cierto que borra incluso numeros
------------- Recordar de que soy nuevo y estoy aprendiendo.
|
Publicado por: 01loko
Fecha de publicación: 03/Abril/2020 a las 22:05
01loko escribió:
Si, eso ya lo pone, pero supongo que no es dificil de modificar en esta zona (Ojo, nunca lo intente, ya que no me hizo falta)
If (iC >= (Asc("a")) And iC <= (Asc("z"))) Or iC = 32 Or (iC >= (Asc("A")) And iC <= (Asc("Z"))) Then cS = cS & Chr(iC)
If iC >=0 And iC <= 9 Then cS = cS
& Chr(iC)
Pero es cierto que borra incluso numeros Editado: creo que asi funcionaria
|
------------- Recordar de que soy nuevo y estoy aprendiendo.
|
Publicado por: xavi
Fecha de publicación: 03/Abril/2020 a las 22:40
|
Creo que no. El iC es el valor ASCII del carácter extraído de la cadena. El carácter 0 tiene el código ASCII 48 mientras que el 9 es el 57.
Si analizas mi función verás que simplemente se analiza el código ASCII del carácter extraído. Si está en los rangos 48 a 57 (los números del 0 al 9), 65 a 90 (letras mayúsculas) o 97 a 122 (letras minúsculas), permite el carácter. En caso contrario, no lo concatena.
Se puede hacer de otras formas.
Mediante InStr
Function LimpiaTexto2(strTexto As String) As String For i = 1 To Len(strTexto) If InStr(1, "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", UCase(Mid(strTexto, i, 1))) > 0 Then LimpiaTexto2 = LimpiaTexto2 & Mid(strTexto, i, 1) End If Next End Function
|
Utilizando una comparación Like
Function LimpiaTexto3(strTexto As String) As String For i = 1 To Len(strTexto) If Mid(strTexto, i, 1) Like "[A-Za-z0-9]" Then LimpiaTexto3 = LimpiaTexto3 & Mid(strTexto, i, 1) End If Next End Function
|
Un saludo ------------- Xavi, un minyó de Terrassa http://www.llodax.com" rel="nofollow - Mi web
|
Publicado por: VIMIPAS
Fecha de publicación: 03/Abril/2020 a las 23:00
|
Hola buenas noches a todos.
Yo creo FedyCalc, ha puesto esto bien claro:
Lo que había pensado era crear un campo oculto en el que, si la matrícula se introduce con guiones, la ponga en este campo quitandole los guiones así:
Pues en base a ello yo propongo algo muy simple:
Caso 1: CampoTomaMatriculas="1234-AAA" Caso 2: CampoTomaMatriculas="R-1234-AAA"
CampoOculto=Replace(CampoTomamatriculas,"-","")
¿No?
A veces creo que nos pasa a todos, sino mirad la respuesta de Pitxiku a mi última pregunta en este foro.... (es de párvulos... pero yo no había pensado en ella).
Cuando la pruebes Fredicalc, ya nos dices algo.
Saludos.
P.D.: Se me olvidó comentar que también vale para esto:
Como puedo saber si la misma matrícula existe ya pero con guiones entre letras y números.
CampoOculto=Replace(CampoDEtablaDONDEestenLASmatriculas,"-","") 'En una consulta y con un Dlookup se comprueba igual de fácil.
------------- Gracias
|
Publicado por: xavi
Fecha de publicación: 03/Abril/2020 a las 23:14
|
Cierto VIMIPAS, la pregunta habla de guiones. Y la utilización del Replace es otra opción más.
Supongo que yo me he "tirado a la piscina" porque yo he trabajado en una empresa dónde las matriculas las ponian como les salía de ____ (póngase lo que se quiera) por lo que unos ponian guiones, otros espacios y otros puntos.
La respuesta es aplicable a otros campos. El más habitual es el NIF. Los de la "vieja escuela" tenian la costumbre de separar con caracteres especiales. Así te podías encontrar el mismo NIF de varias formas: A-08.698.107 A/08698107 A/08.698.107 A 08698107 A 08/698107 (y podría seguir...)
¿Cual es el problema? Pues que la vieja escuela no presentaba los impuestos vía telemática. Y las administraciones no admiten caracteres especiales. Solo números y letras: A08698107
Supongo que por ese motivo he utilizado esa función.
Un saludo
------------- Xavi, un minyó de Terrassa
http://www.llodax.com" rel="nofollow - Mi web
|
Publicado por: VIMIPAS
Fecha de publicación: 04/Abril/2020 a las 19:56
|
De acuerdo Xavi. Saludos.
------------- Gracias
|
Publicado por: fredy8alc
Fecha de publicación: 05/Abril/2020 a las 00:09
|
Bueno cogiendo un poco de unos y un poco de otros lo he resuelto con esto. Posiblemente se podrá simplificar, pero funciona. Lo único malo es que si hay muchos registros, pues ralentiza un poco el proceso.
Private Sub Matricula_BeforeUpdate(Cancel As Integer)
Dim dbTemporal As DAO.Database Dim Registros As DAO.Recordset Dim MatTemporal As String Set dbTemporal = CurrentDb Set Registros = dbTemporal.OpenRecordset("Vehiculos", dbOpenDynaset)
Me.MatLimpia = Replace(Me.Matricula, "-", "") 'Le quito todos los "-" al campo Matricula para que una matrícula como R-1234-BBB se guarden temporalmente en el campo oculto MatLimpia como R1234BBB
Registros.MoveLast 'Voy al último registro de la tabla Vehiculos Registros.MoveFirst 'Voy al primer registro de la tabla Vehiculos Do While Not Registros.EOF 'Inicio la verificación de cada registro de la tabla Vehiculos
MatTemporal = Replace(Registros!Matricula, "-", "") 'Le quito los guiones a cada campo Matricula de la tabla Vehiculos y guardo el dato en la variable MatTempral
If Registros!Matricula = Me.Matricula Or Registros!Matricula = Me.MatLimpia Then 'Compruebo que la Matricula introducida en el campo Matricula no esté en la base como Matricula o como MatLimpia Me.MatDestino = Registros!Matricula 'Guardo la Matricula tal y como está metida en el Campo Matricula de la tabla Veniculos. DoCmd.OpenForm "MatriculaYaExiste", acNormal, , , , acNormal 'Abro el formulario de aviso. En la consulta que genera este formulario Matricula = MatDestino Registros.Close 'Como ya se ha encontrado el duplicado, cierro Recordset dbTemporal.Close 'Cierro la base Set Registros = Nothing 'Cierro Set dbTemporal = Nothing 'Cierro Exit Sub 'Salgo. End If
If MatTemporal = Me.Matricula Then 'Comparo cada registro sin "-" con un posible dato introducido de Matricula sin "-", ejemplo R1234BBB Me.MatDestino = Registros!Matricula 'Guardo la Matricula tal y como está metida en el Campo Matricula de la tabla Veniculos. DoCmd.OpenForm "MatriculaYaExiste", acNormal, , , , acNormal 'Abro el formulario de aviso. En la consulta que genera este formulario Matricula = MatDestino Registros.Close dbTemporal.Close Set Registros = Nothing Set dbTemporal = Nothing Exit Sub End If
Registros.MoveNext 'siguiente registro
DoEvents Loop
Registros.Close dbTemporal.Close
Set Registros = Nothing Set dbTemporal = Nothing
End Sub
--------------------------------------------------------------- Edito para decir que esto lo he puesto en el eveto Antes de Actualizar del campo Matricula
Por favor si alguien aporta alguna mejora será bien venida. Muchas gracias.
|
Publicado por: VIMIPAS
Fecha de publicación: 05/Abril/2020 a las 00:39
|
Buenas noches.
'''''''''''''''' en base a esto que pones:
Me.MatLimpia = Replace(Me.Matricula, "-", "") 'Le quito todos los "-" al campo Matricula para que una matrícula como R-1234-BBB se guarden temporalmente en el campo oculto MatLimpia como R1234BBB
'''''''''''''''' Tienes que confeccionar una Consulta (consulta de selección, nada de actualización ni nada mas, de selección) de la tabla Vehiculos, que tan solo incluya el campo matricula, y lo pones así
Expr1: Replace(matricula,"-","")
La vamos a llamar Fredy a la consulta, nada mas, la cierras y nos olvidamos de ella. Yo así la he puesto en mi prueba.
En tu formulario tendrás el control de texto puesto que se llamará MatLimpia (que es el campo oculto). Además lo ponemos oculto de verdad, es decir en la pestaña de propiedades Formato, pones: Visible = No.
En el origen de control del MatLimpia, pones esto: = Replace(Matricula, "-", "") 'El campo de texto Matricula, entiendo que también está en ese formulario.
Y como bien dices, en el evento "Antes de actualizar", del campo Matricula pones esto:
Dim As Var
Var=Dlookup("Expr1","Fredy", "Expr1 = ' " & Me.Matlimpia & " ' ")'Tomamos/buscamos datos de la consulta Fredy. Ojo a las ' que he puesto en rojo.
If Var = Me.Matlimpia Msgbox "la matrícula ya está metida. No se puede introducir" 'Aquí lo que tu creas que debes hacer para interrumpir el progreso de incluir en la tabla la matrícula Else Msgbox "correcto la matrícula no estaba y por eso la guardamos. Puede continuar." 'Aquí lo que tu creas que debes hacer para que se guarde en la tabla el dato de la matrícula Endif
Yo considero que va a ser más rápido que tu método, pero me gustaría que lo probaras y ya nos dijeras.
¿Te parece bien?.
Saludos.
------------- Gracias
|
Publicado por: jilo
Fecha de publicación: 05/Abril/2020 a las 07:32
|
Hola a todos, Yo me hago una pregunta y ¿No sería mejor hacer este proceso en la introducción de los registros? Si cualquiera de las funciones que han puesto Xavi o Vimipas, las colocas en el formulario de introducción de los registros por los usuarios, ya tendrías las matriculas en el formato que necesitas y no tendrias que hacer el proceso de limpia en cada registro de busqueda. No? Y ya que estamos #YOMEQUEDOENASA, te dejo otra opción.
Function Limpia(cadena As String) As String With CreateObject("vbscript.regexp") .Global = True: .Pattern = "-" Limpia = .Replace(cadena, "") End With End Function
|
------------- Espero te sirva !!!!!! Iñaki
|
Publicado por: fredy8alc
Fecha de publicación: 05/Abril/2020 a las 12:48
|
Para contestar a VIMIPAS y jilo
El problema no es quitar los "-" a cualquier matrícula. El problema es que la base de datos ya tiene metidos mas de 2000 registros y el campo matricula tiene datos metidos ya con "-" y otros sin "-". Efectivamente, se podría forzar el formato de entrada de datos pero esto no resuelve el problema con los datos existentes. Se podría modificar el formato de todos los datos ya introducidos pero preferiría dejarlos como están aunque, posiblemente, al final será lo mejor. Gracias por los aportes.
|
Publicado por: fredy8alc
Fecha de publicación: 05/Abril/2020 a las 13:09
|
VIMIPAS estoy intentando hacer lo que me dices pero:
En esa consulta que me indicas al poner Expr1: Replace(matricula,"-","") me da error de La expresión que ha especificado tiene una sintaxis no válida.
¿que esoy haciendo mal?
Gracias.
|
Publicado por: VIMIPAS
Fecha de publicación: 05/Abril/2020 a las 13:32
|
Hola de nuevo.
Esto en muchas versiones suele ser con ";" ponlo así: Expr1: Replace(matricula;"-";"").
Aunque luego cuando ves la Sql aparece con comas, ya nos dices.
Supongo que también te ocurrirá en el control CampoOculto del formulario, pásalo a ; también.
Saludos.
------------- Gracias
|
Publicado por: fredy8alc
Fecha de publicación: 05/Abril/2020 a las 13:47
|
Gracias, así sí. Voy a probar esto que me has dicho.
Edito:
Ahora me da error: Var = DLookup("Expr1", "Fredy", "Expr1 = ' " & Me.MatLimpia & " ' ") Uso no válido de Null
Supongo que cuando pones: Dim As Var quieres poner: Dim Var As String
|
Publicado por: VIMIPAS
Fecha de publicación: 05/Abril/2020 a las 15:44
|
Hola de nuevo.
No, en Dim Var, tan solo quiero poner eso... en caso de que tu quieras añadir algo, puedes poner: Dim Var As Variant.
Y suponiendo (yo desde aquí no lo veo) que en el origen de control de MatLimpia has puesto: = Replace(Me.matricula,"-","")
¿Qué valor tiene Me.Matilimpia al evaluarse esa expresión?. Pon esto para ver si lo pillamos:
Msgbox "Me.MatLimpia, antes de ejecutarse, vale (" & Nz(Me.MatLimpia) & ")" Var = DLookup("Expr1", "Fredy", "Expr1 = ' " & Me.MatLimpia & " ' ")
¿Puedes mirarlo?. Saludos.
------------- Gracias
|
Publicado por: fredy8alc
Fecha de publicación: 05/Abril/2020 a las 16:56
|
Vale VIMIPAS el error, precisamente, estaba en haber puesto Dim Var As String
lo he cambiado por Dim Var As Variant y resuelto. La verdad es que se ha reducido tanto el código como el tiempo de ejecución muchísmo.
Ahora lo que tengo que resolver es que:
Cuando una matrícula ya exista en la base de datos se abre el formulario MatriculaYaExiste con los datos del vehículo cuya matrícula ya está en la base de datos. Este formulario se basa en una consulta en la que la Matricula(del form MatriculaYaExiste = Forms!Vehiculos!Matricula. Pero como es posible que formato de la matrícula introducida (R1234BBB) no coincida con el que existe en la base de datos (R-1234-BBB), aunque me abra el formulario, me lo abre en blanco. Estoy intentando pasar a otro campo oculto el valor de Matricula de la consulta Fredy pero no lo toma. Seguiré probando.
Muchas gracias por todos los aportes.
Edito para la solución al tema anterior: Lo he resulto creando un campo oculto llamato MatDestino al que le meto el valor de Me.MatDestino = DLookup("[Matricula]", "Fredy", "[Expr1] = '" & Forms!Registradores!MatLimpia & "'") Después abro el Form MatriculaYaExiste incluyendo en la consulta que Matricula = MatDestino.
MUCHAS GRACIAS A TODOS
|
Publicado por: fredy8alc
Fecha de publicación: 05/Abril/2020 a las 17:32
|
Todo el código creado ha quedado reducido a esto: Dim Var As Variant
Var = DLookup("[Expr1]", "Fredy", "[Expr1] = '" & Forms!Registradores!MatLimpia & "'") If Var = Me.MatLimpia Then Me.MatDestino = DLookup("[Matricula]", "Fredy", "[Expr1] = '" & Forms!Registradores!MatLimpia & "'") DoCmd.OpenForm "MatriculaYaExiste", acNormal, , , , acNormal Else Exit Sub End If
Mucho menos complicado y bastante más eficiente. Muchas gracias a todos.
|
Publicado por: fredy8alc
Fecha de publicación: 06/Abril/2020 a las 19:39
Si no hay más comentarios, podemos cerrar el hilo.
|
|