2016-11-19 7 views
0

単純なタスク(日付範囲と従業員番号のすべてのレコードを選択)を行うには、VFPでselect文を変更する必要があります。私は考えることができるすべてを試みました。私はSQLでそれを行うことができます選択を知っているが、私はカーソルを持っていないテーブルを使用したい。INDEX ON日付範囲とUniqe番号VFP

私は私が私のフォーマットが間違っているかINDEX ON動作しますが、知っているこの

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

ような何かをしようとしています。

答えて

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

Welpは本当にフィルタが好きではありませんが、いずれか良いアイデアがあれば教えてください!

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

set filterを使用する場合は、空の 'set filter to'を実行してから、実際に 'set filter'文を実行してください。 VFPが変更されていない限り、それは私にとって奇妙な結果を返すことがありました。 – Hank