|
Responder
|
Página 12> |
| Autor | ||
fredy8alc
Asiduo
Unido: 19/Abril/2016 Localización: España Estado: Sin conexión Puntos: 239 |
Tema: Comprobas valor campo matrículaEnviado: 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.
|
||
![]() |
||
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador
Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14926 |
Enviado: 03/Abril/2020 a las 18:33 |
|
|
Utiliza alguna función de "limpieza" para realizar la comprobación.
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
|
||
![]() |
||
fredy8alc
Asiduo
Unido: 19/Abril/2016 Localización: España Estado: Sin conexión Puntos: 239 |
Enviado: 03/Abril/2020 a las 20:28 |
|
|
Gracias Xavi. He cogido el concepto. Voy a ver si soy capaz de aplicarlo. Muchas gracias.
|
||
![]() |
||
01loko
Colaborador
Unido: 17/Agosto/2017 Localización: Santander Estado: Sin conexión Puntos: 807 |
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.
|
||
![]() |
||
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador
Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14926 |
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
|
||
![]() |
||
01loko
Colaborador
Unido: 17/Agosto/2017 Localización: Santander Estado: Sin conexión Puntos: 807 |
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.
|
||
![]() |
||
01loko
Colaborador
Unido: 17/Agosto/2017 Localización: Santander Estado: Sin conexión Puntos: 807 |
Enviado: 03/Abril/2020 a las 22:05 |
|
|
||
|
Recordar de que soy nuevo y estoy aprendiendo.
|
||
![]() |
||
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador
Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14926 |
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
Utilizando una comparación Like
Un saludo
|
||
![]() |
||
VIMIPAS
Colaborador
Unido: 06/Enero/2006 Localización: ESPAÑA Estado: Sin conexión Puntos: 5462 |
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
|
||
![]() |
||
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador
Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14926 |
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 |
||
![]() |
||
VIMIPAS
Colaborador
Unido: 06/Enero/2006 Localización: ESPAÑA Estado: Sin conexión Puntos: 5462 |
Enviado: 04/Abril/2020 a las 19:56 |
|
|
De acuerdo Xavi.
Saludos.
|
||
|
Gracias
|
||
![]() |
||
fredy8alc
Asiduo
Unido: 19/Abril/2016 Localización: España Estado: Sin conexión Puntos: 239 |
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 |
||
![]() |
||
VIMIPAS
Colaborador
Unido: 06/Enero/2006 Localización: ESPAÑA Estado: Sin conexión Puntos: 5462 |
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
|
||
![]() |
||
jilo
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Colaborador
Unido: 19/Diciembre/2004 Localización: TAFALLA Estado: Sin conexión Puntos: 965 |
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.
|
||
|
Espero te sirva !!!!!!
Iñaki |
||
![]() |
||
fredy8alc
Asiduo
Unido: 19/Abril/2016 Localización: España Estado: Sin conexión Puntos: 239 |
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.
|
||
![]() |
||
Responder
|
Página 12> |
|
Tweet
|
| Ir al foro | Permisos de foro ![]() Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |