Ingreso rápido de la hora

ButteDuLac Mensajes publicados 534 Estado Miembro -  
ButteDuLac Mensajes publicados 534 Estado Miembro -
Hola,

En un formulario de mi base de datos (Access 2010), me gustaría que el usuario pueda introducir rápidamente la hora.

Así, si la hora a introducir es 14:45, con mi máscara de entrada (00:00!;0;_), basta escribir «1445», pero cuando la hora a introducir es 9:30 o 14:00, me gustaría que el usuario pudiera no tener que ingresar más que «930» o «14» y que, por defecto, se añadan los 00 de los minutos, y que el 0 delante del 9 (9:30 en lugar de 09:30) sea opcional. He probado estas máscaras:
99:99!;0;_
90:99!;0;_
90:00!;0;_
99:99;0;_
9:99;0;_

También probé máscaras del tipo 00:00;0;0, etc., pensando que el 0 quedaría por defecto y se tomaría como valor 0, pero solo es un carácter de relleno... Intenté fijar el valor por defecto a 00:00, pensando que la escritura reemplazaría el valor, uno a uno, pero en cuanto se introduce un número en el campo, el valor por defecto 00:00 desaparece y es reemplazado por ... los caracteres de relleno (ya sean _ o 0) y se debe introducir nuevamente los cuatro dígitos...

Mi formato (en la tabla) es « Hora, abreviado ».

Sé que esto se puede hacer, de haberlo vivido en otras bases de datos donde yo era usuario, pero talvez Access no lo permite???

¿Solución??? ¡Gracias!

Configuración: Configuración: Windows / Chrome 55.0.2883.87

