我有一个简单的功能
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。谢谢你的帮助。
答案 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开发人员都在他们的列表中没有使用命令"。它的行为很丑陋,你可能会遇到不可预测的结果。不值得展示它的副作用,只是不要使用它。