Error '2118' Conflicto de escritura al actualizar un subformulario.

Mi problema es debido a un conflicto de escritura bastante extraño, ya que me ocurre la mayoría de las veces pero no siempre.

Tengo un formulario de PRESUPUESTOS en el que se ingresa el CLIENTE a quien va dirigido el presupuesto y dentro de ese mismo formulario se encuentra otro SUBFORMULARIO en el cual ingresamos los conceptos o los artículos.

Aclarar que todas las modificaciones del subformario funcionan a través de botones y toda

La edición directa esta deshabilitada para que no hayan conflictos entre las tablas relacionadas.

En el subformulario de conceptos, haciendo doble click en un concepto abrimos otro formulario para poder modificar dicho concepto.

Todo funciona correctamente, creo los presupuestos sin ningún tipo de error, pero el problema deriva a la hora de modificar un artículo.

Al llegar al REQUERY me salta el conflicto de escritura, por que no he guardado el registro, he probado el requery y el DoCmd. RunCommand acCmdSaveRecord después de actualizar, al cerrar el formulario, en varias zonas pero el resultado siempre es el mismo.

OS ADJUNTO LAS FOTOS PARA QUE OS HAGAIS UNA IDEA DE COMO FUNCIONA y aquí pongo el código que utilizo cuando pulso ACEPTAR en el formulario que modifica el concepto (2 IMAGEN), haber si podeis saber como y por qué ocurre este problema y poder solucionarlo.

Dim instruccion As String
Me.c_presupuesto = Forms("Presupuestos").Controls("c_id")
Me.c_cliente = Forms("Presupuestos").Controls("c_id_cliente")
'ESTE CONDICIONAL LO UTILIZO PARA SABER SI ES UN NUEVO PRESUPUESTO Y EN CASO
'DE QUE ASÍ SEA GUARDE EL PRESUPUESTO COMPLETO PARA QUE PUEDA INSERTAR EL 
'PRIMER CONCEPTO Y LO REABRA CON EL CONCEPTO CARGADO.
If envia_string = "Nuevo_presupuesto" Then
    modifica_numero2 (Forms("Presupuestos").Controls("c_id").Value)
    DoCmd.Close acForm, "Presupuestos"  
    modifica_string ("")
    DoCmd.Close acForm, "Cantidad_formulario"
    Call abrir_productos("Presupuestos", envia_numero2)
Else
'SI NO ES NUEVO NO HACE FALTA HACERLO YA QUE RECOGE Y ACTUALIZA BIEN
'LOS CONCEPTOS QUE VOY INGRESANDO.
    'PRUEBAS
    'Forms![presupuestos]![Cantidad].SetFocus
    'DoCmd. RunCommand acCmdSaveRecord
    DoCmd.Close acForm, "Cantidad_formulario"
    modifica_string ("")
   'aquí me genera el error.
   'pretendo actualizar el subformulario de los conceptos.
   'en ocasiones no salta el error y actualiza bien, es lo extraño.
    Forms![presupuestos]![Cantidad].Requery
    'otra prueba.
    'CommitTrans
End If

Intento evitar el on error, pero en caso de tener que utilizarlo, me gustaria que igualmente el requery funcionase.

2

2 respuestas

Respuesta
2

¿Probaste a hacer el requery a todo el formulario y no solo a un control del formulario? Es decir:

Forms! Presupuestos. Requery, en vez de Forms! Presupuestos! Cantidad. Requery

O igual el problema está en alguno de los procedimientos que llamas (modifica_string, modifica_numero2...)

Esos procedicimientos que nombras son solo dos variables que uso como públicas pero que en vez de estar como públicas las llamo a través de procedimiento, nunca declaro variables públicas.

Dichas variables son la id del registro concreto con el que trabajo.

He probado a hacer el Requery a todo el formulario, pero en esa ocasión me salta un error de que los datos han sido modificados.. y también en el Requery el error.

A ver si lo pillé correctamente:

1º/ Tienes un formulario "bloqueado" para editar (el de la imagen 1), llamado "presupuestos" con un subformulario (¿llamado...?)

2º/ Cuando en el subformulario haces doble click, abres un formulario para editarlo (llamado ¿cantidad_formulario?), el de la imagen 2. En él tienes el botón Aceptar, con el código que transcribes (¿el código está completo o es solo una parte?).

