INDEX ON 日期范围和唯一编号 VFP

INDEX ON Date Range and a Uniqe Number VFP

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

我正在尝试这样的事情

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

我知道 INDEX ON 的工作原理,但我的格式不对。

也许您指的是过滤索引。但是你不需要做这样的事情。您可以简单地拥有一个结合员工编号(我想它是一个整数)和日期的索引。然后你可以使用一个简单的 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

我们不太喜欢过滤器,但如果有人有更好的主意请告诉我!

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