Foreach pattern (langage)
De Wiki1000
(Différences entre les versions)
(13 révisions intermédiaires par 2 utilisateurs sont masquées) | |||
Ligne 1 : | Ligne 1 : | ||
− | {{new| | + | {{new|650}} |
− | === | + | ===ForEachP pattern=== |
− | Le pattern | + | Le pattern foreachP permet de réaliser une énumération sur une collection supportant les énumérations. |
Les différentes syntaxes de ce pattern sont : | Les différentes syntaxes de ce pattern sont : | ||
<pre> | <pre> | ||
− | + | foreachP V in|from C [index I] [with [distinct|global|long] transaction] [on except break|continue] do Statement | |
</pre> | </pre> | ||
Ligne 12 : | Ligne 12 : | ||
:Doit être du type de l'énumération | :Doit être du type de l'énumération | ||
− | *in|from | + | {{tip|Certains énumérateurs supportent un type par défaut pour la variable de boucle, ceci permet de définir la variable de boucle dans l'instruction sans définir son type en utilisant la syntaxe : foreachP var inst in ....}} |
+ | |||
+ | *in | from | ||
:Mode de gestion de l'énumération | :Mode de gestion de l'énumération | ||
Ligne 19 : | Ligne 21 : | ||
|in | |in | ||
|Get | |Get | ||
− | |L'instance est obtenue de l'énumération | + | |L'instance est obtenue de l'énumération. |
|- | |- | ||
|from | |from | ||
|GetAndRemove | |GetAndRemove | ||
− | |L'instance est obtenue puis retirée de l'énumération | + | |L'instance est obtenue puis retirée de l'énumération. |
|} | |} | ||
+ | |||
+ | {{tip|in et from sont équivalents pour un curseur.}} | ||
*C | *C | ||
Ligne 32 : | Ligne 36 : | ||
:Index de boucle | :Index de boucle | ||
− | *with transaction | + | *with [ distinct | global | long ] transaction |
:Mode de gestion de transaction | :Mode de gestion de transaction | ||
Ligne 40 : | Ligne 44 : | ||
|Pas de gestion de transaction | |Pas de gestion de transaction | ||
|- | |- | ||
− | | | + | |transaction |
|Une transaction par corps de boucle. | |Une transaction par corps de boucle. | ||
|- | |- | ||
− | |global | + | |distinct transaction |
+ | |Une transaction par corps de boucle. | ||
+ | |- | ||
+ | |global transaction | ||
|Une transaction pour l'ensemble de la boucle. | |Une transaction pour l'ensemble de la boucle. | ||
|- | |- | ||
− | |long | + | |long transaction |
|Une transaction longue pour l'ensemble du corps de boucle. | |Une transaction longue pour l'ensemble du corps de boucle. | ||
|} | |} | ||
Ligne 54 : | Ligne 61 : | ||
{| class="wikitable" | {| class="wikitable" | ||
− | |||
− | |||
− | |||
|- | |- | ||
|break | |break | ||
|Une exception arrête l'instruction et est propagée. | |Une exception arrête l'instruction et est propagée. | ||
|- | |- | ||
− | |continue | + | |continue (par défaut) |
|Une exception est trappée et n'arrête pas l'instruction. | |Une exception est trappée et n'arrête pas l'instruction. | ||
|} | |} | ||
− | + | {{tip|Lorsque le mode de gestion des exceptions est ''continue'' l'itération dans laquelle se produit l'exception sera interrompue. L'exception est ensuite ignorée et l'exécution de la boucle reprend.}} | |
+ | |||
+ | Exemples : | ||
<source lang="delphi"> | <source lang="delphi"> | ||
Ligne 73 : | Ligne 79 : | ||
Cursor := WFClasseA.CreateCursorWhere('','',true,['A',1]); | Cursor := WFClasseA.CreateCursorWhere('','',true,['A',1]); | ||
− | foreachP inst in cursor index count with long transaction do | + | with long transaction do |
+ | foreachP inst in cursor index count do | ||
+ | begin | ||
+ | List.AddRef(inst); | ||
+ | if List.Count=100 then | ||
+ | begin | ||
+ | parallel doProcessList(List); | ||
+ | List.Clear; | ||
+ | end; | ||
+ | end; | ||
+ | end; | ||
+ | </source> | ||
+ | |||
+ | '''Avec gestion de la transaction :''' | ||
+ | |||
+ | <source lang="delphi"> | ||
+ | var inst:WFClasseA; cursor:WFClasseACursor; count:Integer; tk:Int64; | ||
+ | begin | ||
+ | List := WFClasseA.CreateList; | ||
+ | Cursor := WFClasseA.CreateCursorWhere('','',true,['A',1]); | ||
+ | |||
+ | foreachP inst in cursor index count with long(100) transaction do | ||
+ | begin | ||
+ | parallel doProcessInstance(inst); | ||
+ | end; | ||
+ | end; | ||
+ | </source> | ||
+ | |||
+ | '''Variable de boucle définie dans l'instruction :''' | ||
+ | |||
+ | <source lang="delphi"> | ||
+ | var list:WFClasseAList; cursor:WFClasseACursor; count:Integer; tk:Int64; | ||
+ | begin | ||
+ | List := WFClasseA.CreateList; | ||
+ | Cursor := WFClasseA.CreateCursorWhere('','',true,['A',1]); | ||
+ | |||
+ | with long transaction do | ||
+ | foreachP var inst:WFClasseA in cursor index count do | ||
+ | begin | ||
+ | List.AddRef(inst); | ||
+ | if List.Count=100 then | ||
+ | begin | ||
+ | parallel doProcessList(List); | ||
+ | List.Clear; | ||
+ | end; | ||
+ | end; | ||
+ | end; | ||
+ | </source> | ||
+ | |||
+ | '''Variable de boucle typée par l'énumération :''' | ||
+ | |||
+ | <source lang="delphi"> | ||
+ | var list:WFClasseAList; cursor:WFClasseACursor; count:Integer; tk:Int64; | ||
+ | begin | ||
+ | List := WFClasseA.CreateList; | ||
+ | Cursor := WFClasseA.CreateCursorWhere('','',true,['A',1]); | ||
+ | |||
+ | foreachP var inst in cursor index count with long transaction do | ||
begin | begin | ||
List.AddRef(inst); | List.AddRef(inst); | ||
Ligne 84 : | Ligne 147 : | ||
end; | end; | ||
</source> | </source> | ||
+ | |||
+ | {{info|La portée des variable de boucle définie dans l'instruction est limitée à l'instruction}} | ||
[[Category:Langage]] | [[Category:Langage]] | ||
− | [[Category:Code pattern | + | [[Category:Code pattern]] |
− | [[ | + | [[Category:Version650]] |
Version actuelle en date du 10 février 2016 à 16:22
ForEachP pattern
Le pattern foreachP permet de réaliser une énumération sur une collection supportant les énumérations.
Les différentes syntaxes de ce pattern sont :
foreachP V in|from C [index I] [with [distinct|global|long] transaction] [on except break|continue] do Statement
- V variable de boucle
- Doit être du type de l'énumération
- in | from
- Mode de gestion de l'énumération
in | Get | L'instance est obtenue de l'énumération. |
from | GetAndRemove | L'instance est obtenue puis retirée de l'énumération. |
- C
- Collection énumérable
- index I
- Index de boucle
- with [ distinct | global | long ] transaction
- Mode de gestion de transaction
aucun | Pas de gestion de transaction |
transaction | Une transaction par corps de boucle. |
distinct transaction | Une transaction par corps de boucle. |
global transaction | Une transaction pour l'ensemble de la boucle. |
long transaction | Une transaction longue pour l'ensemble du corps de boucle. |
- on except
- Mode de gestion des exceptions
break | Une exception arrête l'instruction et est propagée. |
continue (par défaut) | Une exception est trappée et n'arrête pas l'instruction. |
Tip : Lorsque le mode de gestion des exceptions est continue l'itération dans laquelle se produit l'exception sera interrompue. L'exception est ensuite ignorée et l'exécution de la boucle reprend. |
Exemples :
var list:WFClasseAList; inst:WFClasseA; cursor:WFClasseACursor; count:Integer; tk:Int64; begin List := WFClasseA.CreateList; Cursor := WFClasseA.CreateCursorWhere('','',true,['A',1]); with long transaction do foreachP inst in cursor index count do begin List.AddRef(inst); if List.Count=100 then begin parallel doProcessList(List); List.Clear; end; end; end;
Avec gestion de la transaction :
var inst:WFClasseA; cursor:WFClasseACursor; count:Integer; tk:Int64; begin List := WFClasseA.CreateList; Cursor := WFClasseA.CreateCursorWhere('','',true,['A',1]); foreachP inst in cursor index count with long(100) transaction do begin parallel doProcessInstance(inst); end; end;
Variable de boucle définie dans l'instruction :
var list:WFClasseAList; cursor:WFClasseACursor; count:Integer; tk:Int64; begin List := WFClasseA.CreateList; Cursor := WFClasseA.CreateCursorWhere('','',true,['A',1]); with long transaction do foreachP var inst:WFClasseA in cursor index count do begin List.AddRef(inst); if List.Count=100 then begin parallel doProcessList(List); List.Clear; end; end; end;
Variable de boucle typée par l'énumération :
var list:WFClasseAList; cursor:WFClasseACursor; count:Integer; tk:Int64; begin List := WFClasseA.CreateList; Cursor := WFClasseA.CreateCursorWhere('','',true,['A',1]); foreachP var inst in cursor index count with long transaction do begin List.AddRef(inst); if List.Count=100 then begin parallel doProcessList(List); List.Clear; end; end; end;