Problemas de sintaxis en la referencia a un control de un SUBFORMULARIO.

A ver. La verdad es que los problemas que tengo con lo que enuncio en mi pregunta son muchos pero a ver si resolviendo el que expongo a continuación resuelvo los demás:

Después de mil vueltas he conseguido dar con la sintaxis correcta en la siguiente Función DBúsq [DLookUp] en una macro (acción Establecer Valor): DBúsq("[CIE10]";"Diagnosticos";"IdDiagnostico=[Formularios]![SubFormul_Diagnosticos_Pacientes]![IdDiagnostico]")

Deliberadamente he escrito como nombre del formulario en el argumento de criterios de la Función el de "SubFormul_Diagnosticos_Pacientes", porque, AUNQUE SE TRATA EN PURIDAD DE UN SUBFORMULARIO -perdón por las mayúsculas: sólo trato de poner énfasis en ello-, si lo abro autónomamente, es decir sin incluirlo en el Formulario Principal destinado en mi aplicación a albergar como Subformulario el anterior, miel sobre hojuelas, la función hace que se me muestre en el lugar que deseo el código CIE10 [Código Internacional de Enfermedades Mentales] propio del IdDiagnóstico que haya seleccionado, POR EL CONTRARIO, si abro el Formulario Principal con el Subformulario anterior, la Función deja de surtir sus mágicos y efectivos efectos.

Estoy convencido de que se trata de un problema de referenciación del control... He leído un montón de entrada en internet sobre la materia -especialmente esta: http://www.geocities.ws/patxisanz/apuntes/refcontrol/subform.html, que aparentemente es muy clara... Pero no hay forma... No doy con ello...

P.D.- Por supuesto mi problema se produce a la inversa, es decir cómo referencio un control de un formulario principal desde otro 'ubicado' en el subformulario en él contenido.

1 Respuesta

Respuesta
1

Rafael: Comienzo por la última.

Para Capturar el valor de un TextBox que está en un Formulario desde un SubFormulario alojado en él:

Me.Txt01SubForm.Value = Me.Parent.Txt01Form.Value

Para la parte de arriba. Ignoro Si tu IdDiagnostico es Texto o Número

Para Texto

DBúsq("[CIE10]";"Diagnosticos";"IdDiagnostico='" & [Formularios]![SubFormul_Diagnosticos_Pacientes].Formulario![IdDiagnostico] &"'")

Para Número

DBúsq("[CIE10]";"Diagnosticos";"IdDiagnostico=" & [Formularios]![SubFormul_Diagnosticos_Pacientes].Formulario![IdDiagnostico] )

Espero te ayude. Saludos >> Jacinto

Gracias, Jacinto  : - )

He copiado en la parte dedicada a la expresión de la Acción Establecer Valor la primera línea que dices -el CIE10 es un campo de texto- pero Access, al hacer clic o al recibir el foco el control en el que he copiado la correspondiente macro me manda el mensaje:

"El objeto al que hizo referencia en el procedimiento de Visual Basic como Objeto OLE no es un Objeto OLE"  ¿¿??

Rafael: Dos cuestiones.

1.- El valor con el que sondeas no es CIE10, es IdDiagnostico.

CIE10 es valor que Buscas.

2.- Por los literales de tu contestación deduzco que estás trabajando con Macros Insertadas y la verdad es que nunca las he utilizado, pero supongo que se tendrá que poner un = al principio.

Las líneas que te he facilitado, son de VBA, para utilizar por ejemplo para encontrar un valor de un TextBox

Me.Txt01xxx= DBúsq("[CIE10]";"Diagnosticos";"IdDiagnostico=" & [Formularios]![SubFormul_Diagnosticos_Pacientes].Formulario![IdDiagnostico] )

Si IdDiagnostico fuera Número

Lamento no poder ayudarte en Macros, pero si necesitas alguna cosa más relacionado con VBA, encantado. Saludos >> Jacinto

