Access 2010 duda con Máscaras de formato

Tengo una duda que puede parecer una pavada, pero no le encuentro la vuelta.

Tengo una linda base de datos para administrar unos 200 vehículos. En mi país las patentes son (eran) de 3 letras y 3 números separados por un guión; en consecuencia las tengo cargadas en un campo de texto, y en los formularios e informes como máscara de formato le asigné @@@-@@@ De ese modo, uno ingresa HRJ452 y el campo termina mostrando HRJ-552. Hasta aquí todo bien, pero no tuve en cuenta que seguirán ingresando vehículos nuevos, y han cambiado el sistema de patentamiento reemplazándolo por 2 letras-3 números y 2 letras (Ej.: AA-143-YQ). O sea que a partir de hoy conviven ambos formatos (el viejo de 6 caracteres, y el nuevo de 7), pero en mi programa esa convivencia se ha tornado dificultosa ya que la máscara original no me sirve para las nuevas patentes, y si la readecúo, termino teniendo problema con las patentes anteriores.

¿Existe alguna forma de hacer que Access lea y aplique la máscara adecuada según el caso? Desde la lógica se me ocurre que ordenándole leer la cantidad de caracteres que tenga el campo aplique la máscara @@@-@@@ o en su defecto la otra @@-@@@-@@ Pero la verdad, no tengo la menor idea de cómo puedo hacerlo.

Si alguien tiene una solución estaré muy agradecido!

2 Respuestas

Respuesta
2

Partiendo de que es la primera vez que veo una mascara de entrada con el símbolo @, a bote pronto te diría que en las propiedades del cuadro de texto matrícula, y suponiendo que la matricula la escribas toda seguida por ejemplo ab345hk, en el evento Antes de actualizar crea un procedimiento de evento y entre Private Sub... y End sub escribe

If Len([Matricula]) = 6 Then
Matricula.InputMask = "&&&\-&&&"
Else
Matricula.InputMask = "&&\-&&&\-&&"
End If

Sería conveniente que en el evento Al recibir el enfoque del mismo control pusieras

matricula.inputmask=""

¡Hola Icue! me faltó aclarar que los registros no se guardan con la máscara, a ésta la utilizo sólo en los formularios e informes para presentar adecuadamente la matrícula. En un rato pruebo tu aporte a ver cómo funciona y te cuento. Desde ya, muchas gracias. 

Hola Icue! Estuve probando tu solución, pero no me dio resultado. No pasaba nada, directamente no actuaban ninguna de las máscaras. No obstante ello, me centré en la lógica y los comandos, y pude terminar armando una pequeña función que sí anduvo bien:

Function FormatValue() As Integer
If Len([PATENTE]) = 6 Then
Forms!MOVILES!PATENTE.Format = ">&&&\-&&&"
Else
Forms!MOVILES!PATENTE.Format = ">&&\-&&&\-&&"
End If

End Function

Esta función no la coloqué en las Propiedades del cuadro de texto; sino en las Propiedades del Formulario en la parte de AlActivarRegistro. De éste modo cuando voy pasando de registro funciona perfecto, y lo mismo cuando acabo de dar de alta un registro con las nuevas matrículas. 

Otro sí digo: la función anda perfecto en todos los formularios; pero no en los INFORMES. No reconoce el comando Format. Da error y se inicia el depurador.

Obviamente en los formularios modifiqué la redacción que comenzaba con Forms! y la dejé así:

Function FormatValue() As Integer
If Len([PATENTE]) = 6 Then
PATENTE.Format = ">&&&\-&&&"
Else
PATENTE.Format = ">&&\-&&&\-&&"
End If

End Function

Vamos por partes

1º Cuando mando una respuesta previamente la he comprobado, por tanto la expresión que puse funciona perfectamente

2º ¿Estamos hablando de mascara de entrada o de formato?

3º La función que has creado es exactamente igual que si la pones en el evento Después de actualizar del cuadro de texto Patente.

4º En el informe supongo que ese cuadro de texto estará en la sección Detalle. Si en las propiedades de esta sección, en eventos-Al dar formato la pones y luego le das ver el informe en Vista Previa de Impresión, observarás que sale 123-AAA o AA-345-BB.

5º En el caso de que hubiera muchos registros para actualizar, en el formulario puedes poner un botón y en sus propiedades-evento-al hacer clic

docmd.setwarnings false

docmd.gotorecord,,acfirst

dim i as integer

for i=1 to form.recordset.recordcount

If len(.....

...

end if

docmd.gotorecord,,acnext

next

Docmd. Gotorecord,, acfirst

Lo que hará es ir recorriendo los registros comprobando si se cumple la expresión, actualizando y al terminar vuelve al principio

¡Gracias Icue! En realidad probé lo que me enviaste, lo puse en el sitio dónde dijiste, pero las patentes me aparecían todas -sea de la vieja o nueva denominación- sin ningún tipo de máscara. Ahí comencé a ver por qué no estaría funcionando, y hurgando un poco decidí cambiar la sentencia PATENTE.ImputMask = por PATENTE.Format = No soy para nada experto en esto, pero se me ocurrió que ImputMask es la máscara de entrada para cuando das de alta un dato, en cambio .Format le cambiaría el formato al campo según se cumpla una condición u otra. Por eso la función es casi idéntica a lo que me enviaste, con ese único cambio; ya que como bien preguntas, estamos hablando del FORMATO en que se presenta ese campo en cada formulario, no de la máscara de entrada. En cuanto a los informes, ya probé poner esa función en la Sección DETALLE dónde se encuentra el campo PATENTE, y me tira error de Visual como que no encuentra ese campo. Y creo saber de dónde puede venir ese error: los formularios leen el campo PATENTE de la Tabla MÓVILES, en cambio los informes a imprimir toman los datos de CONSULTAS, en las cuales puede estar el campo PATENTE de MÓVILES (Tabla Principal) y el campo PATENTE de otra tabla relacionada, ya que PATENTE es la clave que utilizo para relacionar las diferentes tablas. O sea: estoy teniendo un problema de sintaxis a la hora de indicarle cual campo PATENTE debe leer... y ahí se me está terminando la ciencia, ja ja. Pero seguiré probando, y también probaré lo otro que me enviaste. No son muchos registros, no pasan de 200 y pico, y como dije anteriormente, en los formularios funciona de primera, en todos. Muy agradecido por tus aportes!

Respuesta
1

Depende como hayas elegido guardar el contenido si con la máscara de entrada o no. Si es con la máscara de entrada, prueba modificando la estructura de la tabla y definiendo la nueva máscara de entrada, modifica en ancho del campo texto.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas