Imprimir página | Cerrar ventana

Actualizar Campo por Indice de Tabulación

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=84698
Fecha de impresión: 11/Julio/2020 a las 17:00


Tema: Actualizar Campo por Indice de Tabulación
Publicado por: Ignigo
Asunto: Actualizar Campo por Indice de Tabulación
Fecha de publicación: 09/Septiembre/2019 a las 22:59
Hola a todos

Necesito la ayuda de alguien para el próximo tema.

Necesito una función general que serviría para establecer el valor Now () en un campo.

La peculiaridad es que debe hacerse por el índice de tabulación.

El formulario es un formulario de registro de controles de calidad, y justo al lado del control se encuentra el campo "hora de control" con un índice de tabulación correlativo al del control.

Lo que necesito es una función que se activa cuando se inserta un valor en el control, que identifica el índice de tabulación del control y que establece el valor Now () del campo "hora de control" mediante el índice de tabulación + 1.

Sé que esto se puede hacer por macro, pero me gustaría mejorar el programa, ya que por macro tengo que hacer uno para cada control, y hay hay muchos.

En resumen:

1) Después de actualiza un cotrol, la función identifica el índice de tabulación del control
2) Obtiene el "Control de horas" con el tabindex+1.
3) Actualiza el control de horas con 'Now'.

No sé si te lo expliqué bien.

Gracias de antemano.



Respuestas:
Publicado por: xavi
Fecha de publicación: 10/Septiembre/2019 a las 12:02
Hola Ignigo y bienvenido al foro,

Uno de los "problemas" de Access es que no es posible acceder a un control *directamente* a través de la propiedad TabIndex.

La manera de hacerlo es recorriendo la colección de controles de la sección.

Yo lo enfocaría con una función parecida a esta:
Function TimestampTabIndexMasUno()
    Dim ctl As Control
    
    For Each ctl In Me.Section(Screen.ActiveControl.Section).Controls
        If ctl.TabIndex = Screen.ActiveControl.TabIndex + 1 Then
            ctl = Now
            Exit Function
        End If
    Next
End Function

Esa función la asignas a los controles "lanzadores" en el evento AfterUpdate y listo.

Escrito al vuelo. Los experimentos con gaseosa. 

Un saludo



-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: Ignigo
Fecha de publicación: 11/Septiembre/2019 a las 23:51
Gracias Xavi:

Me da un error.

El uso de la palabra clave Me no es valido.

¿Puedes solucionarlo?


Publicado por: xavi
Fecha de publicación: 12/Septiembre/2019 a las 09:41
Se supone que la función está en el módulo asociado al formulario.

De no ser así y quererla genérica por utilizarla en otros formularios dónde se seguirá la misma regla de tabulación, cambia el Me por una referencia al formulario activo: Screen.ActiveForm
 



-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: Ignigo
Fecha de publicación: 12/Septiembre/2019 a las 22:34
Hola Xavi;

Si necesito hacerla genérica.

Otro error.

Esta vez: "Error definido por la aplicación u objeto" en la línea "If ctl.TabIndex = frmCurrentForm.TabIndex + 1 Then"

El código que he escrito es:

"Function TimestampTabIndexMasUno()
    Dim ctl As Control
    Dim frmCurrentForm As Form
    Set frmCurrentForm = Screen.ActiveForm
    For Each ctl In frmCurrentForm.Section(Screen.ActiveControl.Section).Controls
        If ctl.TabIndex = frmCurrentForm.TabIndex + 1 Then
            ctl = Now
            Exit Function
        End If
    Next
End Function"

¿Que puede fallar?

La función la he colocado en la propiedas "al cambiar".


Publicado por: xavi
Fecha de publicación: 12/Septiembre/2019 a las 22:52
Yo solo he sugerido que debias cambiar "Me" por "Screen.ActiveForm". No entiendo los otros cambios que has hecho.

En rojo el único cambio necesario. 

Function TimestampTabIndexMasUno()
    Dim ctl As Control
    
    For Each ctl In Screen.ActiveForm.Section(Screen.ActiveControl.Section).Controls
        If ctl.TabIndex = Screen.ActiveControl.TabIndex + 1 Then
            ctl = Now
            Exit Function
        End If
    Next
End Function


-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: Ignigo
Fecha de publicación: 13/Septiembre/2019 a las 21:51
Hola Xavi;

Si, ya lo probé y me daba el error: "El objeto no admite esta propiedad o método"

Se me marcaba:

"If ctl.TabIndex = Screen.ActiveControl.TabIndex + 1 Then"

Saludos,


Publicado por: xavi
Fecha de publicación: 14/Septiembre/2019 a las 10:19
Vale. El problema viene dado porque no todos los controles disponen de la propiedad TabIndex. Al recorrer la colección de controles, alguno de ellos no tiene esa propiedad (una imagen, una linea, un cuadro, etc)

Modificación del código para que evalúe ciertos tipos de control:

Function TimestampTabIndexMasUno()
    Dim ctl As Control
    
    For Each ctl In Screen.ActiveForm.Section(Screen.ActiveControl.Section).Controls
        Select Case ctl.ControlType
            Case acTextBox, acComboBox, acListBox, acCheckBox
                If ctl.TabIndex = Screen.ActiveControl.TabIndex + 1 Then
                    ctl = Now
                    Exit Function
                End If
            Case Else
                ' Nada
        End Select
        End If
    Next
End Function

Nota: puede faltar algún tipo.




-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: Ignigo
Fecha de publicación: 18/Septiembre/2019 a las 22:47
Hola Xavi;

Si, funciona.

Con esta función genérica, se me simplifica mucho el programa.

Muchísimas gracias




Imprimir página | Cerrar ventana