¿Cómo evitar la perdida de datos al realizar consultas en una base de datos usando Microsoft Acces?
Tengo una base de datos trabajando en red, lo que sucede es que cuando algún usuario se sale inapropiadamente de la base de datos este se daña (por lo menos este es el mensaje que marca la base de datos cuando se repara) pero algunas veces se pierde información, se pone (Error o Delete) dentro del registro que ya se perdió y cuando lo reparo esos registros se llenan con el signo (###########).
Mi pregunta es, se puede evitar esto de alguna forma o porque crees que sucede sera por lo que te mencione anteriormente que dice el Access o por otra cosa.
Lo único que se me ocurre sobre esta cuestión es pasarte un articulo de DevAshish para prevenir el cierre de Access, disculpa si no te lo comento: Prevent Access from closing ---Posted by Dev Ashish--- (Q) I want to make sure that users always exit my database using the Exit button provided on my Switchboard. However, I'm not able to prevent them from closing Access itself. ¿Is there a way to control how they exit Access? (A) You can use the UnLoad event of a form to do this. If your switchboard is the first form to open and always remains open in the background, you can apply the following method on the switchboard. Otherwise, I would recommend creating a hidden form for this functionality. Define a new variable in a new module Public pboolCloseAccess as Boolean 'Note: Access 2.0 does NOT recognize Boolean 'type variables. Use integer type instead, 'passing a -1 as True, and 0 as False. Now, when you open the database, set pboolCloseAccess=False In your (Switchboard/Hidden) Form's Unload Event, set the variable to true and also check for its value pboolCloseAccess=True DoCmd. Close acForm, "hfrmCloseAccess" Docmd. Quit If your Switchboard form closes during one instance, then create a new form (hfrmCloseAccess). You can minimize the size if you want because it will be in hidden mode. Type the following in hfrmCloseAccess's OnUnload Event if not pboolCloseAccess then cancel = true Create the Autoexec macro. If you already have one, make sure that you open hfrmCloseAccess before anything else IN HIDDEN MODE. The reasoning here is, when someone clicks X in Access's window, the System starts closing down all open objects in a first-open-last-close basis. Since your hfrmCloseAccess form is the first one to open, it will be the last to close. And since the boolean var is still False, Cancel will always be true, hence Access will not close. On the other hand, when the user clicks on the Exit button or closes your switchboard, you're setting the boolean var to True and then closing the hfrmCloseAccess form, which WILL close now and hence Access will close itself. NOTA: no he podido validar el código aun, si tienes problemas para aplicarlo me trasladas la cuestión.
Se puede usar el evento Al Descargar de un form para hacer que un usuario tenga que usar un botón del form Panel de control principal para salir de la base de datos. Si tienes un form Panel de control principal y es el primero en abrirse y permanece siempre así, aunque sea en segundo plano, puedes usar este método. En caso contrario habrá que crear un form oculto para esta función. Define esta nueva variable en un modulo nuevo: Public pboolCloseAccess as Boolean 'Note: Access 2.0 does NOT recognize Boolean 'type variables. Use integer type instead, 'passing a -1 as True, and 0 as False. Ahora, cuando abramos la DB ajustamos la variable a: pboolCloseAccess=False En el evento Al descargar del form Panel de control principal, o del form oculto, ajusta la variable a true, pega este código: pboolCloseAccess=True DoCmd. Close acForm, "MiForm" Docmd. Quit Si existe la posibilidad de que el form Panel de control principal pueda ser cerrado, entonces usamos conjuntamente un segundo form que ocultaremos. En el evento Al descargar de este pondremos: if not pboolCloseAccess then cancel = true Crea una macro autoexec. Si ya tienes una, asegurate de poner una linea para que el form Mi formOculto se abra en modo oculto antes que cualquier otro objeto. El razonamiento aquí es, cuando alguien pica POR en la ventana del access, el sistema comienza a cerrar todos los objetos abiertos, el primero que se abrió pasa a ser el último que se cierra. Puesto que el form MiformOculto es el primero en abrirse, será el último en cerrarse. Y puesto que el var boleano sigue siendo falso, la cancelación será siempre verdad, por lo tanto el access no se cerrará. Por otra parte, cuando el usuario pica en el botón para salir desde el Panel de control principal, estamos fijando el var boleano a verdadero y entonces cerrando MiformOculto, se cerrará access. NOTA: personalmente no usaría la macro autoexec a no ser que deshabilitemos la tecla Shift, pero aquí ya entramos en el tema de como blindar una DB. Acabo de validar el código y es cojonudo.
Lo que me refiero con que sale inapropiadamente de la base de datos es que da un reset o apaga su maquina si cerrar el access o sencillamente el access se tildeo y utiliza el administrador de programas para cerrar el access, cuando hacen esto la base de datos se daña, existe alguna solución o siempre se tiene que sacar un respaldo de la base de datos.
Bien, contra un reset del usuario esta claro que no se puede hacer nada, contra lo del cuelgue del programa tampoco (aunque no debería colgarse). En cuanto a lo del respaldo, desde luego que es conveniente hacerlo y si encima tienes los problemas que comentas, lo mejor seria una utilidad que te hiciese el respaldo automáticamente cada pocos minutos (del tipo DBBackup, gratuito y sencillo, si estas usando algún windows 9x o superior puedes echar mano del Programador de tareas y usar el Copia de seguridad).