3º/ El error lo tienes solo al modificar conceptos.

4º/ Cuando das de alta un nuevo concepto, ¿usas ese mismo formulario (el de la imagen 2)?

Mientras respondes a esas dudas, prueba:

Me.c_presupuesto = Forms("Presupuestos").Controls("c_id")
Me.c_cliente = Forms("Presupuestos").Controls("c_id_cliente")
DoCmd.RunCommand acCmdSaveRecord
'ESTE CONDICIONAL LO UTILIZO PARA SABER SI ES UN NUEVO PRESUPUESTO Y EN CASO
'DE QUE ASÍ SEA GUARDE EL PRESUPUESTO COMPLETO PARA QUE PUEDA INSERTAR EL 
'PRIMER CONCEPTO Y LO REABRA CON EL CONCEPTO CARGADO.
If envia_string = "Nuevo_presupuesto" Then
    modifica_numero2 (Forms("Presupuestos").Controls("c_id").Value)
    DoCmd.Close acForm, "Presupuestos"  
    modifica_string ("")
    DoCmd.Close acForm, "Cantidad_formulario"
    Call abrir_productos("Presupuestos", envia_numero2)
Else
'SI NO ES NUEVO NO HACE FALTA HACERLO YA QUE RECOGE Y ACTUALIZA BIEN
'LOS CONCEPTOS QUE VOY INGRESANDO.
    modifica_string ("")
    Forms![presupuestos].Requery
    DoCmd.Close acForm, "Cantidad_formulario"
End If

Y siempre tienes la opción que haces en el primer If, cerrar el formulario presupuestos y volver a abrirlo en el registro adecuado.

El Subformulario es al que le hago el Requery, el llamado "Cantidad".


Al pulsar en crear un "Nuevo Presupuesto" se genera en la variable que envia envia_string.  Que es una variable global para saber que formulario nuevo se abre.
En el caso de "Presupuestos". Sólo sigue con ese valor hasta que aceptes el presupuesto o añadas el primer concepto.
Tal como tengo el código al añadir el segundo concepto, como ya habrá guardado anteriormente los datos vinculados en sendas tablas, no hace falta abrir y cerrar para continuar añadiendo más productos, con lo cual al añadir más, se actualiza al momento la tabla con el Requery y sin ningún tipo de fallo.

Es justo como lo quiero, para editar un concepto es un proceso parecido, sólo que seleccionas el concepto a modificar pulsando doble click sobre él.
Se abre el formulario: "Cantidad_formulario" y de ahí edito. La respuesta a tu pregunta es que si. Es el mismo formulario para todo.
Al pulsar aceptar utilizo el código mencionado anteriormente.

Perdón, me falto comentar que si, el error es sólo al modificar el concepto, con todo lo demás bien.

Lo de hacerle el Requery a Presupuestos me salta un error que me dice que el formulario ha sido modificado, sin más. pero el caso es el mismo, sigo sin poder actualizar.

Lo curioso es que no ocurre siempre. a veces actualiza el registro bien sin fallos, pero son ciertos registros.

Para hacerle un requery al subformulario, tendrías que usar esta sintaxis:

Forms.[presupuestos].[Cantidad].Form. Requery

No acabo de ver nada que explique ese error, y si como tu dices pasa solo en ocasiones, es más difícil... El mensaje de "conflicto de escritura" es habitual cuando abres dos formularios sobre la misma tabla y modificas en ambos el mismo registro (o al acceder y modificar el mismo registro en un entorno multi-usuario, que no parece el caso). Por lo que cuentas, en "Presupuestos" no modificas nada, por lo que cualquier cambio que hagas en "Cantidad" no tendría que afectar, y te tendría que dejar hacer el requery sin problemas.

Sin ver tu archivo para poder probar cosas, solo se me ocurre que pruebes a usar una SQL para actualizar los datos.

Gracias por el interés, intentaré buscar una solución chapucerilla por el momento, como reabrir el formulario, aunque lo suyo sería al menos hacer que el mensaje de conflicto no saliese, y seleccionase una opción desde código, que no sé si se puede hacer con ese mensaje.

Si me pasas una copia de tu BD, solo con las tablas y formularios implicados, y sin datos confidenciales, le echo un vistazo a ver que se puede hacer.

Perdón por no contestar antes, estaba trabajando, os explico.

Lo que ocurre es justo lo que dice Jacinto Trillo, el problema viene al tener el subformulario abierto y hacer los cambios, aunque no debería por que así lo hago en todos los demás formularios, ya que tengo subformularios de clientes, productos, proveedores y varios más  en un formulario principal que es la interfaz de la aplicación, dichos subformularios listan los clientes, productos, o proveedores añadidos.

De un modo similar, se añaden nuevos con su botón, se modifican de la misma manera, pulsando doble click sobre el registro, abriendo su formulario y nunca me ha dado ningún conflicto de escritura.

Sólo en este caso me ocurre esto, he estado pensando en la manera de solucionarlo "Por el momento".

Mi intención es añadir cuando pulse doble click, el valor "Nuevo presupuesto" a "envia_string",  al mismo tiempo que me abre el formulario para modificar, para que lo reinicie sólo cuando voy a modificarlo.
Con eso deberá de solucionarse por el momento, aunque no me parece una manera muy adecuada, estar abriendo y cerrando formularios.

De verdad muy agradecido por vuestro interés y por la ayuda.

El que tengas abierto el formulario principal con el subformulario y el otro formulario no tiene por qué causarte conflicto de escritura (según comentas, solo te pasa con ese formulario en concreto y no siempre).

El conflicto de escritura solo te saltará si modificas en ambos formularios el mismo registro al mismo tiempo, entendiendo al mismo tiempo que hagas modificaciones en uno (por ejemplo en el subformulario) y que sin que se guarden los cambios abras el otro formulario en ese registro y lo modifiques. Y según se desprende de tus comentarios, no es el caso.

Como por probar no pierdes nada, en el evento del doble click fuerza un guardado del registro antes de abrir el formulario "Cantidad_formulario"

Como por probar no pierdes nada, en el evento del doble click fuerza un guardado del registro antes de abrir el formulario "Cantidad_formulario"

Es una buena idea, pero me da el error de: la acción de guardar registro no está disponible ahora.

Comprueba que por código o macros no modifiques nada en el subformulario, a ver si suena la flauta.

Sin ver el archivo, ya no sé qué más decirte...

Eso lo comprobé lo primero de todo, lo cierto es que es un error bastante extraño, no debería de darlo , por que simplemente abro un formulario dando doble click, no hago ninguna otra acción.

Tampoco dando un primer click, que en ese caso solo copia la "id" del registro para saber que concepto eliminará al pulsar dicho boton.

Y por último comprobé que en el "evento exit" del subformulario hubiera algo, pero no, solo hay un Requery sin más.

Aun así, por el momento he llevado a cabo lo que comenté anteriormente.
En el IF del código que os mostre, le he dado un segundo condicional para que me cierre y me reabra solo el formulario cuando edito un concepto.
Lo he dejado así.

If envia_string = "Nuevo_presupuesto" Or envia_string = "Modificando" Then

Al mismo tiempo que abro el formulario para editarlo, cambia el valor a "Modificando" y la verdad, que no va tan mal, ya que sólo me reabre al modificar, no creo que el cliente tampoco ande modificando siempre. Y por el momento, hasta que pueda ver a que viene debido ese error, puedo avanzar en otro apartado, por que este me lleva loco.

De veras, un placer y muchísimas gracias por vuestra ayuda-

Un placer ayudar, aunque me sabe mal no haber encontrado el origen del problema...

Un saludo y no dejes de visitar nuestro sitio (foro de momento) de Access en el link de abajo


Respuesta
1

Sergio: El tema es bonito de resolver y creo que no fácil. Seguro que Sveinbjorn encontrará la solución.

Pero independientementede esd, mi sugerencia sería la de simplificar el proceso y controlarlo desde el propio SubFormulario, de modo que donde vemos un TexrBox de Producto, eso sea un Combo y desde él, hacer las incorporaciones y las "Modificaciones", sin otros agentes externos, como es ese Formulario auxiliar.

Con riesgo de equivocarme, actualizas una tabla sin el permiso del SubFormulario y éste al querer actualizar te dice>> Sergio busca el culpable porque yo no he modificado esa Tabla, por lo tanto dime que hago >> Lo guardo directamente, Lo copio al portapapeles por si lo necesitas, o simplemente desprecio el Cambio. Más o menos creo que es así.

Mis saludos a los dos Sveinbjorn y Sergio >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas