FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour set filter con xbrowse da error
Posts: 18
Joined: Mon Oct 24, 2005 04:36 PM
set filter con xbrowse da error
Posted: Sat Sep 27, 2008 06:17 PM

Quisiera saber si hay soluci贸n para este error que sucede cuando se aplica un filtro usando un control xbrowse


Application

Path and name: C:\DATASOL\Datasol.Exe (32 bits)
Size: 3,490,304 bytes
Time from start: 0 hours 0 mins 19 secs
Error occurred at: 27/09/2008, 15:12:51
Error description: Error BASE/1004 No exported method: EVAL
Args:
[ 1] = L .T.

Stack Calls

Called from: => EVAL(0)
Called from: C:\FWH808\source\classes\xbrowse.prg => TXBROWSE:DELREPOS(873)
Called from: C:\FWH808\source\classes\xbrowse.prg => TXBROWSE:REFRESH(836)
Called from: PROVEEDO.PRG => (b)DEFPROV(254)
Called from: .\source\classes\TIMER.PRG => TIMEREVENT(0)
Called from: WINDOW.PRG => (b)TWINDOW:TWINDOW(592)
Called from: => TWINDOW:TIMER(0)
Called from: => TWINDOW:HANDLEEVENT(0)
Called from: WINDOW.PRG => _FWH(3299)
Called from: => DIALOGBOX(0)
Called from: DIALOG.PRG => TDIALOG:ACTIVATE(270)
Called from: PROVEEDO.PRG => DEFPROV(723)


El filtro aplicado es " Set Filter to Sto->activo ", donde es un campo l贸gico.
Con wBrowse funciona perfecto.
Agradezco su ayuda
Ricardo

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
set filter con xbrowse da error
Posted: Sat Sep 27, 2008 09:38 PM

Ricardo,

Prueba a aplicar el filtro asi:

SET FILTER TO Sto->activo == .T.

y a continuaci贸n haz:

MsgInfo( DbFilter() )

para comprobar que la expresi贸n es la escrita

De paso comprueba que tengas esta l铆nea en el m茅todo DelRepos() de la Clase TXBrowse y que no falte la "&":

        bFilter  := ( ::cAlias )->( &cFilter )
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
set filter con xbrowse da error
Posted: Sat Sep 27, 2008 09:39 PM
Este ejemplo funciona bien aqui:
#include "FiveWin.ch" 
#include "XBrowse.ch" 

function Main() 

   local oWnd, oBrw, oCol, nRecords

   USE Customer 
   
   SET FILTER TO Left( Customer->First, 1 ) == "S"
   COUNT TO nRecords
   GO TOP

   DEFINE WINDOW oWnd 
    
   @ 0, 0 XBROWSE oBrw OF oWnd ALIAS "Customer" 
    
   oCol = oBrw:AddCol() 
   oCol:bStrData = { || Customer->First } 
   oCol:cHeader = "First" 
    
   oBrw:CreateFromCode() 
   oBrw:bKeyCount = { || nRecords }
   oBrw:VSetRange( 1, nRecords )
   oBrw:oVScroll:GoTop()
    
   oWnd:oClient = oBrw 

   ACTIVATE WINDOW oWnd 

return nil
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 18
Joined: Mon Oct 24, 2005 04:36 PM
Parcialmente funcion贸
Posted: Sun Sep 28, 2008 04:10 PM

Antonio, me funcion贸 de la forma que tu me sugieres, pero si utilizo macro en la l铆na de filtro me da el mismo error, pude notar que bfilter puede devolver una cadena de caracteres como valor l贸gico.
A mi browse le hago un filtro luego de creado para filtrar los clientes de una base de datos de acuerdo a lo que se ingrese, detallo mi funci贸n.
La funci贸n DelRePos() est谩 correcta con el &


Static Function FiltroCO(oBrw,nCual)


Local nCant:=0
Local cTxt
Public cField

Default nCual to 1

if nCual=1
cTxt:="Filtrar clientes seg煤n detalle de Observaci贸n"
cfield:="observ"
elseif nCual=2
cTxt:="Filtrar clientes seg煤n el nombre"
cField:="nombre"
endif
m->cFiltroDbf:=space(20)

MsgGet(cTxt,"Filtro...",@m->cfiltroDbf)

m->cFiltroDbf := upper(cFiltroDbf)

DbSelectArea("CLI")

