2015-05-14 41 views
0

關鍵字是由用戶輸入的,即任意數量的關鍵字,它可以是一個或多個關鍵字。我把一個填充字段作爲輸入並搜索所有的關鍵字匹配數據庫記錄的手段,我將顯示在瀏覽...但該記錄必須滿足用戶輸入的所有關鍵字,如果不滿意意味着它會顯示單個關鍵字結果。三江源先生-------我寫的代碼是進度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. 

回答

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-記錄從數據庫-其中-滿足-MU ltiple-keywo/30214270?noredirect = 1#answer-30239320

事實上,我會建議一個界面讓用戶選擇他們希望過濾的字段,然後允許他們輸入他們想要過濾的值特定的字段,然後使用動態查詢來構建它。在我看來,這在性能上更有效率。

無論如何,讓我知道,希望它有幫助。

0

問題是什麼?是區分所有比賽還是不比賽?您可能可以將另一個字段添加到臨時表以跟蹤已匹配的關鍵字數量。這樣,在發現臨時表記錄已經存在的情況下,在輔助關鍵字上,如果再次點擊關鍵字,則增加計數器。

在查詢結束時,您可以通過查看計數是否與關鍵字數相同來查看是否有任何記錄符合所有關鍵字。或者,您可能會選擇按照該記錄進行排序,因爲您可能會說,滿足更多關鍵字可能會使條目比僅滿足少數關鍵字的條目更具相關性。

如果您只希望完全匹配,可能會有某種方式通過前2個或更多關鍵字記錄一次,只有少數記錄符合這2個或更多關鍵字,並檢查它們是否符合「全部」關鍵字標準並停止搜索所有記錄。我有這種想法在腦海中,但沒有時間去思考你將如何實現這一目標。這可能有助於解決上述提到的性能問題,這些問題非常有效。

只是一個想法。 HTH

0

我會去專門的領域,連接所有的數據(用空格隔開),用字索引索引。

單詞索引字段允許您使用CONTAINS運算符快速找到包含一個或多個單詞的記錄。

字索引字段(可以稱之爲風投「字索引」)可以是:

  • 存儲在表和更新的使用觸發器
  • 或使用臨時表飛 創建(將所有車輛數據複製到一個臨時表中,帶有這個特殊字段)。

將風存儲在表中或在運行時構建它的選擇取決於所需的記錄和性能表的數量。

然後查詢那樣簡單:

FOR EACH vehicles WHERE vehicles.wind CONTAINS "keyword": 
    .... 
END. 

將sufice,或更好的動態查詢過濾所有的關鍵字,這將導致到:

FOR EACH vehicles WHERE vehicles.wind CONTAINS "keyword1" 
        OR vehicles.wind CONTAINS "keyword2" 
        OR vehicles.wind CONTAINS "keyword3" 
        OR ... 
        OR vehicles.wind CONTAINS "keywordn": 

    .... 
END. 

這將對恕我直言最好的性能。

相關問題