Manipular datos de tabla filtrada en grid Visual Foxpro 9

Como puedo agregar, eliminar y actualizar datos que tengo de una tabla secundaria filtrada de acuerdo a un código que se muestra de tabla primaria en caja de texto.

Respuesta

Cualquier acción puedes hacerla igual que siempre para hacer modificaciones a nivel registros ya que si el grid apunta a la tabla bastara que una vez termines de hacer cambios uses Refresh; por ejemplo Thisform. Grid1. Refresh()

Ya sabes: para Agregar:

Select MiTabla && o Use Mitabla, según esté o no abierta ya.
Append Blank
Replace...
** O bien
Insert into Mitabla (campo1) value (conestevalor)

para Eliminar

Delete

para Modificar

Select Mitabla
Replace esto with estootro

Buenas tardes,

gracias por tu respuesta, eliminar y modificar ya me sirvieron, pero tengo problemas con agregar, tengo el siguiente código en el botón agregar:

SELECT referencia
APPEND BLANK
replace codigo_emp with thisform.text1.Value
replace cedula with thisform.grid1.column1.text1.Value
replace nombre with thisform.grid1.column2.text1.Value
replace direccion with thisform.grid1.column3.text1.Value
replace telefono with thisform.grid1.column4.text1.Value
thisform.habilitas_guar_canc()
THISFORM. Refresh

pero al momento de dar click en el botón me genera el siguiente error:

de ante mano te agradezco por tu ayuda, soy nuevo en foxpro.

El error que te indica ahí es que la tabla tiene un índice CEDULA que admite un valor único es decir que no se repita nunca y debes estar intentando ingresar un número de cedula que ya existe en la tabla.

hola,

encontré el problema, es que al borrar no me muestra los datos en el formulario y aparentemente lo borra en la tabla, pero si cierro y abro el foxpro y voy a la tabla los registros que supuestamente borre solo están marcados y no los muestra en el formulario.

estoy utilizando el comando como lo indicaste:

Delete

como puedo hacer para que realmente lo borre de la tabla?

Efectivamente cuando usas DELETE (que dicho sea de paso es única manera de borrar un registro) solo lo marcas para borrar; si usas SET DELETE OFF y abres la tabla verás todos los registros incluso aquellos que marcaste para borrar; SET DELETE ON vuelve a ocultarlos.

Ahora para eliminar definitivamente los registros marcados para borrar debes primeramente tener abierta la tabla en modo exclusivo... es decir..

USE mitabla EXCLUSIVE

Y luego usas el comando PACK que elimina todos los registros marcados para ser borrado.

Ahora bien; el problema se presentaría si la tabla está compartida en red y varios la abren al mismo tiempo; esta situación no te permitirá abrir la tabla en modo exclusivo sin que de error en algún sitio. Si no es así lo resuelves con abrirla en modo exclusivo y ejecutar pack.

lo realice y me funciono la primera vez, pero si vuelvo a eliminar nuevamente de la tabla uno cargada en txt o borro desde la tabla 2 cargada en la grid me genera el siguiente error:

esto tengo en el botón borrar para campos de la tabla uno(información cargada en txts):

USE empleado EXCLUSIVE
DELETE FROM empleado WHERE codigo = thisform.text1.Value
PACK
GO top
thisform.campos()

thisform.Refresh()

y esto es lo que tengo en el botón borrar para los campos de la tabla 2(datos en grid):

USE referencia EXCLUSIVE
DELETE FROM referencia WHERE cedula = thisform.grid1.column1.text1.Value
PACK
thisform.campos()
thisform.Refresh()

El error que te presenta es debido a que la tabla ya esta abierta y pides volver a abrirla...

Primero consulta si esta abierta la tabla; si no lo esta abrirla... sería así..

If Used("Empleado")
    Select Empleado
Else
    Select Select(1)  && elijes un área sin uso.
    Use Empleado Exclusive
Endif
Delete ....  && Desde aquí el resto del código.

hola, utilice el código como me indico., pero al borrar un dato del grid efectivamente lo borra de la tabla pero deja la grid totalmente en blanco, y si borro un registro de la tabla primaria me da el siguiente error:

disculpa tantas preguntas, pero soy nuevo en este tema.

El primer error de que te queda el grid en blanco y suponiendo que el grid esta enlazado a la tabla referencia podrías hacer lo siguiente:

THISFORM.GRID1.RECORDSOURCE = ""
IF USED("referencia")
    USE IN referencia
ENDIF
SELECT SELECT(1)
USE referencia EXCLUSIVE 
DELETE FROM referencia WHERE cedula = thisform.grid1.column1.text1.Value 
PACK
THISFORM.GRID1.RECORDSOURCE = "referencia"

Usando el código de verificar si esta abierta la tabla, en cuyo caso primero la cierras para asegurarte que la abres siempre en modo exclusivo, haces..

IF USED("referencia")
    USE IN referencia
ENDIF
SELECT SELECT(1)
USE referencia EXCLUSIVE 
DELETE && y aquí sigue to código.

lo mismo para la tabla empleados.

IF USED("empleado")
    USE IN empleado
ENDIF
SELECT SELECT(1)
USE empleado EXCLUSIVE 
DELETE && y el resto del código.

Le indico como estoy cargando los datos de las dos tablas, como ya sabe tengo dos tablas, empleados y referencias, las cuales las tengo relacionadas 1 a M, referencia recibe el código del empleado, cargo todos los datos de la tabla empleados en cajas de texto con :

SELECT empleado
GO TOP
thisform.campos() 

configure la propiedades del grid, RecordSource : referencia y RecordSourceType: 1-Alias, con esto la grid carga los datos por la relación de la DB , de acuerdo al código del empleado.

Voy a realizar lo que me indico y le escribo nuevamente.

hola, lo del grid no me funciono, borra el registro pero me carga toda la información de la tabla y me debe cargar solo los del código del empleado activo, y como cierro primero la tabla? utilice el código que me indico de ultimo pero me da el mismo error, File is in use.

Entonces para el grid no la cierres ya que deberías volver a aplicar el filtro... haz.

THISFORM.GRID1.RECORDSOURCE = ""
If Used("referencia")
    Select referencia
Else
    Select Select(1)  && elijes un área sin uso.
    Use referencia Exclusive
Endif 
DELETE FROM referencia WHERE cedula = thisform.grid1.column1.text1.Value 
PACK
THISFORM.GRID1.RECORDSOURCE = "referencia"

amigo, me dan los mimos errores, sera que le puedo adjuntar el proyecto y me ayuda a revisar?

Claro, no ay problemas, ya que mucho de lo que dices debo intuirlo, lo mejor será verlo completo. Si quieres envíamelo a mi dirección sysgen.abel arroba Gmail.com

amigo me confirma si recibió el correo.

No, aún no. Pero mi correo tiene respuesta automática; te avisa si me llega.

lo envíe hace 20 minutos, puedes descargar el proyecto de este link:

https://drive.google.com/open?id=1Jb37pG-LlJtZAyVTmiI-qXJ73yAfCAj2

Ya lo tengo Jair, mañana te digo algo.

Gracias!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas