Borrar datos de tabla

Quisiera molestarte nuevamente, tengo un formulario el cual lleno con informacion de un cursor y lo que quiero hacer es tener un boton para borrarla, lo hagon lo la siguiente linea de comando
SET DELETE ON
DELETE FROM DATOS WHERE DATOS.docu = thisform.textdoc.Value
Si lo hago de esta forma unicamente me marca lo registros pero no los borra y si utilizo el comando pack me marca un error que dice que no puedo usar este comando
por favor podrías indicarme cual es mi error ya pase todo el fin de semana con lo mismo y no logro dar con la solución.

1 respuesta

Respuesta
1
Tu sintaxis está bien, lo que sucede es lo siguiente:
En Visual FoxPro eliminar registros puede ser algunas veces complicado, Cuando utilizas el comando delete no estás eliminando el registro sino marcándolo para su eliminación. Es decir que el registro sigue existiendo en la tabla. Por eso utilizas el comando Set Delete ON/OFF, para mostrar u ocultar los registros marcados para su eliminación.
Para eliminar definitivamente uno o varios registros necesitas acceso exclusivo a la tabla, ya que lo que el visual hace en realidad es crear una nueva tabla que reemplaza a la anterior y le agrega los registros que no están marcados para su eliminación. ¿Algo complicado no? Pero es así.
Entonces, en general lo que solemos hacer es marcar los registros para su eliminación utilizando el delete, y luego hacemos un pequeño programa de mantenimiento del sistema que depura la base de datos completa, es decir elimina los registros de forma definitiva.
En cuanto a tu problema específico el error que recibes al ejecutar pack seguramente se debe a que la tabla no se encuentra abierta en modo exclusivo. Para evitar el error asegúrate de abrir tu tabla de manera exclusiva.
Te recomiendo que tengas en cuenta lo que te comenté más arriba. Lo ideal es usar delete y luego desde otro programa haces los packs, pero asegurándote de que no hay otro usuario utilizando el sistema.
Hola experto quisiera molestarte nuevamente, tengo un formulario el cual lleno con informacion de un cursor y lo que quiero hacer es tener un boton para borrarla, lo hagon lo la siguiente linea de comando
SET DELETE ON
DELETE FROM DATOS WHERE DATOS.docu = thisform.textdoc.Value
Si lo hago de esta forma unicamente me marca lo registros pero no los borra y si utilizo el comando pack me marca un error que dice que no puedo usar este comando
por favor podrías indicarme cual es mi error ya pase todo el fin de semana con lo mismo y no logro dar con la solución.
Gracias
Mishel
Hola Carlos, fijate que hice un formulario de prueba en el cual ingresaba el numero de documento a eliminar y si me funciono, lo hice utilizando la misma tabla con la linea de comando
DELETE FROM DATOSWHERE DATOS.docu = thisform.text1.Value
PACK
BROWSE
lo quise hacer de forma similar en el otro formulario pero me genero el mensaje que dice LA OPERACION NO ES VALIDA PARA EL OBJETO CURSOR, lo raro es que del cursor unicamente jalo el numero de documento que es thisform.text1.value y lo demas es de la tabla.
tambien lo modifique utilizando modo exclusivo de tablas de la siguiente forma
SET EXCLUSIVE ON
SET DELETE ON
DELETE FROM DATOS WHERE DATOS.docu = thisform.textdoc.Value
SET EXCLUSIVE OFF
pero tampoco me funciono
Bueno Mishel
Lo que sucede es que no puedes ejecutar un pack sobre un cursor !
Sería algo ilógico, ten presente que el cursor se borra cuando lo liberas. El cursor es el resultado de una cláusula Select SQL o Create Cursor, pero en cualquier caso es TEMPORAL, es decir que no se guarda en disco duro.
Te recomiendo que vuelvas a leer la explicación de mi primera respuesta a tu pregunta actual. El uso del comando Pack (sólo para tablas) requiere de acceso exclusivo y lo que hace es crearte una nueva tabla en disco que reeemplaza la anterior y le agrega los registros que no están marcados para su eliminación. Haz la prueba desde la linea de comandos de abrir una tabla en modo exclusivo y luego marca algún registro para eliminar (ctrl+T) y finlmente ejecuta el pack. Verás en la barra de estado que dice por ej. 1785 records added.
Entonces aplicar Pack sobre un cursor no tiene mucho sentido ya que el cursor desaparece cuando lo liberas.
***********
*SOLUCION*
***********
Si tú has generado un cursor sobre el cual vas trabajando y deseas ir quitando algunos registros tienes dos opciones:
1) Establece Set Deleted On y ejecuta delete sobre el cursor y luego un refresh. Automáticamente desaparecerá el registro que hayas marcado. Pero no utilices Pack.
2) Regenera el cursor sobre el que estás trabajando.
Suerte.
Creo que no me di a entender, porque lo que intento hacer es borrar datos de la tabla no del cursor, lo que no logro entender es porque en un formulario me funciona y en otro no siendo la única diferencia que uno utilizo cursores y en otro no, pero creo que revisare bien todo tal vez cometiendo un error básico
Perdón por el mal entendido. No deberías tener problemas con lo que estás intentando hacer. En la sentencia delete estás indicando la tabla datos y por lo tanto no debería darte el error que me comentas.
Para saber cuál línea te está devolviendo el error haz lo siguiente: Cuando se produzca el error dale click a suspender y se abrirá el depurador y te indicará cuál es la línea que te está generando el error.-
Haz la prueba y avísame a ver qué solución encontramos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas