将过滤器设置为 - INLIST - Visual Foxpro 7

时间:2012-02-08 22:46:52

标签: visual-foxpro foxpro

我正在研究一些遗留代码,我有以下很棒的问题。我希望一些FoxPro专家可以提供帮助!

这个遗留系统的基础结构已经设置好,所以我必须使用内置的表达式引擎来返回结果集,所以不要继续使用SQL(我知道这会更容易!)

这是问题所在。

我需要能够做类似

的事情
PUBLIC ARRAY(20) ArrayOfValuesToFilterBy

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

但是,我知道这不起作用,我只需要等效......不使用SQL。

我可以生成要通过SQL过滤的值列表,而不是由于遗留基础结构约束而导致的最终记录选择。

谢谢!

3 个答案:

答案 0 :(得分:2)

首先,您不必进行明确的逻辑字段

将过滤器设置为Logicalfield = .t。

你可以做到

将过滤器设置为LogicalField 要么 将过滤器设置为NOT LogicalField

接下来,在阵列上。 VFP有一个函数ASCAN(),它将扫描数组中的值,如果找到,将返回数组中与您要查找的匹配的行号。

至于阵列... ex: DIMENSION MyArray [3] MyArray [1] =“test1” MyArray [2] =“某事” MyArray [3] =“其他任何东西”

? ASCAN(MyArray,“其他”)&&这将返回0 ? ASCAN(MyArray,“其他任何东西”)&&这将返回3

如果您正在执行“设置过滤器”,则数组需要在过滤器的持续时间内“在范围内”。如果在一个过程中设置过滤器数组存在,请保留该过程并且数组已经消失,您已完成。

所以,你可以做到

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

现在,如果你想要一个子集来处理,你可以做一个SQL-Select并将数据拉成一个CURSOR(临时读写表),它具有与原始表相同的功能(除了自动递增时)相加)...

我通常将名为“C_”的临时游标命名为“CURSOR OF”,因此当我使用表格时,我知道它的生产数据,还是仅用于临时目的,以便更快地显示,演示,提取其他内容根据需要来源。

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

然后,你可以使用它......

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

或..绑定到表单中的网格等...

答案 1 :(得分:0)

INLIST()函数使用表达式搜索最多24个相同数据类型的表达式进行搜索。

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

答案 2 :(得分:0)

我在这里做了一些假设,你想要做的是创建一个带有动态列表语句的过滤器?如果这是正确的,可以玩这个例子: -

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+")"

上述结果将创建以下过滤器语句并将其存储在lcFilter

将过滤器设置为INLIST(PCode,'ABCD','EFGH','IJKL','MNOP','QRST')

然后你可以使用宏替换

Select dataTable
&lcFilter 

请记住,您可以在INLIST()语句中定义的项目数量有一些限制