我正在研究一些遗留代码,我有以下很棒的问题。我希望一些FoxPro专家可以提供帮助!
这个遗留系统的基础结构已经设置好,所以我必须使用内置的表达式引擎来返回结果集,所以不要继续使用SQL(我知道这会更容易!)
这是问题所在。
我需要能够做类似
的事情PUBLIC ARRAY(20) ArrayOfValuesToFilterBy
SELECT dataTable
SET FILTER TO logicalField = .T. and otherField NOT INLIST(ArrayOfValuesToFilterBy)
但是,我知道这不起作用,我只需要等效......不使用SQL。
我可以生成要通过SQL过滤的值列表,而不是由于遗留基础结构约束而导致的最终记录选择。
谢谢!
答案 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()语句中定义的项目数量有一些限制