2 respuestas

  1. JONAS KAPEND Mensajes publicados 32 Fecha de registro   Estado Miembro Última intervención  
     
    Hola, soy Jonas Kapenda de la República Democrática del Congo.
    Te recomiendo crear dos campos de texto: hora y minuto, limitando la cantidad de caracteres en cada campo.
    Al imprimir el estado, fusiona/guárdalos.
    0
    1. ButteDuLac Mensajes publicados 534 Estado Miembro 41
       
      Gracias, pero no funciona. Tengo campos calculados que tienen en cuenta la hora.
      0
    2. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > ButteDuLac Mensajes publicados 534 Estado Miembro
       
      De hecho, podrías, como sugiere Jonas Kapenda, tener dos campos en el formulario y agruparlos para almacenar la hora en la base de datos. ¿Por qué no?
      0
    3. ButteDuLac Mensajes publicados 534 Estado Miembro 41 > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
       
      Sí, gracias... pero me pregunto... si la persona debe ingresar la hora, luego presionar Tab para pasar a los minutos... y de nuevo Tab para salir del campo de minutos y pasar al siguiente... ¿dónde se ahorra tiempo? (Ej.: para 12:45, en lugar de hacer [1+2+4+5+Tab], la persona hará [1+2+Tab+4+5+Tab] como ahora, o más bien, para 09:00, ella haría [9+Tab+Tab], en lugar de [0+9+0+0] como ahora... mientras que con el método que quiero obtener, la persona haría [9+Tab], o incluso [9+2+Tab] para 09:20, y eso es todo!)

      Y dado que ya tengo un gran número de campos en mi BD, eso agregaría dos más, y tendría que, en cada formulario donde tengo una hora por ingresar, reemplazar el campo inicial por dos campos más (y todo el rollo que viene con ello). ¿Qué si tengo un código VBA asociado a mi máscara de entrada (el que ya está en mi campo), copio-pego el código y es mucho más rápido...

      De todas formas, gracias por la sugerencia...
      0
    4. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588
       
      No es ideal, pero no hace falta tener dos campos en la base de datos: tendrías dos campos en los formularios, uno solo en la base.
      0
    5. ButteDuLac Mensajes publicados 534 Estado Miembro 41 > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
       
      En el sentido de que podría poner una máscara con 99;1;_, ¿verdad?
      Solo que eso sigue significando que debo eliminar todos mis controles de campo HORA para reemplazarlos cada uno por dos nuevos controles de campo HH y MM (supongamos que trabajo simultáneamente en dos bases de datos, con varias columnas de hora, por ejemplo: [heure_debut] y [heure_fin] para una formación; [heure_naissance], [heure_X], [heure_Y], etc. (X e Y son acciones a realizar en la gestión del expediente Z...
      Entonces busco desesperadamente una forma de proceder, ya que sé que es posible...

      Dicho esto, tu idea es buena. Es solo que no es exactamente lo que busco.

      ¡Pero realmente eres genial ayudándome!
      0
  2. ButteDuLac Mensajes publicados 534 Estado Miembro 41
     
    En VBA, voici une traduction approximative et fonctionnelle des fonctions JavaScript fournies. Elle vise à reproduire la logique telle quelle, en adaptant la syntaxe et les types à VBA. Notez que certaines constructions JavaScript (comme les chaînes et les indexes) se mappent différemment en VBA; j’ai pris soin de conserver le comportement d’origine.

    Option 1: version avec fonctions séparées (Type Sub/Function dans un module standard)

    Public Function _HVC(h As String, f As String) As String
    If h = "" Then
    _HVC = ""
    Exit Function
    End If

    Dim r As String
    r = f
    Dim nPos As Long

    nPos = InStr(1, r, "HH", vbBinaryCompare)
    If nPos > 0 Then
    r = Left(r, nPos - 1) & Left(h, 2) & Mid(r, nPos + 2)
    End If

    nPos = InStr(1, r, "MM", vbBinaryCompare)
    If nPos > 0 Then
    r = Left(r, nPos - 1) & Mid(h, 3, 2) & Mid(r, nPos + 2)
    End If

    nPos = InStr(1, r, "SS", vbBinaryCompare)
    If nPos > 0 Then
    r = Left(r, nPos - 1) & Mid(h, 5, 2) & Mid(r, nPos + 2)
    End If

    nPos = InStr(1, r, "CC", vbBinaryCompare)
    If nPos > 0 Then
    r = Left(r, nPos - 1) & Mid(h, 7, 2) & Mid(r, nPos + 2)
    End If

    _HVC = r
    End Function

    Public Function _CVH(h As String, f As String) As String
    If h = "" Then
    _CVH = ""
    Exit Function
    End If

    Dim e As Long, m As Long, s As Long, t As String
    e = InStr(1, f, "HH", vbBinaryCompare)
    If e = 0 Then
    _CVH = ""
    Exit Function
    End If

    m = InStr(1, f, "MM", vbBinaryCompare)
    If m = 0 Then
    _CVH = ""
    Exit Function
    End If

    s = InStr(1, f, "SS", vbBinaryCompare)
    If s = 0 Then
    t = "00"
    Else
    t = Mid(h, s, 2)
    End If

    Dim c As Long
    c = InStr(1, f, "CC", vbBinaryCompare)
    Dim d As String
    If c = 0 Then
    d = "00"
    Else
    d = Mid(h, c, 2)
    End If

    _CVH = Mid(h, e, 2) & Mid(h, m, 2) & t & d
    End Function

    Public Function _EVH(e As Long) As String
    Dim hours As String, minutes As String, seconds As String, cent As String
    hours = CStr(Int(e \ (100 * 3600)))
    If Len(hours) = 1 Then hours = "0" & hours
    e = e Mod (100 * 3600)

    minutes = CStr(Int(e \ (100 * 60)))
    If Len(minutes) = 1 Then minutes = "0" & minutes
    e = e Mod (100 * 60)

    seconds = CStr(Int(e \ 100))
    If Len(seconds) = 1 Then seconds = "0" & seconds
    e = e Mod 100

    cent = CStr(Int(e))
    If Len(cent) = 1 Then cent = "0" & cent

    _EVH = hours & minutes & seconds & cent
    End Function

    Public Function _HSY() As String
    Dim d As Date
    d = Now

    Dim h As String, m As String, s As String, ms As String
    h = CStr(Hour(d))
    If Len(h) = 1 Then h = "0" & h

    m = CStr(Minute(d))
    If Len(m) = 1 Then m = "0" & m

    s = CStr(Second(d))
    If Len(s) = 1 Then s = "0" & s

    ms = CStr(Millisecond(d)) ' Note: VBA n’a pas Millisecond, voir remarque ci-dessous
    If Len(ms) = 1 Then ms = "0" & ms
    If Len(ms) >= 2 Then ms = Left(ms, 2)

    _HSY = h & m & s & ms
    End Function

    ' Remarque: VBA standard ne fournit pas Millisecond(natif).
    ' Pour obtenir des millisecondes, utiliser Now() avec Timer ou une approche API;
    ' ici on laisse Millisecond(d) comme placeholder conceptuel.

    Public Function _HVE(h As String) As Long
    ' Calcule la valeur comme dans l’exemple JavaScript:
    ' (h.substr(0,2)*360000) + (h.substr(2,2)*6000) + (h.substr(4,2)*100) + (h.substr(6,2)*1)
    Dim a As String
    a = h
    Dim part1 As Long, part2 As Long, part3 As Long, part4 As Long
    part1 = CLng(Mid(a, 1, 2)) * 360000
    part2 = CLng(Mid(a, 3, 2)) * 6000
    part3 = CLng(Mid(a, 5, 2)) * 100
    part4 = CLng(Mid(a, 7, 2)) * 1
    _HVE = part1 + part2 + part3 + part4
    End Function

    Public Function _JGP(d As Object) As Object
    Set _JGP = d.Forms(0)
    End Function

    Option 2: version plus concise et adaptée

    ' Si vous préférez une version plus simple et tout-en-un sans manipulations de Date/Time compliquées,
    ' on peut laisser les fonctions _HSY et _Millisecond à adapter selon votre VBA et votre environnement.

    Remarques importantes:
    - InStr en VBA est équivalent à indexOf en JS; les indices en VBA commencent à 1, d’où les ajustements.
    - Substring/Left/Mid en VBA remplacent substring et les manipulations de chaîne JS.
    - VBA n’a pas nativement Millisecond; vous devrez peut-être utiliser l’API ou Timer pour récupérer des millisecondes précises.
    - Les noms de fonctions démarrent par underscore comme dans le code source pour correspondre.

    Si vous voulez, je peux adapter le code pour l’environnement VBA exact (Excel, Access, etc.) et remplacer la partie millisecondes par une solution fonctionnelle adaptée à votre contexte.
    0