Duplicación de tablas

Tengo una tabla llamada equipos. Y bien a partir de esta tengo dos formularios que tienen esta tabla: "InsertarEquipos", y "Listado de equipos". Dentro de el formulario Listado de Equipos hay un botón (nuevo) que lleva al formulario de insertar equipos. Y dentro de insertar equipos hay un botón "Volver ha Listado de equipos".
Pues cuando le doy clic al botón Nuevo de el formulario Listado de Equipos me envía el mensaje siguiente:
- La tabla equipos ya esta abierta en modo exclusivo o ya esta abierta mediante la interfaz de usuario y no se puede manipular mediante código.
Pero si estoy dentro de el formulario "InsertarEquipos" y clico al botón de "Volver ha listado de equipos", me llega sin problemas. Siempre y cuando el formulario "InsertarEquipos" siga abierto, sino me da error.
¿Hay alguna solución posible sin necesidad borrar alguno de los formularios? Es que si fuese así, tendría un problema, porque podría crear un botón de agregar nuevo registro a la tabla equipos, pero dentro de estos formularios, están los subformularios de las tablas MACROLAN y VPN-IP y me supondría el tener que crear 3 botones para cada tabla, porque no se puede crear (por lo menos es lo que creo) un botón que active los registros de 3 tablas a la vez para insertar nuevos registros de todas estas.
Y yo lo que hice fue crear formularios separados.
Los de listado que simplemente mostrasen la información que tienen las tablas.
Y los de insertar que los hice semejantes pero con las propiedades distintas como ahora el derecho a la entrada de datos.
Espero tu respuesta... ;).
RE: Subformulario 14/12/2007
14/12/2007
Usuario Para solucionar el ultimo punto he puesto este código que he deducido y modificando un poco los preedefinidos para ver si lo solucionaba cerrando el formulario "Listado de Equipos" (AEquipos) y una vez cerrado abriendo el "InsertarEquipo pero me sigue dando el mismo error:
Codigo insertado:
Private Sub Comando8_Click()
On Error GoTo Err_Comando8_Click
DoCmd.Close
Dim stDocName As String
Dim stLinkCriteria As String
stDocName = "AInsertarEquipos"
DoCmd.OpenForm stDocName, , , stLinkCriteria
Exit_Comando8_Click:
Exit Sub
Err_Comando8_Click:
MsgBox Err.Description
Resume Exit_Comando8_Click
On Error GoTo Err_Comando8_Click
End Sub
He pensado que quizás en el código, antes de volver a abrir el archivo, después de salir debería de actualizar, para borrar todo lo que queda en memoria cargado, y así ver que no existe ninguna tabla abierta en ese momento y ejecutar la mía.
Si ves muchos errores dímelo.

1 Respuesta

