No me muestra datos seleccionados desde un subformulario

A tod@s, Intentaré explicarmes lo más claro posible. Estoy modificando una antigua base de datos (para reducir el número de formularios) y me he encontrado con el siguiente inconvenientes, os explico lo que tengo realizado.

Tengo un formulario llamado FCodificado y dentro del mismo un subformulario SubGeneral, como se muestra en la imagen:

El subformulario me sirve para mostrar datos de 8 tablas, según seleccione un botón (cada botón corresponde a una tabla diferente), para mostrar los datos utilizo la siguiente instrucción:

Private Sub Marco20_Click()

Select Case Me.Marco20

Case 1 ' Reglamento General de Circulación (CIR)

txtNorma.Value = "RGCir."

txtCodigo.Value = 1

txtArticulo.SetFocus

Form_SubGeneral.Visible = True

Etiqueta65.Caption = "REGLAMENTO GENERAL DE CIRCULACIÓN"

Form_SubGeneral.Form.RecordSource = "SELECT TCIR.Articulo1, TCIR.Articulo, TCIR.Apartado, CIR.Opcion,TCIR.Hecho  FROM TCIR ORDER BY TCIR.Articulo,Apartado,Opcion asc; " Texto62.Value = DCount("*", "TCIR")

……

Si selecciono cualquiera de las opciones se me muestra los datos en el subformulario (SubGeneral), a continuación si doy doble clic en cualquier artículo, se abre un formulario (FArticulado) y muestra los datos correspondientes al artículo seleccionado, según se muestra en la imagen:

Antiguamente tenía tantos Formularios como normativa infringida es decir 8 formularios como los de la imagen anterior, lo que pretendo ahora es que en un solo formulario (FArticulado) pudiera mostrar los datos seleccionados en el subformulario (SubGeneral), para eso uso la siguiente instrucción:

Dim strFiltro As String

Dim strFiltro2 As String

'Reglamento General de Circulación (CIR)

If Forms!FCodificado!txtCodigo.Value = "1" Then

'Construyo la cadena para filtrar por Título

    If Not IsNull(Me.ARTICULO1) And Me.ARTICULO1 <> "" Then

     strFiltro = Nz("ARTICULO1 = '" & Me.ARTICULO1 & "'", "")

     DoCmd.OpenForm "FArticulado", , , strFiltro, acFormReadOnly, , 1

    End If

End If

'Reglamento General de Conductores (CON)

If Forms!FCodificado!txtCodigo.Value = "2" Then

'Construyo la cadena para filtrar por Título

    If Not IsNull(Me.ARTICULO1) And Me.ARTICULO1 <> "" Then

     strFiltro2 = Nz("ARTICULO1 = '" & Me.ARTICULO1 & "'", "")

     DoCmd.OpenForm "FArticulado", , , strFiltro2, acFormReadOnly, , 2

    End If

End If

Muestro solo los datos de las dos primeras opciones, por no extenderme mucho.

Aquí viene el error que estoy teniendo. Si pulso en un articulo de la primera opción sale todo bien, pero cuando selecciono un articulo de la segunda opción, me sale el siguiente error:

Se ha producido el error 2427 en tiempo de ejecución: Ha especificado una expresión que no tiene valor.

Al abrirse filtrado el formulario FArticulado tengo la siguiente instrucción:

Private Sub Form_Open(Cancel As Integer)

'Reglamento General de Circulación (CIR)

If Me.OpenArgs = 1 Then

Forms!FArticulado.Caption = "Reglamento General de Circulación"

If ARTICULO.Value = "002" Then

Etiqueta28. Caption = "Título I. Normas generales de comportamiento en la circulación "

 Etiqueta29.Caption = "Capítulo I. Normas generales"

 Etiqueta34.Caption = ""

 Etiqueta16.Caption = "Usuarios "La instrucción que uso para

Me podéis ayudar si se puede realizar lo que pretendo o tendré que tener un formulario por cada opción, es decir 8 formularios.

Respuesta
1

Antonio: En una lectura rápida, si que veo que al abrir de vez en vez el SubFormulario, le pasas un "Origen de datos". Entiendo y no sé si lo entiendo bien que cuando abres el Formulario "FArticulado", si previamente ha cambiado el Origen de datos del Sub Formulario, también debería de cambiar el de FArticulado, y no veo que se lo adjudiques.

Independientemente del WhereCondition o los OpenArgs (que no he repasado), cuando abres un Formulario, si quieres que se muestren todos los Campos, necesitas una Fuente.

En éste caso esa Fuente no puede ser directa. Es decir veo un Formulario "Independiente", en el que cada apertura corresponda por una Consulta a un Origen.

No me atrevo a ahondar más porque sería un atrevimiento por mi parte sin conocer si las Tablas son "Identicamente iguales en la estructura de Campos..."

La explicación que describes es muy rica, pero importa mucho lo que hay detras. Saludos >> JTJ

