hola si usas tablas nativas la mejor forma es usar seccion privada de datos , trabajas con tus tablas propias en el formulario ,
y te olvidas de bloqueos y demas cosas
en cada form tienes que poner tus seteos propios.
yo tengo un prg con todos los seteos ej:
set date french
det delete on
set exclusive off
set century on
....... y demas
u lo llamo en el load de cada form
para agregar , eliminar y modifica
uso bufering 5 en las tablas
uso insert into , delete from ... y update . es mas seguro y se asemeja a los motores de bases de datos.
********************* ejemplo para agregar
*--- OBTENGO EL ULTIMO codigo ingresado y le sumo uno
SELECT MAX(CLI_NRO) AS ULTIMO FROM CLI000 INTO CURSOR tmpultimo
NRO=ULTIMO+1
INSERT INTO CLI000 (CLI_NOM,CLI_DOM,CLI_NRO) ;
vALUES (v1,v2,nRO)
TABLEUPDATE(.T.,.T.,"CLI000")
MESSAGEBOX("Datos Actualizados con Exito....",64,"AVISO")
RELEASE THISFORM
ejemplo para borrar **************************************
resp=MESSAGEBOX("¿Está seguro que quiere eliminar este registro?",4+32+256,"¡ATENCION!")
IF Resp=6
ee=TMPCLI000.CODIGO
select CLI000
SET MULTILOCKS ON
=CURSORSETPROP('Buffering', 3 )
delete from cli000 WHERE cli_nro = ee
MESSAGEBOX("Se ha eliminado el registro","Aviso")
=CURSORSETPROP('Buffering', 5 )
THISFORM.DETALLE
ENDIF
para modificar *********************************
x1=thisform.pageframe1.page2.text1.Value
x2=ALLTRIM(thisform.pageframe1.page2.text2.Value)
x3=ALLTRIM(thisform.pageframe1.page2.text3.Value)
x4=ALLTRIM(thisform.pageframe1.page2.text4.Value)
update cli000 set cli_nom=x2,cli_dom= x3 where cli_nro=x1
tableupdate(.t.,.t.,"CLI000")
MESSAGEBOX("Datos Actualizados con Exito....",64,"AVISO")
THISFORM.pageframe1.page1.SetFocus
THISFORM.DETAlle
espero sirva mis ejemplos
saludos