Respuesta
1
Entre los datos que me das no veo ningún problema. El Close no es necesario.
Ahora te digo mi opinión.
Cuando tenés una tabla relacionada con otras los que se hace comúnmente es un formulario para actualizar (ABM) los datos de esa tabla. Para cada uno de los campos que son clave foránea se pone un botón junto al campo que abre el formulario ABM correspondiente a ese campo. El formulario primero queda abierto y desde el segundo formulario se actualiza el campo del primer formulario (del que partió la llamada).
Otra cosa para chequear. Los subformularios corresponden a tablas que están en el lado muchos de la relación uno a muchos. A lo mejor no tuviste en cuenta esta regla.
Pero, una de las cosas que suceden con Access es que a veces se arma un embrollo interno. Me ha sucedido hace poco y no te imaginás lo difícil que fue, estaba entregando un sistema y sin que sepa qué paso todo comenzó a dar errores. Tuve que exportar la base. En esa oportunidad leí muchos artículos de Microsoft y en uno de ellos encontré que por una digitación incorrecta (es tan fácil) pueden quedar caracteres no válidos en el código que no son visibles.
Sin ir tan lejos. Muchas veces un formulario se empaca aunque hayas hecho antes varios formularios del mismo tipo. Hay que hacerlo de nuevo.
No recuerdo si te pregunté con qué versión estás trabajando.
Si los formularios los creaste con el asistente nunca te debería decir que no puede abrir uno porque la tabla está bloqueada. Cuando te suceda algo así hay que probar Compactar la base (Desde la ventana de la base de datos Herramientas/Utilidades.../Compactar y reparar
Con los datos que has proporcionado no puedo decirte más.
Marciana
Ambas las he creado en vista diseño, no he usado el asistente, entonces la única solución posible compactar y sino es volver a crear la tabla :¿S?.
¿Y no hay manera de bloquear la tabla cuando pulse el botón?
¿Por qué me da ese error al estar la misma tabla en dos formularios? No lo entiendo...
Shiro!
Compactar y reparar es algo que hay que hacer con frecuencia, una vez por semana, por ejemplo. En los sistemas que entrego pongo un botón y registro la fecha cada vez que lo usan, si pasa más de una semana le pongo un molesto cartelito para que lo usen.
Además no hay que hacer más nada, ejecutar y esperar a que termine, normalmente segundos.
Encontré una solución para el tema bloqueo:
Private Sub Descripción_Enter()
If Parent.RecordsetType = 0 Then
Descripción.Locked = False
Else
Descripción.Locked = True
End If
End Sub
Esto campo por campo del subformulario.
Te cuento las pruebas que hice.
1) Bloquear el subformulario desde el mismo código del formulario. Dice que la operación no está permitida.
2) Probar algún evento del subformulario que se active al intentar modificar, pero ninguno de los que probé se activó como evento. En realidad creo que esta es la mejor solución voy a seguir intentando solo por sacarme la duda.
3) La que te envié funciona muy bien pero hay que ponerla a cada uno de los campos del subformulario.
Suerte y contame, Marciana
Olvidé algo.
Hacé la siguiente prueba: Creá ambas tablas con el asistente y agregale el botón a ver si funciona (esto te lleva minutos). Si funciona quiere decir que algo (una propiedad o código) es lo que está produciendo el error.
Una de las cosas que suelo hacer en casos como este es ir agregando cosa por cosa y probando.
Entonces:
1)Compactar y reparar seguido
2) Probar con nuevas tablas
3) Probá la solución de bloqueo.
M
Finalmente encontré la forma para bloquear formulario y subformulario.
Formulario principal: Países
Subformulario: PaisesMuseosSubformulario
Botón en form principal: CmbBloquear
Private Sub CmbBloquear_Click()
Dim Recordnum As Long
Recordnum = Me.CurrentRecord
If Me.RecordsetType = 2 Then
Me.RecordsetType = 0
Forms!Paises!PaisesMuseosSubformulario.Form.RecordsetType = 0
CmbBloquear.Caption = "Bloquear"
Else
Me.RecordsetType = 2
Forms!Paises!PaisesMuseosSubformulario.Form.RecordsetType = 2
CmbBloquear.Caption = "Desbloquear"
End If
DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, Recordnum
End Sub
Contame si funcionó (yo lo probé y anduvo bien)
El lunes te informaré de todo lo que me has puesto. Que la BDD la tengo en el trabajo, y hasta que no entre mañana, no podré probarlo. Gracias por todo.
¿Sabes qué? Creo que incluso tu estas aprendiendo a base de mis preguntas je je, he elegido una buena experta ;).
En el tema bloqueo:
No he conseguido hacerlo.
Private Sub Descripción_Enter()
If Parent.RecordsetType = 0 Then
Descripción.Locked = False
Else
Descripción.Locked = True
End If
End Sub
¿En el campo descripción he de poner el nombre del campo no?
He creado nuevas tablas en vista de diseño y sigue dando el mismo error, compactando y reparando unicamente me ha comprimido la BDD.
Sobre el tema del botón bloquear/desbloquear. Cuando le doy al botón me dice que no se puede encontrar SubformularioMACRO. ¿Puede ser que aun conserve el nombre con el que lo inserte al formulario y no sea el nombre que tiene ahora asignado?
Espero tu respuesta
Se me olvidaba!
En el tema bloqueo de los campos me dice que "la expresión que introdujo hace una referencia no valida a la propiedad parent".
Bloqueo:
Fíjate que en fecha 15 te puse dos mensajes seguidos. La solución de bloqueo que está en segundo lugar es la que prefiero porque se hace toda desde el formulario principal.
Tenés que tener cuidado porque la referencia al subformulario tiene varios tramos y no puede fallar ninguno. Justamente es la primera de bloqueode las soluciones que te mandé (la vuelvo a copiar debajo) pero estaba mal (en aquella primera) la referencia.
Fijate que hay un Forms y un Form
Private Sub CmbBloquear_Click()
Dim Recordnum As Long
Recordnum = Me.CurrentRecord
If Me.RecordsetType = 2 Then
Me.RecordsetType = 0
Forms!Paises!PaisesMuseosSubformulario.Form.RecordsetType = 0
CmbBloquear.Caption = "Bloquear"
Else
Me.RecordsetType = 2
Forms!Paises!PaisesMuseosSubformulario.Form.RecordsetType = 2
CmbBloquear.Caption = "Desbloquear"
End If
DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, Recordnum
End Sub
En mi caso Países es el formulario principal
PaisesMuseosSubformulario es el nombre del subformulario
La otra solución, también sirve pero hay que aplicarla campo por campo en el subformulario y hay que reemplazar Descripción por el nombre de cada campo.
Espero tus comentarios. M
Continua dándome el error, que el "subformularioMACRO" no lo encuentra.
¿Hay qué determinarle de alguna manera que es un subformulario?
Ah, también estoy intentando que al abrir la página, por defecto salga bloqueada, pero no lo consigo, no se realizar el código que lo hace, ¿me lo podrías facilitar? Es que por más que he probado, no me ha salido ninguna vez.
Espero tu respuesta.
Shiro
Tema Bloqueo:
Para ver bien el nombre del subformulario usá el generador de expresiones:
1) Abrí el formulario principal (el que tiene el subformulario)
2) Pasá a modo diseño
3) Abrí la ventana de código, fíjate que en la línea de nombre (arriba de todo) aparece algo así como
"Microsoft Visual Basic - Nombre de la base [Form_Paises(código)]"
Lo que aparece en lugar de "Paises" es el nombre del formulario
4) Ahora volvé al formulario en modo diseño, hacé clic en cualquier campo del formulario principal
5) Abrí la ventana Propiedades, elegí la pestaña Eventos
En cualquier evento hacé clic en los tres puntos que aparecen a la derecha
6) Abre una ventanita con 3 opciones, elegí "Generador de expresiones"
7) En la ventana del Generador sobre la izquierda, abajo elegí Formularios/Formularios Cargados
8) Elegí en la lista el formulario principal
Te va a quedar abierto la lista de subformularios allí está el nombre.
Cuando resuelvas esto te contesto cómo se hace para que aparezca bloqueada por defecto.
Suerte y contame, M
Lo he probado y he puesto el nombre que me aparecía en el generador de expresiones, y me daba el mismo resultado, el caso es que busca el subformulario como si fuese solo un campo, y claro, evidentemente el campo con el nombre del subformulario no existe, tan solo existe un subformulario con otros campos.
El mensaje de error que me da es el siguiente:
Microsoft Office Access no puede encontrar el campo 'SubformularioMACRO' al que se hace referencia en su expresión.
Ya no se que hacer, y si a ti te ha salido, no entiendo porque a mi no me sale.
¿Tienes alguna idea porque pueda ocurrir?
He conseguido hacer que el error desaparezca, pero aun así, los subformularios siguen siendo siempre editables, es decir, que aunque este bloqueado, los campos de los subformularios los puedo modificar en cualquier momento.
El código que he insertado es este.
Private Sub Comando4_Click()
Dim Recordnum As Long
Recordnum = Me.CurrentRecord
If Me.RecordsetType = 2 Then
Me.RecordsetType = 0
Forms![AEquipops]![Subformulario MACRO].Form.RecordsetType = 0
Forms![AEquipops]![Subformulario VPN].Form.RecordsetType = 0
Comando4.Caption = "Bloquear"
Else
Me.RecordsetType = 2
Forms![AEquipops]![Subformulario MACRO].Form.RecordsetType = 2
Forms![AEquipops]![Subformulario MACRO].Form.RecordsetType = 2
Comando4.Caption = "Desbloquear"
End If
DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, Recordnum
End Sub
Dime a ver que ves mal o que me falta. Creo que es una mejoría que el error haya desaparecido.
Miento, el 'Subformulario MACRO' se bloquea y desbloquea perfectamente a la orden del botón, pero el 'Subformulario VPN' se modifica en todo momento, como te comente antes...
Si pongo los dos subformularios en la misma fila, no es capaz de encontrar el segundo insertado, de esta manera no se si es que lo encuentra o le es indiferente, como si esa condición no existiese.
Shiro.
Fíjate el código que me mandaste, en el grupo de instrucciones del else pusiste dos veces el formulario Macro.
Te aviso que estoy de viaje y miro esporádicamente el correo.
Ya solo me queda saber como puedo abrir el formulario y habré acabado todas mis dudas sobra la base de datos, y la podre acabar al fin! uff que alivio je je.
Es lo más fácil. Abrí el formulario en modo diseño y en Propiedades/Datos poné Bloqueado en Sí.
Te lo estoy diciendo de memoria.
Hacé lo mismo con el (o los) subformulario.
Por las dudas, para seleccionar el subformulario fíjate en el cuadradito que queda en el ángulo entre las reglas vertical y horizontal. De otro modo sería el vértice superior izquierdo del subformulario. Cuando está seleccionado se le ve un cuadradito.
Suerte. M
Funcionaba perfecto, hasta que le puse bloqueado por defecto, ahora cuando intenta bloquear o desbloquear me dice:
- El motor de base de datos no pudo bloquear la tabla 'Equipos'porque actualmente la esta utilizando otro usuario o proceso.
Ahora no se solucionar el problema.
Ya lo he solucionado. Haciendo esto en el formulario principal:
Private Sub Form_Load()
Dim Recordnum As Long
Recordnum = Me.CurrentRecord
Me.RecordsetType = 2
Forms![AEquipops]![Subformulario MACRO].Form.RecordsetType = 2
Forms![AEquipops]![Subformulario VPN].Form.RecordsetType = 2
End Sub
Gracias por ayudarme tanto en la base de datos, encantado de haber tenido soporte de una profesional como usted.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas