INDEX ON日期范围和Uniqe数字VFP

时间:2016-11-19 22:02:56

标签: sorting select indexing visual-foxpro

我需要在VFP中更改select语句来执行简单任务(选择日期范围内的所有记录和员工编号)。我已经尝试了我能想到的一切。我知道我可以在SQL select中执行它,但我只想使用我拥有的表而不是光标。

我正在尝试这样的事情

iPad

我知道INDEX ON Date >= ThisForm.DateFrom+Date + Date=< ThisForm.DateTo+ALLTRIM(empid) TAG MyOrder 是如何工作的,但我的格式错了。

2 个答案:

答案 0 :(得分: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和date的索引,对...的简单扫描也会这样做。即:

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

答案 1 :(得分:0)

Welp并不喜欢过滤器,但如果有任何人有更好的想法,请告诉我!

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