2016-01-20 39 views
0

我有一個簡單的功能我可以使用函數在SET FILTER TO

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

只是不要移動函數中的記錄指針。 –

+2

我在很多很多年的應用程序中都沒有使用過濾器。你想在這裏完成什麼?可能有更好的方法。 –

回答

0

第一種語法 - SET FILTER TO test() - 只要Fox能找到函數就完全沒問題。例如。如果函數駐留在foo.prg中,則可能需要執行SET PROCEDURE TO foo ADDITIVE

但是,當瀏覽器打開遊標時,該函數將被頻繁地調用,因爲Fox需要調用過濾器來查找'活動'記錄是什麼 - 即那些通過過濾器表達式的記錄。你可以看到這一點,如果你執行以下命令:如果你想達到一定的副作用,只要當前記錄的更改,然後它可以爲宗旨更好地濫用SET RELATION

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需要一些目標遊標,因此用於該技巧的函數通常會接收一個索引表達式作爲其第一個參數,並在做了一些有趣的事情之後將其傳遞(即RETURN it)。 Fox經常對關係表達式進行評估,這意味着最好是緩存鍵值,並且只有在鍵值發生變化時才執行副作用。

我一直在使用這個工作數十年,現在讓福克斯開始顯示與當前表中的鍵相關的圖像(我們做了很多處方表單處理)。如果需要,熱鍵會實例化全局圖像管理器,並設置當前工作區的關係(如果需要,可以使用虛擬接收器光標),從那時起,無論當前的記錄如何,我總能看到圖像。第二次按下熱鍵解除了整個shebang。簡單,高效,血腥方便。

話雖如此,我認爲有效的(AB)濾波器和關係式的使用副作用非常少之間很遠......

PS:如果你有一個函數返回一個表達式你想作爲一個過濾器使用,那麼你必須趕上一個變量表達式,這樣就可以使用什麼文檔調用宏替換:

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! 

則變量不會一次執行離開局部範圍內可用。通過爲表達式使用全局變量可以避免這個問題,但是將表達式編譯到過濾器(通過宏替換)會更有效。這種差異變得非常顯着,有非順勢記錄計數表...

0

你的功能將需要返回一個布爾值值 - > .t。| .f。

USE (_samples + "data\customer") 
SET FILTER TO myFilter() 
browse 

myFilter.prg:

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

使用 「設置過濾器」 本身並不是一個好主意。許多Foxpro開發人員將它列入「不使用命令」的列表中。它的行爲很醜,你可能會遇到不可預知的結果。這是不值得展示其副作用,根本不使用它。

相關問題