Yo hago eso bastante seguido y no tengo problemas. Lo uso para dos browses uno debajo del otro, el de arriba con los encabezados de facturas y el de abajo scopeado con el detalle de articulos o para filtrar la cuenta corriendo de un cliente, etc, etc.
Con lo que tenes que tener cuidado con los scopes es con no errarle al indice que corresponde activar para el scope o a los datos que mandas a filtrar, si no coinciden ahi es donde se producen cuelgues del programa o gpfs.
Code: Select all
REDEFINE LISTBOX oBrw Fields DTOC(CCCLI->FECHA),;
CCCLI->DETALLE,;
TRANS(CCCLI->DEBE,"@E 999,999.99"),;
TRANS(CCCLI->HABER,"@E 999,999.99"),;
TRANS(CCCLI->SALDO,"@E 999,999.99");
ID 110 OF oDlg;
HEADERS "Fecha","Detalle","Debe ","Haber","Saldo ";
FIELDSIZES 80, 290, 90, 90, 90;
COLOR CLR_BLACK, RGB(202, 197, 192)
REDEFINE BTNGET oDesde VAR cDesde ID 113 OF oDlg ;
RESOURCE "B_Cld" PICTURE "@D" VALID ValDesde(oBrw,vCodigo,@cDesde,oDesde,@vSaldo,oSaldo) ;
FONT oFont3;
ACTION (aRec :=GetCoors(oDesde:hWnd),;
cDesde:=Calend(cDesde,aRec[1],aRec[4],oDlg),;
oDesde:Refresh(),oDesde:SetFocus())
REDEFINE BTNGET oHasta VAR cHasta ID 114 OF oDlg ;
RESOURCE "B_Cld" PICTURE "@D" VALID ValHasta(oBrw,vCodigo,@cHasta,oHasta,@vSaldo,oSaldo) ;
FONT oFont3;
ACTION (aRec :=GetCoors(oHasta:hWnd), ;
cHasta:=Calend(cHasta,aRec[1],aRec[4],oDlg),;
oHasta:Refresh(),oHasta:SetFocus())
FUNCTION ValDesde(oBrw,vCodigo,wFecdsd,oFecent,vSaldo,oSaldo)
vSaldo:=0
IF EMPTY(WFECDSD)
CCCLI->(ORDSCOPE(0,PADL(vCodigo,4,'0')+"19900101"))
CCCLI->(DBGOTOP())
wfecdsd:=CCCLI->FECHA
oFecent:Refresh()
ENDIF
CCCLI->(ORDSCOPE(0,PADL(vCodigo,4,'0')+DTOS(wFecdsd)))
CCCLI->(DBGOTOP())
CCCLI->(DbEval( { || vSaldo+= CCCLI->DEBE - CCCLI->HABER,IF(CCCLI->(DBRLOCK()),(CCCLI->SALDO:=vSaldo,;
CCCLI->(DBUNLOCK())),)} ))
CCCLI->(DBGOTOP())
oBrw:Refresh()
oSaldo:Refresh()
RETURN .T.
FUNCTION ValHasta(oBrw,vCodigo,wFecHST,oFecent,vSaldo,oSaldo)
vSaldo:=0
IF EMPTY(WFECHST)
wfecHST:=DATE()
oFecent:Refresh()
ENDIF
CCCLI->(ORDSCOPE(1,PADL(vCodigo,4,'0')+DTOS(wFecHST)))
CCCLI->(DBGOTOP())
CCCLI->(DbEval( { || vSaldo+= CCCLI->DEBE - CCCLI->HABER,IF(CCCLI->(DBRLOCK()),(CCCLI->SALDO:=vSaldo,;
CCCLI->(DBUNLOCK())),)} ))
CCCLI->(DBGOTOP())
LLOCLIEN->(DBSETORDER(1))
IF LLOCLIEN->(DBSEEK(PADL(vCodigo,4,'0'),.F.))
IF LLOCLIEN->(DBRLOCK())
REPLACE LLOCLIEN->SALDOM WITH vSaldo
REPLACE LLOCLIEN->SALDOD WITH DATE()
LLOCLIEN->(DBUNLOCK())
ENDIF
ENDIF
LLOCLIEN->(DBCOMMIT())
oBrw:Refresh()
oSaldo:Refresh()
RETURN .T.