2016-11-19 18 views
0

我需要更改VFP中的select語句以執行簡單任務(選擇日期範圍內的所有記錄和員工編號)。我嘗試了所有我能想到的。我知道我可以在SQL select中做到這一點,但我只想使用我擁有的表格而不是遊標。INDEX ON日期範圍和唯一編號VFP

我想這樣

INDEX ON Date >= ThisForm.DateFrom+Date + Date=< ThisForm.DateTo+ALLTRIM(empid) TAG MyOrder 

東西,我知道如何INDEX ON的作品,但我的格式是錯誤的。

回答

0

也許你的意思是過濾掉的索引。但是你不需要做這樣的事情。你可以簡單地有一個索引結合員工號碼(我認爲它是一個整數)和日期。然後,你可以使用一個簡單的for和while範圍子句或範圍或類似的(你真的沒有解釋你會做什麼) - 甚至一個SQL可能是更容易的方式取決於你會做什麼。 即:(使用日期作爲列名是一個壞主意,但那是另一回事)

INDEX ON padl(empId, 10, '1') + dtoc(Date,1) TAG MyOrder 

有這樣一個指標,你可以掃描所有記錄中的日期範圍這樣的給定僱員:

local lnEmployee, lcStart, lcEnd 
lnEmployee = 1 && whatever the employee number is 
lcStart = padl(m.lnEmployee, 10, '1')+dtoc(ThisForm.DateFrom,1) 
lcEnd = padl(m.lnEmployee, 10, '1')+dtoc(ThisForm.DateTo,1) 

scan for padl(empId, 10, '1') + dtoc(Date,1) >= m.lcStart and ; 
    padl(empId, 10, '1') + dtoc(Date,1) <= m.lcEnd 
* whatever 
endscan 

這將做同樣的:

local lnEmployee, lcStart, lcEnd 
lnEmployee = 1 && whatever the employee number is 
lcStart = padl(m.lnEmployee, 10, '1')+dtoc(ThisForm.DateFrom,1) 
lcEnd = padl(m.lnEmployee, 10, '1')+dtoc(ThisForm.DateTo,1) 
set order to tag myOrder 
set range to m.lcStart, m.lcEnd 
scan 
* whatever 
endscan 

PS:其實對EMPID和日期指標,對...一個簡單的掃描會做了。即:

scan for empId = m.lnEmpoyee and ; 
     Date >= ThisForm.DateFrom and ; 
     Date <= ThisForm.DateTo 
    *... 
endscan 
+0

管理謝謝生病嘗試一些他們可能是一個更好的解決方案謝謝! – user2435026

0

韋爾普不喜歡過濾器,但如果任何人有更好的主意讓我知道!

Set Filter To Date >= ThisForm.DateFrom .And. Date =< ThisForm.DateTo .And. EmpID = AllTrim(ThisForm.Combo1.Value) 
+0

如果您要使用設置過濾器,請確保您執行一個空的「設置過濾器」,然後執行實際的「設置過濾器」語句。除非VFP已經改變,否則過去會爲我返回一些奇怪的結果。 – Hank