Page 1 of 1
set filter con xbrowse da error
Posted: Sat Sep 27, 2008 6:17 pm
by riesrovi
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
Posted: Sat Sep 27, 2008 9:38 pm
by Antonio Linares
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 )
Posted: Sat Sep 27, 2008 9:39 pm
by Antonio Linares
Este ejemplo funciona bien aqui:
Code: Select all
#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
Parcialmente funcionó
Posted: Sun Sep 28, 2008 4:10 pm
by riesrovi
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
//////////////////
Posted: Sun Sep 28, 2008 4:30 pm
by Antonio Linares
> 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
??
Posted: Sun Sep 28, 2008 10:59 pm
by riesrovi
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
Posted: Mon Sep 29, 2008 12:25 am
by Antonio Linares
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
Gracias...
Posted: Mon Sep 29, 2008 1:26 am
by riesrovi
Gracias por la sugerencia, la verdad que no se me había ocurrido.
Voy a probar.
Ricardo
Todavía sin solución
Posted: Mon Sep 29, 2008 4:54 pm
by riesrovi
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
Posted: Tue Sep 30, 2008 5:54 pm
by Antonio Linares
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.