Page 1 of 1

Búsqueda incremental en Array filtrado

Posted: Wed Jul 22, 2020 8:56 pm
by acuellar
Buenas estimados

Con éste ejemplo de Mr. RAO

Code: Select all

#include "fivewin.ch"

Function Main()

   local oDlg, oBrw, oFont
   local aData

   USE CUSTOMER
   aData := FW_DbfToArray( "FIRST,LAST,STATE" )
    CLOSE CUSTOMER 

   DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-14
   DEFINE DIALOG oDlg SIZE 700,500 PIXEL TRUEPIXEL FONT oFont

   @ 60,20 XBROWSE oBrw SIZE -20,-20 PIXEL OF oDlg ;
      DATASOURCE aData AUTOCOLS HEADERS "First", "Last", "State" ;
      CELL LINES NOBORDER FOOTERS AUTOSORT 

   WITH OBJECT oBrw
      :lIncrFilter:= .t.
      :lSeekWild  := .t.
      :aCols[ 1 ]:bFooter  := { || "Records : " + Str( oBrw:nLen ) }
      :CreateFromCode()
     
   END
   @ 20,450 SAY oBrw:oSeek VAR oBrw:cSeek SIZE 150,20 PIXEL OF oDlg COLOR { 0,16777215 }
   @ 10, 20 BTNBMP PROMPT "Set Filter" SIZE 200,40 PIXEL OF oDlg FLAT ;
      ACTION ( xSetFilter( oBrw ), oBrw:SetFocus() )

   @ 10,240 BTNBMP PROMPT "Clear Filter" SIZE 200,40 PIXEL OF oDlg FLAT ;
      ACTION ( xClearFilter( oBrw ), oBrw:SetFocus() )

   ACTIVATE DIALOG oDlg CENTERED
   RELEASE FONT oFont

Return nil

Function xSetFilter( oBrw )
   local cFilter  := ""
   local oCol, c
 
   cFilter:= "'NY' $ Upper( cValToChar( aRow[3] ) )" 
   cFilter  := "{ |c,aRow,oBrw| " + cFilter + " }"
   oBrw:bFilterExp  := &( cFilter )
   oBrw:ArrayIncrFilter( "dummy" )
   oBrw:Refresh()
   oBrw:SetFocus()
Return .t.

Function xClearFilter( oBrw )
   If oBrw:nLen < Len( oBrw:aArrayData )
      oBrw:bKeyCount    := { || Len( oBrw:aArrayData ) }
      oBrw:Refresh()
   Endif
   oBrw:SetFocus()
   If oBrw:nLen >= 2
      ASort( oBrw:aArrayData,,, { |x, y| if( x[1]==y[1], x[2]<y[2], x[1]<y[1] ) })
   EndIF
return .t.
 
Al dar Set Filter la filtra por el State="NY". Necesito hacer búsqueda incremental en lo filtrado.
Una solución sería hacer algo como Scope ó pasar a un nuevo Array lo filtrado (No se como hacerlo)

Gracias por la ayuda.

Re: Búsqueda incremental en Array filtrado

Posted: Thu Jul 23, 2020 7:47 am
by acuellar
Help Mr. Rao

Re: Búsqueda incremental en Array filtrado

Posted: Thu Jul 23, 2020 6:31 pm
by acuellar
Estimados

Lo he logrado de ésta manera

Code: Select all

#include "fivewin.ch"

