progress 4gl:如何检索满足用户在fill-in-field中输入的所有关键字的数据库记录

时间:2015-05-14 05:09:40

标签: progress-4gl

用户输入关键字,即任意数量的关键字,它可以是一个或多个。我将填写字段作为输入并搜索所有关键字对与数据库记录匹配,我将在浏览中显示...但该记录必须满足用户输入的所有关键字,如果不满意意味着,它将显示单个关键字结果。谢谢你先生-------我写的代码是

::::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.

3 个答案:

答案 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运算符快速查找包含一个或多个单词的记录。

单词索引字段(让我们称之为“单词索引”的风)可以是:

  • 存储在表中并使用触发器
  • 进行更新
  • 或即时创建 使用临时表(将所有车辆数据复制到ttVehicles 临时表,有这个特殊字段)。

将风存储在表中或在运行时构建它的选择取决于记录的表数和所需的性能。

然后查询简单如下:

@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.

这将使恕我直言的表现最佳。