2016-07-21 23 views
2

hier ist die Probe, die ich fragen wollen:Wie füge ich IF THEN ELSE im BY/BREAK BY-Schlüsselwort von FOR EACH hinzu?

FOR EACH table-name.... NO LOCK BY (IF TRUE THEN sort-this ELSE sort-that + sort-that2). 

END. 

in einem Fehler Dies würde zur Folge haben.

wenn es nur

FOR EACH .. NO LOCK BY (IF TRUE THEN sort-this ELSE sort-that). 
END. 

dann ist kein Fehler. Fortschritt würde den Code

akzeptiert Was notwendig ist, ist, wenn die Bedingung wahr ist, dann sortiert nach einem Feld anders sortiert nach zwei oder mehr Feldern

+0

Ich bin verwirrt, was das Problem ist, und die Antworten, die Sie bisher hatten - mit Fortschritt 9.1e, kann ich eine für jeden mit 'BY (IF cond DANN ausdr ELSE ausdr)' konstruieren, ohne irgendwelche Fehler. – Screwtape

+0

Das BY (IF cond THEN Ausdruck ELSE Ausdruck) hat kein Problem an meinem Ende. Das Problem ist BY (WENN cond THEN expr ELSE expr + expr2) wird zu einem Fehler führen. oder sollte mein Ansatz 'BY sein (WENN cond DANN expr ELSE expr2) BY (IF cond dann TRUE sonst othr-expr)' mit zwei BY's – noob

Antwort

0

Leider ist diese Syntax nicht unterstützt wird. Gemäß der Dokumentation erwartet BREAK/BY einen folgenden Ausdruck, aber keine Anweisung.

1

Wie in der vorherigen Antwort wird dies nicht unterstützt.

Normalerweise müssen Sie das Ergebnis zuerst in einer temporären Tabelle vorbereiten, indem Sie ein logisches Feld in der temporären Tabelle für das Ergebnis Ihres IF THEN ELSE-Ausdrucks verwenden.

2

Wenn Sie in einer modern genug Version von Progress sind, können Sie eine dynamische Abfrage erstellen. Dies wird effizienter in Bezug auf die Laufzeit als auch um Ihr Problem zu umgehen, da IF-Anweisungen in Ihrem Abfrageprädikat die Indexauswahl erschweren werden.

QueryString = "for each table no-lock...". 
if true then 
    QueryString = QueryString + " by sort-this". 
else 
    QueryString = QueryString + " by sort-that by sort-other". 

create query QueryHandle. 
QueryHandle:add-buffer(buffer table:handle). 
QueryHandle:query-prepare(QueryString). 
QueryHandle:query-open. 
do while QueryHandle:get-next(): 
    /*some stuff*/ 
end. 
QueryHandle:query-close. 
delete object QueryHandle. 
+0

Wir haben versucht dynamische Abfrage in unserem Code. also kann ich es wirklich nicht verstehen. aber ich werde das studieren .. danke – noob