用户输入关键字,即任意数量的关键字,它可以是一个或多个。我将填写字段作为输入并搜索所有关键字对与数据库记录匹配,我将在浏览中显示...但该记录必须满足用户输入的所有关键字,如果不满意意味着,它将显示单个关键字结果。谢谢你先生-------我写的代码是
::::ASSIGN ENTRYcount = (NUM-ENTRIES(hi:SCREEN-VALUE)).
REPEAT pos = 1 TO ENTRYcount :
ASSIGN keywordi = ENTRY(pos,trim(hi:SCREEN-VALUE)).
FOR EACH db1.vehicles WHERE vehicles.ad-num MATCHES keywordi OR string(vehicles.sl-num) MATCHES keywordi
OR vehicles.product-id MATCHES keywordi OR vehicles.product-name MATCHES keywordi OR
string(vehicles.amount) MATCHES keywordi NO-LOCK:
FOR EACH db2.service WHERE db2.service.ad-num = db1.vehicles.ad-num NO-LOCK:
/* IF vcount EQ 0 AND scount LT 1 THEN */
/* DO: */
FIND ttservice WHERE ttservice.service-num = service.service-num NO-LOCK NO-ERROR .
IF AVAILABLE ttservice THEN
DO:
END.
ELSE
DO:
CREATE ttservice .
ASSIGN ttservice.ad-num = vehicles.ad-num
ttservice.sl-num = vehicles.sl-num
ttservice.sl-id = service.sl-num
ttservice.product-id = vehicles.product-id
ttservice.service-num = service.service-num
ttservice.product-name =vehicles.product-name
ttservice.purchase-amt = vehicles.amount
ttservice.service-amt = service.service-amt NO-ERROR .
END.
END.
答案 0 :(得分:0)
嗯,即使是动态查询也不够,因为你想针对每个字段搜索每个条目。它不会起作用,因为你没有添加通配符 - > *到字符串。你看,正在进行中
display 'myhappyexample' matches 'happy'.
返回FALSE,而
display 'myhappyexample' matches '*happy*'.
会给你一个真实的状态。 但是,添加到左侧字段转换中的OR子句的数量会使性能超出窗口。如果您仍想继续这样做,请查看我在您的其他帖子上发布的答案
stackoverflow.com/questions/30210548/progress-4gl-how-to-retrive-record-from-database-which-satisfies-multiple-keywo/30214270?noredirect=1#answer-30225957
如果您想使用动态查询寻求更优雅的解决方案(但您应该要求用户选择要过滤的字段,然后使用这些字段构建csv,并在其中输入过滤器他们想要搜索的字段的顺序,看看我发布的答案:
stackoverflow.com/questions/30210548/progress-4gl-how-to-retrive-record-from-database-which-satisfies-multiple-keywo/30214270?noredirect=1#answer-30239320
事实上,我建议一个界面供用户选择他们希望过滤哪些字段,然后允许他们输入他们想要为该特定字段过滤的值,然后使用动态查询来构建它。在我看来,它会更具性能效率。
无论如何,请告诉我,希望它有所帮助。
答案 1 :(得分:0)
问题是什么?是区分所有比赛而不是比赛?您可以在temp-table中添加另一个字段,以跟踪已匹配的关键字数量。这样,在查找临时表记录已经存在的情况下,在辅助关键字上,如果再次点击关键字,则只需递增计数器。
在查询结束时,您可以通过查看计数是否与关键字数相同来查看是否有任何记录符合所有关键字。或者,您可以选择按该记录进行排序,因为您可能会说,满足更多关键字可能会使条目比仅满足较少关键字的条目更具相关性。
如果您只想要完整匹配,可能会有一些方法注意到前两个或更多关键字,只有少数记录符合这两个或更多关键字并检查它们是否符合"所有"关键字条件并停止搜索所有记录。我有这个想法,但没有时间仔细考虑如何实现这一目标。这可能有助于解决上面提到的非常有效的性能问题。
只是一个想法。 HTH
答案 2 :(得分:0)
我会选择一个特殊字段,连接所有数据(用空格分隔),用单词索引编制索引。
单词索引字段允许您使用CONTAINS运算符快速查找包含一个或多个单词的记录。
单词索引字段(让我们称之为“单词索引”的风)可以是:
将风存储在表中或在运行时构建它的选择取决于记录的表数和所需的性能。
然后查询简单如下:
@page {
margin: 20px 30px 60px 70px;
@top-left{content:element(header);}
}
foreach($types as $t){
$html=$html."<div class='header'>".$t->head_name."</div>";
}
会影响或更好地使用动态查询来过滤所有关键字,这会导致:
FOR EACH vehicles WHERE vehicles.wind CONTAINS "keyword":
....
END.
这将使恕我直言的表现最佳。