Function Main()
   local oDlg, oFont,aData:= {}
   Private oBrw,aFiltro:={}

   USE data\customer Alias calias 
   aTodos:=FW_DbfToArray( "FIRST,LAST,STATE" )
   CLOSE calias 
   aData:=aTodos

   DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-14
   DEFINE DIALOG oDlg SIZE 700,500 PIXEL TRUEPIXEL FONT oFont

   @ 60,20 XBROWSE oBrw SIZE -20,-20 PIXEL OF oDlg DATASOURCE aData AUTOCOLS;
   COLUMNS 1,2,3 ;
   HEADERS "FIRST","LAST","STATE" ;
   JUSTIFY AL_LEFT,AL_LEFT, AL_CENTER ;
   COLSIZES 200,200,50;
   CELL LINES NOBORDER FOOTERS AUTOSORT 
  
   WITH OBJECT oBrw
      :lIncrFilter:= .t.
      :lSeekWild  := .t.
      :aCols[ 1 ]:bFooter  := { || "Records : " + Str( oBrw:nLen ) }
      :CreateFromCode()
     
      WITH OBJECT :FIRST
        :bLClickHeader:= {|| Inicio() }
      END
      WITH OBJECT :LAST
        :bLClickHeader:= {|| Inicio() }
      END
      WITH OBJECT :STATE
        :bLClickHeader:= {|| Inicio() }
      END
   END
   @ 20,450 SAY oBrw:oSeek VAR oBrw:cSeek SIZE 150,20 PIXEL OF oDlg COLOR { 0,16777215 }
   @ 10, 20 BTNBMP PROMPT "Set Filter" SIZE 200,40 PIXEL OF oDlg FLAT ;
      ACTION ( xSetFilter( oBrw ), oBrw:SetFocus() )

   @ 10,240 BTNBMP PROMPT "Clear Filter" SIZE 200,40 PIXEL OF oDlg FLAT ;
      ACTION ( xClearFilter( oBrw ), oBrw:SetFocus() )

   ACTIVATE DIALOG oDlg CENTERED 
   RELEASE FONT oFont

Return nil

Function xSetFilter( oBrw )
   If Len(aFiltro)=0
     USE data\CUSTOMER Alias cAlias 
     aFiltro := FW_DbfToArray( "FIRST,LAST,STATE",{ || FIELD->STATE = "NY" } )
     CLOSE cAlias 
     aData:=aFiltro
     oBrw:SetArray(aData,.T.)
    Endif
   oBrw:aCols[1]:SetOrder()
   ASort( oBrw:aArrayData,,, { |x, y| if( x[1]==y[1], x[2]<y[2], x[1]<y[1] ) })
   Inicio()

Return .t.

Function xClearFilter( oBrw )
   If len(aFiltro)>0
     aFiltro:={}
     aData:=aTodos
     oBrw:SetArray(aData,.T.)
   Endif
   oBrw:aCols[1]:SetOrder()
   If oBrw:nLen < Len( oBrw:aArrayData )
      oBrw:bKeyCount    := { || Len( oBrw:aArrayData ) }
   Endif
   ASort( oBrw:aArrayData,,, { |x, y| if( x[1]==y[1], x[2]<y[2], x[1]<y[1] ) })
   Inicio()
return .t.
*
Function Inicio()
  oBrw:Seek( "" )
  oBrw:cSeek:="";oBrw:oSeek:Refresh()
  oBrw:Refresh();oBrw:Setfocus();oBrw:GoTop()
Return .T.
 
Debe haber otra manera sin necesidad de estar cargando la tabla desde la DBF

Lo que no he podido lograr es que al hacer doble clip sobre el Header la búsqueda se por esa columna

Gracias por la ayuda.

Re: Búsqueda incremental en Array filtrado

Posted: Thu Jul 23, 2020 7:00 pm
by cnavarro

Re: Búsqueda incremental en Array filtrado

Posted: Fri Jul 24, 2020 2:12 pm
by acuellar
Muchas gracias estimado Cristobal

No encontré nada de lo que necesito.

Re: Búsqueda incremental en Array filtrado

Posted: Fri Jul 24, 2020 11:32 pm
by nageswaragunupudi
Al dar Set Filter la filtra por el State="NY". Necesito hacer búsqueda incremental en lo filtrado.
Set

Code: Select all

:lIncrFilter := .F.
 
You may set the value of :lSeekWild to .T. or .F. as you require.

Re: Búsqueda incremental en Array filtrado

Posted: Sat Jul 25, 2020 1:15 pm
by acuellar
Thanks Mr. Rao

I solved it with: oBrw:cFilterFld:="COLUMN"

Regards,