Access. Formularios. Formatear un campo de acuerdo con contenido de un cuadro de texto.

No sé si el contenido del título de la pregunta es suficientemente claro pero voy a tratar de explicarlo. La solución se me antoja sencilla pero no acabo de encontrarla.

Esta captura de pantalla contiene un listado de marcas de atletismo. Aunque no salen los nombres de los campos, aparece el sexo, nombre, apellido, país, fecha de nacimiento, evento (cada una de las especialidades de atletismo), un campo independiente donde está el cursor que llamo INTRO_MARCA y el siguiente que llamo MARCA. A continuación algunos datos más de la competición como el puesto logrado, nombre de la misma, lugar y fecha. En este otro enlace se puede tener una idea más exacta de lo que hago.

Yendo al primer enlace, lo que intento hacer es que escribiendo la marca en INTRO_MARCA (solo los números) me aparezca con sus correspondientes signos de puntuación en MARCA dependiendo del tipo de evento. A la vista de lo anterior, vemos que si escribimos 2020 en el primer campo, debería salir 20.20 en el segundo. Los dos registros anteriores son de pértiga y altura e, igualmente se trataría de escribir solo los números.

Si el formato de las marcas fuese siempre el mismo para un determinado evento no habría problema, y de hecho durante años lo he solucionado con máscaras de entrada seleccionadas con SELECT CASE, pero hay disciplinas como el medio maratón de hombres, donde el formato de la marca puede ser H:mm:ss o mm:ss, igual ocurre con el 3000 obstáculos de mujeres, donde el formato puede ser mm:ss.cc o m:ss:cc, u otras.

Es por ello que lo que estoy intentando es asociar un código del evento After_Update de tal forma que, en función del evento seleccionado y de los números escritos en INTRO_MARCA, me lo presente de una u otra forma. Volviendo al medio maratón, lo que quiero es que si escribo 5945 me lo ponga como 59:45 pero que si es 10316 me lo ponga como 1:03:16 en MARCA. No creo tener problema en el establecimiento de las condiciones y los formatos, con los que estoy muy familiarizado, pero si en como realizarlo técnicamente.

Perdón por el rollazo, pero si alguien me puede echar una mano se lo agradecería.

1 respuesta

Respuesta
2

Sin entrar a profundizar, lo estabas haciendo bien con el select case, lo único que tendrías que añadirle, por ejemplo, con lo de 5945 y 10316 es

if len([marca])>4 then

loquesea=format([marca],"hh:nn:ss)

else

loquesea=format([marca],"hh:nn,ss")

end if

Y cosas del estilo

Muchas gracias Icué.

Efectivamente, eso es lo que tenía pensado hacer, jugar con Len para, en función de su valor (y del contenido del evento), formatearlo de una forma u otra (en realidad los tiempos tienen formato texto porque no tengo que hacer operaciones matemáticas con ellos, así es que me ahorro el format).

Como verás en este ejemplo, lo que he venido haciendo hasta ahora ha sido asociar el código al evento "After Update" del campo Evento ("Prueba" en el ejemplo), resolviendo las excepciones de que hablaba de forma manual. Ahora quería automatizarlo un poco más pero creo que estoy haciendo algo mal con ese campo independiente. Igual no lo estoy enlazando correctamente con el formulario.

Carlos.

Vamos por partes.

1º.- En tu instrucción le estás hablando de la máscara de entrada, pero si no le dices nada más, cuando escribas, por ejemplo 2245, si en la máscara tienes puesto algo así como

Marca.inputmask="00:00"

Cuando vayas a escribirlo, si te aparecerá como en la imagen

Y cuando lo escribas te quedará

Paro si cierras el formulario y lo vuelves a abrir te aparecerá asi

Si embargo, si en el evento Después de actualizar del cuadro de texto Marca le pongo algo como

Aunque cierres el formulario el valor que te guardaría en la tabla es el de 23:45

2º Yo te aconsejaría usar los eventos Al recibir el enfoque y Después de actualizar del cuadro de texto Marca. Me explico, cuando recibe el enfoque si la prueba es... entonces su máscara de entrada sea... pero usando lo de format en el evento Después de actualizar.

3º Dicho lo dicho en el punto anterior, yo no usaría máscara de entrada. Escribiría directamente 23456 y en el evento Después de actualizar poner algo así como

Select case prueba

case is="Maratón"

if len([marca]=6 then

marca=format([marca],"00:00:00")

else

marca=format([marca],"0:00:00")

end if

Si fueran muchos los formatos de tiempo lo podrías poner como

Select case Prueba

case is="Maratón"

              Select case len([marca])

              case is=5

               .......

              Case is=6

              ....

Muchísimas gracias Icue por tu detallada explicación. Funciona perfectamente ahora. Lo único que he hecho ha sido suprimir el formato porque por experiencia sé que dan problemas dependiendo de la configuración regional. Aquí pongo parte de código.

Saludos.

Private Sub MARCA_AfterUpdate()
Select Case PRUEBA
   Case "50", "55", "60", "50H", "55H", "60H"
        If Len(MARCA) = 2 Then
            MARCA = Left(MARCA, 1) & "." & Right(MARCA, 1)
        Else
            MARCA = Left(MARCA, 1) & "." & Right(MARCA, 2)
        End If
  Case "150", "200", "300", "400"
        If Len(MARCA) = 3 Then
            'MARCA = Format(MARCA, "00.0")
            MARCA = Left(MARCA, 2) & "." & Right(MARCA, 1)
        Else
            'MARCA = Format(MARCA, "00.00")
            MARCA = Left(MARCA, 2) & "." & Right(MARCA, 2)
        End If

Si a ti te sirve ni mil palabras. Pero lo que me sorprende es que haya locos que se atrevan a correr más de 50 m.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas