Abrir un formulario no editable o editable desde otro formulario

Tengo un formulario principal que contiene 3 subformularios. En cada uno de los 3 subformularios, cada registro informado contiene un botón de comando que al pulsarlo te lleva a otro formulario para que puedas editar los datos de ese registro o bien no permitir la edición.
Para el ejemplo, en el botón de comando tengo puesto el siguiente código:
If vEditar = "SI" Then DoCmd.OpenForm "frmOPER", , , strExpresion, acFormEdit Else DoCmd.OpenForm "frmOPER", , , strExpresion, acFormReadOnly End If
Forms![frmOPER].Modal = True
Forms![frmOPER]!NumRAN.Value = Me!NumRAN
Forms![frmOPER]!VieneDe.Value = "DET"
' se bloquea el campo <NumRAN>para que no se pueda modificar (es clave) Forms![frmOPER]!NumRAN.Locked = True
La variable strExpresion contiene un filtro del registro a mostrar en el formulario.
La variable vEditar indica si el formulario se debe abrir de forma que se pueda editar el registro o no.
El campo <VieneDe> indica que procede del formulario "Detalle" en esta caso "DET" para que en formulario <frmOPER> sepa de donde procede.
Además le envían datos adicionales al formulario (modal, datos para controles, etc.)
Hasta aquí todo correcto (o por lo menos así parece), pero el problema es que al mostrar el registro en el formulario que se indica como <acFormReadOnly> el cual no tiene ningún botón <Guardar>, solo tiene un botón <Imprimir> y otro <Volver> nada más.
No obstante, permite modificar cualquier dato de los controles, a no ser que el control en cuestión esté bloqueado (como hay alguno), y al pulsar el botón <Volver> para volver al formulario anterior, el registro queda actualizado.
El código que tengo puesto en el botón <Volver> del <frmOPER> es el siguiente:
If VieneDe = "DET" Then DoCmd.SetWarnings False If CurrentProject.AllForms("frmDetExp").IsLoaded Then Forms![frmDetExp].Refresh Forms![frmDetExp].NumExp.Value = vExpe Forms![frmDetExp].NumExp.SetFocus Forms![].NumExp.Locked = True DoCmd.Close acForm, Me.Name End If DoCmd.SetWarnings True Exit Sub End If
Alguien me puede decir que es lo que estoy haciendo mal, ¿para qué me modifique los datos y actualice el formulario inicial?.
Quedo a la espera de alguna respuesta, si es posible.

1 respuesta

Respuesta
1

Ciertamente, es un tema que ya salió hace poco.

Yo prefiero deshabilitar controles, pero en formularios con muchos controles se vuelve muy pesado hacerlo.

Si es un subform siempre se puede poner el subform como enabled=false, que es una sola sentencia y funciona.

El problema que comentas viene dado en parte por tener los forms vinculados a datos, entonces es Access quien lo controla.

Se puede hacer de otra forma, pero ya te digo que es quitando el origen del formulario y haciendo que los datos los controles tú.

Puedo pasarte algo de código para que veas como es y te lo puedas desarrollar tú adaptándolo.

Muchas gracias por la respuesta.

No había indicado que la versión de Access que utilizo es la 2007.

La verdad es que lo único que quiero es que cuando llamo al formulario a abrir (este no es un subform), lo abra como yo indico, es decir si solo es de lectura que no permita modificar nada. Efectivamente el formulario que abro está vinculado a datos y sirve para hacer otras entradas de datos y no entiendo el porqué Access controla lo que él quiera, debería respetar lo que se le dice, un poco de autonomía al usuario no estaría mal.

Si no te es molestia, envíame el código a que haces referencia y le daré un vistazo a ver si lo puedo adaptar.

Un Saludo

De lo que se trata es de hacer lo siguiente (hazlo con una copia por si acaso):

- Ningún control del formulario tiene que tener vinculación a datos

- El formulario tampoco

- Toda vinculación de datos tienes que programarla tú, a la entrada, al guardar y al cerrar

Ahora el código:

- Al abrir el formulario (para mostrar un solo registro), en el evento form_open tienes que crear un recordset y pasarle el contenido de un select a partir de un parámetro de entrada del formulario. Normalmente suelo usar, cuando el parámetro es cero o nulo, para hacer un nuevo registro, cuando el parámetro tiene valor, éste es la clave principal de la tabla, y por tanto baso el select en ese dato:

Dim Registro as recordset
Set Registro = Currentdb.OpenRecordset("SELECT * FROM Tabla WHERE Clave = " & Me.OpenArgs)

Una vez se ha cargado el registro en memoria hay que recorrer cada uno de los campos del formulario y asignarlo:

CampoFormulario = Registro.Fields("NombreCampo")

Con esto ya tendrías el registro en el formulario.

Lo normal es tener un botón de cerrar sin guardar y uno de guardar y cerrar, y una variable o un campo de formulario que te indique si tienes que guardar o pedir conformidad o no.

Me explicaré:

Imagina que haces todo lo anterior y después el usuario te modifica uno de los campos del form. Cuando vas a cerrar tienes que saber si se ha modificado algo o no. A veces lo que hago yo es añadir un campo de texto, visible o no, que después de cada Después de actualizar de cada campo escriba un * en ese campo. Esto indica que se ha modificado el registro y tiene que guardarse.

De ese modo, en el evento al cerrar del formulario, si el campo es * el programa pregunta si hay que guardar o descartar cambios.

Igualmente si pulsas en el botón guardar, después de realizar la operación de almacenamiento, pones el campo en blanco.

¿Cómo guardar?. Hay dos casos:

- si Me.OpenArgs=0 or Isnull(Me.OpenArgs) entonces hay que crear un registro

sqlGuardar = "INSERT INTO Tabla(Campo1, Campo2, ...., Campo) VALUES(" & valor1 & ", " & valor2 & ", .... " & valorN ")"

- si Me.OpenArgs>0 entonces hay que modificar un registro

sqlGuardar = "UPDATE Tabla SET Campo1 = " & valor1 & ", Campo2 = " & valor2 & ", ... campoN = " & valorN & " WHERE ClavePrimaria = " & me.openargs

Ten en cuenta que si los campos son de cadena o dobles hay que rodearlos por comillas simples, si son de fecha por almohadillas y formatear como fecha norteamericana.

Más o menos y por encima. No digo que sea fácil ni rápido hacerlo y entenderlo, y además te da más trabajo a la hora de programar, pero también te da más libertad.

Lo que no acabo de ver claro es porque al abrir en modo ReadOnly no responde bien. Es otro de los fallos de Access.

Ya me dirás algo.

Hay mucho trabajo por hacer, y debería cambiar el sistema de acceso, ya que todos mis formularios están vinculados a datos. No obstante en cuanto finalice la primera fase de la BD me pondré en ello.

Muchas gracias por tu respuesta.

Un saludo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas