重复搜索
这可以通过多种方式完成。这是一个例子:
DEFINE TEMP-TABLE customer NO-UNDO
FIELD cusname AS CHARACTER
FIELD num AS INTEGER.
DEFINE VARIABLE compnum AS INTEGER NO-UNDO.
DEFINE VARIABLE compname AS CHARACTER NO-UNDO.
DEFINE QUERY qSearch FOR customer.
FORM compname compnum WITH FRAME f1.
/* Create some bogus data */
CREATE customer.
ASSIGN customer.cusname = "john doe"
customer.num = 1.
CREATE customer.
ASSIGN customer.cusname = "jane doe"
customer.num = 2.
CREATE customer.
ASSIGN customer.cusname = "name name"
customer.num = 3.
loop:
REPEAT:
CLEAR FRAME f2 ALL.
UPDATE compname compnum WITH FRAME f1.
/* Quit if neither name or number is entered */
IF compname = "" AND compnum = 0 THEN
LEAVE loop.
/* If num is entered - search by it, otherwise by name */
IF compnum <> 0 THEN DO:
OPEN QUERY qSearch FOR EACH customer NO-LOCK WHERE customer.num = compnum.
END.
ELSE DO:
OPEN QUERY qSearch FOR EACH customer NO-LOCK WHERE customer.cusname MATCHES "*" + compname + "*".
END.
GET NEXT qSearch.
DO WHILE AVAILABLE customer:
IF AVAILABLE customer THEN DO:
DISPLAY customer WITH FRAME f2 10 DOWN.
DOWN WITH FRAME f2.
END.
GET NEXT qSearch.
END.
/* If we have results - leave the loop otherwise try again */
IF QUERY qSearch:NUM-RESULTS = 0 THEN
LEAVE loop.
END.
MESSAGE "Quitting" VIEW-AS ALERT-BOX.
搜索部分名称
有几个用于匹配字符串的运算符:
开始
测试一个字符表达式以查看该表达式是否以第二个字符表达式开头。
语法:
expression1 BEGINS expression2
例子:
FOR EACH customer WHERE NO-LOCK customer.cusname BEGINS "john":
比赛
将字符表达式与模式进行比较,如果表达式满足模式条件,则计算结果为 TRUE。
模式可以包含通配符:在特定位置的句点 (.) 表示该位置可以接受任何单个字符;星号 (*) 表示可接受任何字符组,包括空字符组。
语法:
expression1 MATCHES expression2
例子:
FOR EACH customer NO-LOCK WHERE customer.cusname MATCHES "*doe*":
MATCHES 听起来像您所追求的,但请注意: MATCHES 不会利用数据库中的索引,因此将扫描整个表。这可能/将影响性能,并可能使您的查询花费很长时间。
上面用 MATCHES 替换的 WHERE 子句看起来像这样:
FOR EACH customer NO-LOCK WHERE customer.cusname MATCHES "*" + compname + "*":
包含
还有第三个称为 CONTAINS 的运算符,它使用称为 WORD 索引的东西。这将要求您或您的 DBA 首先在数据库中创建此类索引。在在线帮助或此处的 PDF 中阅读有关单词索引和 CONTAINS 的更多信息:Progress ABL Reference(第 1004 页)。
CONTAINS 可能比 MATCHES 更好,但也需要您对数据库进行更改。