2016-07-21 1 views
2

ici est l'exemple que je veux demander:Comment ajouter l'IF THEN ELSE dans le mot-clé BY/BREAK BY de FOR EACH?

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

END. 

Cela se traduirait par une erreur.

si elle est juste

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

alors il n'y a pas d'erreur. Les progrès accepterait le code

Ce qui est nécessaire est si la condition est vrai, sorte par un champ de tri d'autre par deux ou plusieurs champs

+0

Je suis confus par ce que la question est, et les réponses que vous avez eu à ce jour - à l'aide 9.1e progrès, je peux construire un pour chacun avec '(Se expr ALORS AUTRE cond expr)' sans des erreurs. – Screwtape

+0

Le BY (SI cond THEN expr ELSE expr) n'a pas de problème de ma part. le probl'eme est BY (SI cond THEN expr ELSE expr + expr2) entrainera une erreur. ou si mon approche est 'BY (SI par exemple THEN expr ELSE expr2) BY (SI cond alors TRUE sinon othr-expr)' ayant deux BY – noob

Répondre

0

Malheureusement, cette syntaxe est pas prise en charge. Selon la documentation, BREAK/BY attend une expression qui la suit mais pas une déclaration.

1

Selon la réponse précédente, ceci n'est pas supporté.

Généralement, vous devez d'abord préparer le résultat dans une table temporaire, en utilisant un champ logique dans la table temporaire pour le résultat de votre expression IF THEN ELSE.

2

Si vous disposez d'une version suffisamment récente de Progress, vous pouvez construire une requête dynamique. Ce sera plus efficace en termes de temps d'exécution et de contourner votre problème car avoir des instructions IF dans votre prédicat de requête rendra la sélection d'index difficile.

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

Nous n'avons pas essayé de requête dynamique dans notre code. donc je ne peux pas vraiment le comprendre. mais je vais étudier celui-ci .. merci – noob