Es un placer saludarte. Espero poder ayudarte.
Yo soy del criterio ferviente que hay muchas formas de hacer las cosas... todas validas mientras resuelvan.
La base para la programación, incluyendo la eliminación de registros, es la aplicación de una correcta fisolofia. Una cosa debe ir después de la otra en orden.
Eliminar un registro depende... ¿de qué? De como quieres eliminarlo... ¿de forma "visual" o de forma "fisica"? Las tablas nativas de VFP permiten hacer ambas cosas. La diferencia.. es que en la misma tabla... podes marcar el registro para eliminación y si en el form, en el evento INIT aplicas SET DETELE OFF el registro no estará disponible para verlo. Seguirá existiendo en la tabla físicamente... pero tendrá la marcadura de borrado, es decir... quedara marcada como en lista de espera para cuando decidas borrarlo físicamente. Esto tiene sus ventajas y desventajas. Ventaja es que el registro lo vas a tener en la tabla... y vos decidís si lo ves o no en tus forms y reportes. Si algún día revertís la eliminación con el comando RECALL, el registro lo recuperas sin problemas.
Desventaja, es que a veces aplicas ciertos comandos que tratan el registro y lo incluyen en los procesos. Además.. que si nunca más usas el registro y lo tienes solo marcado, te ocupara espacio innecesario.
He aquí que recalco... la filosofía de programación es la base para tu aplicación: ¿Cómo deseas hacer las cosas? ¿Cuándo? ¿Con qué objetivo? Es importante plantearse si deseas eliminar el registro físico o solo visual.
Ahora... empecemos por el inicio. ¿Cómo cargas tus registros en el grid? Directamente enlazado a la tabla física... ¿o a través de un cursor? Yo aconsejo siempre mostrar los datos de consultas en cursores temporales. Las tablas de foxpro deben usarse como fuente de alimentación de consultas y vistas solamente.
Una buena opción seria... crear un método personalizado en tu form llamado (por ejemplo) "cargardatos" en donde creamos un cursor y lo enlazamos al grid. ¿Por qué usar esto? Porque es más fácil re crear un cursor después de alguna adición o eliminación o modificación desde un método ya creado.. y así evitas reescribir códigos!
Te dare esta opcion... probala y me decis si te funciona.
Vamos al modo diseño del form... y en e menu form, escogemos la opción newmethod... ahí escribimos de nombre cargardatos y guardamos.
Ahora... ese método lo podrás ver en la pestaña method de las propiedades del form... al final de la ventana en letras rojitas. Dale doble click y en el, insertaremos un código como este:
**--Desenlazamos fuente para evitar perdida visual de la clase
THISFORM.Grid1.RecordSource = " "
**--Creamos un cursor temporal y lo enlazamos al grid para eliminar registros.
SELECT * FROM tabla1 WHERE campo1 = condicion INTO CURSOR temp1
SELECT temp1
GO TOP
**--Enlazamos grid
THISFORM.Grid1.RecordSource = "temp1"
**--Enlazamos cada columna del grid a cada campo deseado
THISFORM.Grid1.Column1.ControlSource = "temp1.campo1"
THISFORM.Grid1.Column2.ControlSource = "temp1.campo2"
**--Aqui el resto de columnas que vas a ver
**--//
THISFORM.Grid1.Refresh
**--//
Ahora... vamos al init del form y activamos el método... cuando el form arranque, el método se activa y se ejecuta!
THISFORM.cargardatos
**--//
AHORA... vamos a crear otro método llamado eliminarreg desde el menu form, opción newmethod... ! En el... vamos a escribir un código para eliminar. Aquí es donde debemos decidir... la eliminiacion sera solo visual, es decir.. ¿solo marcar el registro para eliminación? De ser asi... establece SET DELETE OFF en el init del form y ahi ya no veras el registro una vez que lo marques. De ser esta opción... coloca un código como este:
**--Eliminar registros DELETE--**
#DEFINE MSGBOX_YES 6
#DEFINE C_MSGBOX1 36
#DEFINE C_DELETE_LOC "Desea eliminar este registro?"
IF EMPTY(ALIAS())
RETURN
ENDIF
IF MESSAGEBOX(C_DELETE_LOC,C_MSGBOX1) = MSGBOX_YES
SELECT temp1
DELETE
THISFORM.Refresh
ENDIF
IF !EOF()
SKIP 1
ENDIF
IF EOF() AND !BOF()
SKIP -1
ENDIF
**--Recargamos la consulta y el registro, si SET DELETE esta en off... ya no debe aparecer!
THISFORM.cargardatos
**--//
**--Ahora en el botón que decís.. que es para eliminar.. llama al método eliminarreg, así: coloca esta línea de código en el evento click del botón:
THISFORM. Eliminarreg
**--//
Con esto... ya podrás marcar los registros y ahí mismo... reconstruir la consulta.
Ahora.. si lo que deseas es eliminar el registro de forma física.. osea.. total de la tabla... coloca este código en el evento UNLOAD del form:
Use table1.dbf exclusive
PACK
**--//
Y ya con eso... además de marcarlo... lo eliminaras de una de la tabla al salir del form.
PROBA y me avisas. Mi correo:
[email protected]
Podes consultar tambien la respuesta parecida que le di a un usuario hace tiempo aqui
Eliminar registros marcados..
Y una entrada en mi blog respecto al tema... con algun punto de vista que te puede servir, aqui:
http://ravennfoxpro.blogspot.com/2011/08/marcar-registros-para-eliminacion_06.html
Cualquier cosa... estoy al a orden
Desde Managua, NICARAGUA!
Ravenn :D :D :D