<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://frp.sage.fr/wiki1000/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>https://frp.sage.fr/wiki1000/index.php?action=history&amp;feed=atom&amp;title=Test</id>
		<title>Test - Historique des versions</title>
		<link rel="self" type="application/atom+xml" href="https://frp.sage.fr/wiki1000/index.php?action=history&amp;feed=atom&amp;title=Test"/>
		<link rel="alternate" type="text/html" href="https://frp.sage.fr/wiki1000/index.php?title=Test&amp;action=history"/>
		<updated>2026-04-30T16:51:51Z</updated>
		<subtitle>Historique pour cette page sur le wiki</subtitle>
		<generator>MediaWiki 1.18.6</generator>

	<entry>
		<id>https://frp.sage.fr/wiki1000/index.php?title=Test&amp;diff=14618&amp;oldid=prev</id>
		<title>Syfre : Page créée avec « {{Version650}} __TOC__  Les vues locales sont des type de données vues déclarées localement à l'intérieur d'une opération.  Par exemple le code suivant déclare une ... »</title>
		<link rel="alternate" type="text/html" href="https://frp.sage.fr/wiki1000/index.php?title=Test&amp;diff=14618&amp;oldid=prev"/>
				<updated>2024-06-14T07:10:01Z</updated>
		
		<summary type="html">&lt;p&gt;Page créée avec « {{Version650}} __TOC__  Les vues locales sont des type de données vues déclarées localement à l&amp;#039;intérieur d&amp;#039;une opération.  Par exemple le code suivant déclare une ... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Version650}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
Les vues locales sont des type de données vues déclarées localement à l'intérieur d'une opération.&lt;br /&gt;
&lt;br /&gt;
Par exemple le code suivant déclare une vue MyView et effectue une recherche sur cette vue :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function foo(const S:string):Integer;&lt;br /&gt;
Type&lt;br /&gt;
  MyView = viewof(ClassA)&lt;br /&gt;
  unCode:string = unCodeA;&lt;br /&gt;
  unEntier:Integer = refB.unEntierB;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var inst:MyView;&lt;br /&gt;
begin&lt;br /&gt;
  inst := MyView.Find('unCode=%1','',true,['B1']);&lt;br /&gt;
  if Assigned(inst) then&lt;br /&gt;
   begin&lt;br /&gt;
     ...&lt;br /&gt;
   end;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le périmètre du type est limité à la procédure, il n'est donc pas possible de passer les objets de la vue en paramètre à d'autres fonctions (pour cela utilisez une vue globale).&lt;br /&gt;
&lt;br /&gt;
La syntaxe pour définir une vue locale :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  BNF style grammar : &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nom_vue&amp;gt; ::= ViewOf(&amp;lt;class_dec&amp;gt;) [&amp;lt;attributes&amp;gt;] end &lt;br /&gt;
  &amp;lt;class_dec&amp;gt; ::= &amp;lt;class_names&amp;gt; | &amp;lt;class_name&amp;gt; &amp;lt;class_dec&amp;gt;&lt;br /&gt;
  &amp;lt;class_names&amp;gt; ::= &amp;lt;class_name&amp;gt;| [&amp;lt;class_name&amp;gt; ,]&lt;br /&gt;
  &amp;lt;class_name&amp;gt; ::= identifier&lt;br /&gt;
  &amp;lt;class_dec&amp;gt; ::= distinct&lt;br /&gt;
  &amp;lt;attributes&amp;gt; ::= &amp;lt;attribute_def&amp;gt; | &amp;lt;attribute_def&amp;gt; &amp;lt;where_def&amp;gt;&lt;br /&gt;
  &amp;lt;attribute_def&amp;gt; ::= &amp;lt;simple_attribute_def&amp;gt; | &amp;lt;simple_attribute_def&amp;gt; &amp;lt;attribute_directive&amp;gt; &lt;br /&gt;
  &amp;lt;simple_attribute_def&amp;gt; ::= &amp;lt;attribute_dec&amp;gt; | &amp;lt;attribute_dec&amp;gt; = &amp;lt;attribute_ref&amp;gt;&lt;br /&gt;
  &amp;lt;attribute_dec&amp;gt; ::= &amp;lt;attribute_name&amp;gt; : &amp;lt;type_name&amp;gt;&lt;br /&gt;
  &amp;lt;attribute_ref&amp;gt; ::= &amp;lt;main_class_attribute_name&amp;gt; | &amp;lt;operator&amp;gt;(&amp;lt;main_class_attribute_name&amp;gt;)&lt;br /&gt;
  &amp;lt;operator&amp;gt; ::= &amp;lt;aggregate_operator&amp;gt; | &amp;lt;date_operator&amp;gt; | &amp;lt;join_operator&amp;gt;&lt;br /&gt;
  &amp;lt;aggregate_operator&amp;gt; ::= count|sum|max|min&lt;br /&gt;
  &amp;lt;date_operator&amp;gt; ::= year|month|quarter|week|day|dayofyear|dayofweek|hour|minute|second&lt;br /&gt;
  &amp;lt;join_operator&amp;gt; ::= join&lt;br /&gt;
  &amp;lt;attribute_directive&amp;gt; ::=  primary | orderby | orderby desc | over | notInSelect&lt;br /&gt;
  &amp;lt;where_def&amp;gt; ::= [ &amp;lt;expression&amp;gt; ]&lt;br /&gt;
&lt;br /&gt;
  Type&lt;br /&gt;
    NomDeVue = ViewOf(NomDeClassePrincipale)&lt;br /&gt;
      Attribut : Type;&lt;br /&gt;
      Attribut : Type = AliasDe;&lt;br /&gt;
      Attribut : Type = operator(AliasDe);&lt;br /&gt;
      Attribut : Type = AliasDe primary;&lt;br /&gt;
      Attribut : Type = AliasDe orderby;&lt;br /&gt;
      Attribut : Type = AliasDe orderby desc;&lt;br /&gt;
      [ expression ]&lt;br /&gt;
    end;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les vues peuvent utiles pour effectuer des traitement sur des classes complexes, par exemples :&lt;br /&gt;
&lt;br /&gt;
===Exemples===&lt;br /&gt;
====Curseur sur une classe vue====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function foo(const S:string):Integer;&lt;br /&gt;
Type&lt;br /&gt;
  MyView = viewof(ClassA)&lt;br /&gt;
    newCode:string;&lt;br /&gt;
    unCode:string = unCodeA;&lt;br /&gt;
    unEntier:Integer = refB.unEntierB;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var inst:MyView; cursor:MyViewCursor&lt;br /&gt;
begin&lt;br /&gt;
  Result := 0;&lt;br /&gt;
  cursor := MyView.CreateCursorWhere(''unCode=%1'','''',true,[S]);&lt;br /&gt;
  foreach inst in cursor do&lt;br /&gt;
   begin&lt;br /&gt;
     Result := Result + inst.unEntier;&lt;br /&gt;
   end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Vue avec jointure externe====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function ViewExternalJoin(const S:string):Boolean;&lt;br /&gt;
Type&lt;br /&gt;
  MyView = viewof(ClassA)&lt;br /&gt;
    newCode:string;&lt;br /&gt;
    unCodeAA:string = unCodeA;&lt;br /&gt;
    unCodeBB:string = refB+unCodeB;&lt;br /&gt;
  end;&lt;br /&gt;
var inst:MyView;&lt;br /&gt;
begin&lt;br /&gt;
  inst := MyView.Find('unCodeAA=%1','',true,[S]);&lt;br /&gt;
  if Assigned(inst) and (inst.unCodeAA=S)&lt;br /&gt;
     then Result := True&lt;br /&gt;
     else Result := False;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Vue sur une interface====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function foo(const S:string):Integer;&lt;br /&gt;
Type&lt;br /&gt;
  MyView = viewof(InterfaceA, ClassA1, ClassA2)&lt;br /&gt;
    unCode:string = unCodeA primary;&lt;br /&gt;
    ....&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Vue sur des combinaisons uniques d'attributs====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function foo(const S:string):Integer;&lt;br /&gt;
Type&lt;br /&gt;
  MyView = viewof(ClassA distinct)&lt;br /&gt;
    unCode:string = unCodeA primary;&lt;br /&gt;
    unEntier:Integer = refB.unEntierB;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Vue avec agrégats====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function foo(const S:string):Integer;&lt;br /&gt;
Type&lt;br /&gt;
  MyView = viewof(ClassA)&lt;br /&gt;
    unCode:string = unCodeA primary;&lt;br /&gt;
    unEntier:Integer = sum(unEntier);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Vue avec agrégats sur un montant====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  myView = viewof(WFClasseX)&lt;br /&gt;
   mysum:TMoney = sum(credit) orderby;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector; inst:MyView; S,stag:string;&lt;br /&gt;
begin&lt;br /&gt;
  sel := MyView.CreateSelector('','',true,[]);&lt;br /&gt;
&lt;br /&gt;
  S := ''; stag := '';&lt;br /&gt;
  foreach inst in Sel.AsCursor do&lt;br /&gt;
   begin&lt;br /&gt;
     S := S+stag+Formatfloat('0.00',inst.mysum.Value);&lt;br /&gt;
     stag := ',';&lt;br /&gt;
   end;&lt;br /&gt;
  showmessage(S);&lt;br /&gt;
&lt;br /&gt;
  Result := FALSE;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select sum(t0.credit) &amp;quot;mysum&amp;quot;,t0.credit_CodeDevise &amp;quot;mysum_CodeDevise&amp;quot; from dbo.WFCLASSEX t0&lt;br /&gt;
group by t0.credit_CodeDevise&lt;br /&gt;
order by sum(t0.credit)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Vue avec agrégats sur un attribut enfant====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  myView = viewof(WFClasseX)&lt;br /&gt;
   mysum:TMoney = sum(credit:TCValue) orderby;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select sum(t0.credit_TCValue) &amp;quot;mysum&amp;quot; from dbo.WFCLASSEX t0&lt;br /&gt;
order by sum(t0.credit_TCValue)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Vue avec un opérateur de date====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function foo(const S:string):Integer;&lt;br /&gt;
Type&lt;br /&gt;
  MyView = viewof(ClassC distinct)&lt;br /&gt;
    unCode:string = unCodeC primary;&lt;br /&gt;
    unMois:Integer = month(uneDate);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Vue avec un opérateur de date (diff)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function foo(iDayDiff):string;&lt;br /&gt;
Type&lt;br /&gt;
  MyView = viewof(ClassC distinct)&lt;br /&gt;
    unCode:string = unCodeC primary;&lt;br /&gt;
    DayDiff:Integer = DayDiff(uneDateStart,uneDateEnd);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  inst := MyView.Find('DayDiff &amp;gt;= %1','',true,[iDayDiff]);&lt;br /&gt;
    if Assigned(inst)&lt;br /&gt;
       then Result := inst.unCode&lt;br /&gt;
       else Result := 'Not found';&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Vue avec référence====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function foo(const S:string):Integer;&lt;br /&gt;
Type&lt;br /&gt;
  MyView = viewof(ClassA)&lt;br /&gt;
    unCodeAA:string = unCodeA;&lt;br /&gt;
    refB:reference = refB;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function foo(const S:string):Integer;&lt;br /&gt;
Type&lt;br /&gt;
  MyView = viewof(ClassA)&lt;br /&gt;
    unCodeAA:string = unCodeA;&lt;br /&gt;
    refB:ClassB = refB;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Vue avec variable référence====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function foo(const S:string):Integer;&lt;br /&gt;
Type&lt;br /&gt;
  MyView = viewof(ClassA)&lt;br /&gt;
    unCodeAA:string = unCodeA;&lt;br /&gt;
    refB:ClassB;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Vue avec filtre====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function foo(const S:string):Integer;&lt;br /&gt;
Type&lt;br /&gt;
  MyView = viewof(ClassA)&lt;br /&gt;
    unCodeAA:string = unCodeA;&lt;br /&gt;
    unCodeBB:string = refB.unCodeB;&lt;br /&gt;
    [ unCodeA='A1' ]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Vue avec traversée de liste====&lt;br /&gt;
&lt;br /&gt;
[[image:view-list-1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function _Concat(const S:string):string;&lt;br /&gt;
Type&lt;br /&gt;
  MyView = viewof(ClassF)&lt;br /&gt;
    unCodeF:string = unCodeF;&lt;br /&gt;
    unCodeG:string = refFG.unCodeG;&lt;br /&gt;
    unCodeH:string = refFG.listH.unCodeH;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var ls:MyViewList; stag:string; idx:integer;&lt;br /&gt;
begin&lt;br /&gt;
  ls := MyView.CreateListWhere('unCodeG=%1','','unCodeH',true,-1,[S]);&lt;br /&gt;
  Result := ''; stag := '';&lt;br /&gt;
  for idx:=0 to ls.Count-1 do&lt;br /&gt;
   begin&lt;br /&gt;
     Result := Result+stag+ls.Refs[idx].unCodeH;&lt;br /&gt;
     stag := ',';&lt;br /&gt;
   end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Vue avec jointure sur une classe====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  myView = class(myClass)&lt;br /&gt;
    vp1:joinClass1 = join(A,B);&lt;br /&gt;
    vp2:JoinClass2 = join(A,B,W);&lt;br /&gt;
    vp3:JoinClass3 = join(W);&lt;br /&gt;
    ....&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paramètre&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|A&lt;br /&gt;
|Attribut de la classe join (joinClass)&lt;br /&gt;
|-&lt;br /&gt;
|B&lt;br /&gt;
|Chemin à partir de la classe base (myView)&lt;br /&gt;
|-&lt;br /&gt;
|W&lt;br /&gt;
|Clause Where sur la classe join&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
La clause Where peut être exprimée avec les préfixes :&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|self&lt;br /&gt;
|Préfixe de la classe de base&lt;br /&gt;
|-&lt;br /&gt;
|?&lt;br /&gt;
|Préfixe de la classe Join&lt;br /&gt;
|-&lt;br /&gt;
|xx&lt;br /&gt;
|alias d'une jointure de classe&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{tip|Il est possible de créer un produit cartésien entre deux classes en utilisant une jointure avec une clause where toujours vraie. }}&lt;br /&gt;
&lt;br /&gt;
{{tip|Les jointures seront générées dans l'ordre de leur déclaration dans la vue. }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//Procedure expensePendings(req:Tjson; var res:TObject);&lt;br /&gt;
Type&lt;br /&gt;
  ExpenseView = viewOf(TNoteFrais)&lt;br /&gt;
   vp: TValideurPossible = join(ValidationEtat.EtatPossible.EtatMetier, EtatNF);&lt;br /&gt;
   aManager:string = vp.ContactEtablissement.oidutilisateur;&lt;br /&gt;
   //&lt;br /&gt;
   aDate:TDatetime = nDate;&lt;br /&gt;
   aRef:string = referencePiece;&lt;br /&gt;
   aReason:string = Caption;&lt;br /&gt;
   aAmountOrg:TMoney = MontantTTC;&lt;br /&gt;
   aAmountAct:TMoney = MontantRetenu;&lt;br /&gt;
   aQuantity:TQuantity = Quantite;&lt;br /&gt;
   aUser:string = Salarie.Operateur.oidutilisateur;&lt;br /&gt;
   aType:string = FraisSalarie.Caption;&lt;br /&gt;
   aMode:Integer = FraisSalarie.modeRemboursement;&lt;br /&gt;
   aAmountMax:TMoney = FraisSalarie.montantPlafond;&lt;br /&gt;
   aStatus:Integer = Statut;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var json:TJson; ls:TSelector; indx,ctn:Integer; inst:ExpenseView;&lt;br /&gt;
    AWhere,AOrder:string; Args:Array[0..5] of variant;&lt;br /&gt;
begin&lt;br /&gt;
  json := TJson.Create('');&lt;br /&gt;
  res  := json;&lt;br /&gt;
  //&lt;br /&gt;
  AWhere := '(aManager=%1) and (aStatus=%2)';&lt;br /&gt;
  Args[0] := GlbUserName;&lt;br /&gt;
  Args[1] := StatutNF_AValider;&lt;br /&gt;
  AOrder := 'aUser,-aDate';&lt;br /&gt;
&lt;br /&gt;
  indx := 0; ctn := 0; &lt;br /&gt;
  ls := ExpenseView.CreateSelector(AWhere,AOrder,true,Args);&lt;br /&gt;
  foreachP inst in ls.AsCursor do&lt;br /&gt;
   begin&lt;br /&gt;
     . . . &lt;br /&gt;
   end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple le modèle est celui-ci :&lt;br /&gt;
&lt;br /&gt;
[[image:view-join-2.jpg]]&lt;br /&gt;
&lt;br /&gt;
La classe TEtatMetier est atteinte par deux chemins différents, un issu de la classe TValideurPossible et un issu de la classe TNoteFrais. La jointure est réalisée sur l'objet TEtatMetier. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   vp: TValideurPossible = join(ValidationEtat.EtatPossible.EtatMetier, EtatNF);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* TValideurPossible est la classe qui va être jointe &lt;br /&gt;
* vp défini un alias sur cette classe qui peut être ensuite utilisé dans la définition de la vue.&lt;br /&gt;
* ValidationEtat.EtatPossible.EtatMetier est le chemin issu de la classe jointe&lt;br /&gt;
* EtatNF est le chemin issu de la classe de la vue.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exemple, vue locale avec produit cartésien, jointure par clause where et sous requêtes'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//procedure RubriqueParExerciceDetail;&lt;br /&gt;
Type&lt;br /&gt;
  vueSolde = viewof(TCumulPeriodeCompte)&lt;br /&gt;
   codeCompte:string = CompteGeneral.codeCompte;&lt;br /&gt;
   datePeriode:TDatetime = Periode.dateDebut;&lt;br /&gt;
   value:Currency = sumDiff(debitTenue,creditTenue); &lt;br /&gt;
   oidExercice:TOID = Periode.oidexercice; &lt;br /&gt;
   [(typeLot=1)] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vueSelection = viewOf(TSelectionCompte) &lt;br /&gt;
   vc:TCompteGeneral = join('(codeCompte&amp;gt;=self.compteInferieur) and (codeCompte&amp;lt;=self.compteSuperieur)');&lt;br /&gt;
   vp:TPeriode = join('(1=1)'); &lt;br /&gt;
   ve:TExercice = join(oid,vp.oidexercice); &lt;br /&gt;
   ve1:TExercice = join('(?.dateDebut = DateAdd(dpyear,ve.dateDebut,-1))');&lt;br /&gt;
  // &lt;br /&gt;
   idCompteGeneral:TOID = vc.oid primary; &lt;br /&gt;
   idRubrique:TOID = oidRubriqueCompte primary; &lt;br /&gt;
   idPeriode:TOID = vp.oid primary;&lt;br /&gt;
   idExercice:TOID = vp.oidexercice; &lt;br /&gt;
   idExerciceN1:TOID = ve1.oid;&lt;br /&gt;
   // &lt;br /&gt;
   codeRubrique:string = RubriqueCompte.code orderby; &lt;br /&gt;
   libelleRubrique:string = RubriqueCompte.Caption; &lt;br /&gt;
   codeCompte:string = vc.codeCompte orderby;&lt;br /&gt;
   libelleCompte:string = vc.Caption; &lt;br /&gt;
   libellePeriode:string = vp.Caption; &lt;br /&gt;
   // &lt;br /&gt;
   datePeriode:TDatetime = vp.dateDebut orderby desc;&lt;br /&gt;
   year:Integer = year(vp.dateDebut);&lt;br /&gt;
   month:Integer = month(vp.dateDebut);&lt;br /&gt;
   valueN0:currency = VueSolde.select('value','(oidExercice=self.idExercice) and  (codeCompte=self.codeCompte) and (datePeriode&amp;lt;=self.datePeriode)','',true,[]); &lt;br /&gt;
   valueN1:currency = VueSolde.select('value','(oidExercice=self.idExerciceN1) and  (codeCompte=self.codeCompte) and (datePeriode&amp;lt;=DateAdd(dpYear,self.datePeriode,-1))','',true,[]); &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
var Sel:TSelector; inst:vueSelection; S,stag:string;&lt;br /&gt;
begin&lt;br /&gt;
  Sel   := vueSelection.CreateSelector('(codeRubrique=%1) and (year=2022) and (month=3)','',True,['SIG.L02']);&lt;br /&gt;
&lt;br /&gt;
  S := ''; stag := ''; &lt;br /&gt;
  forEach inst in Sel.AsCursor do&lt;br /&gt;
   begin&lt;br /&gt;
     S := S+stag+inst.codeCompte;&lt;br /&gt;
     stag := ','; &lt;br /&gt;
   end; &lt;br /&gt;
  showMessage(S); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tip|Notez l'opérateur SQL DateAdd() qui peut être utilisé dans la partie littérale d'une expression}}&lt;br /&gt;
&lt;br /&gt;
====Vue avec jointures liées====&lt;br /&gt;
{{version11}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
 Type&lt;br /&gt;
  VueValideur = viewOf(TPieceTaxable)&lt;br /&gt;
   vp1: TValideurPossible = join(ValidationEtat.EtatPossible.EtatMetier,EtatMetier);&lt;br /&gt;
   vp2: TValideurPossible = join(ValidationEtat.RegleValidation,RegleValidation);&lt;br /&gt;
   gcv: TGroupeContactValidation = leftjoin(TGroupeValidation,vp2.ContactEtablissement); &lt;br /&gt;
   aId1:TOID = vp1.oid;&lt;br /&gt;
   aId2:TOID = vp2.oid; &lt;br /&gt;
   // &lt;br /&gt;
   ...&lt;br /&gt;
   [ (aId1=aId2) and ... ] &lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple :&lt;br /&gt;
&lt;br /&gt;
* vp1 et vp2 sont deux jointures qui coincident sur le même tuple.&lt;br /&gt;
* La coincidence des deux jointures est réalisée par le clause where (aId1=aId2)&lt;br /&gt;
* gcv est une jointure sur le tuple défini par vp1 et vp2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voir aussi :&lt;br /&gt;
&lt;br /&gt;
* [[Vue anonyme (langage)|Vue anonyme]]&lt;br /&gt;
&lt;br /&gt;
[[Category:langage]]&lt;br /&gt;
[[Category:Vue de classe]]&lt;br /&gt;
[[Category:Version650]]&lt;br /&gt;
[[Category:Version11]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>	</entry>

	</feed>