if !empty(m->cFiltroDbf)
set filter to at( alltrim( m->cFiltroDbf ) , cli->&( m->cField ) ) > 0
else
set filter to
release cField
endif
go top
if !empty( m->cFiltroDbf )
count to nCant
Msginfo( alltrim( str( nCant ) ) + " COINCIDENCIAS" , "...")
endif
DbGoTop()
oBrw:Refresh()
//////////////////
Return
//////////////////

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
set filter con xbrowse da error
Posted: Sun Sep 28, 2008 04:30 PM

> pero si utilizo macro en la l铆na de filtro me da el mismo error

Si, pues al aplicarle macro a una expresi贸n que empieza por & dar谩 error.

Me alegro que est茅 solucionado :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 18
Joined: Mon Oct 24, 2005 04:36 PM
??
Posted: Sun Sep 28, 2008 10:59 PM

Antonio, no entend铆 tu comentario anterior cuanto dices que dar谩 error si le aplico macro a la expresi贸n que comienza por &, pero mi filtro es:at( alltrim( m->cFiltroDbf ) , cli->&( m->cField ) ) > 0, no comienza por macro, o solamente por ten茅r macro en alg煤n lugar me dar谩 siempre error ?
Qu茅 me sugieres tu para poder realizar el filtro en este caso, he probado realizar un 铆ndice adicional con un for, pero el tiempo que demora en realizarlo es muy superior que el filtrado.
Agradezco mucho tu sugerencia y explicaci贸n sobre el error del filtro en este caso.

Ricardo

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
set filter con xbrowse da error
Posted: Mon Sep 29, 2008 12:25 AM

Ricardo,

Da error pues la expresi贸n contiene &.

Puedes cambiar:

at( alltrim( m->cFiltroDbf ) , cli->&( m->cField ) ) > 0

por:

at( alltrim( m->cFiltroDbf ) , cli->( FieldGet( FieldPos( m->cField ) ) ) ) > 0

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 18
Joined: Mon Oct 24, 2005 04:36 PM
Gracias...
Posted: Mon Sep 29, 2008 01:26 AM

Gracias por la sugerencia, la verdad que no se me hab铆a ocurrido.
Voy a probar.
Ricardo

Posts: 18
Joined: Mon Oct 24, 2005 04:36 PM
Todav铆a sin soluci贸n
Posted: Mon Sep 29, 2008 04:54 PM

Eduardo, el error persiste, pude ver que el valor de bFilter es l贸gico y al dejar la funci贸n como est谩 da error porque intenta evaluar algo que no es bloque de c贸digo, le hice esta modificaci贸n y me est谩 funcionando aparentemente.

METHOD DelRepos() CLASS TXBrowse

local lRepos := .f.
local cFilter, bFilter

if ::nDataType == DATATYPE_RDD
if ::nLen > 0
if Set( _SET_DELETED ) .and. ( ::cAlias )->( Deleted() )
( ::cAlias )->( dbSkip( 1 ) )
if ( ::cAlias )->( eof() )
( ::cAlias )->( DbGoBottom() )
endif
lRepos := .t.
elseif ! Empty( cFilter := ( ::cAlias )->( dbFilter() ) )
bFilter := ( ::cAlias )->( &cFilter )

//Modificaci贸n
if Valtype(bfilter)="C"
if &bFilter
( ::cAlias )->( dbSkip( 1 ) )
if ( ::cAlias )->( eof() )
( ::cAlias )->( DbGoBottom() )
endif
lRepos := .t.
endif

        elseif valtype(bfilter)="L"
           if bFilter
              ( ::cAlias )->( dbSkip( 1 ) )
              if ( ::cAlias )->( eof() )
                 ( ::cAlias )->( DbGoBottom() )
              endif
              lRepos := .t.
           endif
        elseif valtype(bFilter)="B"

//Fin de modificaci贸n

         if ( ::cAlias )->( Eval( bFilter ) )
            ( ::cAlias )->( dbSkip( 1 ) )
            if ( ::cAlias )->( eof() )
               ( ::cAlias )->( DbGoBottom() )
            endif
            lRepos := .t.
         endif
  • endif
    endif
    endif
    endif

return lRepos

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
set filter con xbrowse da error
Posted: Tue Sep 30, 2008 05:54 PM

Ricardo,

usando: SET FILTER TO Customer->Married

que es un campo l贸gico, el ejemplo que te hemos proporcionado funciona correctamente, sin necesidad de cambiar nada en la Clase TXbrowse.

regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion