Estimados,
Fiz pequenas alteracoes em minha HC-TWBrowse:
Code: Select all
CLASS TWBrowse FROM TControl
DATA bFooter
DATA lSumFooter INIT .f.
...
//----------------------------------------------------------------------------//
METHOD ReDefine( nId, bLine, oDlg, aHeaders, aColSizes, cField, uVal1, uVal2,;
bChange, bLDblClick, bRClick, oFont, oCursor,;
nClrFore, nClrBack, cMsg, lUpdate, cAlias,;
bWhen, bValid, bLClick, aActions ) CLASS TWBrowse
...
::bFooter = {||.t.}
::lSumFooter = .f.
...
return Self
//----------------------------------------------------------------------------//
METHOD Paint() CLASS TWBrowse
local n := 1, nSkipped := 1, nLines
local nSkip, nRealSkip
if ::lIconView
::DrawIcons()
return 0
endif
if ::nRowPos == 1 .and. ! Empty( ::cAlias ) .and. ;
Upper( ::cAlias ) != "ARRAY" .and. Upper( ::cAlias ) != "_TXT_"
if ! ( ::cAlias )->( EoF() )
( ::cAlias )->( DbSkip( -1 ) )
if ! ( ::cAlias )->( BoF() )
( ::cAlias )->( DbSkip() )
endif
endif
endif
// **********
if ::lSumFooter
::lDrawFooters := .t.
::aFJustify := ::aJustify
endif
// **********
...
return 0
//----------------------------------------------------------------------------//
METHOD Refresh( lSysRefresh ) CLASS TWBrowse
If ::Cargo != Nil .or. ; // Tree
!( ::nLen := Eval( ::bLogicLen ) ) > 0
Super:Refresh()
Else // Si hay elementos en la tabla
DEFAULT lSysRefresh:= .f.
If "B"$ValType( ::aFooters )
::DrawFooters()
EndIf
Super:Refresh( .f. ) // No borrar fondo, WBrwPane se encarga de eso !!
If lSysRefresh // OJO Usar con cuidado porque puede hacer agotar
SysRefresh() // el Stack :-(
EndIf
// **********
if ::lSumFooter
eval( ::bFooter )
endif
// **********
EndIf
return 0
Em meus aplicativos uso:
Code: Select all
...
REDEFINE LISTBOX oLbx FIELDS ... ;
HEADERS ... ;
FIELDSIZES ... ;
ID 999 OF oDlg
//
oLbx:aJustify := { .f., .f., 1, .f., 1, 1 }
//
oLbx:lSumFooter := .t.
oLbx:bFooter := {|| ( aSumFooter := nSumFooter( oLbx, "CLIENTS", {0,0,0,0,1,1} ) ) }
oLbx:aFooters := { "", "", "", "", 0, 0 }
//
...
Code: Select all
...
function nSumFooter( oSUMLbx, cSUMArea, aSUMArray )
// oSUMLbx - Objeto Browse
// cSUMArea - Alias usado no momento
// aSUMArray - Array de 0s e 1s onde 0-Nao soma e 1-Soma
local aSUMLbx := {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
nSUMArea := Select()
dbSelectArea( cSUMArea )
dbGotop()
do while .not. eof()
for n = 1 to Len( aSUMArray )
if aSUMArray[n] = 1
aSUMLbx[n] := aSUMLbx[n] + Eval( GenBlockN( oSUMLbx:bLine, n ) )
endif
next
skip
enddo
for n = 1 to Len( aSUMArray )
oSUMLbx:aFooters[n] := iif( aSUMArray[n] = 0, "", transf( aSUMLbx[n], "@E 999999.99" ) )
next
dbGotop()
dbSelectArea( nSUMArea )
return aSUMLbx
static function GenBlockN( bLine, nPos )
return { || val( iif(","$Eval(bLine)[nPos],;
substr(Eval(bLine)[nPos],1,at(",",Eval(bLine)[nPos])-1)+"."+substr(Eval(bLine)[nPos],at(",",Eval(bLine)[nPos])+1,3),;
Eval(bLine)[nPos]) ) }
...