簡體   English   中英

我可以在 Progress-4GL 中創建緩沖區時指定緩沖區的內容嗎?

[英]Can I specify the contents of the buffer while creating it in Progress-4GL?

菜鳥在這里進步和自學,如果我錯過了一些明顯的事情,我很抱歉。 我昨天了解了緩沖區,我想知道是否可以將緩沖區搜索的 scope 分隔開。 下面,一個我想知道的例子。

DEFINE BUFFER ex1 FOR emit WHERE emit.id > 50000.

FOR EACH ex1:
    DISP ex1.id ex1.name.
end.

我知道我可以在這個例子中將 WHERE 放在 FOR EACH 部分,但我想知道是否以及如何分隔緩沖區,以便我可以在這里的代碼中做我想做的事情。

謝謝您的幫助。

編輯:我會把我寫的代碼放在這里,這樣更容易理解我的意思。 除了使用臨時表之外,我真的沒有看到任何其他解決方案,它讓一切變得如此緩慢。 我會這樣保留我的代碼,但如果有人知道更好的解決方案,請大聲告訴我。 感謝你的寶貴時間。

def var contador as int.
def var contador2 as int.
def var contador3 as int.

def temp-table tt-min-oper 
field it-codigo like operacao.it-codigo
field num-id-operacao like operacao.num-id-operacao
field op-codigo like operacao.op-codigo
.

def temp-table tt-oper 
field it-codigo like operacao.it-codigo
field op-codigo like operacao.op-codigo
.

def temp-table tt-valida-oper 
field it-codigo like operacao.it-codigo
.

for each operacao NO-LOCK
break by operacao.it-codigo by operacao.num-id-operacao:
    IF FIRST-OF (operacao.it-codigo) THEN DO:
        
        CREATE tt-min-oper.
        ASSIGN
        tt-min-oper.it-codigo = operacao.it-codigo
        tt-min-oper.num-id-operacao = operacao.num-id-operacao
        tt-min-oper.op-codigo = operacao.op-codigo
        .
    END.
END.

FOR EACH tt-min-oper WHERE tt-min-oper.op-codigo <> 10 NO-LOCK:
    create tt-oper.
    assign tt-oper.it-codigo = tt-min-oper.it-codigo.
END.


FOR EACH operacao NO-LOCK,
    EACH tt-oper
    WHERE operacao.it-codigo = tt-oper.it-codigo
    AND operacao.op-codigo = 10 NO-LOCK:
       
        create tt-valida-oper.
        assign
        tt-valida-oper.it-codigo = operacao.it-codigo.
    
END.

您在查詢中限制結果,在您的情況下是 FOR EACH 語句,所以

DEFINE BUFFER ex1 FOR emit .

FOR EACH ex1 WHERE ex1.id > 50000:
    DISP ex1.id ex1.name.
end.

回答 OP 的擴展問題。

在不知道您的用例和有關表關系的詳細信息的情況下回答這個問題總是很困難的。 但從你的代碼:

在最后的 FOR EACH 中,您只需要迭代 opacao 記錄,其中首先 it-codigo 是唯一的(然后將其放入 tt-min-oper 中)。 然后過濾 tt-min-oper 為 op-codigo <> 10 並將結果記錄添加到 tt-oper。

所以此時 tt-oper 應該包含具有唯一 it-codigo 值和 op-codigo <> 10 的記錄。

所以至少你在這里不需要這個循環:

FOR EACH tt-min-oper WHERE tt-min-oper.op-codigo <> 10 NO-LOCK:
    create tt-oper.
    assign tt-oper.it-codigo = tt-min-oper.it-codigo.
END.

與最初的 FOR EACH 一樣,您也可以過濾 op-codigo <> 10 :

for each operacao WHERE operacao.op-codigo <> 10 NO-LOCK
break by operacao.it-codigo by operacao.num-id-operacao:

能干的歌劇有多少條記錄? 是否有以 it-codigo 作為第一個字段的索引? 帶有 BREAK-BY 的 FOR EACH 仍將檢索表中的所有記錄,但僅處理 FIRST-OF (it-codigo) 記錄。 這可能是一個非常繁重的操作。

在大表中,如果做這樣的事情而不是使用 BREAK-BY 的 FOR EACH 可能會更好。 我的 Order 表有 700000 條記錄,所以這里處理所有 700000 條記錄:

FOR EACH Order BREAK BY Order.Salesrep:
        
    IF FIRST-OF (Order.Salesrep) THEN
    DO:
        DISPLAY Order.Salesrep . 
    END.
END.

這在這里得到相同的結果,但只讀取 10 條記錄(數據庫中有 10 個銷售代表)。 但這只有在 Salesrep 字段有索引時才有可能。

DEFINE VARIABLE cPrevious-Salesrep AS CHARACTER NO-UNDO . 

FIND FIRST Order WHERE Order.Salesrep > cPrevious-Salesrep
    NO-LOCK NO-ERROR . 
    
DO WHILE AVAILABLE (Order):
    DISPLAY Order.Salesrep WITH DOWN . 
    DOWN 1 .
    
    ASSIGN cPrevious-Salesrep = Order.Salesrep. 

    FIND NEXT Order WHERE Order.Salesrep > cPrevious-Salesrep
        NO-LOCK NO-ERROR . 
END.

因此,要優化您的代碼,您需要了解您的數據庫架構和實際數據。

我之前發布的代碼需要幾分鍾才能編譯。 我通過將 FOR EACH 放入另一個中來設法減少了很多(現在只需要 25 秒)。 不幸的是,我無法在第一個 FOR EACH 中過濾 op-codigo <> 10,因為它會改變結果。 我沒有使用 USE-INDEX 因為我讀到 Tom Bascom 說它不好,但是我們在使用的表中有索引。 我對桌子了解不多,因為我在這里還很新,而且我還在學習很多東西。

所以我的代碼變成了下面的例子。 我不知道將 FOR EACH 放在另一個里面是否好,我總是避免這樣做,但我所有的同事都這樣做。

DEF TEMP-TABLE tt-min-oper 
FIELD it-codigo         LIKE operacao.it-codigo
FIELD num-id-operacao   LIKE operacao.num-id-operacao
FIELD op-codigo         LIKE operacao.op-codigo
.

DEF TEMP-TABLE tt-valida-oper 
FIELD it-codigo LIKE operacao.it-codigo
FIELD num-id-operacao   LIKE operacao.num-id-operacao
.


FOR EACH operacao NO-LOCK
BREAK BY operacao.it-codigo BY operacao.num-id-operacao:
    IF FIRST-OF (operacao.it-codigo) THEN DO:
    CREATE tt-min-oper.
       ASSIGN
       tt-min-oper.it-codigo = operacao.it-codigo
       tt-min-oper.num-id-operacao = operacao.num-id-operacao
       tt-min-oper.op-codigo = operacao.op-codigo
       .          
     END.
 END.

FOR EACH tt-min-oper
WHERE tt-min-oper.op-codigo <> 10 NO-LOCK:
    FOR EACH operacao
    WHERE operacao.it-codigo = tt-min-oper.it-codigo
    AND operacao.op-codigo = 10 NO-LOCK:
        CREATE tt-valida-oper.
        ASSIGN
        tt-valida-oper.it-codigo = operacao.it-codigo
        tt-valida-oper.num-id-operacao = tt-min-oper.num-id-operacao
        .
    END.
END.

我找不到我想要的緩沖區解決方案,但我設法以我以前從未做過的方式做到了,所以我認為這是一場勝利。 感謝您的時間和建議邁克,如果有任何其他建議,我都願意接受。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM