Access - Conexión entre subformularios

 
Vista:

Conexión entre subformularios

Publicado por luis (3 intervenciones) el 12/11/2003 16:41:33
Saludos,

Tengo un subformulario llamado "X" que contiene otros dos subformularios llamados "X1" y "X2". El primero es una vista de formulario normal, los otros dos son de hoja de datos. El subformulario "X" (tabla) unicamente lo utilizo para vincularlo al subformulario "X2" (subtabla) a través de un campo, y cada vez que me desplazo por "X1" me posiciono en el subformulario "X" en el mismo registro (mediante la función Form_Current). Todo funciona perfectamente. Cada vez que me desplazo sobre "X1" posiciono el mismo registro en "X", el cual a su vez actualiza el subformulario "X2" (por ser formularios o subformularios vinculados). El problema es cuando me desplazo a un NUEVO registro en "X1", el subformulario "X" no se desplaza a ese nuevo registro automaticamente, ni siquiera mediante la sentencia 'DoCmd':

DoCmd.GoToRecord acDataForm, "X", acNewRecord

Me dice que el subformulario "X" está cerrado (error 2489 en tiempo de ejecución), lo cual es imposible ya que contiene a "X1" y "X2" vinculado y para todos los demás registros funciona perfectamente.

Alguien puede echarme una mano?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Conexión entre subformularios

Publicado por Alejandro (4142 intervenciones) el 03/05/2023 21:48:36
Es posible que el problema que estás experimentando se deba a la manera en que estás intentando moverte a un nuevo registro en el subformulario "X". En lugar de utilizar la sentencia `DoCmd.GoToRecord` para moverte a un nuevo registro en el subformulario "X", intenta utilizar la propiedad `Form.RecordsetClone` para crear una copia del conjunto de registros del subformulario "X" y luego utiliza el método `RecordsetClone.FindFirst` para buscar el registro correspondiente al nuevo registro seleccionado en el subformulario "X1".

A continuación te muestro un ejemplo de cómo podrías hacerlo:

1. En el evento `Current` del subformulario "X1", añade el siguiente código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub Form_Current()
    Dim rstX As Recordset
 
    ' Obtener una referencia al conjunto de registros del subformulario "X"
    Set rstX = Me.Parent!X.Form.RecordsetClone
 
    ' Buscar el registro correspondiente al nuevo registro seleccionado en "X1"
    rstX.FindFirst "[ID] = " & Me!ID
 
    ' Si se encuentra el registro, cambiar la posición del subformulario "X" a ese registro
    If Not rstX.NoMatch Then
        Me.Parent!X.Form.Bookmark = rstX.Bookmark
    End If
 
    ' Liberar la memoria del objeto Recordset
    Set rstX = Nothing
End Sub

En este código, `ID` es el campo que vincula los subformularios "X1" y "X", y asumimos que es un campo numérico. Si el campo de vinculación es de tipo texto, asegúrate de incluir comillas simples alrededor del valor del campo en la expresión `FindFirst`.

2. Asegúrate de que el subformulario "X" tenga un control invisible vinculado al campo de vinculación (`ID`). Esto es necesario para que Access pueda crear un objeto RecordsetClone para el subformulario "X". Para hacer esto, puedes añadir un control de cuadro de texto invisible al subformulario "X" y configurar su propiedad `ControlSource` para que sea el campo de vinculación (`ID`).

Con este código, cada vez que el usuario se desplace a un nuevo registro en el subformulario "X1", se buscará el registro correspondiente en el subformulario "X" y se cambiará la posición del subformulario a ese registro. Esto debería permitirte actualizar automáticamente los subformularios "X1" y "X2" cada vez que cambies de registro en el subformulario "X1".
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar