2012-02-08 7 views
0

私はいくつかのレガシーコードに取り組んでおり、次の素晴らしい問題があります。私はFoxProの専門家が助けることを望んでいる!私は内蔵の表現エンジンの結果セットを返すために使用する必要がありますようにフィルタを設定する - INLIST - Visual Foxpro 7

このレガシーシステムのインフラを設置しているので、SQLには行く(私はそれがとても容易になるだろう知っている!)

ここに問題があります。私は

PUBLIC ARRAY(20) ArrayOfValuesToFilterBy 

SELECT dataTable 
SET FILTER TO logicalField = .T. and otherField NOT INLIST(ArrayOfValuesToFilterBy) 

ような何かを行うことができるようにする必要があり

はしかし、私はこの文句を言わない仕事を知って、私はちょうど等価を必要とする... SQLを使用していません。

従来のインフラストラクチャの制約のために、最終レコードの選択ではなく、SQLを使用してフィルタリングする値のリストを生成できます。

ありがとうございます!

+0

でefineは、ASCANを適用した後、私の正確なコードは\t \tがgly_is_cshするのGly \t \tセットフィルタを選択して...このように見えたASCAN(pRestrictedVendors、gly_srcdsc)= 0 –

答えて

2

まず、論理的なフィールドは、あなたはLogicalfield = .Tへの明示的な

セットフィルタを行う必要はありません。

あなただけのアレイ上で、次

をLogicalFieldないようにLogicalField または セットフィルタへ

セットフィルタを行うことができます。 VFPには配列の値を検索するASCAN()関数があります。見つかった場合は、探している配列と一致する配列内の行番号を返します。アレイ用として

...例: DIMENSION MyArrayという[3] MyArrayという[1] = "TEST1" MyArrayという[2] = "何か" MyArrayという[3] = "何か"

? ASCAN(MyArray、 "else")& &これは0 を返しますか? ASCAN(MyArray、 "anything else")& &これは3を返します。

"セットフィルタ"を実行している場合、その配列はフィルタの有効期間内に「有効範囲内」である必要があります。プロシージャでフィルタを設定した場合、配列は存在しますが、プロシージャを終了すると配列はなくなります。

だから、あなたはそれが持っているあなたはサブセットがWITHを仕事をしたい場合、あなたはSQL-選択を行うことができますし、(一時的な読み書き表)CURSORにデータを引き出し、今

set filter to LogicalField and ASCAN(YourArray, StringColumnFromTable) > 0 

を行うことができます(追加時の自動インクリメントを除く)...

私は通常、テーブルを使って作業しているときに、 "CUR"のプレフィックス "C_"のテンポラリカーソルに名前を付けます。その生産データ、または必要に応じて他の起源からの迅速な表示、提示、抽出のための一時的な目的のためだけに利用可能である。その後

use in select("C_FinalRecords") 
select * from YourTable ; 
    where LogicalField ; 
    and ASCAN(YourArray, StringColumnFromTable) > 0; 
    into cursor C_FinalRecords READWRITE 

、あなただけの、私はここにいくつかの仮定を作っています...など、フォームのグリッドに

+0

ASCANは完璧に働いています...論理的な、非常に徹底的な答えについてのヒントについて感謝します! –

0

INLIST()関数は、検索する同じデータ型の式を24個まで検索します。

SELECT dataTable 
SET FILTER TO logicalField = .T. AND NOT INLIST(otherField, 'Value1', 'Value2', 'Value3', 'Value4') 
+0

この意志私がしたいことをしないでください。私はINLIST()関数が何をしているのか知っていますが、実行時にこのようなハードパラメータを指定することはできません。 @DRappには完璧なソリューションがありました。 Daveを試してくれてありがとう! –

0

をその...

select C_FinalRecords 
scan 
    do something with the record, or values of it... 
endscan 

か...バインドを使用することができますあなたがしたいことは、listステートメントで動的なフィルタを作成することですか?これは正しい。この例で遊びを持っている場合: -

lcList1="ABCD" 
lcList2="EFGH" 
lcList3="IJKL" 
lcList4="MNOP" 
lcList5="QRST" 

lcFullList="" 
lcFullList=lcFullList+"'"+lcList1+"'," 
lcFullList=lcFullList+"'"+lcList2+"'," 
lcFullList=lcFullList+"'"+lcList3+"'," 
lcFullList=lcFullList+"'"+lcList4+"'," 
lcFullList=lcFullList+"'"+lcList5+"'" 



lcField="PCode" 

lcFilter="SET FILTER TO INLIST ("+lcField+","+lcFullList+")" 

上記の結果は、INLIST TO SETフィルタ(Pコード、「ABCD」を、以下のフィルタステートメントを作成し、lcFilter

に保存します、 「EFGH」、「IJKL」、「MNOP」、「QRST」)

あなたは、あなたがことができますどのように多くの項目のいくつかの制限がありそうであることを念頭に置いて、マクロ置換

Select dataTable 
&lcFilter 

ベアを使用することができますd INLIST()文で誰不思議のために

+0

応答のおかげで、ヒュー、これは、私が当時フィルタについて知っていたと仮定して、ある程度は機能します。しかし、答えとして選択されたASCANメソッドは優れています。リテラルの数に制限はなく、結果を達成するためにコードが少なくて済むからです。 –

関連する問題