Antonio: Se me ha pasado comentarte, que con un análisis de todo ese proceso, el código creo que se puede simplificar adjudicando variables a los Nombres de tabla..., pero sería un segundo escalón. Saludos >> JTJ

¡Gracias! Jacinto por tu ayuda y orientación, al final lo solucione con la siguiente instrucción 

If Me.OpenArgs = 1 Then
Forms!FArticulado.RecordSource = "Select * FROM TCIR WHERE ARTICULO1 = '" & Forms!FCodificado!SubGeneral!ARTICULO1 & "'".

Decirte que Articulo1 es un campo oculto en el subformulario y por el cual filtro los registros, se me olvido haberlo dicho.

En cuanto a lo que me indicas de poder simplificar más el código adjudicando variables a los  nombres de tabla, me podrías indicar como lo harías, los nombre de campos son todos los mismos. Un Saludo. 

2 respuestas más de otros expertos

Respuesta
1

Antonio, independientemente de otras cosas, algo no entiendo. Por lo que dices, al menos eso parece, el formulario es independiente.

Si texto62 es el control Total de registros( ya que no leo por ningún otro lado), no debes meterlo en la instrucción que da el origen de registros al subformulario, sino que cuando dices

Case=1

txtnorma="RGIR"

texto62=Dcount("*","rgir")

Por cierto, tampoco he descubierto el control TxtCodigo, así como en el subformulario el control Artículo1

Cuando, para el origen de registros del subformulario, que según pones arriba, se llama Subgeneral la instrucción sería

subgeneral.form.recordsource="SELECT Articulo, Apartado, opcion, Hecho  FROM TCIR ORDER BY Articulo,Apartado,Opcion"

sobra el asc. Access, si no le dices nada entiende que es ascendente

por otro lado, la instrucción

 If Not IsNull(Me.ARTICULO1) And Me.ARTICULO1 <> "" Then

     strFiltro2 = Nz("ARTICULO1 = '" & Me.ARTICULO1 & "'", "")

DoCmd. OpenForm "FArticulado",,, strFiltro2, acFormReadOnly,, 2

No le veo sentido, verás le dices, si no es nulo Articulo1, o sea que tenga algo pero luego luego le dices que no esté vacío, es una redundancia, ya que previamente le "has exigido" que tenga algo. Luego en el filtro le pones la instrucción nz, que no hace falta, ya que previamente le has exigido que tenga valor.

No estás mal usar un filtro, pero personalmente opino, que debería usarse para algo más complejo, si sólo va a tener una instrucción puedes usar, aprovechando que le vas a decir docmd, simplemente

docmd.openform "Farticulado",,,"articulo1='" & me.articulo1 & "'",....

En fin, podría seguir pero sería conveniente que pusieras una imagen del diseño de los formularios para saber donde están artículo1, txtcodigo, texto62, etc

Por ejemplo, para darte una idea, si tengo el formulario 1 con un marco de opciones que se llama Marco8 y un cuadro de texto llamado Total, con un subformulario llamado Socios(por poner algo)

Si elijo Alemania

En total me dice cuántos registros hay de Alemania, y si hago clic en cualquier nombre

Si hago clic en otro

Lógicamente, el código es algo más simple, ya que no tengo esos campos, pero la instrucción es la misma. La del marcos de opciones es

Private Sub Marco8_AfterUpdate()
Select Case Marco8
Case Is = 1
Total = DCount("*", "clientes", "pais =""Alemania""")
Socios.Form.RecordSource = "select nombrecliente from clientes where pais=""Alemania"" order by nombrecliente"
End Select
End Sub

En caso de que en Total quisieras que te apareciera la cantidad total de registros de la tabla sería Dcount("*","clientes")

Y el código del evento Al hacer clic del control Nombrecliente del subformulario sería

Private Sub NombreCliente_Click()
DoCmd.OpenForm "clientes", , , "nombrecliente='" & Me.NombreCliente & "'", acFormReadOnly, acDialog
End Sub

Lógicamente puedes poner los criterios que quieras

" nombrecliente='" & me.nombrecliente & "' and accidente=""Catacrás, cras"" and heridos=""Muchos"""

¡Gracias! Julián por tu ayuda y orientación, se me olvido decir que Articulo1 es un campo que tengo oculto en el Subformulario y por el cual filtro los registros, y que texto62 es un contador de registro lo que ocurre que a la hora de escribir el mensaje lo inserte con la instrucción y podría dar a entender otra cosa.

Respuesta
1

Le recomiendo que haga un seguimiento al código con un STOP y va presionando la tecla F8, algo como;

Private Sub Form_Open(Cancel As Integer)

'Reglamento General de Circulación (CIR)

STOP

If Me.OpenArgs = 1 Then

...

Al menos puede identificar que está causando el error. El error 2427 indica que está haciendo referencia a un objeto de un formulario que no tiene valor.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas