** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Actualizar Campo por Indice de Tabulación
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoActualizar Campo por Indice de Tabulación

 Responder Responder
Autor
Mensaje
Ignigo Ver desplegable
Nuevo
Nuevo


Unido: 09/Septiembre/2019
Localización: España
Estado: Sin conexión
Puntos: 9
Enlace directo a este mensaje Tema: Actualizar Campo por Indice de Tabulación
    Enviado: 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.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 12022
Enlace directo a este mensaje Enviado: 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

Mi web
Arriba
Ignigo Ver desplegable
Nuevo
Nuevo


Unido: 09/Septiembre/2019
Localización: España
Estado: Sin conexión
Puntos: 9
Enlace directo a este mensaje Enviado: 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?
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 12022
Enlace directo a este mensaje Enviado: 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

Mi web
Arriba
Ignigo Ver desplegable
Nuevo
Nuevo


Unido: 09/Septiembre/2019
Localización: España
Estado: Sin conexión
Puntos: 9
Enlace directo a este mensaje Enviado: 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".
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 12022
Enlace directo a este mensaje Enviado: 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

Mi web
Arriba
Ignigo Ver desplegable
Nuevo
Nuevo


Unido: 09/Septiembre/2019
Localización: España
Estado: Sin conexión
Puntos: 9
Enlace directo a este mensaje Enviado: 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,
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 12022
Enlace directo a este mensaje Enviado: 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

Mi web
Arriba
Ignigo Ver desplegable
Nuevo
Nuevo


Unido: 09/Septiembre/2019
Localización: España
Estado: Sin conexión
Puntos: 9
Enlace directo a este mensaje Enviado: 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

Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable