Foreach pattern (langage)

De Wiki1000
Version du 10 février 2016 à 16:22 par Flfay (discuter | contributions)
(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)
version650-48x48.png

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
Tip-20px.png 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
in Get L'instance est obtenue de l'énumération.
from GetAndRemove L'instance est obtenue puis retirée de l'énumération.
Tip-20px.png Tip : in et from sont équivalents pour un curseur.
  • 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-20px.png 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;
Info-20px.png Note : La portée des variable de boucle définie dans l'instruction est limitée à l'instruction
Outils personnels