FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Búsqueda incremental en Array filtrado
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Búsqueda incremental en Array filtrado
Posted: Wed Jul 22, 2020 08:56 PM
Buenas estimados

Con éste ejemplo de Mr. RAO
Code (fw): Select all Collapse
#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.
Saludos,



Adhemar C.
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Re: Búsqueda incremental en Array filtrado
Posted: Thu Jul 23, 2020 07:47 AM

Help Mr. Rao

Saludos,



Adhemar C.
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Re: Búsqueda incremental en Array filtrado
Posted: Thu Jul 23, 2020 06:31 PM
Estimados

Lo he logrado de ésta manera
Code (fw): Select all Collapse
#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.
Saludos,



Adhemar C.
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Búsqueda incremental en Array filtrado
Posted: Thu Jul 23, 2020 07:00 PM
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Re: Búsqueda incremental en Array filtrado
Posted: Fri Jul 24, 2020 02:12 PM

Muchas gracias estimado Cristobal

No encontré nada de lo que necesito.

Saludos,



Adhemar C.
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Búsqueda incremental en Array filtrado
Posted: Fri Jul 24, 2020 11:32 PM
Al dar Set Filter la filtra por el State="NY". Necesito hacer búsqueda incremental en lo filtrado.


Set
Code (fw): Select all Collapse
:lIncrFilter := .F.


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



G. N. Rao.

Hyderabad, India
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Re: Búsqueda incremental en Array filtrado
Posted: Sat Jul 25, 2020 01:15 PM

Thanks Mr. Rao

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

Regards,

Saludos,



Adhemar C.

Continue the discussion