Gracias de nuevo Jacinto   : - )

A la vista de lo que me dices he sustituido la macro por un evento al hacer clic en el cuadro de texto correspondiente -llamado CIE1o, por cierto- por la línea de código:

Me.CIE10 = DLookup("[CIE10]", "Diagnosticos", "IdDiagnostico=" & [Formularios]![SubFormul_Diagnosticos_Pacientes].Formulario![IdDiagnostico])

[Como ves he sustituido el DBúsq por DLookup]

Pero nada... ACCESS me manda el mensaje: "Se ha producido el error '2465' en tiempo de ejecución: Microsoft Access no encuentra el campo '|1' al que hace referencia en la expresión." Te he copiado literalmente lo de que no encuentra el campo '|1' porque me da que es importante...

Rafael: Disculpa pero también hay que traducir el resto de la línea.

Me.CIE10 = DLookup("[CIE10]", "Diagnosticos", "IdDiagnostico=" & [Forms]![SubFormul_Diagnosticos_Pacientes].Form![IdDiagnostico])

Prueba y me comentas. Saludos >> Jacinto

:-)

He escrito:

Private Sub CIE10_Click()
Me.CIE10 = DLookup("[CIE10]", "Diagnosticos", "IdDiagnostico=" & [Forms]![SubFormul_Diagnosticos_Pacientes].Form![IdDiagnostico])
End Sub

Y esta vez el mensaje de Access parece un poco más inteligible:

"Se ha producido el error '2450' en tiempo de ejecución: Microsoft Access no encuentra el formulario 'Subformul_Diagnosticos_Pacientes' al que hace referencia"... Y juro por los dioses  : - )  que sí que existe y con ese preciso nombre!  : -0

A ver, a ver, a ver, a ver...

He definido como Cuadro Combinado el campo CIE10 en lugar de un simple cuadro de texto y me da que va a surtir efecto... [Me ha dado la pista el Me.CIE...]

Confirmo si sí o ha sido una falsa pista...  ; - )

Rafael: Poco a poco llegaremos al final.

Recapitulando un poco y admitiendo que el Subformulario existe, un preliminar simple.

Cuado tu insertas un SubFormulario dentro de un Formulario, en realidad hay dos Objetos.

Uno el SubFormulario y otro el del Control que lo contine.

Normalmente el Nombre del Control siempre coincide con el del SubFormulario, pero a veces no es así.

En vista de diseño del Formulario Principal resalta el Cuadro grande del SubFormulario. Tal como en la figura.

Ahí es donde tiene que coincidir el Nombre. Saludos >> Jacinto

Efectivamente Jacinto, he hecho lo que me decías y mira, creo que podrás observar que el control se llama como el Subformulario -perdón si no contesto en horas, estaré fuera-:

Rafael: Creo que no debe ser algo dificil de solucionar, pero es dificil sin tener el problema delante.

Te sugiero que pongas tu BD aquí en un enlace, mejor con datos no reales y con el historial anterior, vemos que pasa.

Espero tu respuesta. Saludos >> Jacinto

La prepararé y la subiré esta tarde.

Un saludo y muchas gracias.

Siguiendo las indicaciones de Jacinto Trillo subo a una maqueta de la aplicación de la que se habla en esta entrada:

http://www.mediafire.com/download/8udhwwop2dvf75f/Cl%C3%AD 

Algunas precisiones:

1) El rar enlazado consta de dos ficheros: Tablas y Programa. Hay un registro en la 'Tabla Principal' que he llamado 'Ingresos' y algunos más en las tablas auxiliares, aunque lógicamente he eliminado referencias a nombres de pacientes. Están vinculados y correrían en la carpeta C:\Clinicas.

2) El 'problema' se produce al entrar en el formulario de "EntradaDeDatos" y hacer clic en el combo 'Diagnostico' del SubFormulario llamado en la BD 'SubFormul_Diagnosticos_Pacientes' , al hacerlo una línea de código asociada al evento 'Al Hacer Clic', mueve el foco al control del mismo Subformulario, y al producirse esto, ZAS!: "Se ha producido el error '2450' en tiempo de ejecución: Microsoft Access no encuentra el formulario 'SubFormul_Diagnosticos_Pacientes' al que hace referencia", aunque aparentemente -si bien yo ya no aseguro nada... sé que la más mínima diferencia: una mayúscula... un espacio blanco... - el Subformulario existe en la BD y figura en ella -aparentemente, insisto- con idéntico nombre al que figura en el argumento Criterios' de la función DLookup involucrada en el suceso.

3) Como podréis comprobar -el que decida verlo, claro- en el Formulario de Entrada de Datos una línea de código absolutamente simple impide que se introduzca dato alguno en este Formulario si antes no se ha informado el campo 'Paciente' ... código que quisiera trasladar, con las acomodaciones precisas a los controles del Subformulario..., ¿utilizando la Función Parents?... para ello me temo que también necesito ayuda...

4) Y ya lo último: ¿Cómo podría evitar que la tabla auxiliar de 'DiagnosticosPacientes' se llene de registros basura si no hay un Registro Principal [de Ingreso] que finalmente grabe en la BD? ... lo que sin impedimento alguno sucede en la BD que subo...

Gracias de antemano por cualquier ayuda recibida. 

Rafael: Visto. Cuando la mire y tenga algo te comento. Saludos >> Jacinto

Rafael: Ignoro si hay más cosas en la BD, pero de momento sustituye la línea de código por ésta:

Me.CIE10 = DLookup("[CIE10]", "Diagnosticos", "IdDiagnostico=" & Me.IdDiagnostico)

Yo seguiré haciendo alguna prueba más.

Prueba y me comentas. Un saludo >> Jacinto

Genial, gracias Jacinto. El problema principal resuelto     ; - ))))))

Rafael: Estupendo que se haya resuelto el tema.

¿Tienes algo concreto que quieras que mire o ya sigues tu?

Mis saludos >> Jacinto

Por supuesto que es un abuso, pero... ¿echas un vistazo a los puntos 3 y 4 de la intervención en la que relato la subida a Mediafire la BD?

Gracias.

Rafael: En absoluto es un abuso. Contento de ayudarte.

Lo miro con más calma y te contesto. Saludos >> Jacinto

Jacinto, un problemilla. Cuando selecciono un paciente en el formulario principal y me voy al control de diagnóstico del paciente en el Subformulario ACCESS manda el mensaje: "El índice o la clave principal no puede tener un valor Null" ... :' - (

OK Rafael: Miraré todo el proceso.

En lo poco que he observado, no he visto la posibilidad de mostrar, el historial de Ingresos de un Paciente, si es que ha tenido mas de uno.

Quizá lo adecuado sería que la estructura fuera la cabecera que ya tienes en el Formulario EntradaDeDatos y el SubFormulario, sustituirlo por uno Continuo que te mostrara todos los Ingresos de un Paciente.

Ocurre que es solo una sugerencia porque no sé como quieres montarlo o como lo tienes ya montado, pero lo digo por como tienes relacionadas las Tablas que es correcto.

Mis saludos >> Jacinto

Jacinto, dices: "En lo poco que he observado, no he visto la posibilidad de mostrar, el historial de Ingresos de un Paciente, si es que ha tenido mas de uno."  Sí, sí, Jacinto, mira el filtro previo al Formulario de Lectura de Datos, ahí, si se filtra por Paciente, este Formulario te presentaría todos los ingresos de ese paciente.

Rafael: Casi seguro que voy a necesitar hacerte mas de una consulta para que la ayuda que sepa prestarte se adecúe al máximo a tus necesidades.

Para evitar seguir poblando éstas páginas si prefieres facilitarme tu correo lo haces a [email protected]

Mis saludos >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas