Problema usando tDatabase
Posted: Wed Nov 28, 2007 4:19 pm
Hola foro,
Necesito ayuda, estoy algo confuso, y no doy con la solución del siguiente problema.
Quiero utilizar la clase tDatabase, y la estoy probando con un sencillo mantenimiento de fichero maestro. Visualizo una tabla en un browse, y edito o añado datos en un dialogo.
Pretendo que solo exista un objeto tDatabase, que es el que uso en el browse y en dialogo.
He aqui el problema, puesto que al al intentar añadir registros, ejecuto el metodo Blank, que deja vacio el buffer de edicion, pero mientras estoy editando, o al cerrar el dialogo, supongo que desde el browse se ejecuta el metodo load, con lo que el buffer que estoy editando se carga con los datos del registro sobre el que esta posicionado el browse.
No se si me explico, aqui os dejo un ejemplo autocontenido, probad de dar de alta un registro.
Veis alguna posible solucion, o por el contrario la unica via es crear dos objetos tDatabase, para que sea independiente el browse del dialogo.
Ahora que escribo esto, estoy pensando que si ejecuto el metodo blank en el browse y no el dialogo, puede que tambien funcione, ya que tanto el browse como el dialogo estarian sobre un registro vacio.
Necesito ayuda, estoy algo confuso, y no doy con la solución del siguiente problema.
Quiero utilizar la clase tDatabase, y la estoy probando con un sencillo mantenimiento de fichero maestro. Visualizo una tabla en un browse, y edito o añado datos en un dialogo.
Pretendo que solo exista un objeto tDatabase, que es el que uso en el browse y en dialogo.
He aqui el problema, puesto que al al intentar añadir registros, ejecuto el metodo Blank, que deja vacio el buffer de edicion, pero mientras estoy editando, o al cerrar el dialogo, supongo que desde el browse se ejecuta el metodo load, con lo que el buffer que estoy editando se carga con los datos del registro sobre el que esta posicionado el browse.
No se si me explico, aqui os dejo un ejemplo autocontenido, probad de dar de alta un registro.
Code: Select all | Expand
#include "Fivewin.ch"
#include "xBrowse.ch"
STATIC oDbf
FUNCTION MAIN()
LOCAL oWnd,oBrw,oCol,oBar
CrtTmp()
oDbf:=tDatabase():New()
DEFINE WINDOW oWnd
DEFINE BUTTONBAR oBar OF oWnd
*-
DEFINE BUTTON OF oBar ACTION EdtTmp(.t.) PROMPT 'Altas'
DEFINE BUTTON OF oBar ACTION EdtTmp(.f.) PROMPT 'Modif'
*--
oBrw := TXBrowse():New(oWnd)
oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW
oBrw:nColDividerStyle := LINESTYLE_BLACK
oBrw:lColDividerComplete := .T.
*--
oCol:=oBrw:AddCol()
oCol:bStrData:= {||oDbf:Cod}
oCol:cHeader := 'Cod.'
*--
oCol:=oBrw:AddCol()
oCol:bStrData:= {||oDbf:Nom}
oCol:cHeader := 'Descripción'
*--
oBrw:bGoTop := {|| oDbf:GoTop() }
oBrw:bGoBottom := {|| oDbf:GoBottom() }
oBrw:bSkip := {| n | iif( n == nil, n := 1, ), oDbf:Skipper( n ) }
oBrw:bBof := {|| oDbf:Bof() }
oBrw:bEof := {|| oDbf:Eof()}
oBrw:bBookMark := {| n | iif( n == NIL, oDbf:RecNo() , oDbf:Goto( n ) ) }
oBrw:CreateFromCode()
oWnd:oClient := oBrw
oBrw:lRecordSelector:=.t.
ACTIVATE WINDOW oWnd
RETURN NIL
//-------------------------------
STATIC FUNCTION EdtTmp(lAdd)
LOCAL oDlg,lSave := .F.,oFont,oBtn, cCod,cNom
//LOCAL oDbf:=tDatabase():New() <<<<<<<<<<<<<<<<Si defino otro objeto local, funciona Ok.
IF (lAdd,oDbf:Blank(),oDbf:Load())
DEFINE FONT oFont NAME "MS Sans Serif" SIZE 0, 8
DEFINE DIALOG oDlg FROM 100, 100 TO 230,494 PIXEL FONT oFont
oDlg:SetText('('+ProcName()+') '+ IF(lAdd,'Alta','Modificación')+' de registros' )
@ 12, 10 SAY "Cod:" OF oDlg SIZE 15, 8 PIXEL FONT oFont
@ 26, 10 SAY "Nom:" OF oDlg SIZE 17, 8 PIXEL FONT oFont
@ 10, 32 GET oDbf:Cod OF oDlg SIZE 15, 12 PIXEL FONT oFont WHEN lAdd
@ 24, 32 GET oDbf:Nom OF oDlg SIZE 155, 12 PIXEL FONT oFont
@ 46, 107 BUTTON oBtn PROMPT "OK" OF oDlg SIZE 42, 14 PIXEL FONT oFont DEFAULT ;
ACTION (MsgStop("Valor nombre antes de cerrar el dialogo:"+CRLF+oDbf:Nom),oDlg:End(), lSave := .T.)
@ 46, 151 BUTTON oBtn PROMPT "Cancelar" OF oDlg SIZE 42, 14 PIXEL FONT oFont CANCEL ACTION (oDlg:End())
ACTIVATE DIALOG oDlg CENTERED
MsgStop("Valor nombre despues de cerrar el dialogo:"+CRLF+oDbf:Nom)
IF lSave
IF lAdd
oDbf:Append()
ENDIF
oDbf:Save()
ENDIF
RETURN NIL
//-------------------------------
STATIC FUNCTION CrtTmp()
LOCAL i
DBCreate('tmp.dbf',{;
{ "COD" , "C", 2, 0 },;
{ "NOM" , "C", 30, 0 } ;
})
DBUseArea(.T.,,'tmp',,.T.)
FOR i:=1 TO 50
Tmp->(dbAppend())
Tmp->Cod:=Str(i,2)
Tmp->Nom:='Nombre '+Tmp->Cod
NEXT
Tmp->(dbGoTop())
RETURN NIL
Veis alguna posible solucion, o por el contrario la unica via es crear dos objetos tDatabase, para que sea independiente el browse del dialogo.
Ahora que escribo esto, estoy pensando que si ejecuto el metodo blank en el browse y no el dialogo, puede que tambien funcione, ya que tanto el browse como el dialogo estarian sobre un registro vacio.