FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Uso de DBSETFILTER y SET FILTER con variables.
Posts: 13
Joined: Mon Feb 26, 2007 10:00 AM
Uso de DBSETFILTER y SET FILTER con variables.
Posted: Wed Sep 26, 2007 11:46 AM
Intentando sustituir un filtro construido por SET FILTER por uno hecho con DBSETFILTER, me he encontrado con un error que no soy capaz de solventar. Os adjunto un codigo de "ejemplo".

LOCAL cCadena:="MANUEL"

SET FILTER TO AT(cCadena, _FIELD->NOMBRE) > 0
//Este filtro, funciona perfectamente.


Ahora supongamos, que en vez de usar este c贸digo, usamos este otro:

LOCAL cCadena:="MANUEL"
LOCAL cFiltro, bFiltro

cFiltro:="AT(cCadena, _FIELD->NOMBRE) > 0"
bFiltro:="{||"+cFiltro+"}"
DBSETFILTER(&bFiltro, cFiltro)


Si lo hago as铆, recibo un error en tiempo de ejecuci贸n que me se帽ala que DBSETFILTER no reconoce la variable cCadena, pero en cambio el SET FILTER si.

He intentado mandarla como 'parametro' al codeblock:
bFiltro:="{|cCadena|"+cFiltro+"}"
. Tampoco funciona as铆.

驴Como puedo hacer para que DBSETFILTER me reconozca la variable local? Curioso es que este trozo de c贸digo tampoco funciona.
SET FILTER TO AT(cCadena, _FIELD->NOMBRE) > 0 //Establezco el filtro
cFiltro:=DBFILTER() //Lo envio a una cadena de caracteres
DBCLEARFILTER() //Elimino filtros activos
bFiltro:="{||"+cFiltro+"}" 
DBSETFILTER(&bFiltro, cFiltro) //Lo asigno...


Provoca el mismo error en tiempo de ejecuci贸n. 驴Alguna sugerencia? Gracias de antemano.
Posts: 364
Joined: Tue Oct 25, 2005 07:06 PM
Uso de DBSETFILTER y SET FILTER con variables.
Posted: Wed Sep 26, 2007 12:35 PM

HAS PROBADO

cFiltro:="AT(&cCadena, _FIELD->NOMBRE) > 0"

Software especializado para oficinas contables con grandes volumenes de Informacion
Impresion de todos los formularios del Seniat, Dian

alex_patino74@hotmail.com
whatsapp 57+3214777217
Posts: 13
Joined: Mon Feb 26, 2007 10:00 AM
Uso de DBSETFILTER y SET FILTER con variables.
Posted: Wed Sep 26, 2007 12:47 PM
Si. De hecho fue lo primero que probe. Provoca el mismo error en tiempo de ejecuci贸n. DBSETFILTER no es capaz de reconocer la variable local si se le manda via & como si se le envia via @.

He encontrado una soluci贸n dr谩stica para este problema, que me he ha dado mas de tres o cuatro horas de quebraderos de cabeza hasta que por fin, he encontrado el como, pero estoy seguro de que hay alguna manera de que el codeblock reconozca una variable pasandosela como parametro... He aqui el codigo:

LOCAL cCadena:="Manuel"
LOCAL cFiltro, bFiltro

cFiltro:="(AT("+CHR(34)+cCadena+CHR(34)+",UPPER(_FIELD->NOMBRE)) > 0"
bFiltro:="{||"+cFiltro+"}"
DBSETFILTER(&bFiltro,cFiltro)


Ojo al dato. Consiste en hacerle pasar a DBSETFILTER los datos 'digeridos'. Lo tedioso del asunto es que hay que pasarle las comillas via CHR (caracter 34) cerrando y abriendo la cadena. Con esto se consigue sustituir la variable por su valor real. No es lo mas optimo, y si alguno de ustedes sabe como hacer para que el codeblock de DBSETFILTER me reconozca la variable, me har铆a un gran favor.
Posts: 1074
Joined: Fri Oct 07, 2005 01:56 PM
Uso de DBSETFILTER y SET FILTER con variables.
Posted: Wed Sep 26, 2007 01:20 PM
dbSetFilter( {|| AT(cCadena, _FIELD->NOMBRE) > 0}, "AT(cCadena, _FIELD->NOMBRE) > 0" )


nota:

Lo puedes hacer tambien utilizando la opcion del compilador /p

este te va generar un archivo.ppo

o sea si colocas SET FILTER TO AT(cCadena, _FIELD->NOMBRE) > 0
el archivo .ppo te lo va traducir
dbSetFilter( {|| AT(cCadena, _FIELD->NOMBRE) > 0}, "AT(cCadena, _FIELD->NOMBRE) > 0" )

saludos
Saludos
Patricio

__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
Posts: 989
Joined: Thu Nov 24, 2005 03:01 PM
Uso de DBSETFILTER y SET FILTER con variables.
Posted: Wed Sep 26, 2007 02:04 PM
new_indika wrote:Si. De hecho fue lo primero que probe. Provoca el mismo error en tiempo de ejecuci贸n. DBSETFILTER no es capaz de reconocer la variable local si se le manda via & como si se le envia via @.

He encontrado una soluci贸n dr谩stica para este problema, que me he ha dado mas de tres o cuatro horas de quebraderos de cabeza hasta que por fin, he encontrado el como, pero estoy seguro de que hay alguna manera de que el codeblock reconozca una variable pasandosela como parametro... He aqui el codigo:

LOCAL cCadena:="Manuel"
LOCAL cFiltro, bFiltro

cFiltro:="(AT("+CHR(34)+cCadena+CHR(34)+",UPPER(_FIELD->NOMBRE)) > 0"
bFiltro:="{||"+cFiltro+"}"
DBSETFILTER(&bFiltro,cFiltro)


Ojo al dato. Consiste en hacerle pasar a DBSETFILTER los datos 'digeridos'. Lo tedioso del asunto es que hay que pasarle las comillas via CHR (caracter 34) cerrando y abriendo la cadena. Con esto se consigue sustituir la variable por su valor real. No es lo mas optimo, y si alguno de ustedes sabe como hacer para que el codeblock de DBSETFILTER me reconozca la variable, me har铆a un gran favor.


El problema es que las variables locales no pueden ser usadas en expresiones din谩micas, digamos de manera simplificada que el compilador no guarda el nombre.

Si cambias Local cCadena por Private cCadena te funcionar谩 bien, porque las privates se crean en runtime por lo tanto se las puede invocar por nombre. Obviamente son mucho mas lentas.

Yo preferir铆a usar la opci贸n de armar la expresi贸n entre comillas, la evaluaci贸n es m谩s r谩pida porque no tiene que resolver el nombre de ninguna variable.
Y para optimizar un poquito m谩s, en lugar de usar la funci贸n AT() puedes usar el operador $ como en:
cFiltro:= CHR(34)+cCadena+CHR(34)+" $ UPPER(_FIELD->NOMBRE)"
o Bien :

Set Filter to "Manuel"$Upper( _Field->Nombre)

Saludos,

Carlos
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
鈥淚f you think education is expensive, try ignorance"
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Uso de DBSETFILTER y SET FILTER con variables.
Posted: Wed Sep 26, 2007 02:10 PM
QAZWSX2K wrote:HAS PROBADO

cFiltro:="AT(&cCadena, _FIELD->NOMBRE) > 0"


Mejor a煤n,

cFiltro:="AT(" + cCadena + ", _FIELD->NOMBRE) > 0"

Saludos
Carlos G.

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Continue the discussion