Orden de eventos den access

Lo primero darte las gracias por tu tiempo.
Me considero un usuario de nivel medio de access, pero en cuanto me tengo que salir de lo que es access propiamente y tengo que tocar un poquito de V.Basic o incluso en este caso SQL ya me pierdo pues no sé de programación y de ahí te pido tu ayuda. Se trata de lo siguiente:
Tengo un formulario en el cual cuando se agrega un nuevo registro, se ejecuta un evento que mediante una sentencia SQL agrega un nuevo registro en una segunda tabla que está relacionada con esta primera. He dicho que agrega un nuevo registro, pero en realidad según los datos que se introducen en la primera tabla se agregarán entre dos y ocho nuevos registros en la tabla relacionada. Hasta ahí todo bien.
El problema viene cuando se necesita modificar algún dato de algún registro introducido previamente. Estuve barajando la opción de hacerlo mediante una sentencia UPDATE de SQL pero lo veo muy complejo puesto que pueden ser muchos campos de hasta 8 registros distintos los que haya que cambiar en función de la modificación en el registro principal. Por tanto creo que lo más cómodo era establecer que cuando hubiera una modificación de un campo de un registro del formulario principal directamente se borraran todos los registros con él relacionados en la tabla secundaria y se volvieran a crear nuevos registros con los nuevos datos. No sé si la idea tiene sentido pero me parecía lo más fácil. La cuestión es que cuando lo he intentado, y no sé si porque no he puesto correctamente en orden las órdenes en los eventos correctos, no me ha resultado. Lo que probé en primer lugar es que los registros se borrarn en el evento "después de actualizar" del formulario y se crearan los nuevos al salir del mismo, pero mi sorpresa fue que ese evento después de actualizar no se ejecuta sólo cuando se está modificando un registro previamente introducido, sino que cuando se está introduciendo de primeras también se ejecuta de modo que intenta borrar un registro que no existe y me empiezan a aparecer los errores.
No sé si me he sabido explicar a pesar del tocho que he escrito pero en resumen creo que se trata de saber establecer el orden correcto en los eventos para primero borrar el registro relacionado al que se está cambiando y crear los nuevos
Muchas gracias por cualquier sugerencia

1 respuesta

Respuesta
1
¿Por que no pones un botón que ejecute la sql? Sería Delete... from .... where NombreCampo='" & form!NombreCuadroTexto.value & "'
Me cuentas.
Lo cierto es que no había pensado en esa opción y sería lo más fácil, pero es que preferiría que sea algo automático. Esta base de datos la va a usar bastante gente y estoy seguro que de hacerse así en muchas ocasiones que alguien modifique un registro no ejecutará ese botón y al final se acabarán grabando dos registros en la tabla relacionada.
No entiendo, si quieres borrar unos registros lo tendrás que hacer de forma premediatada, no automáticamente. Entiendo que si quieres borrar es porque te has equivocado... ¿o no me enteré bien del tema?
Perdona, creo que no fui muy claro en la primera exposición.
El usuario registrará datos en un formulario que tira de la tabla principal llamémosla A. Al incluir un nuevo registro, automáticamente y sin que él tenga conocimiento se crearán varios registros en la tabla relacionada B mediante SQL.
Lo que quiero es que si tiene que modificar a través del formulario algún registro de la tabla A, también se modifiquen en la tabla B que él ni sabe que existe. Pero decía antes, que puesto que puede haber hasta 8 registros distintos dependiente de uno de la tabla A, ejecutar una sentencia SQL de modificación se me hace muy complicado y pensaba que sería más fácil que en el caso de tener que modificar algún dato de un registro de la tabla A previamente introducido eliminar los relacionados en la tabla B y crear nuevos con los datos ya modificados. De todas formas sólo era una idea, quizás sea una locura lo que estoy diciendo. No sé, es que como te decía no entiendo mucho de SQL y quizás haya una forma mucho más fácil de hacer
Gracias
Ahora ya lo entiendo, yo pondría la sentencia Delete en la acción de algún cuadro de texto relacionado con la tabla A, es decir, por ejemplo Al actualizar ---> Procedimiento de Evento.
Me cuentas.
Gracias por tu rápida respuesta
Eso fue lo primero que probé. Había establecido la sentencia DETELE FROM y posteriormente el nuevo SELECT INTO con los nuevos datos en el evento "Después de actualizar" del campo que se iba a modificar, pero lo que no esperaba es que para un registro nuevo access también lo considera una modificación y salta la sentencia y claro me sale el aviso de error de que se van a borrar cero datos, etc.. Pensaba que cuando era un registro nuevo no lo consideraba una actualización pero por lo visto sí. Igualmente si lo pongo en el evento "Después de actualizar" del registro y no del campo
Por eso quería saber si o bien hay un orden de eventos mejor para hacer eso o un evento en sí que sólo actúe cuando se está modificando un registro previamente introducido pero no cuando se está introduciendo la primera vez
Gracias nuevamente por tu tiempo
Lo que puedes hacer es comprobar si existe el registro o no.
dim db as database
dim rs as recordset
set db=currentdb
set rs=db.openrecordset("Select...... busca el registro en la tabla")
if not rs.eof then 'Es decir si está
docmd.runsql "Delete........."
end if
Gracias por tu respuesta
Entiendo la idea, pero no me queda clara la ejecución seguramente porque como te decía apenas sé nada de SQL y VB.
Se supone que con esta línea: set rs=db.openrecordset("Select...... busca el registro en la tabla"   ¿debo seleccionar un registro que cumpla una determinada condición para ver si ya existía? Por ejemplo que seleccione registros con determinado valor en un campo? si es así no sé si me servirá porque esa sentencia de después de actualizar se debería poner en bastantes campos y creo que casi todos ellos pueden tener valores duplicados.
Gracias
¿No tienes ningún campo que, inequívocamente, identifique al registro?
Gracias por tu respuesta
Pues lo cierto es que no. Hay uno que no será fácil que se repita pero puede pasar y prefiero evitar esta posibilidad.
Dándole vueltas he pensado otra opción totalmente distinta. En vez de que los registros de la tabla relacionada B, se generen uno a uno (o varios) con cada nuevo registro de la tabla A, que quizás luego cada cierto tiempo, porque no es necesario que sea instantáneo, esos registros de la tabla B se generaran mediante un simple botón todos de golpe una vez que ya sepamos que no se va a modificar nada de ellos.
Ahora bien, ahí la cuestión sería que cada vez que se haga eso habría que filtrar los registros de la tabla A sobre los que se tendrían que aplicar o no el Select into y ahí nuevamente ya me pierdo. No sé si este nuevo enfoque sería más factible porque a mi me resultaría exactamente igual de útil.
Gracias por la paciencia
¿Por cuántos campos relacionas la tabla A con la tabla B?
Pues ese es el campo que tienes que utilizar para buscar si existe y para borrarlo en caso afirmativo.
Si tienes que hacer más preguntas te diré que no estaré disponible hasta el martes o miércoles.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas