** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Comprobas valor campo matrícula
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoComprobas valor campo matrícula

 Responder Responder Página  12>
Autor
Mensaje
fredy8alc Ver desplegable
Asiduo
Asiduo


Unido: 19/Abril/2016
Localización: España
Estado: Sin conexión
Puntos: 239
Enlace directo a este mensaje Tema: Comprobas valor campo matrícula
    Enviado: 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.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14926
Enlace directo a este mensaje Enviado: 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

Mi web
Arriba
fredy8alc Ver desplegable
Asiduo
Asiduo


Unido: 19/Abril/2016
Localización: España
Estado: Sin conexión
Puntos: 239
Enlace directo a este mensaje Enviado: 03/Abril/2020 a las 20:28
Gracias Xavi.

He cogido el concepto.
Voy a ver si soy capaz de aplicarlo.

Muchas gracias.
Arriba
01loko Ver desplegable
Colaborador
Colaborador


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 807
Enlace directo a este mensaje Enviado: 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.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14926
Enlace directo a este mensaje Enviado: 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

Mi web
Arriba
01loko Ver desplegable
Colaborador
Colaborador


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 807
Enlace directo a este mensaje Enviado: 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.
Arriba
01loko Ver desplegable
Colaborador
Colaborador


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 807
Enlace directo a este mensaje Enviado: 03/Abril/2020 a las 22:05
Publicado originalmente por 01loko 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.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14926
Enlace directo a este mensaje Enviado: 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

Mi web
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5462
Enlace directo a este mensaje Enviado: 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.



Editado por VIMIPAS - 03/Abril/2020 a las 23:04
Gracias
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14926
Enlace directo a este mensaje Enviado: 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

Mi web
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5462
Enlace directo a este mensaje Enviado: 04/Abril/2020 a las 19:56
De acuerdo Xavi.
Saludos.
Gracias
Arriba
fredy8alc Ver desplegable
Asiduo
Asiduo


Unido: 19/Abril/2016
Localización: España
Estado: Sin conexión
Puntos: 239
Enlace directo a este mensaje Enviado: 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.


Editado por fredy8alc - 05/Abril/2020 a las 00:11
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5462
Enlace directo a este mensaje Enviado: 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.


Editado por VIMIPAS - 05/Abril/2020 a las 00:59
Gracias
Arriba
jilo Ver desplegable
Colaborador
Colaborador


Unido: 19/Diciembre/2004
Localización: TAFALLA
Estado: Sin conexión
Puntos: 965
Enlace directo a este mensaje Enviado: 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
Arriba
fredy8alc Ver desplegable
Asiduo
Asiduo


Unido: 19/Abril/2016
Localización: España
Estado: Sin conexión
Puntos: 239
Enlace directo a este mensaje Enviado: 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.
Arriba
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable