Eliminar registro y actualizar grid

Buenas, necesitaría que me ayuden con lo siguiente, yo tengo un grid en el cual tengo personal, quiero que al hacer click en uno de ellos y tocar el botón eliminar, el mismo se borre, eso lo logro hacer pero lo que no puedo hacer es que en ese mismo momento se actualice e grid y ese registro ya no aparezca, gracias

Respuesta
1

Veamos si con este código puedes solucionar el inconveniente, caso contrario me comentas y veremos de que otra manera lo solucionamos.

Posiciónate al inicio de la tabla después que hayas eliminado borrado el registro de personal
Select  mitabla
If recno()>0
Delete
Else
Tablerevert(.f.)
Endif
Go top
Thisform. Grid. Refresh

Ahhh lo olvidaba, antes de cargar el programa que hace tu grid, debes colocar lo siguiente
SET DELETE OFF && los registros eliminados no se visualizan
SET REFRESH TO 1,1 && Refresca los intervalos en el grid

1 respuesta más de otro experto

Respuesta

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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas