Cambiar origen de registro en formulario

Tengo en un formulario un boton con la siguiente instrucción :

Dim Matri As Variant

Matri = Nz(ID.Value, "")

   'Esto es por si el control no tuviera valor

If Matri = 0 Then Exit Sub

DoCmd.OpenForm "FConsultasActual", , , "[ID]=" & Matri & "", acFormEdit

End If

Todo me funciona bien, pero ahora viene la cuestión, el Formulario que me abre "FConsultasActual", tiene en origen del registro THistorico, lo que pretendo es que ese mismo formulario me sirviera para filtrar y que me cambiara el origen del registro a TAltas, es decir como poner en el mismo formulario otro origen de registro, si se pudiera hacer.

2 respuestas

Respuesta
2

Como bien te dice Icue, para cambiar el origen de un formulario has de modificar su propiedad RecordSource.

Esto lo puedes hacer desde el propio formulario "FConsultasActual", con

Me.Recordsource="TAltas"

Me.Recorsource="SELECT * FROM TAltas"

Me.Recorsource="SELECT Campo1,Campo2,.... FROM TAltas WHERE..."

O cualquier otro origen de datos válido.

También lo puedes hacer desde el formulario que abre "FConsultasActual":

Forms("FConsultasActual").Recordsource="TAltas"

...

Si quieres que los cambios sean "permanentes", es decir, que siempre que abras el formulario "FConsultasActual" tenga el último origen de datos, has de cambiar el enfoque, y desde el formulario que lo llama primero lo abres en vista diseño (y oculto), le modificas la propiedad, guardas los cambios y lo abres normalmente:

DoCmd. OpenForm "FConsultasActual", acDesign,,,, acHidden
Forms("FConsultasActual").Recordsource="TAltas"
DoCmd. Close acForm, "FConsultasActual", acSaveYes
DoCmd. OpenForm "FConsultasActual"

Y para terminar, permíteme señalarte un par de "errores" que veo en tu código, y que me llevan a pensar que tu afirmación de "todo me funciona bien" no es del todo cierta... porque si tu control no tiene valor, tendrás un error (y este es el motivo por el que te respondo, porque si piensas que tu código es correcto, cometerás el mismo error en el futuro y te volverás loco pensando "¿por qué ahora esto no me funciona si antes sí lo hacía?").

Te explico:

1º/ Declaras la variable Matri como Variant.

En principio ningún problema, aunque yo suelo escapar siempre que puedo de este tipo de variables.

2º/ Cuando le asignas el valor a la variable usas Nz() y le pasas como valor en caso de nulo una cadena vacía ("")

Aquí ya hay para comentar: una variable de tipo Variant admite sin problemas valores Nulos, por lo que puedes hacer la asignación directa, sin necesidad de usar Nz (Matri=Me.ID). Por otro lado, todo parece que ID es un campo numérico, y tu le estás dando a la variable un valor de texto con Nz: la cadena vacía ""

3º/ La comparación "por si no tiene valor" (If Matri = 0 Then Exit Sub) no se cumplirá nunca.

Primero, porque Matri si el control no tiene valor nunca será 0, sino "", que no es lo mismo

Segundo, porque si ID es un autonumérico, empezará en 1, y por tanto nunca tendrá valor 0.

Tal como lo tienes la comparación tendría que ser If Matri = "" Then Exit Sub, o bien, si aplicas lo que te decía en el punto anterior: If IsNull(Matri)Then Exit Sub.

Como te decía, tal como lo tienes ahora, si ID es nulo, la variable Matri tendrá el valor "", no te saltará la comprobación de "no hay valor", con lo que no te saldrá de la rutina, y cuando intente abrir el formulario filtrado => ¡Error al canto!

Yo hubiera escrito así el código:

Dim Matri As Long
Matri = Nz(ID.Value, -1)
'Esto es por si el control no tuviera valor
If Matri = -1 Then Exit Sub
DoCmd.OpenForm "FConsultasActual", , , "[ID]=" & Matri & "", acFormEdit
End If

Un saludo


Hola y gracias por todas las explicaciones y los consejos.

Te comento un poco lo que tengo, espero que no sea muy liosa la explicación. Tengo un formulario (FBusquedas) con dos botones uno Histórico y otro Altas, cuando pulso por ejemplo Altas, para realizar una consulta, me abre un subformulario con los datos que solicito, como se muestra en la imagen:

 Al pulsar sobre ese icono me abre el FConsultasActual con los datos filtrados de la tabla Altas.

En el formulario FConsultasActual, al activar el registro, he puesto la siguiente instrucción:

Recorsource = "SELECT * FROM TAltas WHERE [ID]=" & Matri & ""

Me muestra los datos correctos.

