我可以在SET FILTER TO中使用一个功能吗?

时间:2016-01-20 13:45:45

标签: visual-foxpro foxpro

我有一个简单的功能

FUNCTION TEST
    LOCAL lcExp
    FOR I = 0 TO 10
        lcExp = lcExp + " AND plz="+STR(I)
    ENDFOR
    RETURN lcExp
ENDFUNC

这只是一个例子。这些功能在这里毫无意义。

现在我想使用此函数为SET FILTER构建我的字符串。 我试过了

SET FILTER TO test()

SET FILTER TO EVALUATE(test())

任何人都知道如何使这个工作?

我正在使用visual foxpro8。谢谢你的帮助。

3 个答案:

答案 0 :(得分:0)

第一种语法 - SET FILTER TO test() - 完全可以,只要Fox可以找到该功能。例如。如果函数位于SET PROCEDURE TO foo ADDITIVE

,则可能需要执行foo.prg

但是,当光标打开浏览时,将为频繁不同的记录频繁调用该函数,因为Fox需要调用过滤器来找出“活动”的内容。记录是 - 即那些通过过滤表达式的记录。如果执行以下命令,则可以看到此信息:

strto("debugout alias(), recno()", "foo.prg")
set proc to foo addi
acti wind debug
sele 0
use sys(2005) shar noup agai
brow last nowa
set filt to foo()

如果你想在当前记录发生变化时达到一些副作用,那么为了这个目的可以更好地滥用SET RELATION,因为它只会被调用当前记录。

显然,SET RELATION需要一些目标光标,因此用于此技巧的函数通常会接收索引表达式作为其第一个参数,并在执行一些有趣的操作后将其传递给它(即RETURN) 。 Fox经常评估关系表达式,这意味着最好缓存密钥并仅在密钥更改时执行副作用。

我几十年来一直在使用它,以使Fox开始显示与当前表格中的键相关的图像(我们做了很多处方表格处理)。如果需要,热键实例化全局图像管理器并设置当前工作区的关系(如果需要,使用虚拟接收器光标),从那时起,我总能看到当前记录可能的图像。第二次按下热键就会解开整个shebang。简单,高效,血腥方便。

话虽如此,我认为有效(ab)使用过滤器和关系表达式的副作用非常少而且很远......

P.S。:如果你有一个函数返回一个你想用作过滤器的表达式,那么你必须在变量中捕获表达式,这样你就可以使用docs调用宏替换的内容:

local cExpr
cExpr = test()
set filter to &cExpr

如果您使用

set filter to evaluate(test())   && usually a bad idea!

然后每次Fox需要评估过滤时,都会重新计算过滤器表达式,这通常是确实。

如果您使用

local cExpr
cExpr = test()
set filter to evaluate(m.cExpr)  && often not a good idea!

然后,一旦执行离开本地范围,变量就不可用。通过对表达式使用全局变量可以避免这个问题,但是将表达式编译到过滤器中(通过宏替换)会更有效。对于具有非顺势疗法记录计数的表格,差异变得非常显着......

答案 1 :(得分:0)

您的函数需要返回布尔值值 - > .T。| .F

LOCAL llok
llok = "a" $ contact and  LEFT(city,1) = "C"
RETURN llok

myFilter.prg:

mod_rewrite

答案 2 :(得分:0)

使用"设置过滤器"本身并不是一个好主意。许多Foxpro开发人员都在他们的列表中没有使用命令"。它的行为很丑陋,你可能会遇到不可预测的结果。不值得展示它的副作用,只是不要使用它。