Leandro, asi es como lo uso en uno de mis programas.
Code: Select all | Expand
Function ArrayFilter()
local oDlg,oBrw, cAlias, oFont, oCol
local nWd := GetSysMetrics(0) * .90 // .75
local nHt := GetSysMetrics(1) / 1.20 // 2
local aGradBarSel:= { { 1, RGB(252,232,171) , RGB(248,195, 34) } }
local aGradRowSel:= {{1, RGB(108,125, 184), RGB(241,222,088)}}
local cOldSele:=Select(), aDat:={},aData:={}, aTitCols
local nOrdAnt, nDocu:=0
local aSub, n, r
local bFilter := { |x| x[3] == nDocu } //3 es la col
DBUSEAREA(.T.,,"MCONMOV","MCONMOV",.T.)
dbselectarea("MCONMOV")
cAlias:=Alias()
index on Substr(Str(field->Numdoc),7,4) + Substr(Str(field->Numdoc),5,2) + Substr(Str(field->Numdoc),1,4) ;
to "C:\"+cAlias ADDITIVE TEMPORARY FOR FIELD->TD="CD"
aTitCols:={}
AEval( DbStruct(), { |a| aadd(aTitCols, a[1]) } )
(cAlias)->( FW_DbfToArray( , , , , , , aData ) )
(cAlias)->(OrdDestroy("C:\"+cAlias))
(cAlias)->(DBCLOSEAREA())
DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-12
DEFINE DIALOG oDlg SIZE nWd,nHt PIXEL TRUEPIXEL TITLE "ARRAY DE CDIARIOS " +cAlias FONT oFont
nWd /= 2
nHt /= 2
XbrNumFormat( 'A', .t. )
@1,1 XBROWSE oBrw OF oDlg ;
AUTOCOLS ;
HEADERS aTitCols ;
ARRAY aDATA ;
CELL LINES NOBORDER FOOTERS
if UPPER(cAlias)=="MCONMOV"
WITH OBJECT oBrw:numdoc
:cEditPicture := "####-##-####"
END
endif
ADD COLUMN oCol TO oBrw AT 1 HEADER "Item"
oBrw:aCols[ 1 ]:bEditValue := { || oBrw:nArrayAt }
oBrw:aCols[ 1 ]:bFooter := { || oBrw:nLen }
oBrw:CreateFromCode()
//oBrw:bRClicked := {|| VerDocs(cAlias,oBrw) }
@ oDlg:nHeight-25, 10 BUTTON 'Imprimir' SIZE 80,20 PIXEL OF oDlg ACTION oBrw:Report()
@ oDlg:nHeight-25,100 BUTTON 'Excel' SIZE 80,20 PIXEL OF oDlg ACTION oBrw:ToExcel()
@ oDlg:nHeight-25,190 BUTTON 'Salir' SIZE 80,20 PIXEL OF oDlg ACTION ( oDlg:End() )
//@ oDlg:nHeight-25, 164 BUTTON 'Ver Doc' SIZE 35,11 PIXEL OF oDlg ACTION ( VerDocs(cAlias,oBrw) )
@ oDlg:nHeight-25,280 BUTTON "SetFilter" SIZE 80,20 PIXEL OF oDlg ACTION ;
( nDocu := oBrw:aArrayData[oBrw:nArrayAt, 3] ,; //3 es la col
If( aSub == nil, ( aSub := {}, AScan( aData, { |x| If ( Eval( bFilter, x ), AAdd( aSub, x ), nil ) } ) ), nil ), ;
n := oBrw:aRow, r := oBrw:nRowSel, oBrw:aArrayData := aSub, oBrw:Refresh( .t. ), ;
oBrw:nArrayAt := Max( 1, AScan( aSub, { |x| x == n } ) ), ;
oBrw:nRowSel := r, ;
oBrw:SetFocus() )
@ oDlg:nHeight-25,370 BUTTON "ClearFilter" SIZE 80,20 PIXEL OF oDlg ACTION ;
( n := oBrw:aRow, r := oBrw:nRowSel, oBrw:aArrayData := aData, oBrw:Refresh( .t. ), ;
oBrw:nArrayat := Max( 1, AScan( aData, { |x| x == n } ) ), ;
oBrw:nRowSel := r, ;
oBrw:SetFocus() , aSub:=NIL)
ACTIVATE DIALOG oDlg CENTERED ;
ON INIT ( FitSizes( oBrw, ) , oBrw:SetSize(oDlg:nWidth,oDlg:nHeight-80) )
RELEASE FONT oFont
dbselectarea(cOldSele)
Return nil
Saludos.