Ahora quiero hacer lo mismo que lo anterior pero que me muestre los datos de la tabla histórico, es decir poner:

Recorsource = "SELECT * FROM THistorico WHERE [ID]=" & Matri & ""

Como debería de hacer para que me cogiera indistintamente una u otra dependiendo de la consulta que realice , de Histórico o Altas. Espero que no parezca muy lioso lo que comento.

En primer lugar, yo no usaría el evento "Al activar registro", sino "Al cargar", pues aunque no creo que sea el caso, si la SQL Devuelve más de un registro, cada vez que cambies se te lanzará de nuevo ese código y te volverá al primer registro.

En cuanto a tu pregunta, no acabo de entender cómo lo quieres hacer. Me despista que digas que "se abre un subformulario" Qué quieres decir, ¿qué dentro de tu formulario muestras uno u otro subformulario o que abres un formulario nuevo?

Yo lo que haría a priori (de nuevo sin saber cómo es lo que tienes montado) es lo que te comentaba antes, de modificar en vista diseño el origen de tu formulario a una u otra tabla al pulsar en los botones de Altas o Historico, y luego al pulsar en el botón de la imagen, simplemente abres el formulario filtrado con el código de tu pregunta (pero "corregido").

Hola y saludos, te adjunto una imagen, al insertar una matricula y darle al botón aceptar(Altas) muestra un subformulario con los  datos. Esta es la instrucción que tengo insertada en el botón acaeptar.

If Texto11.Value = 1 Then
subBuscaActual.Visible = True
subBuscaActual.Height = 4666
Forms!FBusquedas!subBuscaActual.Form.RecordSource = "Select * FROM TAltas WHERE MATRICULA Like  '*" & Form!txtConsulta.Value & "*'  Or MATRICULA1 Like  '*" & Form!txtConsulta.Value & "*' Or MATRICULA2 Like  '*" & Form!txtConsulta.Value & "*' Or MATRICULA3 Like  '*" & Form!txtConsulta.Value & "*' ORDER BY TAltas.Fecha asc;"
txtRegistro.Value = Form_subBuscaActual.RecordsetClone.RecordCount
Etiqueta26.Visible = True
txtRegistro.Visible = True
Etiqueta14.Visible = True
End If

If txtRegistro.Value = 0 Then
subBuscaActual.Visible = False
MsgBox "      No existen datos para la Matricula:  " & vbCrLf & vbCrLf & Space(20) & Me.txtConsulta & vbCrLf & vbCrLf & "       ¿Realiza nueva consulta?", vbInformation + vbOKOnly, "Sin Datos"
End If

La instrucción que tu me propones que debería de insertarla al final de esta instrucción o al principio, eso es lo que tu me comentas. Y en el otro botón (Histórico) pongo la instrucción cambiando el Recordsource="THistorico"

Lo que te propongo (modificar en diseño el origen del formulario) da igual si la pones al principio, en el medio o al final de ese código, siempre que lo hagas antes de pulsar el botón que te abre el segundo formulario.

Si no te sale, buscamos otras alternativas.

Perdón por si soy un poco pesado, pero veras he insertado la instrucción, que me propusiste:

DoCmd. OpenForm "FConsultasActual", acDesign,,,, acHidden

Forms("FConsultasActual").Recordsource="TAltas"

DoCmd. Close acForm, "FConsultasActual", acSaveYes

DoCmd. OpenForm "FConsultasActual"

Pero claro me salen filtrados los registros por la TAltas, y cuando quiero filtrados por la THistorico no me sale nada. Como haga para que salga indistintamente uno u otro, según pulso el botón Ver (de las imágenes anteriores)

Llevo días (casi una semana) sin poder entrar "normalmente" a todoexpertos, y acabo de ver que me habías respondido...

El código que pones es correcto para el boton "Altas", y debes poner lo mismo, pero con "THistoricos" para el botón "Historicos".

Es lo que te explicaba aquí:

Yo lo que haría a priori (de nuevo sin saber cómo es lo que tienes montado) es lo que te comentaba antes, de modificar en vista diseño el origen de tu formulario a una u otra tabla al pulsar en los botones de Altas o Historico, y luego al pulsar en el botón de la imagen, simplemente abres el formulario filtrado con el código de tu pregunta.

De todas formas, no sé si ya habrás solucionado este tema después de tanto tiempo...

Un saludo.


Respuesta
2

Sin haberlo entendido bien, puedes poner en el evento Al abrir del segundo formulario

If currentproject.allforms("Formulario1").isloaded then

if forms!formulario1.id=.... then

form.recordsource="select * from Taltas where..

End if

End if

Es decir, que si el formulario 1 está cargado y si en el campo Id está el valor que sea entonces el origen del segundo formulario sean aquellos registros de la tabla Taltas que cumplan...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas