Modificar registros de formulario antes de verlos

Ésta es mi primera pregunta aquí. He estado buscando y no encuentro (o no sé reconocer) lo que necesito.
Tengo un formulario con un subformulario donde se visualizan los registros de la tabla "Referencias" (libros, revistas, páginas web, etc). En el subformulario tengo el campo "tipo" que decribe el tipo de la referencia; por ejemplo, tendría el tipo "libro" para la referencia "Don Quijote de la Mancha", el tipo "revista" para "Muy interesante", etc.
La cuestión es que para el tipo "enlace de internet" quisiera que el campo "Referencia" fuera un hipervículo, de tal manera que al hacer click sobre él se abriera el navegador para llevarme a la página cuya dirección está en el campo "Referencia" (es decir: un registro con tipo "internet" y referencia "www.todoexpertos.com"). Y para el resto de tipos, que esto no sucediera.
He pensado en ir cambiando la propiedad hyperlink del campo TextBox de la referencia, mediante un bucle en el Form_Load, dependiendo del tipo de referencia (internet u otros).
Mi pregunta es: ¿Es ésto una tremenda chapuza, o sería la manera de resolver el tema?
¿Se puede abrir el navegador por defecto, o sólo se abriría el IE?

1 respuesta

Respuesta
1
Se me ocurre una solución simple. Agregar un segundo campo Vinculo que se usaría para el link, y en el código de formulario pondría esto:
Private Sub Form_Current()
If Tipo = "enlace" Then
Referencia.Visible = False
Vinculo.Visible = True
Else
Referencia.Visible = True
Vinculo.Visible = False
End If
End Sub
Si en el formulario superponés los campos: Referencia y Vínculo (siempre hay solo uno visible. Obtendrás el resultado que te interesa.
Para agregar el código hacé lo siguiente:
Poner el formulario en modo diseño
luego ver el ´código (hay un botón "código")
Pegar el código que puse.
Supuse que tu campo tipo se llama Tipo, de no ser así cambiá el nombre en el código.
En resumen, tenés dos campos pero usás uno por vez.
Contame cómo te fue y ojo con los detalles.
Abre el navegador que está predeterminado.
Hola, Marciana:
Gracias por tu celeridad en contestar.
Después de unos "problemillas técnicos" he podido probar lo que me sugieres y no da el resultado que quería
Si no entiendo mal, el form_current funciona para cada registro, y yo los registros los tengo en un subformulario donde los veo de golpe: el formulario principal visualiza, uno a uno, los registros de la tabla Temas (arte, ciencia, etc), y para cada Tema tengo el subformulario con las referencias (algunas hipervínculos, otras no). Si pongo el código que me has proporcionado en el form_current, sólo se ejecuta cuando hago click en algún registro del subformulario. Y lo que quiero es que cuando aparezca el subformulario, con sus tres o treinta registros de referencias, ya salgan preparados los campos de hiperenlace, y los que no lo son, pues que sean texto normal.
Uf, no sé si me explico con suficiente claridad. Ojalá puedas ayudarme, estoy atascada con esto.
Un saludo.
Entonces hacé lo siguiente:
Creá una consulta con la tabla en cuestión, agregale un campo calculado:
mostrar: iif([tipo]="enlace",[Vinculo],[Referencia])
Te puede cambiar iif por SiInm según tengas configurado el idioma.
Y luego poné el campo mostrar en el subformulario en vez de referencia.
Comentame, M
No lo debo estar haciendo bien...
En la consulta he creado el nuevo campo calculado "mostrar", pero los campos "Vínculo" y "Referencia" son del formulario, en la tabla sólo tengo el campo "Referencia". ¿Qué no estoy entendiendo?
En la tabla agregá el campo vinculo (mejor sin acento) de tipo enlace.
En la consulta poné la tabla y agregá el campo "mostrar"
Esto simula que tenés un campo pero en realidad tenés 2, cuando lo vas a mostrar te fijás en tipo (con el iif) y mostrás el que corresponde. Esto es una trampita que se usa mucho.
Se te va a presentar un problema en el formulario donde se cargan los datos pero se resuelve con la misma trampita. Se pone un cuadro de texto que registra el dato (el usuario escribe en ese cuadro tanto una referencia como un enlace, pero desde el código (consultando otra vez el campo tipo) se guarda el valor ingresado por el usuario en el campo Referencia o en Vinculo según corresponda. Para el usuario esto es transparente.
Primero agregá el campo en la tabla, luego probá la consulta.
Una vez que compruebes que la consulta funcionó modificá el formulario. En el formulario primero poné los tres campos referencia, vinculo y mostrar para comprobar que funciona una vez que quedes satisfecho dejá solamente mostrar.
Suerte y contame, M
¡Ay!
- He modificado la tabla añadiendo el nuevo campo ReferenciaWeb, y lo he actualizado según el campo tipo de referencia.
- También he modificado la consulta añadiendo el campo Mostrar. Tengo el campo Referencia lleno o vacío, el campo ReferenciaWeb vacío o lleno (y es hipervínculo), y el campo Mostrar que está siempre lleno. He observado que para direcciones web su contenido es del tipo www.google.com#http://www.google.com# (espero que el signo almohadilla se vea...) .
- En alta de registro, tengo una ComboBox en la cual el usuario selecciona el tipo de referencia, y una TextBox para que introduzca la referencia. Por código, según el tipo, guardo la referencia ora en el campo Referencia, ora en el campo ReferenciaWeb.
Hasta aquí todo correcto. Voy añadiendo los nuevos registros en mi subformulario pero...
En el subformulario, que es de tipo "formulario continuo" y me lista todas las referencias existentes para un tema dado, tengo:
- El campo "tipo de referencia" como TextBox no modificable
- El campo Referencia como TextBox modificable, funciona estupendo
- El campo ReferenciaWeb como TextBox con la propiedad "EsHipervínculo" a sí. No sé cómo hacerlo modificable.
- El campo Mostrar como TextBox que no lo tengo marcado como hipervínculo, cuyo contenido coincide con el que obtengo en la consulta. Ya sea la referencia en cuestión hipervínculo o no, el campo Mostrar es como una TextBox de toda la vida. No veo que hipervincule a nada.
Supongo que lo que pasa es que tengo que manipular cada registro antes de visualizarlo en el formulario (que no sé cómo se hace), pero aún así no tengo claro que el campo Mostrar vaya adquiriendo aspecto de "texto normal" o "hipervínculo" según el tipo de cada registro.
Además, y para más inri, cada vez que añado un nuevo registro al subformulario hago un requery. Antes de añadir estos cambios el requery funcionaba y me iba visualizando los nuevos registros que iba creando, además de los ya existentes; ahora aparentemente el requery no hace nada. Si entro en el depurador, el requery no me va al form_load ni al form_current ni a nada del subformulario, con lo cual éste se queda como al inicio.
Buaaa. ¿Qué estoy haciendo mal?
Gracias por tu infinita paciencia.
Calma, calma vamos progresando.
Fíjate que en mi respuesta anterior te había puesto este comentario:
Se te va a presentar un problema en el formulario donde se cargan los
datos pero se resuelve con la misma trampita. Se pone un cuadro de
texto que registra el dato (el usuario escribe en ese cuadro tanto una
referencia como un enlace, pero desde el código (consultando otra vez
el campo tipo) se guarda el valor ingresado por el usuario en el campo
Referencia o en Vinculo según corresponda. Para el usuario esto es
transparente.

Aclaro, en relación con la trampita para la entrada de datos, que el cuadro de texto que se agrega es independiente (no es un campo de la tabla) y en el evento Después de actualizar se asigna el dato ingresado a Referencia o a ReferenciaWeb según lo que haya ingresado en Tipo de referencia. Algo así:
if tipo = "enlace" then
    referenciaWeb=DatoIngresado
else
    referencia=DatoIngresado
end if
Donde Dato ingresado sería el nombre del text box independiente donde el usuario ingresa la referencia o el enlace.
No entiendo bien el problema que se plantea con el subformulario (los subformularios dan trabajo) .
Cuando un cuadro de texto "se retoba" -como decimos en criollo- lo que hay que hacer es eliminarlo del subformulario y volverlo a insertar. Te sugiero eso para el campo Tipo de referencia (y todos los que consideres que funcionan mal.
Voy suponiendo que el formulario donde se te plantea problema es de ingreso de datos, en tal caso no podes usar un campo calculado para ingreso de datos.
Confírmame si voy interpretando bien o aclarame lo que corresponda. Confírmame qué es lo que funciona bien y qué es lo que no. Espero tus comentarios. M
La introducción de datos no plantea ningún problema. Voy a intentar describir mejor el escenario de la situación actual.
En el formulario "Padre" hago el mantenimiento de los temas. En el subformulario "hijo" tengo las referencias de cada tema. Este subformulario hijo sólo contiene el recordsource de las referencias.
En el formulario padre, además de otros datos, tengo los campos para introducir un hijo. Al pulsar el botón "Agregar hijo", inserto el hijo en la tabla de referencias y hago un requery (que misteriosamente para mí ha dejado de funcionar) para que en el subformulario hijo aparezca el nuevo registro.
Es en este subformulario hijo donde:
- Puedo modificar las referencias
- Debería poder ver los campos "normales" como "normales" y los de tipo "enlace web" como "enlace web", ocultando el que sea conveniente, o bien usando directamente ese nuevo campo "mostrar" que ahora mismo veo como "www.google.com#http://www.google.com#" para los campos de tipo hipervínculo.
Por lo que voy viendo, en el Form_Load del hijo, si pregunto por el valor del campo tipo, esta pregunta sólo es válida para el primer registro del recordset. Si es de tipo "enlace web", todos los registros que visualizo en el recordset se tratan como de tipo "enlace web"; análogamente sucede si el primer registro es de tipo "normal".
Y si me voy al Form_Current, veo que sólo surte efecto para el registro sobre el cual he hecho click. Por eso pensé en la conveniencia de hacer un bucle sobre los registros del recordset e ir haciendo la pregunta para cada uno de ellos.
Gracias de nuevo.
Vos decís:
Por lo que voy viendo, en el Form_Load del hijo, si pregunto por el
valor del campo tipo, esta pregunta sólo es válida para el primer
registro del recordset. Si es de tipo "enlace web", todos los
registros que visualizo en el recordset se tratan como de tipo "enlace
web"; análogamente sucede si el primer registro es de tipo "normal".

Esto es correcto, así funciona.
Vos querés que el subformulario muestre todos los registros pero al mismo tiempo poder dar de alta un registro.
Tenemos que tener en cuenta que hay truco para mostrar y truco para agregar y que no son iguales.
¿Al insertar un "hijo" aparece un nuevo formulario o lo hacés sobre el mismo subformulario?
Ahora que se puede agregar imágenes en estos mensajes, por qué no capturás (lo mínimo) el formulario y lo pegás como imagen para que yo lo vea. Tal vez me facilite la comprensión del problema.
Mientras dejame pensar a ver si se me ocurre un truquito para hacer todo al mismo tiempo (mostrar el campo que corresponda en los registros que no tienen el enfoque y permitir actualizar en un registro nuevo. Seguramente también se debería poder modificar un registro cualquiera. No sé si será posible.
El tema de los Requery es enfermante, a veces dejan de funcionar. Yo digo que los formularios se fatigan cuando uno los modifica una y otra vez, a veces hay que comenzar de nuevo copiando y pegando lo que sirve.
Los sistemas cuando se van sofisticando cueestan trabajo, ánimo.
Espero tu respuesta y voy pensando algo. M
Aquí te paso una imagen, a ver si soy capaz de insertarla correctamente. Los colores son para identificar mejor los componentes, ¡No te asustes!
Y la casilla de verificación es un experimento para borrar varios registros de una vez (es otra pregunta que tengo pendiente de resolver).
Un saludo.
c:\imagen1.png
No sé cómo se inserta...c:\imagen1.png
Deberías ver una barra de edición justo sobre la ventana donde escribís tu texto. Hay un botón con un arbolito, usalo.
file:///C:/DOCUME%7E1/MARIAC%7E1/LOCALS%7E1/Temp/moz-screenshot.jpgC:\Documents and Settings\Maria Celia\My Documents\My Pictures\editar.jpg
La capturé y la pegué
La imagen no se visualiza.
Dejemos la imagen (salvo que hagas tu intento y tengas más suerte que yo).
Vamos de a un problema por vez. Contestame esto:
Vos querés que el subformulario muestre todos los registros pero al mismo tiempo poder dar de alta un registro.
Tenemos que tener en cuenta que hay truco para mostrar y truco para agregar y que no son iguales.
¿Al insertar un "hijo" aparece un nuevo formulario o lo hacés sobre el mismo subformulario?
Una solución es que uses otro formulario para dar de alta una referencia (sería como un cuadro de diálogo pequeño) entonces usamos el truco 2 para este y el truco 1 para el otro.
De lo contrario habría que hacer un trucazo que involucre ambos truquitos, ¿ta?
Inserto un hijo desde el mismo subformulario. No quisiera abrir un nuevo formulario para no complicarle al usuario la aplicación (demasiadas ventanas), aunque si es la única solución, pues deberé hacerlo así.
Voy a ver si ahora sale la imagen (formato jpeg):
c:\imagen1.jpg
Dejame ver si se me ocurre el truco mayor.
Sigo investigando y aún no sé cómo resolver el tema. La cuestión de fondo la identifico en cómo recorrer un recordset, y según las propiedades de un campo de un registro en particular, modificar las propiedades de un objeto del formulario sólo para ese campo de ese registro. Si vislumbras alguna solución te lo agradezco, y si no puede ser entonces dejo estar este asunto porque estoy paralizada en esto, y tengo otras cuestiones que ya empiezan a ser importantes. Desde luego he aprendido muchísimo y lo que me has aportado lo he usado en otros formularios, donde tu solución me ha venido de perlas. Espero tus noticias.
La solución simple (y que es usual) es no mezclar en un mismo formulario consulta y alta de registro. Una salida rápida es tener el formulario de consulta que funciona bien con la solución que vimos pero no admite alta. Pero agregando un botón que te permita dar el alta y entonces abrís un formulario que será pequeño para que realice un alta. En este formulario de alta usarás la otra solución.
La solución que involucre a las dos anteriores no me parece imposible pero voy a pensarla, hacerla y probarla.
Ok
Finalmente encontré una solución aceptable. Estuve a punto de tirar la tolla.
Es así:
1) La consulta con el campo ver como te dije antes.
2) En el formulario van los tres campos, Referencia, Vinculo y Ver
3) En el formulario deberás esconder los campos Referencia y Vinculo (deben tener la propiedad visible en Sí) por ejemplo achicarlos y poner encima el campo Ver.
4) Agregarás el código que te pegué debajo
5) El campo Ver debe estar bloqueado para que el usuario no intente ingresar o modificar datos, además ponele el punto de tabulación en No
Funciona así:
Cuando el usuario completa datos de un registro nuevo le pide el valor de Referencia con el evento Después de actualizar del campo Tipo, según sea el valor de Tipo lo guarda en Referencia o en Vinculo.
Ahora bien, como el campo Ver no es un campo OLE no funcionará como enlace, entonces le agregamos el código del evento clic (y todos los que quieras, por ejemplo la tecla Enter) para que accione el clic sobre el campo Vinculo.
Yo lo probé y funciona.
El tema es cómo hace el usuario para modificar algo en el campo Referencia (o Vínculo) acá se presenta un problema (este problema es una ventaja para nuestra solución) es que cuando el usuario opera sobre el campo el sistema no sabe si lo que quiere es accionar el vínculo o cambiar datos. Entonces yo le pondría un Botón ( o un texto, como te guste) que diga "Agregar o modificar Refencia" y en el evento Clic le pediría el dato con la función InputBox() como está hecho en el evento AfterUpdate de Tipo.
Contame qué te parece. Cordialmente, M
Private Sub Tipo_AfterUpdate()
    If Tipo = "enlace" Then
        Vinculo = InputBox("Ingresar Referencia")
        Referencia = ""
        SendKeys "{F9}"
    Else
        Referencia = InputBox("Ingresar Referencia")
        Vinculo = ""
        SendKeys "{F9}"
    End If
End Sub
Private Sub ver_Click()
    Vinculo.SetFocus
    SendKeys "{Enter}"
End Sub
Lo voy a probar. Cuando tenga información te digo algo. Gracias.
OK
Bueno, al final he tenido que separar en dos consultas los campos de tipo "enlace web" y los otros, no había manera (y tampoco me dejaban hacerlo de otra forma...).
Al menos lo que me has explicado me ha servido para usarlo en otros formularios.
Muchas gracias por tu amable interés y disculpa la demora en contestar... "gajes del oficio".
Un saludo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas