Javier
Espero no responder muy tarde.
La edición sobre la tabla o recordset le dejo al propio xbrowse , en el siguiente codigo establesco qué columnas quiero editar y qué tipo de edición realizar:
Code: Select all
for i:=3 to len(oBrw2:acols)
if i=4
oBrw2:acols[i]:nEditType := EDIT_GET_LISTBOX //edicion con combo
oBrw2:aCols[i]:aEditListTxt := atareas_u //contenido delcombo
else
oBrw2:acols[i]:nEditType := EDIT_GET //edicion normal
endif
next
oBrw2:lFastEdit:=.t.
oBrw2:lEditmode:=.t.
Para eliminar o crear nuevos registros en cambio uso botones que llaman a funciones con consultas SQL usando el objeto command creado previamente tal como se lo hace con el objeto recordset. Al crear el registro hay que tener en cuenta el asunto del autoincremento y de las claves foraneas, sino obtendremos errores difíciles de encontrar. La siguiente funcion la uso para añadir, a lo mejor esté algo confusa pero tú la puedes hacer más sencilla:
Code: Select all
//----------------------------------------------------------------------------//
//Inserto Un registro vacío para luego rellenar en el los datos
//Esto es conveniente así tenemos el registro con el siguiente numero autoincrementado
//oRs Recordset que maneja la tabla
//tabla nombre de la tabla donde se va a insertar
//is_auto indica si el registro es autoincremental, por defecto es verdadero
//akey_ext array con el nombre y valor del campo con clave externa
//akey_ext2 array con el nombre y valor de otro segundo campo que puede ser o no otra clave externa
//filltxt .t. para rellenar con espacio un campo text, .f. no rellena con nada
//ncampos
METHOD InsIt(oRs,tabla,is_auto,akey_ext,akey_ext2,filltxt,ncampos) CLASS TVehic
local cQuery,nobra,cfilt
local i,acampotxt:={},cCampo:="",cValor:=""
default is_auto:=.t.
default filltxt:=.f.
if filltxt
default ncampos:=oRs:fields:count
endif
//si filltxt está en verdadero Buscar si no hay campos tipo texto
if filltxt
for i:=1 to ncampos
//msgalert(ors:fields(i-1):name)
if ors:fields(i-1):Type = 203 //adLongVarchar en ADO
aadd(acampotxt,ors:fields(i-1):name)
endif
next
if len(acampotxt)>0
for i:=1 to len(acampotxt)
cCampo+=","+acampotxt[i]
cValor+=",' '"
next
endif
endif
CursorWait()
if is_auto
if akey_ext!=nil .and. akey_ext2!=nil
cQuery :="insert into " + tabla + "(" + oRs:Fields(0):Name + ","+ akey_ext[1] +","+ akey_ext2[1] + cCampo+;
") values(0,"+str(akey_ext[2])+","+str(akey_ext2[2]) + cValor +")"
elseif akey_ext!=nil
cQuery :="insert into " + tabla + "(" + oRs:Fields(0):Name + ","+ akey_ext[1] + cCampo +;
") values(0,"+alltrim(str(akey_ext[2]))+ cValor + ")"
else
cQuery :="insert into " + tabla + "(" + oRs:Fields(0):Name + cCampo + ") values(0"+cValor+")"
endif
else
if akey_ext!=nil .and. akey_ext2!=nil
cQuery :="insert into " + tabla + "(" + oRs:Fields(0):Name + ","+ akey_ext[1] + ","+ akey_ext2[1]+ cCampo+;
") values('" + space(20) + "'," + str(akey_ext[2]) + "," + str(akey_ext2[2]) + cValor+")"
elseif akey_ext!=nil
cQuery :="insert into " + tabla + "(" + oRs:Fields(0):Name + ","+ akey_ext[1] + cCampo +;
") values('" + space(20) + "'," + str(akey_ext[2]) + cValor + ")"
else
cQuery :="insert into " + tabla + "(" + oRs:Fields(0):Name + cCampo +;
") values('"+space(20)+"'" + cValor+ ")" //ojo si el primer campo es numerico puede dar error
endif
endif
try
//msgalert(cQuery)
ors:Requery()
oCon:Execute(cQuery,"INSERT")
oRs:Requery()
oRs:Movelast()
catch oError
showError(oError,oCon)
end
return .t.
//-------------------------------------
//Borra registro de un recordset
METHOD DelIt(oRs,ctabla,oBrw) CLASS TVehic
local cQuery,nrec,nlen
local uclave //Registro actual //asumimos que el campo clave es el primero
local cfield
CursorWait()
if !oRs:BOF .and. !oRs:EOF
uclave:=oRs:Fields(0):Value //Registro actual //asumimos que el campo clave es el primero
cfield:=oRs:Fields(0):Name
cQuery :="delete from " + ctabla + " where "+ cfield +" = " +if(valtype(uclave)="N",str(uclave),"'"+alltrim(uclave)+"'")
nrec:=oRs:AbsolutePosition
oCon:Execute(cQuery,"DELETE")
oRs:Requery()
nLen:=oRs:RecordCount()
if !oRs:BOF .and. !oRs:EOF
if nlen+1 == nrec
oRs:MoveLast()
else
oRs:Move(nrec-1)
endif
endif
else
msgstop("No hay nada para borrar")
endif
return nil
Espero sea de guia. Saludos