<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>http://wiki.sage.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Syfre</id>
	<title>Wiki1000 - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.sage.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Syfre"/>
	<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php/Sp%C3%A9cial:Contributions/Syfre"/>
	<updated>2026-05-24T21:10:17Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14776</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14776"/>
		<updated>2025-05-22T08:04:51Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Sélecteur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Langage==&lt;br /&gt;
&lt;br /&gt;
* Valeur par défaut de paramètre&lt;br /&gt;
: Il est possible de définir des valeurs par défaut aux paramètres des méthodes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  MyClass = Class(TitObject)&lt;br /&gt;
    Procedure TestDeffParams;&lt;br /&gt;
    Procedure TestDefParamBool(p1:string; p2:boolean=true);&lt;br /&gt;
    Procedure TestDefParamJson(p1:string; p2:TJson=nil);&lt;br /&gt;
    Procedure TestDefParamJson2(p1:string; p2:TJson=&#039;{a:false}&#039;);&lt;br /&gt;
    Procedure TestDefParamEnum(p1:string; p2:Integer=WFCAState_Etat2);&lt;br /&gt;
    Procedure TestDefParamMulti(p1:string; p2:string=&#039;a&#039;; p3:string=&#039;b&#039;);&lt;br /&gt;
    Function TestDefParamOne(p1:string=&#039;a&#039;):string;&lt;br /&gt;
    Function TestDefParamFunc(p1:string=&#039;a&#039;):string;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
Procedure MyClass.TestDeffParams;&lt;br /&gt;
var V:string;&lt;br /&gt;
begin&lt;br /&gt;
  V := TestDefParamFunc(&#039;c&#039;); &lt;br /&gt;
  ShowMessage(V); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamOne;&lt;br /&gt;
  TestDefParamOne(); &lt;br /&gt;
  TestDefParamOne(&#039;x&#039;); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamMulti(&#039;a&#039;); &lt;br /&gt;
  TestDefParamMulti(&#039;a&#039;,&#039;1&#039;); &lt;br /&gt;
  TestDefParamMulti(&#039;a&#039;,&#039;1&#039;,&#039;2&#039;); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamBool(&#039;a&#039;); &lt;br /&gt;
  TestDefParamBool(&#039;a&#039;,false); &lt;br /&gt;
  TestDefParamBool(&#039;a&#039;,true); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamJson2(&#039;b&#039;);&lt;br /&gt;
  TestDefParamJson2(&#039;b&#039;,&#039;{a:true}&#039;); &lt;br /&gt;
&lt;br /&gt;
  TestDefParamEnum(&#039;c&#039;);&lt;br /&gt;
  TestDefParamEnum(&#039;c&#039;,WFCAState_Final); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type classe&lt;br /&gt;
: Les paramètres de type classe peuvent être passé directement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  MyClass1 = class&lt;br /&gt;
    class procedure foo(rg:TRegClass);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass2 = class&lt;br /&gt;
    ....&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass3 = class&lt;br /&gt;
    procedure oldbar();&lt;br /&gt;
    procedure newbar();&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
class procedure MyClass1.foo(rg:TRegClass);&lt;br /&gt;
begin&lt;br /&gt;
  // =&amp;gt; MyClass2&lt;br /&gt;
  showMessage(rg.aClassName);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.oldbar();&lt;br /&gt;
var rg:TRegClass;&lt;br /&gt;
begin&lt;br /&gt;
  ModelManager.FindClass(&#039;MyClass2&#039;);&lt;br /&gt;
  myClass1.foo(rg);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.newbar();&lt;br /&gt;
begin&lt;br /&gt;
  myClass1.foo(MyClass2);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Json==&lt;br /&gt;
* Opérateur In&lt;br /&gt;
: Un json de type structure supporte l&#039;opérateur In &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Procedure TestJson;&lt;br /&gt;
&lt;br /&gt;
 function _foo(p:TJson):boolean;&lt;br /&gt;
 begin&lt;br /&gt;
   Result := false; &lt;br /&gt;
   if &#039;a&#039; in p then&lt;br /&gt;
    begin&lt;br /&gt;
      Result := True;&lt;br /&gt;
    end; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
var js:TJson;&lt;br /&gt;
begin&lt;br /&gt;
  js := TJson.Create(&#039;{a:true}&#039;); &lt;br /&gt;
  if _foo(js) then showMessage(&#039;ok&#039;) else showMessage(&#039;nok&#039;);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Getter et Setter&lt;br /&gt;
: Un json de type structure supporte l&#039;accès direct aux valeur des membres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Procedure TestJson;&lt;br /&gt;
&lt;br /&gt;
 function _foo(p:TJson):boolean;&lt;br /&gt;
 begin&lt;br /&gt;
   Result := false; &lt;br /&gt;
   if &#039;a&#039; in p then&lt;br /&gt;
    begin&lt;br /&gt;
      Result := p[&#039;a&#039;];&lt;br /&gt;
    end; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
var js:TJson;&lt;br /&gt;
begin&lt;br /&gt;
  js := TJson.Create(&#039;{a:true}&#039;); &lt;br /&gt;
  js[&#039;b&#039;] := False; &lt;br /&gt;
  js[&#039;a&#039;] := not js[&#039;b&#039;]; &lt;br /&gt;
  if _foo(js) then showMessage(&#039;ok&#039;) else showMessage(&#039;nok&#039;);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Constructeur implicite&lt;br /&gt;
: Un paramètre TJson peut être instancié à partir d&#039;une chaine de caractère&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Procedure TestJson;&lt;br /&gt;
&lt;br /&gt;
 function _foo(p:TJson):boolean;&lt;br /&gt;
 begin&lt;br /&gt;
   Result := false; &lt;br /&gt;
   if &#039;a&#039; in p then&lt;br /&gt;
    begin&lt;br /&gt;
      Result := p[&#039;a&#039;];&lt;br /&gt;
    end; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  if _foo(&#039;{a:true}&#039;) then showMessage(&#039;ok&#039;) else showMessage(&#039;nok&#039;);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Enumérateurs&lt;br /&gt;
: Un json de type strutucture supporte l&#039;énumérateur sur les clés&lt;br /&gt;
: Un json de type tableau supporte l&#039;énumérateur sur les éléments&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//Procedure TestJson;&lt;br /&gt;
&lt;br /&gt;
 procedure _enumValues(p:TJson);&lt;br /&gt;
 var i:Integer; V:Variant;&lt;br /&gt;
 begin&lt;br /&gt;
   forEach V in p index i do&lt;br /&gt;
    begin&lt;br /&gt;
      showMessageFmt(&#039;%d:%s&#039;,[i,V]); &lt;br /&gt;
    end; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
 procedure _enumKeys(p:TJson);&lt;br /&gt;
 var i:Integer; Key,Keys,stag:string; &lt;br /&gt;
 begin&lt;br /&gt;
   Keys := &#039;&#039;; stag := &#039;&#039;;&lt;br /&gt;
   forEach key in p index i do&lt;br /&gt;
    begin&lt;br /&gt;
      Keys := Keys+stag+inttostr(i)+&#039;:&#039;+key;&lt;br /&gt;
      stag := &#039;,&#039;; &lt;br /&gt;
    end; &lt;br /&gt;
   showMessage(Keys); &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  _enumKeys(&#039;{a:true, b:false}&#039;); &lt;br /&gt;
  _enumValues(&#039;[{a:true, b:false},{a:false, b:true}]&#039;); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
* Alloue un oid de la classe&lt;br /&gt;
: Peut être utile dans les tests unitaires&lt;br /&gt;
&lt;br /&gt;
* Méthode ToJson()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sérialize l&#039;objet en json &lt;br /&gt;
: SA peut être un TJsonArray ou un TJsonStruct&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Expression de Sous requête &lt;br /&gt;
&lt;br /&gt;
Une expression peut être définie par une sous requête&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  VueTauxADate = ViewOf(TTauxADate)&lt;br /&gt;
    idTVA : TOid = oidTVA;&lt;br /&gt;
    tDate : Date = tDate;&lt;br /&gt;
    taux : float = taux; &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vueMontantTVA = viewOf(TEcriture)&lt;br /&gt;
    dateEcriture:TDatetime=eDate notInSelect;&lt;br /&gt;
    oidTVA:TOID = ProfilTVA.oidTVA notInSelect; &lt;br /&gt;
    oidPiece:TOID = oidPiece; &lt;br /&gt;
    montantTVAReel:Currency = vueTauxADate.select(&#039;taux * self.montant_TCValue /100&#039;,&#039;(tDate&amp;lt;=self.dateEcriture)and(idTVA=self.oidTVA)&#039;,&#039;&#039;,True,[]); &lt;br /&gt;
    montantTVAReel_CodeDevise:string = montantTVAReel:CodeDevise; &lt;br /&gt;
  end; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastOpeAffected, lastOpeFirstOID&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* operationId, operation&lt;br /&gt;
: Permet d&#039;enregistrer les opérations dans la table TdbfLogOpe&lt;br /&gt;
: S&#039;applique à CopyTo()&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom&lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
* InsertInto&lt;br /&gt;
: Permet de créer une table temporaire à partir d&#039;un sélecteur&lt;br /&gt;
: Réalise un select ... into TEMPTABLE from ...&lt;br /&gt;
&lt;br /&gt;
===TsqlOperation===&lt;br /&gt;
&lt;br /&gt;
Classe SQL définie par le framework et permettant d&#039;enregistrer les opérations du sélecteur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  TsqlOperation = Class(TsqlObject)&lt;br /&gt;
  public&lt;br /&gt;
    class procedure CleanOpe(iOpeId:string);&lt;br /&gt;
    //&lt;br /&gt;
    property action: StringS[128];&lt;br /&gt;
    property id: SQLIdentity;&lt;br /&gt;
    property oidSourceObject: TOID;&lt;br /&gt;
    property oidTargetObject: TOID;&lt;br /&gt;
    property opeId: StringS[128];&lt;br /&gt;
    property operation: StringS[128];&lt;br /&gt;
    property SourceObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
    property TargetObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* opeId, operationId&lt;br /&gt;
: Un identifiant unique (guid) identifiant l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* opération&lt;br /&gt;
: Nom de l&#039;opération dans l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* action&lt;br /&gt;
: Action de l&#039;opération &lt;br /&gt;
: Par exemple INSERT pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidSourceObject&lt;br /&gt;
: identifiant de l&#039;objet source dans l&#039;opération &lt;br /&gt;
: Par exemple l&#039;objet source de la copie pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidTargetObject&lt;br /&gt;
: identifiant de l&#039;objet cible dans l&#039;opération&lt;br /&gt;
: Par exemple l&#039;objet copié par un CopyTo&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple d&#039;utilisation:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // Créer des écritures a partir des réglements&lt;br /&gt;
 //&lt;br /&gt;
 procedure  _doCreateEcritureReglements(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueEcritureReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgBordereau&#039;,oidBordereauReglement); &lt;br /&gt;
   sel.Operation := &#039;EcrReg&#039;; &lt;br /&gt;
   sel.OpeId := iOpeId; &lt;br /&gt;
   // &lt;br /&gt;
   sel.CopyTo(&#039;TEcriture&#039;,[&#039;oidpiece&#039;,&#039;eDate&#039;,&#039;sens&#039;,&#039;sensProrata&#039;,&#039;regimeTVA&#039;,&#039;typeEcriture&#039;],[&lt;br /&gt;
    iOidPiece,&lt;br /&gt;
    BordereauReglement.dateReglement, &lt;br /&gt;
    sens_credit,&lt;br /&gt;
    sens_credit, &lt;br /&gt;
    regimeTVA_Encaissements,&lt;br /&gt;
    typeEcriture_Brouillard &lt;br /&gt;
   ]); &lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Type&lt;br /&gt;
  vueUpdateReglement = viewOf(TReglement)&lt;br /&gt;
   vl:TsqlOperation = join(&#039;(opeId=%ArgOpeId) and (operation=%ArgOperation) and (oidSourceObject=self.oid)&#039;); &lt;br /&gt;
   oidEcriture:TOID = oidEcriture; &lt;br /&gt;
   oidTargetEcriture:TOID = vl.oidTargetObject; &lt;br /&gt;
   oidBordereau:TOID = oidBordereauReglement; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 // Met à jour l&#039;oidEcriture créée sur les réglements correspondants&lt;br /&gt;
 ..&lt;br /&gt;
 procedure _doUpdateReglementsEcriture(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueUpdateReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOpeId&#039;,iOpeId); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOperation&#039;,&#039;EcrReg&#039;); &lt;br /&gt;
   //&lt;br /&gt;
   sel.Update([&#039;oidEcriture&#039;],[&#039;oidTargetEcriture&#039;]); &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  aOpeId := CreateGuid;&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
   begin&lt;br /&gt;
     aOidPiece := _doCreatePiece();&lt;br /&gt;
     _doCreateEcritureReglements(aOidPiece,aOpeId);&lt;br /&gt;
     _doUpdateReglementsEcriture(aOidPice,aOpeId); &lt;br /&gt;
     ...&lt;br /&gt;
     TsqlOperation.CleanOpe(aOpeId);&lt;br /&gt;
   end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ToJson()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:TJsonArray);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sérialize tous les objets retournés par le sélecteur au format JSon comptabible avec les tables react&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//procedure GetData(SRows:TJsonArray);&lt;br /&gt;
Type&lt;br /&gt;
  myView = viewOf(...)&lt;br /&gt;
   ...&lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var sel:TSelector; &lt;br /&gt;
begin&lt;br /&gt;
  // Selector to retreive the data&lt;br /&gt;
  // &lt;br /&gt;
  sel := myView.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
  sel.ToJson(SRows); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Table temporaire==&lt;br /&gt;
&lt;br /&gt;
* TDatabase.AllocTempTable(JobId:string)&lt;br /&gt;
: Génère un nom de table temporaire&lt;br /&gt;
&lt;br /&gt;
* TDatabase.DropTempTables(JobId:string)&lt;br /&gt;
: Supprime (drop) les tables temporaires&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue = viewOf(...)&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector; aJob,aTempTable1,aTempTable2,aTempTable3,aTempTable4:string; keepTables:boolean;&lt;br /&gt;
begin&lt;br /&gt;
  Result := FALSE;&lt;br /&gt;
  aJob := &#039;ANA&#039;; &lt;br /&gt;
  keepTables := False; &lt;br /&gt;
&lt;br /&gt;
  sel := vueUnion.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
  sel.useCTE := True; &lt;br /&gt;
  sel.NoShare := True;&lt;br /&gt;
  sel.NoFrameworks := True; &lt;br /&gt;
  sel.NoOrderBy := True; &lt;br /&gt;
  sel.AnyWhere := True; &lt;br /&gt;
&lt;br /&gt;
  try&lt;br /&gt;
    // Add the maxLevel by oidGCA to the temp table &lt;br /&gt;
    aTempTable1 := ClassManager.DefDatabase.AllocTempTable(aJob);&lt;br /&gt;
    sel.InsertInto(aTempTable1,[&#039;maxLevel&#039;],[&#039;Expression(max(level) over(partition by oidGroupeCumulAnalytique))&#039;]); &lt;br /&gt;
    //showMessageFmt(&#039;%s : %d&#039;,[aTempTable1, sel.lastOpeAffected]); &lt;br /&gt;
    //&lt;br /&gt;
    sel := vueCumulExtCols.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]); &lt;br /&gt;
    sel.SourceTableName := aTempTable1; &lt;br /&gt;
&lt;br /&gt;
    aTempTable2 := ClassManager.DefDatabase.AllocTempTable(aJob);&lt;br /&gt;
    sel.InsertInto(aTempTable2,[],[]); &lt;br /&gt;
    //showMessageFmt(&#039;%s : %d&#039;,[aTempTable2, sel.lastOpeAffected]); &lt;br /&gt;
&lt;br /&gt;
    sel := vueCumulFlat.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
    sel.SourceTableName := aTempTable2; &lt;br /&gt;
     &lt;br /&gt;
    aTempTable3 := ClassManager.DefDatabase.AllocTempTable(aJob);&lt;br /&gt;
    sel.InsertInto(aTempTable3,[],[]); &lt;br /&gt;
    //showMessageFmt(&#039;%s : %d&#039;,[aTempTable3, sel.lastOpeAffected]); &lt;br /&gt;
&lt;br /&gt;
    sel := vueCumulFlatMontant.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]); &lt;br /&gt;
    sel.SourceTableName := aTempTable3; &lt;br /&gt;
    sel.AddParameter(&#039;ArgDeviseTC&#039;,&#039;EUR&#039;); &lt;br /&gt;
&lt;br /&gt;
    aTempTable4 := ClassManager.DefDatabase.AllocTempTable(aJob);&lt;br /&gt;
    sel.InsertInto(aTempTable4,[],[]); &lt;br /&gt;
    //showMessageFmt(&#039;%s : %d&#039;,[aTempTable4, sel.lastOpeAffected]); &lt;br /&gt;
&lt;br /&gt;
  finally&lt;br /&gt;
  if not KeepTables then ClassManager.DefDatabase.DropTempTables(aJob); &lt;br /&gt;
  end; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Updater==&lt;br /&gt;
&lt;br /&gt;
Classe technique permettant de mettre à jour un attribut sur un ensemble d&#039;objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple : Mise à jour des compteurs qui ne peuvent pas être déterminés en SQL&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Should returns all attributes part of the counter&lt;br /&gt;
  //&lt;br /&gt;
  vueNumeroPiece = viewOf(TPiece)&lt;br /&gt;
   pDate:TDatetime = pDate;&lt;br /&gt;
   numero:TCounter = numero; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 procedure _doUpdateNumeroPiece(iOidPiece:string);&lt;br /&gt;
 var sel:TSelector; vueNP:vueNumeroPiece; upd:TUpdater;&lt;br /&gt;
 begin&lt;br /&gt;
   upd := TPiece.CreateUpdater(&#039;numero&#039;); &lt;br /&gt;
   // &lt;br /&gt;
   sel := vueNumeroPiece.CreateSelector(&#039;(oid=%1)&#039;,&#039;&#039;,True,[iOidPiece]);&lt;br /&gt;
   forEach vueNP in sel.AsCursor do&lt;br /&gt;
    begin&lt;br /&gt;
      vueNP.numero.AllocValue;&lt;br /&gt;
      upd.AddValue(vueNP.OID,vueNP.numero.value); &lt;br /&gt;
    end; &lt;br /&gt;
   //&lt;br /&gt;
   upd.Execute; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  &lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14775</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14775"/>
		<updated>2025-05-22T07:55:39Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Sélecteur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Langage==&lt;br /&gt;
&lt;br /&gt;
* Valeur par défaut de paramètre&lt;br /&gt;
: Il est possible de définir des valeurs par défaut aux paramètres des méthodes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  MyClass = Class(TitObject)&lt;br /&gt;
    Procedure TestDeffParams;&lt;br /&gt;
    Procedure TestDefParamBool(p1:string; p2:boolean=true);&lt;br /&gt;
    Procedure TestDefParamJson(p1:string; p2:TJson=nil);&lt;br /&gt;
    Procedure TestDefParamJson2(p1:string; p2:TJson=&#039;{a:false}&#039;);&lt;br /&gt;
    Procedure TestDefParamEnum(p1:string; p2:Integer=WFCAState_Etat2);&lt;br /&gt;
    Procedure TestDefParamMulti(p1:string; p2:string=&#039;a&#039;; p3:string=&#039;b&#039;);&lt;br /&gt;
    Function TestDefParamOne(p1:string=&#039;a&#039;):string;&lt;br /&gt;
    Function TestDefParamFunc(p1:string=&#039;a&#039;):string;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
Procedure MyClass.TestDeffParams;&lt;br /&gt;
var V:string;&lt;br /&gt;
begin&lt;br /&gt;
  V := TestDefParamFunc(&#039;c&#039;); &lt;br /&gt;
  ShowMessage(V); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamOne;&lt;br /&gt;
  TestDefParamOne(); &lt;br /&gt;
  TestDefParamOne(&#039;x&#039;); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamMulti(&#039;a&#039;); &lt;br /&gt;
  TestDefParamMulti(&#039;a&#039;,&#039;1&#039;); &lt;br /&gt;
  TestDefParamMulti(&#039;a&#039;,&#039;1&#039;,&#039;2&#039;); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamBool(&#039;a&#039;); &lt;br /&gt;
  TestDefParamBool(&#039;a&#039;,false); &lt;br /&gt;
  TestDefParamBool(&#039;a&#039;,true); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamJson2(&#039;b&#039;);&lt;br /&gt;
  TestDefParamJson2(&#039;b&#039;,&#039;{a:true}&#039;); &lt;br /&gt;
&lt;br /&gt;
  TestDefParamEnum(&#039;c&#039;);&lt;br /&gt;
  TestDefParamEnum(&#039;c&#039;,WFCAState_Final); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type classe&lt;br /&gt;
: Les paramètres de type classe peuvent être passé directement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  MyClass1 = class&lt;br /&gt;
    class procedure foo(rg:TRegClass);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass2 = class&lt;br /&gt;
    ....&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass3 = class&lt;br /&gt;
    procedure oldbar();&lt;br /&gt;
    procedure newbar();&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
class procedure MyClass1.foo(rg:TRegClass);&lt;br /&gt;
begin&lt;br /&gt;
  // =&amp;gt; MyClass2&lt;br /&gt;
  showMessage(rg.aClassName);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.oldbar();&lt;br /&gt;
var rg:TRegClass;&lt;br /&gt;
begin&lt;br /&gt;
  ModelManager.FindClass(&#039;MyClass2&#039;);&lt;br /&gt;
  myClass1.foo(rg);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.newbar();&lt;br /&gt;
begin&lt;br /&gt;
  myClass1.foo(MyClass2);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Json==&lt;br /&gt;
* Opérateur In&lt;br /&gt;
: Un json de type structure supporte l&#039;opérateur In &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Procedure TestJson;&lt;br /&gt;
&lt;br /&gt;
 function _foo(p:TJson):boolean;&lt;br /&gt;
 begin&lt;br /&gt;
   Result := false; &lt;br /&gt;
   if &#039;a&#039; in p then&lt;br /&gt;
    begin&lt;br /&gt;
      Result := True;&lt;br /&gt;
    end; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
var js:TJson;&lt;br /&gt;
begin&lt;br /&gt;
  js := TJson.Create(&#039;{a:true}&#039;); &lt;br /&gt;
  if _foo(js) then showMessage(&#039;ok&#039;) else showMessage(&#039;nok&#039;);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Getter et Setter&lt;br /&gt;
: Un json de type structure supporte l&#039;accès direct aux valeur des membres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Procedure TestJson;&lt;br /&gt;
&lt;br /&gt;
 function _foo(p:TJson):boolean;&lt;br /&gt;
 begin&lt;br /&gt;
   Result := false; &lt;br /&gt;
   if &#039;a&#039; in p then&lt;br /&gt;
    begin&lt;br /&gt;
      Result := p[&#039;a&#039;];&lt;br /&gt;
    end; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
var js:TJson;&lt;br /&gt;
begin&lt;br /&gt;
  js := TJson.Create(&#039;{a:true}&#039;); &lt;br /&gt;
  js[&#039;b&#039;] := False; &lt;br /&gt;
  js[&#039;a&#039;] := not js[&#039;b&#039;]; &lt;br /&gt;
  if _foo(js) then showMessage(&#039;ok&#039;) else showMessage(&#039;nok&#039;);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Constructeur implicite&lt;br /&gt;
: Un paramètre TJson peut être instancié à partir d&#039;une chaine de caractère&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Procedure TestJson;&lt;br /&gt;
&lt;br /&gt;
 function _foo(p:TJson):boolean;&lt;br /&gt;
 begin&lt;br /&gt;
   Result := false; &lt;br /&gt;
   if &#039;a&#039; in p then&lt;br /&gt;
    begin&lt;br /&gt;
      Result := p[&#039;a&#039;];&lt;br /&gt;
    end; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  if _foo(&#039;{a:true}&#039;) then showMessage(&#039;ok&#039;) else showMessage(&#039;nok&#039;);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Enumérateurs&lt;br /&gt;
: Un json de type strutucture supporte l&#039;énumérateur sur les clés&lt;br /&gt;
: Un json de type tableau supporte l&#039;énumérateur sur les éléments&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//Procedure TestJson;&lt;br /&gt;
&lt;br /&gt;
 procedure _enumValues(p:TJson);&lt;br /&gt;
 var i:Integer; V:Variant;&lt;br /&gt;
 begin&lt;br /&gt;
   forEach V in p index i do&lt;br /&gt;
    begin&lt;br /&gt;
      showMessageFmt(&#039;%d:%s&#039;,[i,V]); &lt;br /&gt;
    end; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
 procedure _enumKeys(p:TJson);&lt;br /&gt;
 var i:Integer; Key,Keys,stag:string; &lt;br /&gt;
 begin&lt;br /&gt;
   Keys := &#039;&#039;; stag := &#039;&#039;;&lt;br /&gt;
   forEach key in p index i do&lt;br /&gt;
    begin&lt;br /&gt;
      Keys := Keys+stag+inttostr(i)+&#039;:&#039;+key;&lt;br /&gt;
      stag := &#039;,&#039;; &lt;br /&gt;
    end; &lt;br /&gt;
   showMessage(Keys); &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  _enumKeys(&#039;{a:true, b:false}&#039;); &lt;br /&gt;
  _enumValues(&#039;[{a:true, b:false},{a:false, b:true}]&#039;); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
* Alloue un oid de la classe&lt;br /&gt;
: Peut être utile dans les tests unitaires&lt;br /&gt;
&lt;br /&gt;
* Méthode ToJson()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sérialize l&#039;objet en json &lt;br /&gt;
: SA peut être un TJsonArray ou un TJsonStruct&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Expression de Sous requête &lt;br /&gt;
&lt;br /&gt;
Une expression peut être définie par une sous requête&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  VueTauxADate = ViewOf(TTauxADate)&lt;br /&gt;
    idTVA : TOid = oidTVA;&lt;br /&gt;
    tDate : Date = tDate;&lt;br /&gt;
    taux : float = taux; &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vueMontantTVA = viewOf(TEcriture)&lt;br /&gt;
    dateEcriture:TDatetime=eDate notInSelect;&lt;br /&gt;
    oidTVA:TOID = ProfilTVA.oidTVA notInSelect; &lt;br /&gt;
    oidPiece:TOID = oidPiece; &lt;br /&gt;
    montantTVAReel:Currency = vueTauxADate.select(&#039;taux * self.montant_TCValue /100&#039;,&#039;(tDate&amp;lt;=self.dateEcriture)and(idTVA=self.oidTVA)&#039;,&#039;&#039;,True,[]); &lt;br /&gt;
    montantTVAReel_CodeDevise:string = montantTVAReel:CodeDevise; &lt;br /&gt;
  end; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastOpeAffected, lastOpeFirstOID&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* operationId, operation&lt;br /&gt;
: Permet d&#039;enregistrer les opérations dans la table TdbfLogOpe&lt;br /&gt;
: S&#039;applique à CopyTo()&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom, InsertInto &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===TsqlOperation===&lt;br /&gt;
&lt;br /&gt;
Classe SQL définie par le framework et permettant d&#039;enregistrer les opérations du sélecteur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  TsqlOperation = Class(TsqlObject)&lt;br /&gt;
  public&lt;br /&gt;
    class procedure CleanOpe(iOpeId:string);&lt;br /&gt;
    //&lt;br /&gt;
    property action: StringS[128];&lt;br /&gt;
    property id: SQLIdentity;&lt;br /&gt;
    property oidSourceObject: TOID;&lt;br /&gt;
    property oidTargetObject: TOID;&lt;br /&gt;
    property opeId: StringS[128];&lt;br /&gt;
    property operation: StringS[128];&lt;br /&gt;
    property SourceObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
    property TargetObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* opeId, operationId&lt;br /&gt;
: Un identifiant unique (guid) identifiant l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* opération&lt;br /&gt;
: Nom de l&#039;opération dans l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* action&lt;br /&gt;
: Action de l&#039;opération &lt;br /&gt;
: Par exemple INSERT pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidSourceObject&lt;br /&gt;
: identifiant de l&#039;objet source dans l&#039;opération &lt;br /&gt;
: Par exemple l&#039;objet source de la copie pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidTargetObject&lt;br /&gt;
: identifiant de l&#039;objet cible dans l&#039;opération&lt;br /&gt;
: Par exemple l&#039;objet copié par un CopyTo&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple d&#039;utilisation:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // Créer des écritures a partir des réglements&lt;br /&gt;
 //&lt;br /&gt;
 procedure  _doCreateEcritureReglements(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueEcritureReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgBordereau&#039;,oidBordereauReglement); &lt;br /&gt;
   sel.Operation := &#039;EcrReg&#039;; &lt;br /&gt;
   sel.OpeId := iOpeId; &lt;br /&gt;
   // &lt;br /&gt;
   sel.CopyTo(&#039;TEcriture&#039;,[&#039;oidpiece&#039;,&#039;eDate&#039;,&#039;sens&#039;,&#039;sensProrata&#039;,&#039;regimeTVA&#039;,&#039;typeEcriture&#039;],[&lt;br /&gt;
    iOidPiece,&lt;br /&gt;
    BordereauReglement.dateReglement, &lt;br /&gt;
    sens_credit,&lt;br /&gt;
    sens_credit, &lt;br /&gt;
    regimeTVA_Encaissements,&lt;br /&gt;
    typeEcriture_Brouillard &lt;br /&gt;
   ]); &lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Type&lt;br /&gt;
  vueUpdateReglement = viewOf(TReglement)&lt;br /&gt;
   vl:TsqlOperation = join(&#039;(opeId=%ArgOpeId) and (operation=%ArgOperation) and (oidSourceObject=self.oid)&#039;); &lt;br /&gt;
   oidEcriture:TOID = oidEcriture; &lt;br /&gt;
   oidTargetEcriture:TOID = vl.oidTargetObject; &lt;br /&gt;
   oidBordereau:TOID = oidBordereauReglement; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 // Met à jour l&#039;oidEcriture créée sur les réglements correspondants&lt;br /&gt;
 ..&lt;br /&gt;
 procedure _doUpdateReglementsEcriture(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueUpdateReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOpeId&#039;,iOpeId); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOperation&#039;,&#039;EcrReg&#039;); &lt;br /&gt;
   //&lt;br /&gt;
   sel.Update([&#039;oidEcriture&#039;],[&#039;oidTargetEcriture&#039;]); &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  aOpeId := CreateGuid;&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
   begin&lt;br /&gt;
     aOidPiece := _doCreatePiece();&lt;br /&gt;
     _doCreateEcritureReglements(aOidPiece,aOpeId);&lt;br /&gt;
     _doUpdateReglementsEcriture(aOidPice,aOpeId); &lt;br /&gt;
     ...&lt;br /&gt;
     TsqlOperation.CleanOpe(aOpeId);&lt;br /&gt;
   end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ToJson()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:TJsonArray);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sérialize tous les objets retournés par le sélecteur au format JSon comptabible avec les tables react&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//procedure GetData(SRows:TJsonArray);&lt;br /&gt;
Type&lt;br /&gt;
  myView = viewOf(...)&lt;br /&gt;
   ...&lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var sel:TSelector; &lt;br /&gt;
begin&lt;br /&gt;
  // Selector to retreive the data&lt;br /&gt;
  // &lt;br /&gt;
  sel := myView.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
  sel.ToJson(SRows); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Updater==&lt;br /&gt;
&lt;br /&gt;
Classe technique permettant de mettre à jour un attribut sur un ensemble d&#039;objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple : Mise à jour des compteurs qui ne peuvent pas être déterminés en SQL&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Should returns all attributes part of the counter&lt;br /&gt;
  //&lt;br /&gt;
  vueNumeroPiece = viewOf(TPiece)&lt;br /&gt;
   pDate:TDatetime = pDate;&lt;br /&gt;
   numero:TCounter = numero; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 procedure _doUpdateNumeroPiece(iOidPiece:string);&lt;br /&gt;
 var sel:TSelector; vueNP:vueNumeroPiece; upd:TUpdater;&lt;br /&gt;
 begin&lt;br /&gt;
   upd := TPiece.CreateUpdater(&#039;numero&#039;); &lt;br /&gt;
   // &lt;br /&gt;
   sel := vueNumeroPiece.CreateSelector(&#039;(oid=%1)&#039;,&#039;&#039;,True,[iOidPiece]);&lt;br /&gt;
   forEach vueNP in sel.AsCursor do&lt;br /&gt;
    begin&lt;br /&gt;
      vueNP.numero.AllocValue;&lt;br /&gt;
      upd.AddValue(vueNP.OID,vueNP.numero.value); &lt;br /&gt;
    end; &lt;br /&gt;
   //&lt;br /&gt;
   upd.Execute; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  &lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14774</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14774"/>
		<updated>2025-05-22T07:43:12Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Json */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Langage==&lt;br /&gt;
&lt;br /&gt;
* Valeur par défaut de paramètre&lt;br /&gt;
: Il est possible de définir des valeurs par défaut aux paramètres des méthodes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  MyClass = Class(TitObject)&lt;br /&gt;
    Procedure TestDeffParams;&lt;br /&gt;
    Procedure TestDefParamBool(p1:string; p2:boolean=true);&lt;br /&gt;
    Procedure TestDefParamJson(p1:string; p2:TJson=nil);&lt;br /&gt;
    Procedure TestDefParamJson2(p1:string; p2:TJson=&#039;{a:false}&#039;);&lt;br /&gt;
    Procedure TestDefParamEnum(p1:string; p2:Integer=WFCAState_Etat2);&lt;br /&gt;
    Procedure TestDefParamMulti(p1:string; p2:string=&#039;a&#039;; p3:string=&#039;b&#039;);&lt;br /&gt;
    Function TestDefParamOne(p1:string=&#039;a&#039;):string;&lt;br /&gt;
    Function TestDefParamFunc(p1:string=&#039;a&#039;):string;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
Procedure MyClass.TestDeffParams;&lt;br /&gt;
var V:string;&lt;br /&gt;
begin&lt;br /&gt;
  V := TestDefParamFunc(&#039;c&#039;); &lt;br /&gt;
  ShowMessage(V); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamOne;&lt;br /&gt;
  TestDefParamOne(); &lt;br /&gt;
  TestDefParamOne(&#039;x&#039;); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamMulti(&#039;a&#039;); &lt;br /&gt;
  TestDefParamMulti(&#039;a&#039;,&#039;1&#039;); &lt;br /&gt;
  TestDefParamMulti(&#039;a&#039;,&#039;1&#039;,&#039;2&#039;); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamBool(&#039;a&#039;); &lt;br /&gt;
  TestDefParamBool(&#039;a&#039;,false); &lt;br /&gt;
  TestDefParamBool(&#039;a&#039;,true); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamJson2(&#039;b&#039;);&lt;br /&gt;
  TestDefParamJson2(&#039;b&#039;,&#039;{a:true}&#039;); &lt;br /&gt;
&lt;br /&gt;
  TestDefParamEnum(&#039;c&#039;);&lt;br /&gt;
  TestDefParamEnum(&#039;c&#039;,WFCAState_Final); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type classe&lt;br /&gt;
: Les paramètres de type classe peuvent être passé directement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  MyClass1 = class&lt;br /&gt;
    class procedure foo(rg:TRegClass);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass2 = class&lt;br /&gt;
    ....&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass3 = class&lt;br /&gt;
    procedure oldbar();&lt;br /&gt;
    procedure newbar();&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
class procedure MyClass1.foo(rg:TRegClass);&lt;br /&gt;
begin&lt;br /&gt;
  // =&amp;gt; MyClass2&lt;br /&gt;
  showMessage(rg.aClassName);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.oldbar();&lt;br /&gt;
var rg:TRegClass;&lt;br /&gt;
begin&lt;br /&gt;
  ModelManager.FindClass(&#039;MyClass2&#039;);&lt;br /&gt;
  myClass1.foo(rg);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.newbar();&lt;br /&gt;
begin&lt;br /&gt;
  myClass1.foo(MyClass2);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Json==&lt;br /&gt;
* Opérateur In&lt;br /&gt;
: Un json de type structure supporte l&#039;opérateur In &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Procedure TestJson;&lt;br /&gt;
&lt;br /&gt;
 function _foo(p:TJson):boolean;&lt;br /&gt;
 begin&lt;br /&gt;
   Result := false; &lt;br /&gt;
   if &#039;a&#039; in p then&lt;br /&gt;
    begin&lt;br /&gt;
      Result := True;&lt;br /&gt;
    end; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
var js:TJson;&lt;br /&gt;
begin&lt;br /&gt;
  js := TJson.Create(&#039;{a:true}&#039;); &lt;br /&gt;
  if _foo(js) then showMessage(&#039;ok&#039;) else showMessage(&#039;nok&#039;);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Getter et Setter&lt;br /&gt;
: Un json de type structure supporte l&#039;accès direct aux valeur des membres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Procedure TestJson;&lt;br /&gt;
&lt;br /&gt;
 function _foo(p:TJson):boolean;&lt;br /&gt;
 begin&lt;br /&gt;
   Result := false; &lt;br /&gt;
   if &#039;a&#039; in p then&lt;br /&gt;
    begin&lt;br /&gt;
      Result := p[&#039;a&#039;];&lt;br /&gt;
    end; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
var js:TJson;&lt;br /&gt;
begin&lt;br /&gt;
  js := TJson.Create(&#039;{a:true}&#039;); &lt;br /&gt;
  js[&#039;b&#039;] := False; &lt;br /&gt;
  js[&#039;a&#039;] := not js[&#039;b&#039;]; &lt;br /&gt;
  if _foo(js) then showMessage(&#039;ok&#039;) else showMessage(&#039;nok&#039;);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Constructeur implicite&lt;br /&gt;
: Un paramètre TJson peut être instancié à partir d&#039;une chaine de caractère&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Procedure TestJson;&lt;br /&gt;
&lt;br /&gt;
 function _foo(p:TJson):boolean;&lt;br /&gt;
 begin&lt;br /&gt;
   Result := false; &lt;br /&gt;
   if &#039;a&#039; in p then&lt;br /&gt;
    begin&lt;br /&gt;
      Result := p[&#039;a&#039;];&lt;br /&gt;
    end; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  if _foo(&#039;{a:true}&#039;) then showMessage(&#039;ok&#039;) else showMessage(&#039;nok&#039;);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Enumérateurs&lt;br /&gt;
: Un json de type strutucture supporte l&#039;énumérateur sur les clés&lt;br /&gt;
: Un json de type tableau supporte l&#039;énumérateur sur les éléments&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//Procedure TestJson;&lt;br /&gt;
&lt;br /&gt;
 procedure _enumValues(p:TJson);&lt;br /&gt;
 var i:Integer; V:Variant;&lt;br /&gt;
 begin&lt;br /&gt;
   forEach V in p index i do&lt;br /&gt;
    begin&lt;br /&gt;
      showMessageFmt(&#039;%d:%s&#039;,[i,V]); &lt;br /&gt;
    end; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
 procedure _enumKeys(p:TJson);&lt;br /&gt;
 var i:Integer; Key,Keys,stag:string; &lt;br /&gt;
 begin&lt;br /&gt;
   Keys := &#039;&#039;; stag := &#039;&#039;;&lt;br /&gt;
   forEach key in p index i do&lt;br /&gt;
    begin&lt;br /&gt;
      Keys := Keys+stag+inttostr(i)+&#039;:&#039;+key;&lt;br /&gt;
      stag := &#039;,&#039;; &lt;br /&gt;
    end; &lt;br /&gt;
   showMessage(Keys); &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  _enumKeys(&#039;{a:true, b:false}&#039;); &lt;br /&gt;
  _enumValues(&#039;[{a:true, b:false},{a:false, b:true}]&#039;); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
* Alloue un oid de la classe&lt;br /&gt;
: Peut être utile dans les tests unitaires&lt;br /&gt;
&lt;br /&gt;
* Méthode ToJson()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sérialize l&#039;objet en json &lt;br /&gt;
: SA peut être un TJsonArray ou un TJsonStruct&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Expression de Sous requête &lt;br /&gt;
&lt;br /&gt;
Une expression peut être définie par une sous requête&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  VueTauxADate = ViewOf(TTauxADate)&lt;br /&gt;
    idTVA : TOid = oidTVA;&lt;br /&gt;
    tDate : Date = tDate;&lt;br /&gt;
    taux : float = taux; &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vueMontantTVA = viewOf(TEcriture)&lt;br /&gt;
    dateEcriture:TDatetime=eDate notInSelect;&lt;br /&gt;
    oidTVA:TOID = ProfilTVA.oidTVA notInSelect; &lt;br /&gt;
    oidPiece:TOID = oidPiece; &lt;br /&gt;
    montantTVAReel:Currency = vueTauxADate.select(&#039;taux * self.montant_TCValue /100&#039;,&#039;(tDate&amp;lt;=self.dateEcriture)and(idTVA=self.oidTVA)&#039;,&#039;&#039;,True,[]); &lt;br /&gt;
    montantTVAReel_CodeDevise:string = montantTVAReel:CodeDevise; &lt;br /&gt;
  end; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastOpeAffected, lastOpeFirstOID&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* operationId, operation&lt;br /&gt;
: Permet d&#039;enregistrer les opérations dans la table TdbfLogOpe&lt;br /&gt;
: S&#039;applique à CopyTo()&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===TsqlOperation===&lt;br /&gt;
&lt;br /&gt;
Classe SQL définie par le framework et permettant d&#039;enregistrer les opérations du sélecteur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  TsqlOperation = Class(TsqlObject)&lt;br /&gt;
  public&lt;br /&gt;
    class procedure CleanOpe(iOpeId:string);&lt;br /&gt;
    //&lt;br /&gt;
    property action: StringS[128];&lt;br /&gt;
    property id: SQLIdentity;&lt;br /&gt;
    property oidSourceObject: TOID;&lt;br /&gt;
    property oidTargetObject: TOID;&lt;br /&gt;
    property opeId: StringS[128];&lt;br /&gt;
    property operation: StringS[128];&lt;br /&gt;
    property SourceObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
    property TargetObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* opeId, operationId&lt;br /&gt;
: Un identifiant unique (guid) identifiant l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* opération&lt;br /&gt;
: Nom de l&#039;opération dans l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* action&lt;br /&gt;
: Action de l&#039;opération &lt;br /&gt;
: Par exemple INSERT pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidSourceObject&lt;br /&gt;
: identifiant de l&#039;objet source dans l&#039;opération &lt;br /&gt;
: Par exemple l&#039;objet source de la copie pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidTargetObject&lt;br /&gt;
: identifiant de l&#039;objet cible dans l&#039;opération&lt;br /&gt;
: Par exemple l&#039;objet copié par un CopyTo&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple d&#039;utilisation:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // Créer des écritures a partir des réglements&lt;br /&gt;
 //&lt;br /&gt;
 procedure  _doCreateEcritureReglements(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueEcritureReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgBordereau&#039;,oidBordereauReglement); &lt;br /&gt;
   sel.Operation := &#039;EcrReg&#039;; &lt;br /&gt;
   sel.OpeId := iOpeId; &lt;br /&gt;
   // &lt;br /&gt;
   sel.CopyTo(&#039;TEcriture&#039;,[&#039;oidpiece&#039;,&#039;eDate&#039;,&#039;sens&#039;,&#039;sensProrata&#039;,&#039;regimeTVA&#039;,&#039;typeEcriture&#039;],[&lt;br /&gt;
    iOidPiece,&lt;br /&gt;
    BordereauReglement.dateReglement, &lt;br /&gt;
    sens_credit,&lt;br /&gt;
    sens_credit, &lt;br /&gt;
    regimeTVA_Encaissements,&lt;br /&gt;
    typeEcriture_Brouillard &lt;br /&gt;
   ]); &lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Type&lt;br /&gt;
  vueUpdateReglement = viewOf(TReglement)&lt;br /&gt;
   vl:TsqlOperation = join(&#039;(opeId=%ArgOpeId) and (operation=%ArgOperation) and (oidSourceObject=self.oid)&#039;); &lt;br /&gt;
   oidEcriture:TOID = oidEcriture; &lt;br /&gt;
   oidTargetEcriture:TOID = vl.oidTargetObject; &lt;br /&gt;
   oidBordereau:TOID = oidBordereauReglement; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 // Met à jour l&#039;oidEcriture créée sur les réglements correspondants&lt;br /&gt;
 ..&lt;br /&gt;
 procedure _doUpdateReglementsEcriture(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueUpdateReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOpeId&#039;,iOpeId); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOperation&#039;,&#039;EcrReg&#039;); &lt;br /&gt;
   //&lt;br /&gt;
   sel.Update([&#039;oidEcriture&#039;],[&#039;oidTargetEcriture&#039;]); &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  aOpeId := CreateGuid;&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
   begin&lt;br /&gt;
     aOidPiece := _doCreatePiece();&lt;br /&gt;
     _doCreateEcritureReglements(aOidPiece,aOpeId);&lt;br /&gt;
     _doUpdateReglementsEcriture(aOidPice,aOpeId); &lt;br /&gt;
     ...&lt;br /&gt;
     TsqlOperation.CleanOpe(aOpeId);&lt;br /&gt;
   end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ToJson()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:TJsonArray);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sérialize tous les objets retournés par le sélecteur au format JSon comptabible avec les tables react&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//procedure GetData(SRows:TJsonArray);&lt;br /&gt;
Type&lt;br /&gt;
  myView = viewOf(...)&lt;br /&gt;
   ...&lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var sel:TSelector; &lt;br /&gt;
begin&lt;br /&gt;
  // Selector to retreive the data&lt;br /&gt;
  // &lt;br /&gt;
  sel := myView.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
  sel.ToJson(SRows); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Updater==&lt;br /&gt;
&lt;br /&gt;
Classe technique permettant de mettre à jour un attribut sur un ensemble d&#039;objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple : Mise à jour des compteurs qui ne peuvent pas être déterminés en SQL&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Should returns all attributes part of the counter&lt;br /&gt;
  //&lt;br /&gt;
  vueNumeroPiece = viewOf(TPiece)&lt;br /&gt;
   pDate:TDatetime = pDate;&lt;br /&gt;
   numero:TCounter = numero; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 procedure _doUpdateNumeroPiece(iOidPiece:string);&lt;br /&gt;
 var sel:TSelector; vueNP:vueNumeroPiece; upd:TUpdater;&lt;br /&gt;
 begin&lt;br /&gt;
   upd := TPiece.CreateUpdater(&#039;numero&#039;); &lt;br /&gt;
   // &lt;br /&gt;
   sel := vueNumeroPiece.CreateSelector(&#039;(oid=%1)&#039;,&#039;&#039;,True,[iOidPiece]);&lt;br /&gt;
   forEach vueNP in sel.AsCursor do&lt;br /&gt;
    begin&lt;br /&gt;
      vueNP.numero.AllocValue;&lt;br /&gt;
      upd.AddValue(vueNP.OID,vueNP.numero.value); &lt;br /&gt;
    end; &lt;br /&gt;
   //&lt;br /&gt;
   upd.Execute; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  &lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14773</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14773"/>
		<updated>2025-05-22T07:34:53Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Modèle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Langage==&lt;br /&gt;
&lt;br /&gt;
* Valeur par défaut de paramètre&lt;br /&gt;
: Il est possible de définir des valeurs par défaut aux paramètres des méthodes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  MyClass = Class(TitObject)&lt;br /&gt;
    Procedure TestDeffParams;&lt;br /&gt;
    Procedure TestDefParamBool(p1:string; p2:boolean=true);&lt;br /&gt;
    Procedure TestDefParamJson(p1:string; p2:TJson=nil);&lt;br /&gt;
    Procedure TestDefParamJson2(p1:string; p2:TJson=&#039;{a:false}&#039;);&lt;br /&gt;
    Procedure TestDefParamEnum(p1:string; p2:Integer=WFCAState_Etat2);&lt;br /&gt;
    Procedure TestDefParamMulti(p1:string; p2:string=&#039;a&#039;; p3:string=&#039;b&#039;);&lt;br /&gt;
    Function TestDefParamOne(p1:string=&#039;a&#039;):string;&lt;br /&gt;
    Function TestDefParamFunc(p1:string=&#039;a&#039;):string;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
Procedure MyClass.TestDeffParams;&lt;br /&gt;
var V:string;&lt;br /&gt;
begin&lt;br /&gt;
  V := TestDefParamFunc(&#039;c&#039;); &lt;br /&gt;
  ShowMessage(V); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamOne;&lt;br /&gt;
  TestDefParamOne(); &lt;br /&gt;
  TestDefParamOne(&#039;x&#039;); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamMulti(&#039;a&#039;); &lt;br /&gt;
  TestDefParamMulti(&#039;a&#039;,&#039;1&#039;); &lt;br /&gt;
  TestDefParamMulti(&#039;a&#039;,&#039;1&#039;,&#039;2&#039;); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamBool(&#039;a&#039;); &lt;br /&gt;
  TestDefParamBool(&#039;a&#039;,false); &lt;br /&gt;
  TestDefParamBool(&#039;a&#039;,true); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamJson2(&#039;b&#039;);&lt;br /&gt;
  TestDefParamJson2(&#039;b&#039;,&#039;{a:true}&#039;); &lt;br /&gt;
&lt;br /&gt;
  TestDefParamEnum(&#039;c&#039;);&lt;br /&gt;
  TestDefParamEnum(&#039;c&#039;,WFCAState_Final); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type classe&lt;br /&gt;
: Les paramètres de type classe peuvent être passé directement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  MyClass1 = class&lt;br /&gt;
    class procedure foo(rg:TRegClass);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass2 = class&lt;br /&gt;
    ....&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass3 = class&lt;br /&gt;
    procedure oldbar();&lt;br /&gt;
    procedure newbar();&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
class procedure MyClass1.foo(rg:TRegClass);&lt;br /&gt;
begin&lt;br /&gt;
  // =&amp;gt; MyClass2&lt;br /&gt;
  showMessage(rg.aClassName);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.oldbar();&lt;br /&gt;
var rg:TRegClass;&lt;br /&gt;
begin&lt;br /&gt;
  ModelManager.FindClass(&#039;MyClass2&#039;);&lt;br /&gt;
  myClass1.foo(rg);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.newbar();&lt;br /&gt;
begin&lt;br /&gt;
  myClass1.foo(MyClass2);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Json==&lt;br /&gt;
* Opérateur In&lt;br /&gt;
: Un json de type structure supporte l&#039;opérateur In &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Procedure TestJson;&lt;br /&gt;
&lt;br /&gt;
 function _foo(p:TJson):boolean;&lt;br /&gt;
 begin&lt;br /&gt;
   Result := false; &lt;br /&gt;
   if &#039;a&#039; in p then&lt;br /&gt;
    begin&lt;br /&gt;
      Result := True;&lt;br /&gt;
    end; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
var js:TJson;&lt;br /&gt;
begin&lt;br /&gt;
  js := TJson.Create(&#039;{a:true}&#039;); &lt;br /&gt;
  if _foo(js) then showMessage(&#039;ok&#039;) else showMessage(&#039;nok&#039;);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Getter et Setter&lt;br /&gt;
: Un json de type structure supporte l&#039;accès direct aux valeur des membres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Procedure TestJson;&lt;br /&gt;
&lt;br /&gt;
 function _foo(p:TJson):boolean;&lt;br /&gt;
 begin&lt;br /&gt;
   Result := false; &lt;br /&gt;
   if &#039;a&#039; in p then&lt;br /&gt;
    begin&lt;br /&gt;
      Result := p[&#039;a&#039;];&lt;br /&gt;
    end; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
var js:TJson;&lt;br /&gt;
begin&lt;br /&gt;
  js := TJson.Create(&#039;{a:true}&#039;); &lt;br /&gt;
  js[&#039;b&#039;] := False; &lt;br /&gt;
  js[&#039;a&#039;] := not js[&#039;b&#039;]; &lt;br /&gt;
  if _foo(js) then showMessage(&#039;ok&#039;) else showMessage(&#039;nok&#039;);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Constructeur implicite&lt;br /&gt;
: Un paramètre TJson peut être instancier à partir d&#039;une chaine de caractère&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Procedure TestJson;&lt;br /&gt;
&lt;br /&gt;
 function _foo(p:TJson):boolean;&lt;br /&gt;
 begin&lt;br /&gt;
   Result := false; &lt;br /&gt;
   if &#039;a&#039; in p then&lt;br /&gt;
    begin&lt;br /&gt;
      Result := p[&#039;a&#039;];&lt;br /&gt;
    end; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  if _foo(&#039;{a:true}&#039;) then showMessage(&#039;ok&#039;) else showMessage(&#039;nok&#039;);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Enumérateurs&lt;br /&gt;
: Un json de type strutucture supporte l&#039;énumérateur sur les clés&lt;br /&gt;
: Un json de type tableau supporte l&#039;énumérateur sur les éléments&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//Procedure TestJson;&lt;br /&gt;
&lt;br /&gt;
 procedure _enumValues(p:TJson);&lt;br /&gt;
 var i:Integer; V:Variant;&lt;br /&gt;
 begin&lt;br /&gt;
   forEach V in p index i do&lt;br /&gt;
    begin&lt;br /&gt;
      showMessageFmt(&#039;%d:%s&#039;,[i,V]); &lt;br /&gt;
    end; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
 procedure _enumKeys(p:TJson);&lt;br /&gt;
 var i:Integer; Key,Keys,stag:string; &lt;br /&gt;
 begin&lt;br /&gt;
   Keys := &#039;&#039;; stag := &#039;&#039;;&lt;br /&gt;
   forEach key in p index i do&lt;br /&gt;
    begin&lt;br /&gt;
      Keys := Keys+stag+inttostr(i)+&#039;:&#039;+key;&lt;br /&gt;
      stag := &#039;,&#039;; &lt;br /&gt;
    end; &lt;br /&gt;
   showMessage(Keys); &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  _enumKeys(&#039;{a:true, b:false}&#039;); &lt;br /&gt;
  _enumValues(&#039;[{a:true, b:false},{a:false, b:true}]&#039;); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
* Alloue un oid de la classe&lt;br /&gt;
: Peut être utile dans les tests unitaires&lt;br /&gt;
&lt;br /&gt;
* Méthode ToJson()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sérialize l&#039;objet en json &lt;br /&gt;
: SA peut être un TJsonArray ou un TJsonStruct&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Expression de Sous requête &lt;br /&gt;
&lt;br /&gt;
Une expression peut être définie par une sous requête&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  VueTauxADate = ViewOf(TTauxADate)&lt;br /&gt;
    idTVA : TOid = oidTVA;&lt;br /&gt;
    tDate : Date = tDate;&lt;br /&gt;
    taux : float = taux; &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vueMontantTVA = viewOf(TEcriture)&lt;br /&gt;
    dateEcriture:TDatetime=eDate notInSelect;&lt;br /&gt;
    oidTVA:TOID = ProfilTVA.oidTVA notInSelect; &lt;br /&gt;
    oidPiece:TOID = oidPiece; &lt;br /&gt;
    montantTVAReel:Currency = vueTauxADate.select(&#039;taux * self.montant_TCValue /100&#039;,&#039;(tDate&amp;lt;=self.dateEcriture)and(idTVA=self.oidTVA)&#039;,&#039;&#039;,True,[]); &lt;br /&gt;
    montantTVAReel_CodeDevise:string = montantTVAReel:CodeDevise; &lt;br /&gt;
  end; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastOpeAffected, lastOpeFirstOID&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* operationId, operation&lt;br /&gt;
: Permet d&#039;enregistrer les opérations dans la table TdbfLogOpe&lt;br /&gt;
: S&#039;applique à CopyTo()&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===TsqlOperation===&lt;br /&gt;
&lt;br /&gt;
Classe SQL définie par le framework et permettant d&#039;enregistrer les opérations du sélecteur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  TsqlOperation = Class(TsqlObject)&lt;br /&gt;
  public&lt;br /&gt;
    class procedure CleanOpe(iOpeId:string);&lt;br /&gt;
    //&lt;br /&gt;
    property action: StringS[128];&lt;br /&gt;
    property id: SQLIdentity;&lt;br /&gt;
    property oidSourceObject: TOID;&lt;br /&gt;
    property oidTargetObject: TOID;&lt;br /&gt;
    property opeId: StringS[128];&lt;br /&gt;
    property operation: StringS[128];&lt;br /&gt;
    property SourceObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
    property TargetObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* opeId, operationId&lt;br /&gt;
: Un identifiant unique (guid) identifiant l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* opération&lt;br /&gt;
: Nom de l&#039;opération dans l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* action&lt;br /&gt;
: Action de l&#039;opération &lt;br /&gt;
: Par exemple INSERT pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidSourceObject&lt;br /&gt;
: identifiant de l&#039;objet source dans l&#039;opération &lt;br /&gt;
: Par exemple l&#039;objet source de la copie pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidTargetObject&lt;br /&gt;
: identifiant de l&#039;objet cible dans l&#039;opération&lt;br /&gt;
: Par exemple l&#039;objet copié par un CopyTo&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple d&#039;utilisation:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // Créer des écritures a partir des réglements&lt;br /&gt;
 //&lt;br /&gt;
 procedure  _doCreateEcritureReglements(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueEcritureReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgBordereau&#039;,oidBordereauReglement); &lt;br /&gt;
   sel.Operation := &#039;EcrReg&#039;; &lt;br /&gt;
   sel.OpeId := iOpeId; &lt;br /&gt;
   // &lt;br /&gt;
   sel.CopyTo(&#039;TEcriture&#039;,[&#039;oidpiece&#039;,&#039;eDate&#039;,&#039;sens&#039;,&#039;sensProrata&#039;,&#039;regimeTVA&#039;,&#039;typeEcriture&#039;],[&lt;br /&gt;
    iOidPiece,&lt;br /&gt;
    BordereauReglement.dateReglement, &lt;br /&gt;
    sens_credit,&lt;br /&gt;
    sens_credit, &lt;br /&gt;
    regimeTVA_Encaissements,&lt;br /&gt;
    typeEcriture_Brouillard &lt;br /&gt;
   ]); &lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Type&lt;br /&gt;
  vueUpdateReglement = viewOf(TReglement)&lt;br /&gt;
   vl:TsqlOperation = join(&#039;(opeId=%ArgOpeId) and (operation=%ArgOperation) and (oidSourceObject=self.oid)&#039;); &lt;br /&gt;
   oidEcriture:TOID = oidEcriture; &lt;br /&gt;
   oidTargetEcriture:TOID = vl.oidTargetObject; &lt;br /&gt;
   oidBordereau:TOID = oidBordereauReglement; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 // Met à jour l&#039;oidEcriture créée sur les réglements correspondants&lt;br /&gt;
 ..&lt;br /&gt;
 procedure _doUpdateReglementsEcriture(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueUpdateReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOpeId&#039;,iOpeId); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOperation&#039;,&#039;EcrReg&#039;); &lt;br /&gt;
   //&lt;br /&gt;
   sel.Update([&#039;oidEcriture&#039;],[&#039;oidTargetEcriture&#039;]); &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  aOpeId := CreateGuid;&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
   begin&lt;br /&gt;
     aOidPiece := _doCreatePiece();&lt;br /&gt;
     _doCreateEcritureReglements(aOidPiece,aOpeId);&lt;br /&gt;
     _doUpdateReglementsEcriture(aOidPice,aOpeId); &lt;br /&gt;
     ...&lt;br /&gt;
     TsqlOperation.CleanOpe(aOpeId);&lt;br /&gt;
   end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ToJson()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:TJsonArray);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sérialize tous les objets retournés par le sélecteur au format JSon comptabible avec les tables react&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//procedure GetData(SRows:TJsonArray);&lt;br /&gt;
Type&lt;br /&gt;
  myView = viewOf(...)&lt;br /&gt;
   ...&lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var sel:TSelector; &lt;br /&gt;
begin&lt;br /&gt;
  // Selector to retreive the data&lt;br /&gt;
  // &lt;br /&gt;
  sel := myView.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
  sel.ToJson(SRows); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Updater==&lt;br /&gt;
&lt;br /&gt;
Classe technique permettant de mettre à jour un attribut sur un ensemble d&#039;objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple : Mise à jour des compteurs qui ne peuvent pas être déterminés en SQL&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Should returns all attributes part of the counter&lt;br /&gt;
  //&lt;br /&gt;
  vueNumeroPiece = viewOf(TPiece)&lt;br /&gt;
   pDate:TDatetime = pDate;&lt;br /&gt;
   numero:TCounter = numero; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 procedure _doUpdateNumeroPiece(iOidPiece:string);&lt;br /&gt;
 var sel:TSelector; vueNP:vueNumeroPiece; upd:TUpdater;&lt;br /&gt;
 begin&lt;br /&gt;
   upd := TPiece.CreateUpdater(&#039;numero&#039;); &lt;br /&gt;
   // &lt;br /&gt;
   sel := vueNumeroPiece.CreateSelector(&#039;(oid=%1)&#039;,&#039;&#039;,True,[iOidPiece]);&lt;br /&gt;
   forEach vueNP in sel.AsCursor do&lt;br /&gt;
    begin&lt;br /&gt;
      vueNP.numero.AllocValue;&lt;br /&gt;
      upd.AddValue(vueNP.OID,vueNP.numero.value); &lt;br /&gt;
    end; &lt;br /&gt;
   //&lt;br /&gt;
   upd.Execute; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  &lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14772</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14772"/>
		<updated>2025-05-22T07:18:01Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Langage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Langage==&lt;br /&gt;
&lt;br /&gt;
* Valeur par défaut de paramètre&lt;br /&gt;
: Il est possible de définir des valeurs par défaut aux paramètres des méthodes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  MyClass = Class(TitObject)&lt;br /&gt;
    Procedure TestDeffParams;&lt;br /&gt;
    Procedure TestDefParamBool(p1:string; p2:boolean=true);&lt;br /&gt;
    Procedure TestDefParamJson(p1:string; p2:TJson=nil);&lt;br /&gt;
    Procedure TestDefParamJson2(p1:string; p2:TJson=&#039;{a:false}&#039;);&lt;br /&gt;
    Procedure TestDefParamEnum(p1:string; p2:Integer=WFCAState_Etat2);&lt;br /&gt;
    Procedure TestDefParamMulti(p1:string; p2:string=&#039;a&#039;; p3:string=&#039;b&#039;);&lt;br /&gt;
    Function TestDefParamOne(p1:string=&#039;a&#039;):string;&lt;br /&gt;
    Function TestDefParamFunc(p1:string=&#039;a&#039;):string;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
Procedure MyClass.TestDeffParams;&lt;br /&gt;
var V:string;&lt;br /&gt;
begin&lt;br /&gt;
  V := TestDefParamFunc(&#039;c&#039;); &lt;br /&gt;
  ShowMessage(V); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamOne;&lt;br /&gt;
  TestDefParamOne(); &lt;br /&gt;
  TestDefParamOne(&#039;x&#039;); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamMulti(&#039;a&#039;); &lt;br /&gt;
  TestDefParamMulti(&#039;a&#039;,&#039;1&#039;); &lt;br /&gt;
  TestDefParamMulti(&#039;a&#039;,&#039;1&#039;,&#039;2&#039;); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamBool(&#039;a&#039;); &lt;br /&gt;
  TestDefParamBool(&#039;a&#039;,false); &lt;br /&gt;
  TestDefParamBool(&#039;a&#039;,true); &lt;br /&gt;
   &lt;br /&gt;
  TestDefParamJson2(&#039;b&#039;);&lt;br /&gt;
  TestDefParamJson2(&#039;b&#039;,&#039;{a:true}&#039;); &lt;br /&gt;
&lt;br /&gt;
  TestDefParamEnum(&#039;c&#039;);&lt;br /&gt;
  TestDefParamEnum(&#039;c&#039;,WFCAState_Final); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type classe&lt;br /&gt;
: Les paramètres de type classe peuvent être passé directement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  MyClass1 = class&lt;br /&gt;
    class procedure foo(rg:TRegClass);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass2 = class&lt;br /&gt;
    ....&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass3 = class&lt;br /&gt;
    procedure oldbar();&lt;br /&gt;
    procedure newbar();&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
class procedure MyClass1.foo(rg:TRegClass);&lt;br /&gt;
begin&lt;br /&gt;
  // =&amp;gt; MyClass2&lt;br /&gt;
  showMessage(rg.aClassName);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.oldbar();&lt;br /&gt;
var rg:TRegClass;&lt;br /&gt;
begin&lt;br /&gt;
  ModelManager.FindClass(&#039;MyClass2&#039;);&lt;br /&gt;
  myClass1.foo(rg);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.newbar();&lt;br /&gt;
begin&lt;br /&gt;
  myClass1.foo(MyClass2);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
* Alloue un oid de la classe&lt;br /&gt;
: Peut être utile dans les tests unitaires&lt;br /&gt;
&lt;br /&gt;
* Méthode ToJson()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sérialize l&#039;objet en json &lt;br /&gt;
: SA peut être un TJsonArray ou un TJsonStruct&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Expression de Sous requête &lt;br /&gt;
&lt;br /&gt;
Une expression peut être définie par une sous requête&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  VueTauxADate = ViewOf(TTauxADate)&lt;br /&gt;
    idTVA : TOid = oidTVA;&lt;br /&gt;
    tDate : Date = tDate;&lt;br /&gt;
    taux : float = taux; &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vueMontantTVA = viewOf(TEcriture)&lt;br /&gt;
    dateEcriture:TDatetime=eDate notInSelect;&lt;br /&gt;
    oidTVA:TOID = ProfilTVA.oidTVA notInSelect; &lt;br /&gt;
    oidPiece:TOID = oidPiece; &lt;br /&gt;
    montantTVAReel:Currency = vueTauxADate.select(&#039;taux * self.montant_TCValue /100&#039;,&#039;(tDate&amp;lt;=self.dateEcriture)and(idTVA=self.oidTVA)&#039;,&#039;&#039;,True,[]); &lt;br /&gt;
    montantTVAReel_CodeDevise:string = montantTVAReel:CodeDevise; &lt;br /&gt;
  end; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastOpeAffected, lastOpeFirstOID&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* operationId, operation&lt;br /&gt;
: Permet d&#039;enregistrer les opérations dans la table TdbfLogOpe&lt;br /&gt;
: S&#039;applique à CopyTo()&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===TsqlOperation===&lt;br /&gt;
&lt;br /&gt;
Classe SQL définie par le framework et permettant d&#039;enregistrer les opérations du sélecteur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  TsqlOperation = Class(TsqlObject)&lt;br /&gt;
  public&lt;br /&gt;
    class procedure CleanOpe(iOpeId:string);&lt;br /&gt;
    //&lt;br /&gt;
    property action: StringS[128];&lt;br /&gt;
    property id: SQLIdentity;&lt;br /&gt;
    property oidSourceObject: TOID;&lt;br /&gt;
    property oidTargetObject: TOID;&lt;br /&gt;
    property opeId: StringS[128];&lt;br /&gt;
    property operation: StringS[128];&lt;br /&gt;
    property SourceObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
    property TargetObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* opeId, operationId&lt;br /&gt;
: Un identifiant unique (guid) identifiant l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* opération&lt;br /&gt;
: Nom de l&#039;opération dans l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* action&lt;br /&gt;
: Action de l&#039;opération &lt;br /&gt;
: Par exemple INSERT pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidSourceObject&lt;br /&gt;
: identifiant de l&#039;objet source dans l&#039;opération &lt;br /&gt;
: Par exemple l&#039;objet source de la copie pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidTargetObject&lt;br /&gt;
: identifiant de l&#039;objet cible dans l&#039;opération&lt;br /&gt;
: Par exemple l&#039;objet copié par un CopyTo&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple d&#039;utilisation:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // Créer des écritures a partir des réglements&lt;br /&gt;
 //&lt;br /&gt;
 procedure  _doCreateEcritureReglements(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueEcritureReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgBordereau&#039;,oidBordereauReglement); &lt;br /&gt;
   sel.Operation := &#039;EcrReg&#039;; &lt;br /&gt;
   sel.OpeId := iOpeId; &lt;br /&gt;
   // &lt;br /&gt;
   sel.CopyTo(&#039;TEcriture&#039;,[&#039;oidpiece&#039;,&#039;eDate&#039;,&#039;sens&#039;,&#039;sensProrata&#039;,&#039;regimeTVA&#039;,&#039;typeEcriture&#039;],[&lt;br /&gt;
    iOidPiece,&lt;br /&gt;
    BordereauReglement.dateReglement, &lt;br /&gt;
    sens_credit,&lt;br /&gt;
    sens_credit, &lt;br /&gt;
    regimeTVA_Encaissements,&lt;br /&gt;
    typeEcriture_Brouillard &lt;br /&gt;
   ]); &lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Type&lt;br /&gt;
  vueUpdateReglement = viewOf(TReglement)&lt;br /&gt;
   vl:TsqlOperation = join(&#039;(opeId=%ArgOpeId) and (operation=%ArgOperation) and (oidSourceObject=self.oid)&#039;); &lt;br /&gt;
   oidEcriture:TOID = oidEcriture; &lt;br /&gt;
   oidTargetEcriture:TOID = vl.oidTargetObject; &lt;br /&gt;
   oidBordereau:TOID = oidBordereauReglement; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 // Met à jour l&#039;oidEcriture créée sur les réglements correspondants&lt;br /&gt;
 ..&lt;br /&gt;
 procedure _doUpdateReglementsEcriture(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueUpdateReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOpeId&#039;,iOpeId); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOperation&#039;,&#039;EcrReg&#039;); &lt;br /&gt;
   //&lt;br /&gt;
   sel.Update([&#039;oidEcriture&#039;],[&#039;oidTargetEcriture&#039;]); &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  aOpeId := CreateGuid;&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
   begin&lt;br /&gt;
     aOidPiece := _doCreatePiece();&lt;br /&gt;
     _doCreateEcritureReglements(aOidPiece,aOpeId);&lt;br /&gt;
     _doUpdateReglementsEcriture(aOidPice,aOpeId); &lt;br /&gt;
     ...&lt;br /&gt;
     TsqlOperation.CleanOpe(aOpeId);&lt;br /&gt;
   end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ToJson()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:TJsonArray);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sérialize tous les objets retournés par le sélecteur au format JSon comptabible avec les tables react&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//procedure GetData(SRows:TJsonArray);&lt;br /&gt;
Type&lt;br /&gt;
  myView = viewOf(...)&lt;br /&gt;
   ...&lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var sel:TSelector; &lt;br /&gt;
begin&lt;br /&gt;
  // Selector to retreive the data&lt;br /&gt;
  // &lt;br /&gt;
  sel := myView.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
  sel.ToJson(SRows); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Updater==&lt;br /&gt;
&lt;br /&gt;
Classe technique permettant de mettre à jour un attribut sur un ensemble d&#039;objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple : Mise à jour des compteurs qui ne peuvent pas être déterminés en SQL&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Should returns all attributes part of the counter&lt;br /&gt;
  //&lt;br /&gt;
  vueNumeroPiece = viewOf(TPiece)&lt;br /&gt;
   pDate:TDatetime = pDate;&lt;br /&gt;
   numero:TCounter = numero; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 procedure _doUpdateNumeroPiece(iOidPiece:string);&lt;br /&gt;
 var sel:TSelector; vueNP:vueNumeroPiece; upd:TUpdater;&lt;br /&gt;
 begin&lt;br /&gt;
   upd := TPiece.CreateUpdater(&#039;numero&#039;); &lt;br /&gt;
   // &lt;br /&gt;
   sel := vueNumeroPiece.CreateSelector(&#039;(oid=%1)&#039;,&#039;&#039;,True,[iOidPiece]);&lt;br /&gt;
   forEach vueNP in sel.AsCursor do&lt;br /&gt;
    begin&lt;br /&gt;
      vueNP.numero.AllocValue;&lt;br /&gt;
      upd.AddValue(vueNP.OID,vueNP.numero.value); &lt;br /&gt;
    end; &lt;br /&gt;
   //&lt;br /&gt;
   upd.Execute; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  &lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Tableaux_de_bord_(dev)&amp;diff=14771</id>
		<title>Tableaux de bord (dev)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Tableaux_de_bord_(dev)&amp;diff=14771"/>
		<updated>2025-05-06T08:17:51Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Principe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
A partir de la version 11 2024 une nouvelle API permet de réaliser des tableaux de bord dans le portail basé sur le framework React.&lt;br /&gt;
&lt;br /&gt;
{{tip|L&#039;ancienne API de tableau de bord est dépréciée}}&lt;br /&gt;
&lt;br /&gt;
==Principe==&lt;br /&gt;
&lt;br /&gt;
Un tableau de bord peut être considéré comme une interface organisée en vignettes (widgets) disposés sur une grille.&lt;br /&gt;
&lt;br /&gt;
==Développement==&lt;br /&gt;
&lt;br /&gt;
Dans le modèle 1000 un tableau de bord est une classe non persistante&lt;br /&gt;
&lt;br /&gt;
==Environnement de développement==&lt;br /&gt;
&lt;br /&gt;
===A partir de l&#039;application Desktop===&lt;br /&gt;
&lt;br /&gt;
Vous pouvez développer un tableau de bord à partir de l&#039;application Desktop.&lt;br /&gt;
&lt;br /&gt;
Pour cela devez disposer d&#039;un environnement de service 1000 contenant le site html.&lt;br /&gt;
&lt;br /&gt;
Dans le concepteur de modèle &lt;br /&gt;
&lt;br /&gt;
* Définissez le répertoire du site htmls du Service 1000.&lt;br /&gt;
* Démarrez le serveur htpp de développement.&lt;br /&gt;
&lt;br /&gt;
L&#039;url du portail géré par le serveur de développement sera indiqué dans la page.&lt;br /&gt;
&lt;br /&gt;
A partir de cette adresse vous pouvez exécuter le portal 1000 et développer les tableaux de bord&lt;br /&gt;
&lt;br /&gt;
===A partir des sources du portail React===&lt;br /&gt;
&lt;br /&gt;
Si vous disposez d&#039;un accès aux sources du portail React vous pouvez développer à partir du serveur de l&#039;environnement de développement React (Visual Studio Code) et de l&#039;application 1000 Desktop.&lt;br /&gt;
&lt;br /&gt;
Ceci vous permettra de tracer le code javascript du portail.&lt;br /&gt;
&lt;br /&gt;
Pour cela :&lt;br /&gt;
&lt;br /&gt;
* Installer l&#039;environnement de développement React (Visual Studio code)&lt;br /&gt;
&lt;br /&gt;
* Cloner ou copier le projet React&lt;br /&gt;
&lt;br /&gt;
Dans le fichier &amp;quot;.env.developpement&amp;quot; du projet vous devez avoir les variable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
REACT_APP_API_URL=http://localhost:8080/sdata&lt;br /&gt;
REACT_APP_API_PACKAGE=htmlportalPackage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ouvrir le répertoire du projet React&lt;br /&gt;
* Dans une fenêtre terminal bash exécuter &lt;br /&gt;
: &amp;quot;yarn install&amp;quot;&lt;br /&gt;
: &amp;quot;yarn start&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Le serveur de développement React démarre sur http://localhost:3000&lt;br /&gt;
&lt;br /&gt;
Le serveur de développement de l&#039;application Desktop doit être démarré.&lt;br /&gt;
&lt;br /&gt;
[[Category:Tableaux de bord]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Tableaux_de_bord_(dev)&amp;diff=14770</id>
		<title>Tableaux de bord (dev)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Tableaux_de_bord_(dev)&amp;diff=14770"/>
		<updated>2025-05-06T08:15:05Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* A partir des sources du Portail React */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
A partir de la version 11 2024 une nouvelle API permet de réaliser des tableaux de bord dans le portail basé sur le framework React.&lt;br /&gt;
&lt;br /&gt;
{{tip|L&#039;ancienne API de tableau de bord est dépréciée}}&lt;br /&gt;
&lt;br /&gt;
==Principe==&lt;br /&gt;
&lt;br /&gt;
Un tableau de bord peut être considéré comme une interface organisée en vignettes (widgets) disposés sur une grille.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Environnement de développement==&lt;br /&gt;
&lt;br /&gt;
===A partir de l&#039;application Desktop===&lt;br /&gt;
&lt;br /&gt;
Vous pouvez développer un tableau de bord à partir de l&#039;application Desktop.&lt;br /&gt;
&lt;br /&gt;
Pour cela devez disposer d&#039;un environnement de service 1000 contenant le site html.&lt;br /&gt;
&lt;br /&gt;
Dans le concepteur de modèle &lt;br /&gt;
&lt;br /&gt;
* Définissez le répertoire du site htmls du Service 1000.&lt;br /&gt;
* Démarrez le serveur htpp de développement.&lt;br /&gt;
&lt;br /&gt;
L&#039;url du portail géré par le serveur de développement sera indiqué dans la page.&lt;br /&gt;
&lt;br /&gt;
A partir de cette adresse vous pouvez exécuter le portal 1000 et développer les tableaux de bord&lt;br /&gt;
&lt;br /&gt;
===A partir des sources du portail React===&lt;br /&gt;
&lt;br /&gt;
Si vous disposez d&#039;un accès aux sources du portail React vous pouvez développer à partir du serveur de l&#039;environnement de développement React (Visual Studio Code) et de l&#039;application 1000 Desktop.&lt;br /&gt;
&lt;br /&gt;
Ceci vous permettra de tracer le code javascript du portail.&lt;br /&gt;
&lt;br /&gt;
Pour cela :&lt;br /&gt;
&lt;br /&gt;
* Installer l&#039;environnement de développement React (Visual Studio code)&lt;br /&gt;
&lt;br /&gt;
* Cloner ou copier le projet React&lt;br /&gt;
&lt;br /&gt;
Dans le fichier &amp;quot;.env.developpement&amp;quot; du projet vous devez avoir les variable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
REACT_APP_API_URL=http://localhost:8080/sdata&lt;br /&gt;
REACT_APP_API_PACKAGE=htmlportalPackage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ouvrir le répertoire du projet React&lt;br /&gt;
* Dans une fenêtre terminal bash exécuter &lt;br /&gt;
: &amp;quot;yarn install&amp;quot;&lt;br /&gt;
: &amp;quot;yarn start&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Le serveur de développement React démarre sur http://localhost:3000&lt;br /&gt;
&lt;br /&gt;
Le serveur de développement de l&#039;application Desktop doit être démarré.&lt;br /&gt;
&lt;br /&gt;
[[Category:Tableaux de bord]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Tableaux_de_bord_(dev)&amp;diff=14769</id>
		<title>Tableaux de bord (dev)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Tableaux_de_bord_(dev)&amp;diff=14769"/>
		<updated>2025-05-06T08:13:45Z</updated>

		<summary type="html">&lt;p&gt;Syfre : Page créée avec « __NOTOC__  A partir de la version 11 2024 une nouvelle API permet de réaliser des tableaux de bord dans le portail basé sur le framework React.  {{tip|L&amp;#039;ancienne API de ... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
A partir de la version 11 2024 une nouvelle API permet de réaliser des tableaux de bord dans le portail basé sur le framework React.&lt;br /&gt;
&lt;br /&gt;
{{tip|L&#039;ancienne API de tableau de bord est dépréciée}}&lt;br /&gt;
&lt;br /&gt;
==Principe==&lt;br /&gt;
&lt;br /&gt;
Un tableau de bord peut être considéré comme une interface organisée en vignettes (widgets) disposés sur une grille.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Environnement de développement==&lt;br /&gt;
&lt;br /&gt;
===A partir de l&#039;application Desktop===&lt;br /&gt;
&lt;br /&gt;
Vous pouvez développer un tableau de bord à partir de l&#039;application Desktop.&lt;br /&gt;
&lt;br /&gt;
Pour cela devez disposer d&#039;un environnement de service 1000 contenant le site html.&lt;br /&gt;
&lt;br /&gt;
Dans le concepteur de modèle &lt;br /&gt;
&lt;br /&gt;
* Définissez le répertoire du site htmls du Service 1000.&lt;br /&gt;
* Démarrez le serveur htpp de développement.&lt;br /&gt;
&lt;br /&gt;
L&#039;url du portail géré par le serveur de développement sera indiqué dans la page.&lt;br /&gt;
&lt;br /&gt;
A partir de cette adresse vous pouvez exécuter le portal 1000 et développer les tableaux de bord&lt;br /&gt;
&lt;br /&gt;
===A partir des sources du Portail React===&lt;br /&gt;
&lt;br /&gt;
Si vous disposez d&#039;un accès aux sources du portail React vous pouvez développer à partir du serveur de l&#039;environnement de développement React (Visual Studio Code) et de l&#039;application 1000 Desktop.&lt;br /&gt;
&lt;br /&gt;
Pour cela :&lt;br /&gt;
&lt;br /&gt;
* Installer l&#039;environnement de développement React (Visual Studio code)&lt;br /&gt;
&lt;br /&gt;
* Cloner ou copier le projet React&lt;br /&gt;
&lt;br /&gt;
Dans le fichier &amp;quot;.env.developpement&amp;quot; du projet vous devez avoir les variable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
REACT_APP_API_URL=http://localhost:8080/sdata&lt;br /&gt;
REACT_APP_API_PACKAGE=htmlportalPackage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ouvrir le répertoire du projet React&lt;br /&gt;
* Dans une fenêtre terminal bash exécuter &lt;br /&gt;
: &amp;quot;yarn install&amp;quot;&lt;br /&gt;
: &amp;quot;yarn start&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Le serveur de développement React démarre sur http://localhost:3000&lt;br /&gt;
&lt;br /&gt;
Le serveur de développement de l&#039;application Desktop doit être démarré.&lt;br /&gt;
&lt;br /&gt;
[[Category:Tableaux de bord]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Main_Page&amp;diff=14768</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Main_Page&amp;diff=14768"/>
		<updated>2025-05-06T07:33:10Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Guides des développeurs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Sage FRP 1000 =&lt;br /&gt;
&lt;br /&gt;
===Architectures===&lt;br /&gt;
* [[Vue d&#039;ensemble 1000 (arch)|Vue d&#039;ensemble]]&lt;br /&gt;
* [[Architecture 2 Tiers (arch)|Architecture 2 Tiers]]&lt;br /&gt;
* [[Architecture 3 Tiers (arch)|Architecture 3 Tiers]]&lt;br /&gt;
* [[Architecture cluster (arch)|Architecture cluster]]&lt;br /&gt;
&lt;br /&gt;
===Guides des administrateurs===&lt;br /&gt;
&lt;br /&gt;
* [[Administration (admin)|Administration]]&lt;br /&gt;
* [[Console d&#039;administration (admin)|Référence de la console d&#039;administration]]&lt;br /&gt;
* [[Flux d&#039;administration|Flux d&#039;administration]]&lt;br /&gt;
&lt;br /&gt;
===Guides des intégrateurs===&lt;br /&gt;
&lt;br /&gt;
* [[Automates|Automates]]&lt;br /&gt;
* [[Processus Métiers (bp)|Processus Métiers et Workflow]]&lt;br /&gt;
* [[Imports|Imports]]&lt;br /&gt;
* [[Exports|Exports]]&lt;br /&gt;
* [[Guide de la traduction|Traduction]]&lt;br /&gt;
* [[Pilotage|Pilotage]]&lt;br /&gt;
* [[Publication|Publication]]&lt;br /&gt;
* [[Portail|Portail]]&lt;br /&gt;
* [[Serveur|Serveur]]&lt;br /&gt;
* [[Complément Outlook (Outlook)|Complément Outlook]]&lt;br /&gt;
* [[Complément Excel (Excel)|Complément Excel]]&lt;br /&gt;
&lt;br /&gt;
===Guides des développeurs===&lt;br /&gt;
&lt;br /&gt;
* [[Développement ESM|Guide de développement ESM]]&lt;br /&gt;
* [[Développement DSM|Guide de développement DSM]]&lt;br /&gt;
{{IfLatest|&lt;br /&gt;
* [[Développement Mobile|Guide de développement d&#039;applications Mobiles]]&lt;br /&gt;
}}&lt;br /&gt;
* [[Processus Métiers (bp)|Guide des processus métiers et Workflow]]&lt;br /&gt;
* [[Web Services (ws)|Guide de développement de Web Services]]&lt;br /&gt;
* [[SData|Guide de développement de l&#039;API Rest SData]]&lt;br /&gt;
* [[Tableaux de bord (dev)|Guide de développement des Tableaux de bord]]&lt;br /&gt;
&lt;br /&gt;
* [[Concepteur de modèle|Concepteur de modèle]]&lt;br /&gt;
* [[Concepteur d&#039;écran|Concepteur d&#039;écran]]&lt;br /&gt;
* [[Concepteur de requêtes (Concepteur de requêtes)|Concepteur de requête]] &lt;br /&gt;
* [[Guide des formats |Guide des formats de génération/intégration de fichier]]&lt;br /&gt;
* [[Référence_pour_les_formats_de_fichier|Référence pour les formats de fichier]]&lt;br /&gt;
&lt;br /&gt;
===Références===&lt;br /&gt;
&lt;br /&gt;
* [[:Category:RTL|Référence du langage et de l&#039;API]]&lt;br /&gt;
* [[Référence des styles|Référence des styles desktop]]&lt;br /&gt;
* [[Référence des styles web|Référence des styles webtop]]&lt;br /&gt;
&lt;br /&gt;
===Vidéos===&lt;br /&gt;
* [[:Category:Video|Didactitiels vidéo (nécessite flash version 9.02 ou plus)]]&lt;br /&gt;
&lt;br /&gt;
===Versions===&lt;br /&gt;
&lt;br /&gt;
* [[Version 6.00 (release note)|Version 6.00]] &lt;br /&gt;
* [[Version 6.50 (release note)|Version 6.50]] &lt;br /&gt;
* [[Version 7.00 (release note)|Version 7.00]]&lt;br /&gt;
* [[Version 7.10 (release_note)|Version 7.10]]&lt;br /&gt;
* [[Version 8.00 (release_note)|Version 8.00]]&lt;br /&gt;
* [[Version 9.00 (release_note)|Version 9.00]]&lt;br /&gt;
* [[Version 9.10 (release_note)|Version 9.10]]&lt;br /&gt;
* [[Version 9.20 (release_note)|Version 9.20]]&lt;br /&gt;
* [[Version 10.00 (release_note)|Version 10.00]]&lt;br /&gt;
* [[Version 11.00 (release_note)|Version 11.00]]&lt;br /&gt;
* [[Version 2024 r1 (release_note)|Version 2024 r1]]&lt;br /&gt;
* [[Version 2024 r2 (release_note)|Version 2024 r2]]&lt;br /&gt;
* [[Version 2025 r1 (release_note)|Version 2025 r1]]&lt;br /&gt;
* [[Version 2025 r2 (release_note)|Version 2025 r2]]&lt;br /&gt;
&lt;br /&gt;
===Documents===&lt;br /&gt;
* [[Documents|Documents]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Concepteur_de_Tableaux_de_bord&amp;diff=14767</id>
		<title>Concepteur de Tableaux de bord</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Concepteur_de_Tableaux_de_bord&amp;diff=14767"/>
		<updated>2025-05-06T07:00:57Z</updated>

		<summary type="html">&lt;p&gt;Syfre : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|A partir de la version 2024 le concepteur de Tableau de bord est déprécié.}}&lt;br /&gt;
&lt;br /&gt;
Le concepteur de tableaux de bord est un outil permettant de concevoir et de visualiser des tableaux de bord.&lt;br /&gt;
&lt;br /&gt;
Le concepteur de tableaux de bord est une application autonome utilisable indépendamment de l&#039;Application Web.&lt;br /&gt;
&lt;br /&gt;
L&#039;url de l&#039;application est accessible à partir de l&#039;url du service :&lt;br /&gt;
&lt;br /&gt;
 http(s)://domain/service/widgets/index.html&lt;br /&gt;
&lt;br /&gt;
Cet url est exposée dans le panneau de Portail de l&#039;Application Web.&lt;br /&gt;
&lt;br /&gt;
[[image:dashboard-1.png]]&lt;br /&gt;
&lt;br /&gt;
Les tableaux de bord réalisé avec cet outil peuvent être visualisé : &lt;br /&gt;
* Soit dans le concepteur de Tableaux de bord&lt;br /&gt;
* Soit dans un onglet de portail de l&#039;Application Web.&lt;br /&gt;
&lt;br /&gt;
[[Category:Portail]]&lt;br /&gt;
[[Category:Tableaux de bord]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14766</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14766"/>
		<updated>2025-04-27T08:01:25Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* UpdateFrom() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Langage==&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type classe&lt;br /&gt;
: Les paramètres de type classe peuvent être passé directement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  MyClass1 = class&lt;br /&gt;
    class procedure foo(rg:TRegClass);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass2 = class&lt;br /&gt;
    ....&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass3 = class&lt;br /&gt;
    procedure oldbar();&lt;br /&gt;
    procedure newbar();&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
class procedure MyClass1.foo(rg:TRegClass);&lt;br /&gt;
begin&lt;br /&gt;
  // =&amp;gt; MyClass2&lt;br /&gt;
  showMessage(rg.aClassName);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.oldbar();&lt;br /&gt;
var rg:TRegClass;&lt;br /&gt;
begin&lt;br /&gt;
  ModelManager.FindClass(&#039;MyClass2&#039;);&lt;br /&gt;
  myClass1.foo(rg);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.newbar();&lt;br /&gt;
begin&lt;br /&gt;
  myClass1.foo(MyClass2);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
* Alloue un oid de la classe&lt;br /&gt;
: Peut être utile dans les tests unitaires&lt;br /&gt;
&lt;br /&gt;
* Méthode ToJson()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sérialize l&#039;objet en json &lt;br /&gt;
: SA peut être un TJsonArray ou un TJsonStruct&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Expression de Sous requête &lt;br /&gt;
&lt;br /&gt;
Une expression peut être définie par une sous requête&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  VueTauxADate = ViewOf(TTauxADate)&lt;br /&gt;
    idTVA : TOid = oidTVA;&lt;br /&gt;
    tDate : Date = tDate;&lt;br /&gt;
    taux : float = taux; &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vueMontantTVA = viewOf(TEcriture)&lt;br /&gt;
    dateEcriture:TDatetime=eDate notInSelect;&lt;br /&gt;
    oidTVA:TOID = ProfilTVA.oidTVA notInSelect; &lt;br /&gt;
    oidPiece:TOID = oidPiece; &lt;br /&gt;
    montantTVAReel:Currency = vueTauxADate.select(&#039;taux * self.montant_TCValue /100&#039;,&#039;(tDate&amp;lt;=self.dateEcriture)and(idTVA=self.oidTVA)&#039;,&#039;&#039;,True,[]); &lt;br /&gt;
    montantTVAReel_CodeDevise:string = montantTVAReel:CodeDevise; &lt;br /&gt;
  end; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastOpeAffected, lastOpeFirstOID&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* operationId, operation&lt;br /&gt;
: Permet d&#039;enregistrer les opérations dans la table TdbfLogOpe&lt;br /&gt;
: S&#039;applique à CopyTo()&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===TsqlOperation===&lt;br /&gt;
&lt;br /&gt;
Classe SQL définie par le framework et permettant d&#039;enregistrer les opérations du sélecteur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  TsqlOperation = Class(TsqlObject)&lt;br /&gt;
  public&lt;br /&gt;
    class procedure CleanOpe(iOpeId:string);&lt;br /&gt;
    //&lt;br /&gt;
    property action: StringS[128];&lt;br /&gt;
    property id: SQLIdentity;&lt;br /&gt;
    property oidSourceObject: TOID;&lt;br /&gt;
    property oidTargetObject: TOID;&lt;br /&gt;
    property opeId: StringS[128];&lt;br /&gt;
    property operation: StringS[128];&lt;br /&gt;
    property SourceObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
    property TargetObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* opeId, operationId&lt;br /&gt;
: Un identifiant unique (guid) identifiant l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* opération&lt;br /&gt;
: Nom de l&#039;opération dans l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* action&lt;br /&gt;
: Action de l&#039;opération &lt;br /&gt;
: Par exemple INSERT pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidSourceObject&lt;br /&gt;
: identifiant de l&#039;objet source dans l&#039;opération &lt;br /&gt;
: Par exemple l&#039;objet source de la copie pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidTargetObject&lt;br /&gt;
: identifiant de l&#039;objet cible dans l&#039;opération&lt;br /&gt;
: Par exemple l&#039;objet copié par un CopyTo&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple d&#039;utilisation:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // Créer des écritures a partir des réglements&lt;br /&gt;
 //&lt;br /&gt;
 procedure  _doCreateEcritureReglements(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueEcritureReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgBordereau&#039;,oidBordereauReglement); &lt;br /&gt;
   sel.Operation := &#039;EcrReg&#039;; &lt;br /&gt;
   sel.OpeId := iOpeId; &lt;br /&gt;
   // &lt;br /&gt;
   sel.CopyTo(&#039;TEcriture&#039;,[&#039;oidpiece&#039;,&#039;eDate&#039;,&#039;sens&#039;,&#039;sensProrata&#039;,&#039;regimeTVA&#039;,&#039;typeEcriture&#039;],[&lt;br /&gt;
    iOidPiece,&lt;br /&gt;
    BordereauReglement.dateReglement, &lt;br /&gt;
    sens_credit,&lt;br /&gt;
    sens_credit, &lt;br /&gt;
    regimeTVA_Encaissements,&lt;br /&gt;
    typeEcriture_Brouillard &lt;br /&gt;
   ]); &lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Type&lt;br /&gt;
  vueUpdateReglement = viewOf(TReglement)&lt;br /&gt;
   vl:TsqlOperation = join(&#039;(opeId=%ArgOpeId) and (operation=%ArgOperation) and (oidSourceObject=self.oid)&#039;); &lt;br /&gt;
   oidEcriture:TOID = oidEcriture; &lt;br /&gt;
   oidTargetEcriture:TOID = vl.oidTargetObject; &lt;br /&gt;
   oidBordereau:TOID = oidBordereauReglement; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 // Met à jour l&#039;oidEcriture créée sur les réglements correspondants&lt;br /&gt;
 ..&lt;br /&gt;
 procedure _doUpdateReglementsEcriture(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueUpdateReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOpeId&#039;,iOpeId); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOperation&#039;,&#039;EcrReg&#039;); &lt;br /&gt;
   //&lt;br /&gt;
   sel.Update([&#039;oidEcriture&#039;],[&#039;oidTargetEcriture&#039;]); &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  aOpeId := CreateGuid;&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
   begin&lt;br /&gt;
     aOidPiece := _doCreatePiece();&lt;br /&gt;
     _doCreateEcritureReglements(aOidPiece,aOpeId);&lt;br /&gt;
     _doUpdateReglementsEcriture(aOidPice,aOpeId); &lt;br /&gt;
     ...&lt;br /&gt;
     TsqlOperation.CleanOpe(aOpeId);&lt;br /&gt;
   end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ToJson()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:TJsonArray);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sérialize tous les objets retournés par le sélecteur au format JSon comptabible avec les tables react&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//procedure GetData(SRows:TJsonArray);&lt;br /&gt;
Type&lt;br /&gt;
  myView = viewOf(...)&lt;br /&gt;
   ...&lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var sel:TSelector; &lt;br /&gt;
begin&lt;br /&gt;
  // Selector to retreive the data&lt;br /&gt;
  // &lt;br /&gt;
  sel := myView.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
  sel.ToJson(SRows); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Updater==&lt;br /&gt;
&lt;br /&gt;
Classe technique permettant de mettre à jour un attribut sur un ensemble d&#039;objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple : Mise à jour des compteurs qui ne peuvent pas être déterminés en SQL&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Should returns all attributes part of the counter&lt;br /&gt;
  //&lt;br /&gt;
  vueNumeroPiece = viewOf(TPiece)&lt;br /&gt;
   pDate:TDatetime = pDate;&lt;br /&gt;
   numero:TCounter = numero; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 procedure _doUpdateNumeroPiece(iOidPiece:string);&lt;br /&gt;
 var sel:TSelector; vueNP:vueNumeroPiece; upd:TUpdater;&lt;br /&gt;
 begin&lt;br /&gt;
   upd := TPiece.CreateUpdater(&#039;numero&#039;); &lt;br /&gt;
   // &lt;br /&gt;
   sel := vueNumeroPiece.CreateSelector(&#039;(oid=%1)&#039;,&#039;&#039;,True,[iOidPiece]);&lt;br /&gt;
   forEach vueNP in sel.AsCursor do&lt;br /&gt;
    begin&lt;br /&gt;
      vueNP.numero.AllocValue;&lt;br /&gt;
      upd.AddValue(vueNP.OID,vueNP.numero.value); &lt;br /&gt;
    end; &lt;br /&gt;
   //&lt;br /&gt;
   upd.Execute; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  &lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14765</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14765"/>
		<updated>2025-04-27T08:00:49Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* TsqlOperation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Langage==&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type classe&lt;br /&gt;
: Les paramètres de type classe peuvent être passé directement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  MyClass1 = class&lt;br /&gt;
    class procedure foo(rg:TRegClass);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass2 = class&lt;br /&gt;
    ....&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass3 = class&lt;br /&gt;
    procedure oldbar();&lt;br /&gt;
    procedure newbar();&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
class procedure MyClass1.foo(rg:TRegClass);&lt;br /&gt;
begin&lt;br /&gt;
  // =&amp;gt; MyClass2&lt;br /&gt;
  showMessage(rg.aClassName);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.oldbar();&lt;br /&gt;
var rg:TRegClass;&lt;br /&gt;
begin&lt;br /&gt;
  ModelManager.FindClass(&#039;MyClass2&#039;);&lt;br /&gt;
  myClass1.foo(rg);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.newbar();&lt;br /&gt;
begin&lt;br /&gt;
  myClass1.foo(MyClass2);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
* Alloue un oid de la classe&lt;br /&gt;
: Peut être utile dans les tests unitaires&lt;br /&gt;
&lt;br /&gt;
* Méthode ToJson()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sérialize l&#039;objet en json &lt;br /&gt;
: SA peut être un TJsonArray ou un TJsonStruct&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Expression de Sous requête &lt;br /&gt;
&lt;br /&gt;
Une expression peut être définie par une sous requête&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  VueTauxADate = ViewOf(TTauxADate)&lt;br /&gt;
    idTVA : TOid = oidTVA;&lt;br /&gt;
    tDate : Date = tDate;&lt;br /&gt;
    taux : float = taux; &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vueMontantTVA = viewOf(TEcriture)&lt;br /&gt;
    dateEcriture:TDatetime=eDate notInSelect;&lt;br /&gt;
    oidTVA:TOID = ProfilTVA.oidTVA notInSelect; &lt;br /&gt;
    oidPiece:TOID = oidPiece; &lt;br /&gt;
    montantTVAReel:Currency = vueTauxADate.select(&#039;taux * self.montant_TCValue /100&#039;,&#039;(tDate&amp;lt;=self.dateEcriture)and(idTVA=self.oidTVA)&#039;,&#039;&#039;,True,[]); &lt;br /&gt;
    montantTVAReel_CodeDevise:string = montantTVAReel:CodeDevise; &lt;br /&gt;
  end; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastOpeAffected, lastOpeFirstOID&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* operationId, operation&lt;br /&gt;
: Permet d&#039;enregistrer les opérations dans la table TdbfLogOpe&lt;br /&gt;
: S&#039;applique à CopyTo()&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===TsqlOperation===&lt;br /&gt;
&lt;br /&gt;
Classe SQL définie par le framework et permettant d&#039;enregistrer les opérations du sélecteur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  TsqlOperation = Class(TsqlObject)&lt;br /&gt;
  public&lt;br /&gt;
    class procedure CleanOpe(iOpeId:string);&lt;br /&gt;
    //&lt;br /&gt;
    property action: StringS[128];&lt;br /&gt;
    property id: SQLIdentity;&lt;br /&gt;
    property oidSourceObject: TOID;&lt;br /&gt;
    property oidTargetObject: TOID;&lt;br /&gt;
    property opeId: StringS[128];&lt;br /&gt;
    property operation: StringS[128];&lt;br /&gt;
    property SourceObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
    property TargetObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* opeId, operationId&lt;br /&gt;
: Un identifiant unique (guid) identifiant l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* opération&lt;br /&gt;
: Nom de l&#039;opération dans l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* action&lt;br /&gt;
: Action de l&#039;opération &lt;br /&gt;
: Par exemple INSERT pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidSourceObject&lt;br /&gt;
: identifiant de l&#039;objet source dans l&#039;opération &lt;br /&gt;
: Par exemple l&#039;objet source de la copie pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidTargetObject&lt;br /&gt;
: identifiant de l&#039;objet cible dans l&#039;opération&lt;br /&gt;
: Par exemple l&#039;objet copié par un CopyTo&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple d&#039;utilisation:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // Créer des écritures a partir des réglements&lt;br /&gt;
 //&lt;br /&gt;
 procedure  _doCreateEcritureReglements(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueEcritureReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgBordereau&#039;,oidBordereauReglement); &lt;br /&gt;
   sel.Operation := &#039;EcrReg&#039;; &lt;br /&gt;
   sel.OpeId := iOpeId; &lt;br /&gt;
   // &lt;br /&gt;
   sel.CopyTo(&#039;TEcriture&#039;,[&#039;oidpiece&#039;,&#039;eDate&#039;,&#039;sens&#039;,&#039;sensProrata&#039;,&#039;regimeTVA&#039;,&#039;typeEcriture&#039;],[&lt;br /&gt;
    iOidPiece,&lt;br /&gt;
    BordereauReglement.dateReglement, &lt;br /&gt;
    sens_credit,&lt;br /&gt;
    sens_credit, &lt;br /&gt;
    regimeTVA_Encaissements,&lt;br /&gt;
    typeEcriture_Brouillard &lt;br /&gt;
   ]); &lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Type&lt;br /&gt;
  vueUpdateReglement = viewOf(TReglement)&lt;br /&gt;
   vl:TsqlOperation = join(&#039;(opeId=%ArgOpeId) and (operation=%ArgOperation) and (oidSourceObject=self.oid)&#039;); &lt;br /&gt;
   oidEcriture:TOID = oidEcriture; &lt;br /&gt;
   oidTargetEcriture:TOID = vl.oidTargetObject; &lt;br /&gt;
   oidBordereau:TOID = oidBordereauReglement; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 // Met à jour l&#039;oidEcriture créée sur les réglements correspondants&lt;br /&gt;
 ..&lt;br /&gt;
 procedure _doUpdateReglementsEcriture(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueUpdateReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOpeId&#039;,iOpeId); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOperation&#039;,&#039;EcrReg&#039;); &lt;br /&gt;
   //&lt;br /&gt;
   sel.Update([&#039;oidEcriture&#039;],[&#039;oidTargetEcriture&#039;]); &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  aOpeId := CreateGuid;&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
   begin&lt;br /&gt;
     aOidPiece := _doCreatePiece();&lt;br /&gt;
     _doCreateEcritureReglements(aOidPiece,aOpeId);&lt;br /&gt;
     _doUpdateReglementsEcriture(aOidPice,aOpeId); &lt;br /&gt;
     ...&lt;br /&gt;
     TsqlOperation.CleanOpe(aOpeId);&lt;br /&gt;
   end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ToJson()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:TJsonArray);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sérialize tous les objets retournés par le sélecteur au format JSon comptabible avec les tables react&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//procedure GetData(SRows:TJsonArray);&lt;br /&gt;
Type&lt;br /&gt;
  myView = viewOf(...)&lt;br /&gt;
   ...&lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var sel:TSelector; &lt;br /&gt;
begin&lt;br /&gt;
  // Selector to retreive the data&lt;br /&gt;
  // &lt;br /&gt;
  sel := myView.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
  sel.ToJson(SRows); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__Updater__&lt;br /&gt;
&lt;br /&gt;
Classe technique permettant de mettre à jour un attribut sur un ensemble d&#039;objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple : Mise à jour des compteurs qui ne peuvent pas être déterminés en SQL&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Should returns all attributes part of the counter&lt;br /&gt;
  //&lt;br /&gt;
  vueNumeroPiece = viewOf(TPiece)&lt;br /&gt;
   pDate:TDatetime = pDate;&lt;br /&gt;
   numero:TCounter = numero; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 procedure _doUpdateNumeroPiece(iOidPiece:string);&lt;br /&gt;
 var sel:TSelector; vueNP:vueNumeroPiece; upd:TUpdater;&lt;br /&gt;
 begin&lt;br /&gt;
   upd := TPiece.CreateUpdater(&#039;numero&#039;); &lt;br /&gt;
   // &lt;br /&gt;
   sel := vueNumeroPiece.CreateSelector(&#039;(oid=%1)&#039;,&#039;&#039;,True,[iOidPiece]);&lt;br /&gt;
   forEach vueNP in sel.AsCursor do&lt;br /&gt;
    begin&lt;br /&gt;
      vueNP.numero.AllocValue;&lt;br /&gt;
      upd.AddValue(vueNP.OID,vueNP.numero.value); &lt;br /&gt;
    end; &lt;br /&gt;
   //&lt;br /&gt;
   upd.Execute; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  &lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14764</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14764"/>
		<updated>2025-04-27T08:00:28Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Sélecteur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Langage==&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type classe&lt;br /&gt;
: Les paramètres de type classe peuvent être passé directement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  MyClass1 = class&lt;br /&gt;
    class procedure foo(rg:TRegClass);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass2 = class&lt;br /&gt;
    ....&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass3 = class&lt;br /&gt;
    procedure oldbar();&lt;br /&gt;
    procedure newbar();&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
class procedure MyClass1.foo(rg:TRegClass);&lt;br /&gt;
begin&lt;br /&gt;
  // =&amp;gt; MyClass2&lt;br /&gt;
  showMessage(rg.aClassName);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.oldbar();&lt;br /&gt;
var rg:TRegClass;&lt;br /&gt;
begin&lt;br /&gt;
  ModelManager.FindClass(&#039;MyClass2&#039;);&lt;br /&gt;
  myClass1.foo(rg);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.newbar();&lt;br /&gt;
begin&lt;br /&gt;
  myClass1.foo(MyClass2);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
* Alloue un oid de la classe&lt;br /&gt;
: Peut être utile dans les tests unitaires&lt;br /&gt;
&lt;br /&gt;
* Méthode ToJson()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sérialize l&#039;objet en json &lt;br /&gt;
: SA peut être un TJsonArray ou un TJsonStruct&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Expression de Sous requête &lt;br /&gt;
&lt;br /&gt;
Une expression peut être définie par une sous requête&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  VueTauxADate = ViewOf(TTauxADate)&lt;br /&gt;
    idTVA : TOid = oidTVA;&lt;br /&gt;
    tDate : Date = tDate;&lt;br /&gt;
    taux : float = taux; &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vueMontantTVA = viewOf(TEcriture)&lt;br /&gt;
    dateEcriture:TDatetime=eDate notInSelect;&lt;br /&gt;
    oidTVA:TOID = ProfilTVA.oidTVA notInSelect; &lt;br /&gt;
    oidPiece:TOID = oidPiece; &lt;br /&gt;
    montantTVAReel:Currency = vueTauxADate.select(&#039;taux * self.montant_TCValue /100&#039;,&#039;(tDate&amp;lt;=self.dateEcriture)and(idTVA=self.oidTVA)&#039;,&#039;&#039;,True,[]); &lt;br /&gt;
    montantTVAReel_CodeDevise:string = montantTVAReel:CodeDevise; &lt;br /&gt;
  end; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastOpeAffected, lastOpeFirstOID&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* operationId, operation&lt;br /&gt;
: Permet d&#039;enregistrer les opérations dans la table TdbfLogOpe&lt;br /&gt;
: S&#039;applique à CopyTo()&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===TsqlOperation===&lt;br /&gt;
&lt;br /&gt;
Classe SQL définie par le framework et permettant d&#039;enregistrer les opérations du sélecteur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source langage=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  TsqlOperation = Class(TsqlObject)&lt;br /&gt;
  public&lt;br /&gt;
    class procedure CleanOpe(iOpeId:string);&lt;br /&gt;
    //&lt;br /&gt;
    property action: StringS[128];&lt;br /&gt;
    property id: SQLIdentity;&lt;br /&gt;
    property oidSourceObject: TOID;&lt;br /&gt;
    property oidTargetObject: TOID;&lt;br /&gt;
    property opeId: StringS[128];&lt;br /&gt;
    property operation: StringS[128];&lt;br /&gt;
    property SourceObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
    property TargetObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* opeId, operationId&lt;br /&gt;
: Un identifiant unique (guid) identifiant l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* opération&lt;br /&gt;
: Nom de l&#039;opération dans l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* action&lt;br /&gt;
: Action de l&#039;opération &lt;br /&gt;
: Par exemple INSERT pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidSourceObject&lt;br /&gt;
: identifiant de l&#039;objet source dans l&#039;opération &lt;br /&gt;
: Par exemple l&#039;objet source de la copie pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidTargetObject&lt;br /&gt;
: identifiant de l&#039;objet cible dans l&#039;opération&lt;br /&gt;
: Par exemple l&#039;objet copié par un CopyTo&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple d&#039;utilisation:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // Créer des écritures a partir des réglements&lt;br /&gt;
 //&lt;br /&gt;
 procedure  _doCreateEcritureReglements(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueEcritureReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgBordereau&#039;,oidBordereauReglement); &lt;br /&gt;
   sel.Operation := &#039;EcrReg&#039;; &lt;br /&gt;
   sel.OpeId := iOpeId; &lt;br /&gt;
   // &lt;br /&gt;
   sel.CopyTo(&#039;TEcriture&#039;,[&#039;oidpiece&#039;,&#039;eDate&#039;,&#039;sens&#039;,&#039;sensProrata&#039;,&#039;regimeTVA&#039;,&#039;typeEcriture&#039;],[&lt;br /&gt;
    iOidPiece,&lt;br /&gt;
    BordereauReglement.dateReglement, &lt;br /&gt;
    sens_credit,&lt;br /&gt;
    sens_credit, &lt;br /&gt;
    regimeTVA_Encaissements,&lt;br /&gt;
    typeEcriture_Brouillard &lt;br /&gt;
   ]); &lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Type&lt;br /&gt;
  vueUpdateReglement = viewOf(TReglement)&lt;br /&gt;
   vl:TsqlOperation = join(&#039;(opeId=%ArgOpeId) and (operation=%ArgOperation) and (oidSourceObject=self.oid)&#039;); &lt;br /&gt;
   oidEcriture:TOID = oidEcriture; &lt;br /&gt;
   oidTargetEcriture:TOID = vl.oidTargetObject; &lt;br /&gt;
   oidBordereau:TOID = oidBordereauReglement; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 // Met à jour l&#039;oidEcriture créée sur les réglements correspondants&lt;br /&gt;
 ..&lt;br /&gt;
 procedure _doUpdateReglementsEcriture(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueUpdateReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOpeId&#039;,iOpeId); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOperation&#039;,&#039;EcrReg&#039;); &lt;br /&gt;
   //&lt;br /&gt;
   sel.Update([&#039;oidEcriture&#039;],[&#039;oidTargetEcriture&#039;]); &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  aOpeId := CreateGuid;&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
   begin&lt;br /&gt;
     aOidPiece := _doCreatePiece();&lt;br /&gt;
     _doCreateEcritureReglements(aOidPiece,aOpeId);&lt;br /&gt;
     _doUpdateReglementsEcriture(aOidPice,aOpeId); &lt;br /&gt;
     ...&lt;br /&gt;
     TsqlOperation.CleanOpe(aOpeId);&lt;br /&gt;
   end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ToJson()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:TJsonArray);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sérialize tous les objets retournés par le sélecteur au format JSon comptabible avec les tables react&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//procedure GetData(SRows:TJsonArray);&lt;br /&gt;
Type&lt;br /&gt;
  myView = viewOf(...)&lt;br /&gt;
   ...&lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var sel:TSelector; &lt;br /&gt;
begin&lt;br /&gt;
  // Selector to retreive the data&lt;br /&gt;
  // &lt;br /&gt;
  sel := myView.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
  sel.ToJson(SRows); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__Updater__&lt;br /&gt;
&lt;br /&gt;
Classe technique permettant de mettre à jour un attribut sur un ensemble d&#039;objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple : Mise à jour des compteurs qui ne peuvent pas être déterminés en SQL&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Should returns all attributes part of the counter&lt;br /&gt;
  //&lt;br /&gt;
  vueNumeroPiece = viewOf(TPiece)&lt;br /&gt;
   pDate:TDatetime = pDate;&lt;br /&gt;
   numero:TCounter = numero; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 procedure _doUpdateNumeroPiece(iOidPiece:string);&lt;br /&gt;
 var sel:TSelector; vueNP:vueNumeroPiece; upd:TUpdater;&lt;br /&gt;
 begin&lt;br /&gt;
   upd := TPiece.CreateUpdater(&#039;numero&#039;); &lt;br /&gt;
   // &lt;br /&gt;
   sel := vueNumeroPiece.CreateSelector(&#039;(oid=%1)&#039;,&#039;&#039;,True,[iOidPiece]);&lt;br /&gt;
   forEach vueNP in sel.AsCursor do&lt;br /&gt;
    begin&lt;br /&gt;
      vueNP.numero.AllocValue;&lt;br /&gt;
      upd.AddValue(vueNP.OID,vueNP.numero.value); &lt;br /&gt;
    end; &lt;br /&gt;
   //&lt;br /&gt;
   upd.Execute; &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  &lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14763</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14763"/>
		<updated>2025-04-27T07:47:09Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* TdbfLogOpe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Langage==&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type classe&lt;br /&gt;
: Les paramètres de type classe peuvent être passé directement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  MyClass1 = class&lt;br /&gt;
    class procedure foo(rg:TRegClass);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass2 = class&lt;br /&gt;
    ....&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass3 = class&lt;br /&gt;
    procedure oldbar();&lt;br /&gt;
    procedure newbar();&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
class procedure MyClass1.foo(rg:TRegClass);&lt;br /&gt;
begin&lt;br /&gt;
  // =&amp;gt; MyClass2&lt;br /&gt;
  showMessage(rg.aClassName);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.oldbar();&lt;br /&gt;
var rg:TRegClass;&lt;br /&gt;
begin&lt;br /&gt;
  ModelManager.FindClass(&#039;MyClass2&#039;);&lt;br /&gt;
  myClass1.foo(rg);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.newbar();&lt;br /&gt;
begin&lt;br /&gt;
  myClass1.foo(MyClass2);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
* Alloue un oid de la classe&lt;br /&gt;
: Peut être utile dans les tests unitaires&lt;br /&gt;
&lt;br /&gt;
* Méthode ToJson()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sérialize l&#039;objet en json &lt;br /&gt;
: SA peut être un TJsonArray ou un TJsonStruct&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Expression de Sous requête &lt;br /&gt;
&lt;br /&gt;
Une expression peut être définie par une sous requête&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  VueTauxADate = ViewOf(TTauxADate)&lt;br /&gt;
    idTVA : TOid = oidTVA;&lt;br /&gt;
    tDate : Date = tDate;&lt;br /&gt;
    taux : float = taux; &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vueMontantTVA = viewOf(TEcriture)&lt;br /&gt;
    dateEcriture:TDatetime=eDate notInSelect;&lt;br /&gt;
    oidTVA:TOID = ProfilTVA.oidTVA notInSelect; &lt;br /&gt;
    oidPiece:TOID = oidPiece; &lt;br /&gt;
    montantTVAReel:Currency = vueTauxADate.select(&#039;taux * self.montant_TCValue /100&#039;,&#039;(tDate&amp;lt;=self.dateEcriture)and(idTVA=self.oidTVA)&#039;,&#039;&#039;,True,[]); &lt;br /&gt;
    montantTVAReel_CodeDevise:string = montantTVAReel:CodeDevise; &lt;br /&gt;
  end; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastOpeAffected, lastOpeFirstOID&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* operationId, operation&lt;br /&gt;
: Permet d&#039;enregistrer les opérations dans la table TdbfLogOpe&lt;br /&gt;
: S&#039;applique à CopyTo()&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===TsqlOperation===&lt;br /&gt;
&lt;br /&gt;
Classe SQL définie par le framework et permettant d&#039;enregistrer les opérations du sélecteur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  TsqlOperation = Class(TsqlObject)&lt;br /&gt;
  public&lt;br /&gt;
    class procedure CleanOpe(iOpeId:string);&lt;br /&gt;
    //&lt;br /&gt;
    property action: StringS[128];&lt;br /&gt;
    property id: SQLIdentity;&lt;br /&gt;
    property oidSourceObject: TOID;&lt;br /&gt;
    property oidTargetObject: TOID;&lt;br /&gt;
    property opeId: StringS[128];&lt;br /&gt;
    property operation: StringS[128];&lt;br /&gt;
    property SourceObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
    property TargetObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* opeId, operationId&lt;br /&gt;
: Un identifiant unique (guid) identifiant l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* opération&lt;br /&gt;
: Nom de l&#039;opération dans l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* action&lt;br /&gt;
: Action de l&#039;opération &lt;br /&gt;
: Par exemple INSERT pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidSourceObject&lt;br /&gt;
: identifiant de l&#039;objet source dans l&#039;opération &lt;br /&gt;
: Par exemple l&#039;objet source de la copie pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidTargetObject&lt;br /&gt;
: identifiant de l&#039;objet cible dans l&#039;opération&lt;br /&gt;
: Par exemple l&#039;objet copié par un CopyTo&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple d&#039;utilisation:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // Créer des écritures a partir des réglements&lt;br /&gt;
 //&lt;br /&gt;
 procedure  _doCreateEcritureReglements(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueEcritureReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgBordereau&#039;,oidBordereauReglement); &lt;br /&gt;
   sel.Operation := &#039;EcrReg&#039;; &lt;br /&gt;
   sel.OpeId := iOpeId; &lt;br /&gt;
   // &lt;br /&gt;
   sel.CopyTo(&#039;TEcriture&#039;,[&#039;oidpiece&#039;,&#039;eDate&#039;,&#039;sens&#039;,&#039;sensProrata&#039;,&#039;regimeTVA&#039;,&#039;typeEcriture&#039;],[&lt;br /&gt;
    iOidPiece,&lt;br /&gt;
    BordereauReglement.dateReglement, &lt;br /&gt;
    sens_credit,&lt;br /&gt;
    sens_credit, &lt;br /&gt;
    regimeTVA_Encaissements,&lt;br /&gt;
    typeEcriture_Brouillard &lt;br /&gt;
   ]); &lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Type&lt;br /&gt;
  vueUpdateReglement = viewOf(TReglement)&lt;br /&gt;
   vl:TsqlOperation = join(&#039;(opeId=%ArgOpeId) and (operation=%ArgOperation) and (oidSourceObject=self.oid)&#039;); &lt;br /&gt;
   oidEcriture:TOID = oidEcriture; &lt;br /&gt;
   oidTargetEcriture:TOID = vl.oidTargetObject; &lt;br /&gt;
   oidBordereau:TOID = oidBordereauReglement; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 // Met à jour l&#039;oidEcriture créée sur les réglements correspondants&lt;br /&gt;
 ..&lt;br /&gt;
 procedure _doUpdateReglementsEcriture(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueUpdateReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOpeId&#039;,iOpeId); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOperation&#039;,&#039;EcrReg&#039;); &lt;br /&gt;
   //&lt;br /&gt;
   sel.Update([&#039;oidEcriture&#039;],[&#039;oidTargetEcriture&#039;]); &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  aOpeId := CreateGuid;&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
   begin&lt;br /&gt;
     aOidPiece := _doCreatePiece();&lt;br /&gt;
     _doCreateEcritureReglements(aOidPiece,aOpeId);&lt;br /&gt;
     _doUpdateReglementsEcriture(aOidPice,aOpeId); &lt;br /&gt;
     ...&lt;br /&gt;
     TsqlOperation.CleanOpe(aOpeId);&lt;br /&gt;
   end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ToJson()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:TJsonArray);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sérialize tous les objets retournés par le sélecteur au format JSon comptabible avec les tables react&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//procedure GetData(SRows:TJsonArray);&lt;br /&gt;
Type&lt;br /&gt;
  myView = viewOf(...)&lt;br /&gt;
   ...&lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var sel:TSelector; &lt;br /&gt;
begin&lt;br /&gt;
  // Selector to retreive the data&lt;br /&gt;
  // &lt;br /&gt;
  sel := myView.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
  sel.ToJson(SRows); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14762</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14762"/>
		<updated>2025-04-26T09:13:13Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* ToJson() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Langage==&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type classe&lt;br /&gt;
: Les paramètres de type classe peuvent être passé directement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  MyClass1 = class&lt;br /&gt;
    class procedure foo(rg:TRegClass);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass2 = class&lt;br /&gt;
    ....&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass3 = class&lt;br /&gt;
    procedure oldbar();&lt;br /&gt;
    procedure newbar();&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
class procedure MyClass1.foo(rg:TRegClass);&lt;br /&gt;
begin&lt;br /&gt;
  // =&amp;gt; MyClass2&lt;br /&gt;
  showMessage(rg.aClassName);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.oldbar();&lt;br /&gt;
var rg:TRegClass;&lt;br /&gt;
begin&lt;br /&gt;
  ModelManager.FindClass(&#039;MyClass2&#039;);&lt;br /&gt;
  myClass1.foo(rg);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.newbar();&lt;br /&gt;
begin&lt;br /&gt;
  myClass1.foo(MyClass2);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
* Alloue un oid de la classe&lt;br /&gt;
: Peut être utile dans les tests unitaires&lt;br /&gt;
&lt;br /&gt;
* Méthode ToJson()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sérialize l&#039;objet en json &lt;br /&gt;
: SA peut être un TJsonArray ou un TJsonStruct&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Expression de Sous requête &lt;br /&gt;
&lt;br /&gt;
Une expression peut être définie par une sous requête&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  VueTauxADate = ViewOf(TTauxADate)&lt;br /&gt;
    idTVA : TOid = oidTVA;&lt;br /&gt;
    tDate : Date = tDate;&lt;br /&gt;
    taux : float = taux; &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vueMontantTVA = viewOf(TEcriture)&lt;br /&gt;
    dateEcriture:TDatetime=eDate notInSelect;&lt;br /&gt;
    oidTVA:TOID = ProfilTVA.oidTVA notInSelect; &lt;br /&gt;
    oidPiece:TOID = oidPiece; &lt;br /&gt;
    montantTVAReel:Currency = vueTauxADate.select(&#039;taux * self.montant_TCValue /100&#039;,&#039;(tDate&amp;lt;=self.dateEcriture)and(idTVA=self.oidTVA)&#039;,&#039;&#039;,True,[]); &lt;br /&gt;
    montantTVAReel_CodeDevise:string = montantTVAReel:CodeDevise; &lt;br /&gt;
  end; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastOpeAffected, lastOpeFirstOID&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* operationId, operation&lt;br /&gt;
: Permet d&#039;enregistrer les opérations dans la table TdbfLogOpe&lt;br /&gt;
: S&#039;applique à CopyTo()&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===TdbfLogOpe===&lt;br /&gt;
&lt;br /&gt;
Classe SQL définie par le framework et permettant d&#039;enregistrer les opérations du sélecteur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  TdbfLogOpe = Class(TsqlObject)&lt;br /&gt;
  public&lt;br /&gt;
    property action: StringS[128];&lt;br /&gt;
    property id: SQLIdentity;&lt;br /&gt;
    property oidSourceObject: TOID;&lt;br /&gt;
    property oidTargetObject: TOID;&lt;br /&gt;
    property opeId: StringS[128];&lt;br /&gt;
    property operation: StringS[128];&lt;br /&gt;
    property SourceObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
    property TargetObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* opeId, operationId&lt;br /&gt;
: Un identifiant unique (guid) identifiant l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* opération&lt;br /&gt;
: Nom de l&#039;opération dans l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* action&lt;br /&gt;
: Action de l&#039;opération &lt;br /&gt;
: Par exemple INSERT pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidSourceObject&lt;br /&gt;
: identifiant de l&#039;objet source dans l&#039;opération &lt;br /&gt;
: Par exemple l&#039;objet source de la copie pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidTargetObject&lt;br /&gt;
: identifiant de l&#039;objet cible dans l&#039;opération&lt;br /&gt;
: Par exemple l&#039;objet copié par un CopyTo&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple d&#039;utilisation:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // Créer des écritures a partir des réglements&lt;br /&gt;
 //&lt;br /&gt;
 procedure  _doCreateEcritureReglements(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueEcritureReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgBordereau&#039;,oidBordereauReglement); &lt;br /&gt;
   sel.Operation := &#039;EcrReg&#039;; &lt;br /&gt;
   sel.OpeId := iOpeId; &lt;br /&gt;
   // &lt;br /&gt;
   sel.CopyTo(&#039;TEcriture&#039;,[&#039;oidpiece&#039;,&#039;eDate&#039;,&#039;sens&#039;,&#039;sensProrata&#039;,&#039;regimeTVA&#039;,&#039;typeEcriture&#039;],[&lt;br /&gt;
    iOidPiece,&lt;br /&gt;
    BordereauReglement.dateReglement, &lt;br /&gt;
    sens_credit,&lt;br /&gt;
    sens_credit, &lt;br /&gt;
    regimeTVA_Encaissements,&lt;br /&gt;
    typeEcriture_Brouillard &lt;br /&gt;
   ]); &lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Type&lt;br /&gt;
  vueUpdateReglement = viewOf(TReglement)&lt;br /&gt;
   vl:TdbfLogOpe = join(&#039;(opeId=%ArgOpeId) and (operation=%ArgOperation) and (oidSourceObject=self.oid)&#039;); &lt;br /&gt;
   oidEcriture:TOID = oidEcriture; &lt;br /&gt;
   oidTargetEcriture:TOID = vl.oidTargetObject; &lt;br /&gt;
   oidBordereau:TOID = oidBordereauReglement; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 // Met à jour l&#039;oidEcriture créée sur les réglements correspondants&lt;br /&gt;
 ..&lt;br /&gt;
 procedure _doUpdateReglementEcriture(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueUpdateReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOpeId&#039;,iOpeId); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOperation&#039;,&#039;EcrReg&#039;); &lt;br /&gt;
   //&lt;br /&gt;
   sel.Update([&#039;oidEcriture&#039;],[&#039;oidTargetEcriture&#039;]); &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ToJson()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:TJsonArray);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sérialize tous les objets retournés par le sélecteur au format JSon comptabible avec les tables react&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//procedure GetData(SRows:TJsonArray);&lt;br /&gt;
Type&lt;br /&gt;
  myView = viewOf(...)&lt;br /&gt;
   ...&lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var sel:TSelector; &lt;br /&gt;
begin&lt;br /&gt;
  // Selector to retreive the data&lt;br /&gt;
  // &lt;br /&gt;
  sel := myView.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
  sel.ToJson(SRows); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14761</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14761"/>
		<updated>2025-04-26T09:11:13Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* ToJson() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Langage==&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type classe&lt;br /&gt;
: Les paramètres de type classe peuvent être passé directement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  MyClass1 = class&lt;br /&gt;
    class procedure foo(rg:TRegClass);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass2 = class&lt;br /&gt;
    ....&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass3 = class&lt;br /&gt;
    procedure oldbar();&lt;br /&gt;
    procedure newbar();&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
class procedure MyClass1.foo(rg:TRegClass);&lt;br /&gt;
begin&lt;br /&gt;
  // =&amp;gt; MyClass2&lt;br /&gt;
  showMessage(rg.aClassName);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.oldbar();&lt;br /&gt;
var rg:TRegClass;&lt;br /&gt;
begin&lt;br /&gt;
  ModelManager.FindClass(&#039;MyClass2&#039;);&lt;br /&gt;
  myClass1.foo(rg);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.newbar();&lt;br /&gt;
begin&lt;br /&gt;
  myClass1.foo(MyClass2);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
* Alloue un oid de la classe&lt;br /&gt;
: Peut être utile dans les tests unitaires&lt;br /&gt;
&lt;br /&gt;
* Méthode ToJson()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sérialize l&#039;objet en json &lt;br /&gt;
: SA peut être un TJsonArray ou un TJsonStruct&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Expression de Sous requête &lt;br /&gt;
&lt;br /&gt;
Une expression peut être définie par une sous requête&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  VueTauxADate = ViewOf(TTauxADate)&lt;br /&gt;
    idTVA : TOid = oidTVA;&lt;br /&gt;
    tDate : Date = tDate;&lt;br /&gt;
    taux : float = taux; &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vueMontantTVA = viewOf(TEcriture)&lt;br /&gt;
    dateEcriture:TDatetime=eDate notInSelect;&lt;br /&gt;
    oidTVA:TOID = ProfilTVA.oidTVA notInSelect; &lt;br /&gt;
    oidPiece:TOID = oidPiece; &lt;br /&gt;
    montantTVAReel:Currency = vueTauxADate.select(&#039;taux * self.montant_TCValue /100&#039;,&#039;(tDate&amp;lt;=self.dateEcriture)and(idTVA=self.oidTVA)&#039;,&#039;&#039;,True,[]); &lt;br /&gt;
    montantTVAReel_CodeDevise:string = montantTVAReel:CodeDevise; &lt;br /&gt;
  end; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastOpeAffected, lastOpeFirstOID&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* operationId, operation&lt;br /&gt;
: Permet d&#039;enregistrer les opérations dans la table TdbfLogOpe&lt;br /&gt;
: S&#039;applique à CopyTo()&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===TdbfLogOpe===&lt;br /&gt;
&lt;br /&gt;
Classe SQL définie par le framework et permettant d&#039;enregistrer les opérations du sélecteur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  TdbfLogOpe = Class(TsqlObject)&lt;br /&gt;
  public&lt;br /&gt;
    property action: StringS[128];&lt;br /&gt;
    property id: SQLIdentity;&lt;br /&gt;
    property oidSourceObject: TOID;&lt;br /&gt;
    property oidTargetObject: TOID;&lt;br /&gt;
    property opeId: StringS[128];&lt;br /&gt;
    property operation: StringS[128];&lt;br /&gt;
    property SourceObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
    property TargetObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* opeId, operationId&lt;br /&gt;
: Un identifiant unique (guid) identifiant l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* opération&lt;br /&gt;
: Nom de l&#039;opération dans l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* action&lt;br /&gt;
: Action de l&#039;opération &lt;br /&gt;
: Par exemple INSERT pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidSourceObject&lt;br /&gt;
: identifiant de l&#039;objet source dans l&#039;opération &lt;br /&gt;
: Par exemple l&#039;objet source de la copie pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidTargetObject&lt;br /&gt;
: identifiant de l&#039;objet cible dans l&#039;opération&lt;br /&gt;
: Par exemple l&#039;objet copié par un CopyTo&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple d&#039;utilisation:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // Créer des écritures a partir des réglements&lt;br /&gt;
 //&lt;br /&gt;
 procedure  _doCreateEcritureReglements(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueEcritureReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgBordereau&#039;,oidBordereauReglement); &lt;br /&gt;
   sel.Operation := &#039;EcrReg&#039;; &lt;br /&gt;
   sel.OpeId := iOpeId; &lt;br /&gt;
   // &lt;br /&gt;
   sel.CopyTo(&#039;TEcriture&#039;,[&#039;oidpiece&#039;,&#039;eDate&#039;,&#039;sens&#039;,&#039;sensProrata&#039;,&#039;regimeTVA&#039;,&#039;typeEcriture&#039;],[&lt;br /&gt;
    iOidPiece,&lt;br /&gt;
    BordereauReglement.dateReglement, &lt;br /&gt;
    sens_credit,&lt;br /&gt;
    sens_credit, &lt;br /&gt;
    regimeTVA_Encaissements,&lt;br /&gt;
    typeEcriture_Brouillard &lt;br /&gt;
   ]); &lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Type&lt;br /&gt;
  vueUpdateReglement = viewOf(TReglement)&lt;br /&gt;
   vl:TdbfLogOpe = join(&#039;(opeId=%ArgOpeId) and (operation=%ArgOperation) and (oidSourceObject=self.oid)&#039;); &lt;br /&gt;
   oidEcriture:TOID = oidEcriture; &lt;br /&gt;
   oidTargetEcriture:TOID = vl.oidTargetObject; &lt;br /&gt;
   oidBordereau:TOID = oidBordereauReglement; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 // Met à jour l&#039;oidEcriture créée sur les réglements correspondants&lt;br /&gt;
 ..&lt;br /&gt;
 procedure _doUpdateReglementEcriture(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueUpdateReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOpeId&#039;,iOpeId); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOperation&#039;,&#039;EcrReg&#039;); &lt;br /&gt;
   //&lt;br /&gt;
   sel.Update([&#039;oidEcriture&#039;],[&#039;oidTargetEcriture&#039;]); &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ToJson()===&lt;br /&gt;
&lt;br /&gt;
Sérialize tous les objets retournés par le sélecteur au format JSon comptabible avec les tables react&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:TJsonArray);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//procedure GetData(SRows:TJsonArray);&lt;br /&gt;
Type&lt;br /&gt;
  myView = viewOf(...)&lt;br /&gt;
   ...&lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var sel:TSelector; &lt;br /&gt;
begin&lt;br /&gt;
  // Selector to retreive the data&lt;br /&gt;
  // &lt;br /&gt;
  sel := myView.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
  sel.ToJson(SRows); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Sérialize tous les objets retournés par le sélecteur&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14760</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14760"/>
		<updated>2025-04-26T09:10:05Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Sélecteur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Langage==&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type classe&lt;br /&gt;
: Les paramètres de type classe peuvent être passé directement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  MyClass1 = class&lt;br /&gt;
    class procedure foo(rg:TRegClass);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass2 = class&lt;br /&gt;
    ....&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass3 = class&lt;br /&gt;
    procedure oldbar();&lt;br /&gt;
    procedure newbar();&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
class procedure MyClass1.foo(rg:TRegClass);&lt;br /&gt;
begin&lt;br /&gt;
  // =&amp;gt; MyClass2&lt;br /&gt;
  showMessage(rg.aClassName);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.oldbar();&lt;br /&gt;
var rg:TRegClass;&lt;br /&gt;
begin&lt;br /&gt;
  ModelManager.FindClass(&#039;MyClass2&#039;);&lt;br /&gt;
  myClass1.foo(rg);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.newbar();&lt;br /&gt;
begin&lt;br /&gt;
  myClass1.foo(MyClass2);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
* Alloue un oid de la classe&lt;br /&gt;
: Peut être utile dans les tests unitaires&lt;br /&gt;
&lt;br /&gt;
* Méthode ToJson()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sérialize l&#039;objet en json &lt;br /&gt;
: SA peut être un TJsonArray ou un TJsonStruct&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Expression de Sous requête &lt;br /&gt;
&lt;br /&gt;
Une expression peut être définie par une sous requête&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  VueTauxADate = ViewOf(TTauxADate)&lt;br /&gt;
    idTVA : TOid = oidTVA;&lt;br /&gt;
    tDate : Date = tDate;&lt;br /&gt;
    taux : float = taux; &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vueMontantTVA = viewOf(TEcriture)&lt;br /&gt;
    dateEcriture:TDatetime=eDate notInSelect;&lt;br /&gt;
    oidTVA:TOID = ProfilTVA.oidTVA notInSelect; &lt;br /&gt;
    oidPiece:TOID = oidPiece; &lt;br /&gt;
    montantTVAReel:Currency = vueTauxADate.select(&#039;taux * self.montant_TCValue /100&#039;,&#039;(tDate&amp;lt;=self.dateEcriture)and(idTVA=self.oidTVA)&#039;,&#039;&#039;,True,[]); &lt;br /&gt;
    montantTVAReel_CodeDevise:string = montantTVAReel:CodeDevise; &lt;br /&gt;
  end; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastOpeAffected, lastOpeFirstOID&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* operationId, operation&lt;br /&gt;
: Permet d&#039;enregistrer les opérations dans la table TdbfLogOpe&lt;br /&gt;
: S&#039;applique à CopyTo()&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===TdbfLogOpe===&lt;br /&gt;
&lt;br /&gt;
Classe SQL définie par le framework et permettant d&#039;enregistrer les opérations du sélecteur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
  TdbfLogOpe = Class(TsqlObject)&lt;br /&gt;
  public&lt;br /&gt;
    property action: StringS[128];&lt;br /&gt;
    property id: SQLIdentity;&lt;br /&gt;
    property oidSourceObject: TOID;&lt;br /&gt;
    property oidTargetObject: TOID;&lt;br /&gt;
    property opeId: StringS[128];&lt;br /&gt;
    property operation: StringS[128];&lt;br /&gt;
    property SourceObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
    property TargetObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* opeId, operationId&lt;br /&gt;
: Un identifiant unique (guid) identifiant l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* opération&lt;br /&gt;
: Nom de l&#039;opération dans l&#039;ensemble des opérations&lt;br /&gt;
&lt;br /&gt;
* action&lt;br /&gt;
: Action de l&#039;opération &lt;br /&gt;
: Par exemple INSERT pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidSourceObject&lt;br /&gt;
: identifiant de l&#039;objet source dans l&#039;opération &lt;br /&gt;
: Par exemple l&#039;objet source de la copie pour un CopyTo&lt;br /&gt;
&lt;br /&gt;
* oidTargetObject&lt;br /&gt;
: identifiant de l&#039;objet cible dans l&#039;opération&lt;br /&gt;
: Par exemple l&#039;objet copié par un CopyTo&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple d&#039;utilisation:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // Créer des écritures a partir des réglements&lt;br /&gt;
 //&lt;br /&gt;
 procedure  _doCreateEcritureReglements(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueEcritureReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgBordereau&#039;,oidBordereauReglement); &lt;br /&gt;
   sel.Operation := &#039;EcrReg&#039;; &lt;br /&gt;
   sel.OpeId := iOpeId; &lt;br /&gt;
   // &lt;br /&gt;
   sel.CopyTo(&#039;TEcriture&#039;,[&#039;oidpiece&#039;,&#039;eDate&#039;,&#039;sens&#039;,&#039;sensProrata&#039;,&#039;regimeTVA&#039;,&#039;typeEcriture&#039;],[&lt;br /&gt;
    iOidPiece,&lt;br /&gt;
    BordereauReglement.dateReglement, &lt;br /&gt;
    sens_credit,&lt;br /&gt;
    sens_credit, &lt;br /&gt;
    regimeTVA_Encaissements,&lt;br /&gt;
    typeEcriture_Brouillard &lt;br /&gt;
   ]); &lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Type&lt;br /&gt;
  vueUpdateReglement = viewOf(TReglement)&lt;br /&gt;
   vl:TdbfLogOpe = join(&#039;(opeId=%ArgOpeId) and (operation=%ArgOperation) and (oidSourceObject=self.oid)&#039;); &lt;br /&gt;
   oidEcriture:TOID = oidEcriture; &lt;br /&gt;
   oidTargetEcriture:TOID = vl.oidTargetObject; &lt;br /&gt;
   oidBordereau:TOID = oidBordereauReglement; &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
 // Met à jour l&#039;oidEcriture créée sur les réglements correspondants&lt;br /&gt;
 ..&lt;br /&gt;
 procedure _doUpdateReglementEcriture(iOidPiece:string; iOpeId:string);&lt;br /&gt;
 var sel:TSelector; &lt;br /&gt;
 begin&lt;br /&gt;
   sel := vueUpdateReglement.CreateSelector(&#039;(oidBordereau=%1)&#039;,&#039;&#039;,True,[oidBordereauReglement]); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOpeId&#039;,iOpeId); &lt;br /&gt;
   sel.AddParameter(&#039;ArgOperation&#039;,&#039;EcrReg&#039;); &lt;br /&gt;
   //&lt;br /&gt;
   sel.Update([&#039;oidEcriture&#039;],[&#039;oidTargetEcriture&#039;]); &lt;br /&gt;
 end; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ToJson()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:TJsonArray);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//procedure GetData(SRows:TJsonArray);&lt;br /&gt;
Type&lt;br /&gt;
  myView = viewOf(...)&lt;br /&gt;
   ...&lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var sel:TSelector; &lt;br /&gt;
begin&lt;br /&gt;
  // Selector to retreive the data&lt;br /&gt;
  // &lt;br /&gt;
  sel := myView.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
  sel.ToJson(SRows); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Sérialize tous les objets retournés par le sélecteur&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14759</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14759"/>
		<updated>2025-04-26T08:54:51Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Vue locale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Langage==&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type classe&lt;br /&gt;
: Les paramètres de type classe peuvent être passé directement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  MyClass1 = class&lt;br /&gt;
    class procedure foo(rg:TRegClass);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass2 = class&lt;br /&gt;
    ....&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass3 = class&lt;br /&gt;
    procedure oldbar();&lt;br /&gt;
    procedure newbar();&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
class procedure MyClass1.foo(rg:TRegClass);&lt;br /&gt;
begin&lt;br /&gt;
  // =&amp;gt; MyClass2&lt;br /&gt;
  showMessage(rg.aClassName);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.oldbar();&lt;br /&gt;
var rg:TRegClass;&lt;br /&gt;
begin&lt;br /&gt;
  ModelManager.FindClass(&#039;MyClass2&#039;);&lt;br /&gt;
  myClass1.foo(rg);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.newbar();&lt;br /&gt;
begin&lt;br /&gt;
  myClass1.foo(MyClass2);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
* Alloue un oid de la classe&lt;br /&gt;
: Peut être utile dans les tests unitaires&lt;br /&gt;
&lt;br /&gt;
* Méthode ToJson()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sérialize l&#039;objet en json &lt;br /&gt;
: SA peut être un TJsonArray ou un TJsonStruct&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Expression de Sous requête &lt;br /&gt;
&lt;br /&gt;
Une expression peut être définie par une sous requête&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  VueTauxADate = ViewOf(TTauxADate)&lt;br /&gt;
    idTVA : TOid = oidTVA;&lt;br /&gt;
    tDate : Date = tDate;&lt;br /&gt;
    taux : float = taux; &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vueMontantTVA = viewOf(TEcriture)&lt;br /&gt;
    dateEcriture:TDatetime=eDate notInSelect;&lt;br /&gt;
    oidTVA:TOID = ProfilTVA.oidTVA notInSelect; &lt;br /&gt;
    oidPiece:TOID = oidPiece; &lt;br /&gt;
    montantTVAReel:Currency = vueTauxADate.select(&#039;taux * self.montant_TCValue /100&#039;,&#039;(tDate&amp;lt;=self.dateEcriture)and(idTVA=self.oidTVA)&#039;,&#039;&#039;,True,[]); &lt;br /&gt;
    montantTVAReel_CodeDevise:string = montantTVAReel:CodeDevise; &lt;br /&gt;
  end; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastAffectedStamp&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===ToJson()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:TJsonArray);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//procedure GetData(SRows:TJsonArray);&lt;br /&gt;
Type&lt;br /&gt;
  myView = viewOf(...)&lt;br /&gt;
   ...&lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var sel:TSelector; &lt;br /&gt;
begin&lt;br /&gt;
  // Selector to retreive the data&lt;br /&gt;
  // &lt;br /&gt;
  sel := myView.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
  sel.ToJson(SRows); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Sérialize tous les objets retournés par le sélecteur&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14758</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14758"/>
		<updated>2025-04-17T18:24:33Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Langage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Langage==&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type classe&lt;br /&gt;
: Les paramètres de type classe peuvent être passé directement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  MyClass1 = class&lt;br /&gt;
    class procedure foo(rg:TRegClass);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass2 = class&lt;br /&gt;
    ....&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass3 = class&lt;br /&gt;
    procedure oldbar();&lt;br /&gt;
    procedure newbar();&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
class procedure MyClass1.foo(rg:TRegClass);&lt;br /&gt;
begin&lt;br /&gt;
  // =&amp;gt; MyClass2&lt;br /&gt;
  showMessage(rg.aClassName);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.oldbar();&lt;br /&gt;
var rg:TRegClass;&lt;br /&gt;
begin&lt;br /&gt;
  ModelManager.FindClass(&#039;MyClass2&#039;);&lt;br /&gt;
  myClass1.foo(rg);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.newbar();&lt;br /&gt;
begin&lt;br /&gt;
  myClass1.foo(MyClass2);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
* Alloue un oid de la classe&lt;br /&gt;
: Peut être utile dans les tests unitaires&lt;br /&gt;
&lt;br /&gt;
* Méthode ToJson()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sérialize l&#039;objet en json &lt;br /&gt;
: SA peut être un TJsonArray ou un TJsonStruct&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastAffectedStamp&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===ToJson()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:TJsonArray);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//procedure GetData(SRows:TJsonArray);&lt;br /&gt;
Type&lt;br /&gt;
  myView = viewOf(...)&lt;br /&gt;
   ...&lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var sel:TSelector; &lt;br /&gt;
begin&lt;br /&gt;
  // Selector to retreive the data&lt;br /&gt;
  // &lt;br /&gt;
  sel := myView.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
  sel.ToJson(SRows); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Sérialize tous les objets retournés par le sélecteur&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14757</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14757"/>
		<updated>2025-04-17T18:24:18Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Modèle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Langage==&lt;br /&gt;
&lt;br /&gt;
* Paramètre classe&lt;br /&gt;
: Les paramètres de type classe peuvent être passé directement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  MyClass1 = class&lt;br /&gt;
    class procedure foo(rg:TRegClass);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass2 = class&lt;br /&gt;
    ....&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  MyClass3 = class&lt;br /&gt;
    procedure oldbar();&lt;br /&gt;
    procedure newbar();&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
class procedure MyClass1.foo(rg:TRegClass);&lt;br /&gt;
begin&lt;br /&gt;
  // =&amp;gt; MyClass2&lt;br /&gt;
  showMessage(rg.aClassName);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.oldbar();&lt;br /&gt;
var rg:TRegClass;&lt;br /&gt;
begin&lt;br /&gt;
  ModelManager.FindClass(&#039;MyClass2&#039;);&lt;br /&gt;
  myClass1.foo(rg);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure MyClass3.newbar();&lt;br /&gt;
begin&lt;br /&gt;
  myClass1.foo(MyClass2);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
* Alloue un oid de la classe&lt;br /&gt;
: Peut être utile dans les tests unitaires&lt;br /&gt;
&lt;br /&gt;
* Méthode ToJson()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sérialize l&#039;objet en json &lt;br /&gt;
: SA peut être un TJsonArray ou un TJsonStruct&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastAffectedStamp&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===ToJson()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:TJsonArray);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//procedure GetData(SRows:TJsonArray);&lt;br /&gt;
Type&lt;br /&gt;
  myView = viewOf(...)&lt;br /&gt;
   ...&lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var sel:TSelector; &lt;br /&gt;
begin&lt;br /&gt;
  // Selector to retreive the data&lt;br /&gt;
  // &lt;br /&gt;
  sel := myView.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
  sel.ToJson(SRows); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Sérialize tous les objets retournés par le sélecteur&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14756</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14756"/>
		<updated>2025-04-16T15:44:10Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Sélecteur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
* Alloue un oid de la classe&lt;br /&gt;
: Peut être utile dans les tests unitaires&lt;br /&gt;
&lt;br /&gt;
* Méthode ToJson()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sérialize l&#039;objet en json &lt;br /&gt;
: SA peut être un TJsonArray ou un TJsonStruct&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastAffectedStamp&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===ToJson()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:TJsonArray);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//procedure GetData(SRows:TJsonArray);&lt;br /&gt;
Type&lt;br /&gt;
  myView = viewOf(...)&lt;br /&gt;
   ...&lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var sel:TSelector; &lt;br /&gt;
begin&lt;br /&gt;
  // Selector to retreive the data&lt;br /&gt;
  // &lt;br /&gt;
  sel := myView.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
  sel.ToJson(SRows); &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Sérialize tous les objets retournés par le sélecteur&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom()===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14755</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14755"/>
		<updated>2025-04-16T15:36:50Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Classes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
* Alloue un oid de la classe&lt;br /&gt;
: Peut être utile dans les tests unitaires&lt;br /&gt;
&lt;br /&gt;
* Méthode ToJson()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sérialize l&#039;objet en json &lt;br /&gt;
: SA peut être un TJsonArray ou un TJsonStruct&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastAffectedStamp&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14754</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14754"/>
		<updated>2025-04-16T15:36:17Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Classes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Méthode ToJson()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure ToJson(SA:variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sérialize l&#039;objet en json &lt;br /&gt;
:SA peut être un TJsonArray ou un TJsonStruct&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastAffectedStamp&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14753</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14753"/>
		<updated>2025-04-14T08:58:23Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Script */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Trace===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgClear();&amp;lt;/source&amp;gt;&lt;br /&gt;
: Vide la trace&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;procedure dbgEnable(value:boolean);&amp;lt;/source&amp;gt;&lt;br /&gt;
: Active / désactive la trace&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastAffectedStamp&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14752</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14752"/>
		<updated>2025-04-14T06:25:10Z</updated>

		<summary type="html">&lt;p&gt;Syfre : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Modèle==&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
&lt;br /&gt;
* Méthode AllocOID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;class function AllocOID:TOID;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Classes SQL===&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoRefIndex&lt;br /&gt;
&lt;br /&gt;
* Options de rôle : NoForeignKey&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Qualifier d&#039;attribut NotInGroupBy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = expression(&#039;...&#039;) notInGroupBy;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastAffectedStamp&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14751</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14751"/>
		<updated>2025-04-10T17:34:53Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Vue locale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector;&lt;br /&gt;
Type&lt;br /&gt;
  // défini une classe de base avec tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrage = viewOf(TEcriture)&lt;br /&gt;
    lettrable:boolean = compteGeneral.lettrable notInSelect; &lt;br /&gt;
    idEtablissement:TOID = piece.oidEtablissement notInSelect; &lt;br /&gt;
    idCompteGeneral:TOID = oidCompteGeneral notInSelect; &lt;br /&gt;
    idRoleTiers:TOID = oidroleTiers notInSelect; &lt;br /&gt;
    [(lettrable=true) &lt;br /&gt;
      and ((oidLettrageEcriture=&#039;&#039;) or (dateLettrage=0)) &lt;br /&gt;
      and (typeEcriture&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (piece.lot.origineLot&amp;lt;&amp;gt;0)&lt;br /&gt;
      and (eDate&amp;gt;=%ArgDateInf) &lt;br /&gt;
      and (eDate&amp;lt;=%ArgDateSup) &lt;br /&gt;
      and (idEtablissement=%ArgEtablissement) &lt;br /&gt;
      and (idCompteGeneral=%ArgCompteGeneral)&lt;br /&gt;
      and (idRoleTiers=%ArgRoleTiers)&lt;br /&gt;
    ] &lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  // Hérite de tous les filtres&lt;br /&gt;
  //&lt;br /&gt;
  vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)&lt;br /&gt;
    dateMin:TDatetime = min(eDate);&lt;br /&gt;
    dateMax:TDatetime = max(eDate); &lt;br /&gt;
    ACount:Integer = count(oid); &lt;br /&gt;
    credit:Currency = sum(&#039;credit:TCValue&#039;); &lt;br /&gt;
    debit:Currency = sum(&#039;debit:TCValue&#039;); &lt;br /&gt;
    solde:Currency = sumDiff(debit,credit); &lt;br /&gt;
    [inherited] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
  Result := vueLettrageGroupBy.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastAffectedStamp&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14750</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14750"/>
		<updated>2025-04-10T17:27:10Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Vue locale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited and (...)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastAffectedStamp&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14749</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14749"/>
		<updated>2025-04-10T17:26:06Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Vue locale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs &amp;quot;oidXXX&amp;quot; sans définir le rôle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
   oidRef:TOID = oidrefB;&lt;br /&gt;
   ..&lt;br /&gt;
   idRefB:TOID = oidrefB notInSelect;&lt;br /&gt;
   [ (idRefB=%ArgRefB) and ....]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Une vue locale peut contenir des attributs non mappés dans la définition.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
    ACount:Integer = count(oid)&lt;br /&gt;
    oidRef:TOID;&lt;br /&gt;
    codeRef:string;&lt;br /&gt;
    libelleRef:string;&lt;br /&gt;
   ..&lt;br /&gt;
   [  ...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var sel:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  sel := vue1.createSelector();&lt;br /&gt;
  case iGroupBy of&lt;br /&gt;
   &#039;refB&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefB&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refB.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
   &#039;refC&#039;:&lt;br /&gt;
     begin&lt;br /&gt;
       sel.AddColumn(&#039;oidrefC&#039;,&#039;oidRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.code&#039;,&#039;codeRef&#039;); &lt;br /&gt;
       sel.AddColumn(&#039;refC.Caption&#039;,&#039;libelleRef&#039;); &lt;br /&gt;
     end;&lt;br /&gt;
  end; &lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode où elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
Note : Une expression Exists() est beaucoup plus rapide qu&#039;un &amp;quot;Count&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastAffectedStamp&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14748</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14748"/>
		<updated>2025-04-10T17:14:59Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Sélecteur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode ou elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastAffectedStamp&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* RmvParameter()&lt;br /&gt;
: Permet de retirer un paramètre qui a été ajouté par AddParameter()&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes de stéréotype SQL&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14747</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14747"/>
		<updated>2025-04-10T17:11:35Z</updated>

		<summary type="html">&lt;p&gt;Syfre : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
Une vue locale peut être référencée en dehors de la méthode ou elle est définie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
Une expression existe peut être utilisée dans les filtres comme une valeur logique&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastAffectedStamp&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes SQL&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14746</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14746"/>
		<updated>2025-04-10T17:08:29Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Sélecteur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastAffectedStamp&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
* CopyTo, Update, UpdateFrom &lt;br /&gt;
: Fonctionne sur les classes SQL&lt;br /&gt;
&lt;br /&gt;
===UpdateFrom===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet de mettre à jour une classe à partir d&#039;un sélecteur et d&#039;une colonne de correspondance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemple :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // Update the temp table &lt;br /&gt;
  vueTemp = viewOf(TempLettrage)&lt;br /&gt;
    reference1:string = reference1;&lt;br /&gt;
    reference2:string = reference2;&lt;br /&gt;
    modeLettrage:Integer = modeLettrage; &lt;br /&gt;
  end;&lt;br /&gt;
   &lt;br /&gt;
  vueRef1 = viewOf(TempLettrage)&lt;br /&gt;
    //ACount:Integer = count(id);&lt;br /&gt;
    ATotal:Currency = sumSign(montant:TCValue,sens,&#039;1&#039;);&lt;br /&gt;
    reference1:string = reference1; &lt;br /&gt;
    [(modeLettrage=0) and (reference1&amp;lt;&amp;gt;&#039;&#039;)] &lt;br /&gt;
  end; &lt;br /&gt;
&lt;br /&gt;
var selT,selG:TSelector;&lt;br /&gt;
begin&lt;br /&gt;
  withP long transaction do&lt;br /&gt;
    begin&lt;br /&gt;
     // for updating the temp table on &amp;quot;match&amp;quot; &lt;br /&gt;
     selT := vueTemp.CreateSelector(&#039;&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
&lt;br /&gt;
     // Lettrage sur reference 1 &lt;br /&gt;
     selG := vueRef1.CreateSelector(&#039;(ATotal=0)&#039;,&#039;&#039;,True,[]);&lt;br /&gt;
     selG.useCTE := True; &lt;br /&gt;
     selT.UpdateFrom(selG,[&#039;reference1&#039;],[&#039;modeLettrage&#039;],[1]); &lt;br /&gt;
    end;&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;
with CTE as (&lt;br /&gt;
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as &amp;quot;ATotal&amp;quot;,t0.reference1  as &amp;quot;reference1&amp;quot;&lt;br /&gt;
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)&lt;br /&gt;
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))&lt;br /&gt;
group by t0.reference1&lt;br /&gt;
)&lt;br /&gt;
merge into dbo.TEMPLETTRAGE tm0 using (&lt;br /&gt;
SELECT  *&lt;br /&gt;
FROM CTE&lt;br /&gt;
Where (ATotal = 0.0000)&lt;br /&gt;
) tm1 on (tm1.reference1=tm0.reference1)&lt;br /&gt;
when matched then update set&lt;br /&gt;
tm0.modeLettrage = 1&lt;br /&gt;
;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14745</id>
		<title>Version 2025 r2 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r2_(release_note)&amp;diff=14745"/>
		<updated>2025-04-08T08:24:18Z</updated>

		<summary type="html">&lt;p&gt;Syfre : Page créée avec « {{version2025r1}} __TOC__  &amp;#039;&amp;#039;&amp;#039; PREVIEW &amp;#039;&amp;#039;&amp;#039;  ==Script==  ===Vue locale===  * Paramètre de type de donnée  &amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt; Type   vue1 = viewOf(ClassA)    p1:TEnum(... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; PREVIEW &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
===Vue locale===&lt;br /&gt;
&lt;br /&gt;
* Paramètre de type de donnée&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:TEnum(enumName) = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Héritage de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [...]&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(vue1)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
   [inherited]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Scope de vue locale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
procedure Class1.foo;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   p1:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Class2.bar;&lt;br /&gt;
Type&lt;br /&gt;
  vue2 = viewOf(class1.foo.vue1)&lt;br /&gt;
   p1:string = ...;&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;
* Expression Exists()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  vue1 = viewOf(ClassA)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  vue2 = viewOf(ClassB)&lt;br /&gt;
   id:string = ...;&lt;br /&gt;
   bb:boolean = vue1.Exists(&#039;(id=self.id)&#039;,True,[]) notInSelect;&lt;br /&gt;
   [(bb=true) and (....)]&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sélecteur==&lt;br /&gt;
&lt;br /&gt;
* lastOpeStamp, lastAffectedStamp&lt;br /&gt;
: Attributs mis à jour par la dernière opération assembliste.&lt;br /&gt;
&lt;br /&gt;
* Amélioration de CopyTo&lt;br /&gt;
: Permet de créer des objets à partir d&#039;un sélecteur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R2]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Version_2025_r1_(release_note)&amp;diff=14744</id>
		<title>Version 2025 r1 (release note)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Version_2025_r1_(release_note)&amp;diff=14744"/>
		<updated>2025-04-08T08:02:26Z</updated>

		<summary type="html">&lt;p&gt;Syfre : Page créée avec « {{version2025r1}} __TOC__   Category:Version 2025 R1 Category:Release note »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version2025r1}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Version 2025 R1]]&lt;br /&gt;
[[Category:Release note]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Main_Page&amp;diff=14743</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Main_Page&amp;diff=14743"/>
		<updated>2025-04-08T08:01:20Z</updated>

		<summary type="html">&lt;p&gt;Syfre : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Sage FRP 1000 =&lt;br /&gt;
&lt;br /&gt;
===Architectures===&lt;br /&gt;
* [[Vue d&#039;ensemble 1000 (arch)|Vue d&#039;ensemble]]&lt;br /&gt;
* [[Architecture 2 Tiers (arch)|Architecture 2 Tiers]]&lt;br /&gt;
* [[Architecture 3 Tiers (arch)|Architecture 3 Tiers]]&lt;br /&gt;
* [[Architecture cluster (arch)|Architecture cluster]]&lt;br /&gt;
&lt;br /&gt;
===Guides des administrateurs===&lt;br /&gt;
&lt;br /&gt;
* [[Administration (admin)|Administration]]&lt;br /&gt;
* [[Console d&#039;administration (admin)|Référence de la console d&#039;administration]]&lt;br /&gt;
* [[Flux d&#039;administration|Flux d&#039;administration]]&lt;br /&gt;
&lt;br /&gt;
===Guides des intégrateurs===&lt;br /&gt;
&lt;br /&gt;
* [[Automates|Automates]]&lt;br /&gt;
* [[Processus Métiers (bp)|Processus Métiers et Workflow]]&lt;br /&gt;
* [[Imports|Imports]]&lt;br /&gt;
* [[Exports|Exports]]&lt;br /&gt;
* [[Guide de la traduction|Traduction]]&lt;br /&gt;
* [[Pilotage|Pilotage]]&lt;br /&gt;
* [[Publication|Publication]]&lt;br /&gt;
* [[Portail|Portail]]&lt;br /&gt;
* [[Serveur|Serveur]]&lt;br /&gt;
* [[Complément Outlook (Outlook)|Complément Outlook]]&lt;br /&gt;
* [[Complément Excel (Excel)|Complément Excel]]&lt;br /&gt;
&lt;br /&gt;
===Guides des développeurs===&lt;br /&gt;
&lt;br /&gt;
* [[Développement ESM|Guide de développement ESM]]&lt;br /&gt;
* [[Développement DSM|Guide de développement DSM]]&lt;br /&gt;
{{IfLatest|&lt;br /&gt;
* [[Développement Mobile|Guide de développement d&#039;applications Mobiles]]&lt;br /&gt;
}}&lt;br /&gt;
* [[Processus Métiers (bp)|Guide des processus métiers et Workflow]]&lt;br /&gt;
* [[Web Services (ws)|Guide de développement de Web Services]]&lt;br /&gt;
* [[SData|Guide de développement SData]]&lt;br /&gt;
&lt;br /&gt;
* [[Concepteur de modèle|Concepteur de modèle]]&lt;br /&gt;
* [[Concepteur d&#039;écran|Concepteur d&#039;écran]]&lt;br /&gt;
* [[Concepteur de requêtes (Concepteur de requêtes)|Concepteur de requête]] &lt;br /&gt;
* [[Guide des formats |Guide des formats de génération/intégration de fichier]]&lt;br /&gt;
* [[Référence_pour_les_formats_de_fichier|Référence pour les formats de fichier]]&lt;br /&gt;
&lt;br /&gt;
===Références===&lt;br /&gt;
&lt;br /&gt;
* [[:Category:RTL|Référence du langage et de l&#039;API]]&lt;br /&gt;
* [[Référence des styles|Référence des styles desktop]]&lt;br /&gt;
* [[Référence des styles web|Référence des styles webtop]]&lt;br /&gt;
&lt;br /&gt;
===Vidéos===&lt;br /&gt;
* [[:Category:Video|Didactitiels vidéo (nécessite flash version 9.02 ou plus)]]&lt;br /&gt;
&lt;br /&gt;
===Versions===&lt;br /&gt;
&lt;br /&gt;
* [[Version 6.00 (release note)|Version 6.00]] &lt;br /&gt;
* [[Version 6.50 (release note)|Version 6.50]] &lt;br /&gt;
* [[Version 7.00 (release note)|Version 7.00]]&lt;br /&gt;
* [[Version 7.10 (release_note)|Version 7.10]]&lt;br /&gt;
* [[Version 8.00 (release_note)|Version 8.00]]&lt;br /&gt;
* [[Version 9.00 (release_note)|Version 9.00]]&lt;br /&gt;
* [[Version 9.10 (release_note)|Version 9.10]]&lt;br /&gt;
* [[Version 9.20 (release_note)|Version 9.20]]&lt;br /&gt;
* [[Version 10.00 (release_note)|Version 10.00]]&lt;br /&gt;
* [[Version 11.00 (release_note)|Version 11.00]]&lt;br /&gt;
* [[Version 2024 r1 (release_note)|Version 2024 r1]]&lt;br /&gt;
* [[Version 2024 r2 (release_note)|Version 2024 r2]]&lt;br /&gt;
* [[Version 2025 r1 (release_note)|Version 2025 r1]]&lt;br /&gt;
* [[Version 2025 r2 (release_note)|Version 2025 r2]]&lt;br /&gt;
&lt;br /&gt;
===Documents===&lt;br /&gt;
* [[Documents|Documents]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Fichier_de_configuration_(server)&amp;diff=14741</id>
		<title>Fichier de configuration (server)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Fichier_de_configuration_(server)&amp;diff=14741"/>
		<updated>2024-12-09T15:54:04Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Système */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Introduction===&lt;br /&gt;
Le Serveur d&#039;application Sage 1000 utilise un fichier de configuration situé dans le répertoire du serveur.&lt;br /&gt;
&lt;br /&gt;
{{info|Le nom du fichier est serverl1000.ini}}&lt;br /&gt;
&lt;br /&gt;
Ce fichier peut être soit modifié à l&#039;aide de la console d&#039;administration des services, soit manuellement par un éditeur de texte.&lt;br /&gt;
&lt;br /&gt;
{{tip|Le fichier est chargé au démarrage du service.}}&lt;br /&gt;
&lt;br /&gt;
===Structure===&lt;br /&gt;
Le fichier peut configurer plusieurs services exécutés sur le même serveur, chaque service comporte au moins deux sections :&lt;br /&gt;
&lt;br /&gt;
* [\SOFTWARE\Sage\Ligne 1000\Administration\IPC\SERVICE_NAME]&lt;br /&gt;
: Cette entrée détermine la configuration réseau du service.&lt;br /&gt;
&lt;br /&gt;
* [\SOFTWARE\Sage\Ligne 1000\Administration\Servers\SERVICE]&lt;br /&gt;
: Cette entrée détermine la configuration logicielle du service.&lt;br /&gt;
&lt;br /&gt;
* [\SOFTWARE\Sage\Ligne 1000\Administration\Servers\SERVICE\Export]&lt;br /&gt;
: Cette entrée configure la fonction d&#039;exportation du service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemple : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\MYSERVICE]&lt;br /&gt;
ipcMode=ipcSHM&lt;br /&gt;
tcpPort=8090&lt;br /&gt;
shmAddress=SYFRE&lt;br /&gt;
&lt;br /&gt;
[\SOFTWARE\Sage\Ligne 1000\Administration\Servers\MYSERVICE]&lt;br /&gt;
Master base=orasql://myhost/DBMASTER_ORA?prefix=&amp;quot;DBMASTERT_ORA.&amp;quot;&lt;br /&gt;
Master driver=orasql&lt;br /&gt;
Master OS Authentication=0&lt;br /&gt;
Master user=DBMASTER_ORA&lt;br /&gt;
Master password=DBMASTER_ORA&lt;br /&gt;
Server Societies=Société de démonstration GCF 1000&lt;br /&gt;
Server Application=Sage 1000 Suite Financière&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Chaque section est composée d&#039;une liste de variables (NomVariable=ValeurVariable), les types de données des variables sont :&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Variable&lt;br /&gt;
!Type&lt;br /&gt;
|-&lt;br /&gt;
|String&lt;br /&gt;
|Chaîne de caractère&lt;br /&gt;
|-&lt;br /&gt;
|Boolean&lt;br /&gt;
|Valeur logique 0:Non 1:Oui&lt;br /&gt;
|-&lt;br /&gt;
|Integer&lt;br /&gt;
|Valeur entière&lt;br /&gt;
|-&lt;br /&gt;
|Liste de chaîne&lt;br /&gt;
|Liste de chaîne de caractère séparée par des virgules.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Section IPC===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Variable&lt;br /&gt;
!Type&lt;br /&gt;
!Contexte&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|ipcMode&lt;br /&gt;
|enumération&lt;br /&gt;
|Client/Serveur&lt;br /&gt;
|&lt;br /&gt;
*ipcTCP&lt;br /&gt;
:Mode de communication par TCP/IP&lt;br /&gt;
*ipcSHM&lt;br /&gt;
:Mode de communication par mémoire partagée (dépréciée)&lt;br /&gt;
|-&lt;br /&gt;
|tcpPort&lt;br /&gt;
|Integer&lt;br /&gt;
|Client/Serveur&lt;br /&gt;
|Port de communication TCP&lt;br /&gt;
|-&lt;br /&gt;
|tcpAddress&lt;br /&gt;
|string&lt;br /&gt;
|Client/Serveur&lt;br /&gt;
|Adresse de communication TCP&lt;br /&gt;
|-&lt;br /&gt;
|shmAddress&lt;br /&gt;
|string&lt;br /&gt;
|Client/Serveur&lt;br /&gt;
|Nom du segment de mémoire partagé&lt;br /&gt;
|-&lt;br /&gt;
|serverList&lt;br /&gt;
|Serveur&lt;br /&gt;
|String list&lt;br /&gt;
|Configuration de Cluster&amp;lt;br&amp;gt;&lt;br /&gt;
Liste des services associés à cet identifiant de service. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\TRESO]&lt;br /&gt;
ipcMode=ipcTCP&lt;br /&gt;
tcpPort=8090&lt;br /&gt;
tcpAddress=localhost&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration Cluster :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;fichier du configuration des services :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\SYFRE]&lt;br /&gt;
serverList=SYFRE1,SYFRE2&lt;br /&gt;
&lt;br /&gt;
[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\SYFRE1]&lt;br /&gt;
ipcMode=ipcTCP&lt;br /&gt;
tcpPort=8091&lt;br /&gt;
tcpAddress=syfre&lt;br /&gt;
&lt;br /&gt;
[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\SYFRE2]&lt;br /&gt;
ipcMode=ipcTCP&lt;br /&gt;
tcpPort=8092&lt;br /&gt;
tcpAddress=syfre&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;fichier du configuration du client HTTP :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\SYFRE]&lt;br /&gt;
serverList=SYFRE1,SYFRE2&lt;br /&gt;
&lt;br /&gt;
[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\SYFRE1]&lt;br /&gt;
ipcMode=ipcTCP&lt;br /&gt;
tcpPort=8091&lt;br /&gt;
tcpAddress=syfre&lt;br /&gt;
&lt;br /&gt;
[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\SYFRE2]&lt;br /&gt;
ipcMode=ipcTCP&lt;br /&gt;
tcpPort=8092&lt;br /&gt;
tcpAddress=syfre&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Section Servers===&lt;br /&gt;
====IPC====&lt;br /&gt;
Ces variables configurent la gestion des services IPC.&lt;br /&gt;
&lt;br /&gt;
La configuration des services IPC peut être renseignée dans une section IPC&lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\IPC\nom_de_profil] &lt;br /&gt;
&lt;br /&gt;
puis référencée par la variable &amp;quot;IPC Profil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|IPC Profil&lt;br /&gt;
|String&lt;br /&gt;
|Référence un nom de section IPC contenant la configuration&lt;br /&gt;
|-&lt;br /&gt;
|IPC Started&lt;br /&gt;
|boolean&lt;br /&gt;
|Démarre les services IPC (défaut true)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les services IPC sont les services permettant de communiquer via RPC.&lt;br /&gt;
&lt;br /&gt;
Vous avez besoins des services IPC si :&lt;br /&gt;
* Vous utilisez un serveur HTTP externe (IIS ou Apache).&lt;br /&gt;
* Vous utilisez la Console des Processus Métiers pour dialoguer avec ce Service.&lt;br /&gt;
* Vous utilisez le Contrôleur des services.&lt;br /&gt;
* Ce Service exécute des tâches de traitement déléguées par un autre Service.&lt;br /&gt;
&lt;br /&gt;
Si vous n&#039;utilisez pas les services IPC il est conseillé de ne pas les démarrer.&lt;br /&gt;
&lt;br /&gt;
{{tip|Ce paramètre n&#039;est pas modifiable depuis la console des services car si vous désactivez les services IPC le contrôleur n&#039;est plus opérationnel}}&lt;br /&gt;
&lt;br /&gt;
====Sessions====&lt;br /&gt;
Ces variables configurent la gestion des sessions.&lt;br /&gt;
&lt;br /&gt;
La configuration des sessions peut être renseignée dans une section SESSIONS&lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\SESSIONS\nom_de_profil] &lt;br /&gt;
&lt;br /&gt;
puis référencée par la variable &amp;quot;SESSIONS Profil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Variable&lt;br /&gt;
!Type&lt;br /&gt;
!Défaut&lt;br /&gt;
!Min&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|SESSIONS Profil&lt;br /&gt;
|String&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Référence un nom de section SESSIONS contenant la configuration&lt;br /&gt;
|-&lt;br /&gt;
|CheckInterval&lt;br /&gt;
|Entier&lt;br /&gt;
|1 minute&lt;br /&gt;
|1 minute&lt;br /&gt;
|Délai entre chaque test d&#039;expiration en seconde.&lt;br /&gt;
|-&lt;br /&gt;
|ExpireInterval&lt;br /&gt;
|Entier&lt;br /&gt;
|15 minutes&lt;br /&gt;
|&lt;br /&gt;
|Délai d&#039;expiration des sessions en seconde.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Base master====&lt;br /&gt;
Ces variables configurent la base Master utilisée par le service.&lt;br /&gt;
&lt;br /&gt;
La configuration de la base master peut être renseignée dans une section MASTER &lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\MASTER\nom_de_profil] &lt;br /&gt;
&lt;br /&gt;
puis référencée par la variable &amp;quot;Master Profil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Master Profil&lt;br /&gt;
|String&lt;br /&gt;
|Référence un nom de section MASTER contenant la configuration&lt;br /&gt;
|-&lt;br /&gt;
|Master base&lt;br /&gt;
|String&lt;br /&gt;
|Nom de la base de données Master&lt;br /&gt;
|-&lt;br /&gt;
|Master driver&lt;br /&gt;
|String&lt;br /&gt;
|Nom du driver de la base de données Master&lt;br /&gt;
|-&lt;br /&gt;
|Master OS Authentication&lt;br /&gt;
|Boolean&lt;br /&gt;
|Utiliser l&#039;authentification du système d&#039;exploitation.&lt;br /&gt;
|-&lt;br /&gt;
|Master user&lt;br /&gt;
|String&lt;br /&gt;
|Nom d&#039;utilisateur utilisé pour la connexion à la base Master&lt;br /&gt;
|-&lt;br /&gt;
|Master password&lt;br /&gt;
|String&lt;br /&gt;
|Mot de passe utilisé pour la connexion à la base Master&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Application et Sociétés====&lt;br /&gt;
Ces variables configurent l&#039;application et les sociétés servies par le service.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Variable&lt;br /&gt;
!Type&lt;br /&gt;
!Version&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Server Societies&lt;br /&gt;
|String&lt;br /&gt;
|&lt;br /&gt;
|Liste des sociétés/dossiers servies par le service.&lt;br /&gt;
|-&lt;br /&gt;
|Server Application&lt;br /&gt;
|String&lt;br /&gt;
|&lt;br /&gt;
|Nom de l&#039;application servie par le service.&lt;br /&gt;
|-&lt;br /&gt;
|Server User&lt;br /&gt;
|String&lt;br /&gt;
|&lt;br /&gt;
|Nom de l&#039;utilisateur du service.&lt;br /&gt;
|-&lt;br /&gt;
|Server Password&lt;br /&gt;
|String&lt;br /&gt;
|&lt;br /&gt;
|Mot de passe de l&#039;utilisateur du service.&lt;br /&gt;
|-&lt;br /&gt;
|Server User Group&lt;br /&gt;
|String&lt;br /&gt;
|&lt;br /&gt;
|Nom du groupe de l&#039;utilisateur du service.&lt;br /&gt;
|-&lt;br /&gt;
|Server Authentication&lt;br /&gt;
|String&lt;br /&gt;
|&lt;br /&gt;
|Annuaire utilisé pour l&#039;authentification.&lt;br /&gt;
|-&lt;br /&gt;
|Authentication Directories&lt;br /&gt;
|liste de chaîne&lt;br /&gt;
|8.00&lt;br /&gt;
|Annuaires disponibles pour ce service.(code des annuaires séparés par &amp;quot;;&amp;quot;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Service====&lt;br /&gt;
Ces variables configurent le service.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Variable&lt;br /&gt;
!Type&lt;br /&gt;
!Version&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Server Name&lt;br /&gt;
|String&lt;br /&gt;
|&lt;br /&gt;
|Nom du service.&lt;br /&gt;
|-&lt;br /&gt;
|Cache Folder&lt;br /&gt;
|String&lt;br /&gt;
|&lt;br /&gt;
|Répertoire où stocker les fichiers temporaires et les fichiers en cache.&lt;br /&gt;
|-&lt;br /&gt;
|[[Zone publique (server)|Public Folder]]&lt;br /&gt;
|String&lt;br /&gt;
|&lt;br /&gt;
|[[Zone_publique_(server)|Racine des répertoires partagés du service]].&lt;br /&gt;
|-&lt;br /&gt;
|[[Public links (server)|Public Links]]&lt;br /&gt;
|Liste de chaîne&lt;br /&gt;
|&lt;br /&gt;
|Liste de répertoires réseaux (séparés par un ;) pour lesquels des [[Stockage_des_documents|documents peuvent être associés]].&lt;br /&gt;
|-&lt;br /&gt;
|Send Alert To&lt;br /&gt;
|String&lt;br /&gt;
|&lt;br /&gt;
|Liste d&#039;adresses emails (séparées par un ;) auxquelles seront envoyés les messages d&#039;alertes.&lt;br /&gt;
|-&lt;br /&gt;
|Scripts&lt;br /&gt;
|Liste de chaîne&lt;br /&gt;
|&lt;br /&gt;
|Liste de références CSS ajouté aux pages HTML&lt;br /&gt;
|-&lt;br /&gt;
|MaxDatagridRowCount&lt;br /&gt;
|Integer&lt;br /&gt;
|&lt;br /&gt;
|Limite le nombre de lignes affichées dans les grilles (par défaut à 5000). &lt;br /&gt;
|-&lt;br /&gt;
|[[Security mode (server)|Security Mode]]&lt;br /&gt;
|String&lt;br /&gt;
|7.00&lt;br /&gt;
|Valeurs possibles : Intranet (valeur par défaut) / Internet [[Service_exposé_sur_internet|Voir Service exposé sur internet]]&lt;br /&gt;
|-&lt;br /&gt;
|Enable Remember User&lt;br /&gt;
|boolean&lt;br /&gt;
|7.10&lt;br /&gt;
|Permet à l&#039;utilisateur d&#039;avoir son nom pré-renseigné dans la page d&#039;authentification (par défaut à vrai) &lt;br /&gt;
|-&lt;br /&gt;
|MaxPreviewPageCount&lt;br /&gt;
|Integer&lt;br /&gt;
|&lt;br /&gt;
|Limite le nombre de pages affichées dans les aperçus des éditions (par défaut à 50). &lt;br /&gt;
|-&lt;br /&gt;
|Preview max page&lt;br /&gt;
|Integer&lt;br /&gt;
|10.00&lt;br /&gt;
|Limite le nombre de pages affichées dans les aperçus des éditions (par défaut à 50). &lt;br /&gt;
|-&lt;br /&gt;
|Preview blocking&lt;br /&gt;
|Boolean&lt;br /&gt;
|10.00&lt;br /&gt;
|1:Les aperçus sont affichés directement en onglet 0:les aperçus sont envoyés dans la bam. &lt;br /&gt;
|-&lt;br /&gt;
|Preview timeout&lt;br /&gt;
|Integer&lt;br /&gt;
|10.00&lt;br /&gt;
|Délai d&#039;attente de fin d&#039;aperçu si Preview blocking=1. &lt;br /&gt;
|-&lt;br /&gt;
|Printer Filter&lt;br /&gt;
|chaine&lt;br /&gt;
|&lt;br /&gt;
|Noms des imprimantes ne pas proposer, séparées par des points virgules (9.20)&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Automates====&lt;br /&gt;
Ces variables configurent le serveur d&#039;automate inclus dans le serveur.&lt;br /&gt;
&lt;br /&gt;
Ces variables peuvent être renseignées dans une section AUTOMATE &lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\AUTOMATE\nom_de_profil] &lt;br /&gt;
&lt;br /&gt;
puis référencées par la variable &amp;quot;Automate Profil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Variable&lt;br /&gt;
!Type&lt;br /&gt;
!Version&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Automate Profil&lt;br /&gt;
|String&lt;br /&gt;
|&lt;br /&gt;
|Référence une section AUTOMATE.&lt;br /&gt;
|-&lt;br /&gt;
|Automate Started&amp;lt;br&amp;gt;&lt;br /&gt;
Process Server Started&lt;br /&gt;
|Boolean&lt;br /&gt;
|&lt;br /&gt;
|Démarre le serveur d&#039;automate. (défaut) (*)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Automate Name&amp;lt;br&amp;gt;&lt;br /&gt;
Process Server Name&lt;br /&gt;
|String&lt;br /&gt;
|&lt;br /&gt;
|Nom du serveur d&#039;automate à démarrer. (*)&lt;br /&gt;
|-&lt;br /&gt;
|Automate Message Box&amp;lt;br&amp;gt;&lt;br /&gt;
Process Server Message Box&lt;br /&gt;
|String&lt;br /&gt;
|&lt;br /&gt;
|Boite à messages utilisé par le serveur d&#039;automate.&lt;br /&gt;
|-&lt;br /&gt;
|Automate Task Service&amp;lt;br&amp;gt;&lt;br /&gt;
Process Task Service&lt;br /&gt;
|String&lt;br /&gt;
|&lt;br /&gt;
|Nom du Service 1000 exécutant les tâches du serveur d&#039;automate.(hostname.servicename)&lt;br /&gt;
|-&lt;br /&gt;
|Automate Task Count&amp;lt;br&amp;gt;&lt;br /&gt;
|Integer&lt;br /&gt;
|6.50&lt;br /&gt;
|Nombre maximal de tâches automates simultanées (défaut 1).&lt;br /&gt;
|-&lt;br /&gt;
|Automate Debug&amp;lt;br&amp;gt;&lt;br /&gt;
|Boolean&lt;br /&gt;
|7.00 Patch&lt;br /&gt;
|Active le mode debug verbose (**).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Version700}} (*) Ces valeurs peuvent être modifiées sur la ligne de commande&lt;br /&gt;
&lt;br /&gt;
{{Version700}} (**) A utiliser conjointement avec la console de trap snmp&lt;br /&gt;
&lt;br /&gt;
====Processus métiers====&lt;br /&gt;
Ces variables configurent le service de Processus Métiers inclus dans le serveur.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|BP Started&lt;br /&gt;
|Boolean&lt;br /&gt;
|Démarre le service de Processus Métiers (défault).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Version700}} Cette valeur peut être modifiée sur la ligne de commande&lt;br /&gt;
&lt;br /&gt;
====Système====&lt;br /&gt;
Ces variables configurent le Processus du serveur.&lt;br /&gt;
&lt;br /&gt;
Ces variables peuvent être renseignées dans une section PROCESS&lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\PROCESS\nom_de_profil] &lt;br /&gt;
&lt;br /&gt;
puis référencée par la variable &amp;quot;Process Profil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Process Profil&lt;br /&gt;
|string&lt;br /&gt;
|Référence une section PROCESS&lt;br /&gt;
|-&lt;br /&gt;
|ProcessAffinity&lt;br /&gt;
|String&lt;br /&gt;
|Détermine les coeurs utilisés par le processus sur une machine multi-coeurs&amp;lt;br&amp;gt;&lt;br /&gt;
ex : 1,3 pour utiliser les coeurs 1 et 3 d&#039;une machine multi-coeurs.&lt;br /&gt;
|-&lt;br /&gt;
|ThreadPoolSize&lt;br /&gt;
|Integer&lt;br /&gt;
|Taille du pool de thread (20)&lt;br /&gt;
|-&lt;br /&gt;
|FormCacheSize&lt;br /&gt;
|Integer&lt;br /&gt;
|Taille du cache pour un écran (défaut:20, 0:désactive l&#039;utilisation du cache)&lt;br /&gt;
|-&lt;br /&gt;
|FormCacheLimit&lt;br /&gt;
|Integer&lt;br /&gt;
|Taille du cache pour l&#039;ensemble des écrans (256)&lt;br /&gt;
|-&lt;br /&gt;
|FormCacheReuse&lt;br /&gt;
|Integer&lt;br /&gt;
|Nombre de fois qu&#039;un écran peut être réutilisé (-1 : pas de limite)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*ProcessAffinity&lt;br /&gt;
:Le Processus du serveur est un processus multi-threadé, sur une machine multi-coeurs il utilise tous les coeurs disponibles sur le système d&#039;exploitation. Dans certain cas il est souhaitable de restreindre l&#039;exécution à certains coeurs.&lt;br /&gt;
&lt;br /&gt;
*ThreadPoolsize&lt;br /&gt;
:Chaque requête sur le service est exécutée par une thread allouée d&#039;un pool ; lorsque le pool est plein la requête est suspendue jusqu&#039;à ce qu&#039;une thread se libère dans le pool. Cette variable limite la taille du pool de thread et par conséquence limite les contentions et les &amp;quot;context switches&amp;quot; provoqués par le processus.&lt;br /&gt;
&lt;br /&gt;
*FormCacheSize&lt;br /&gt;
:L&#039;opération d&#039;ouverture d&#039;un écran est une opération coûteuse, pour cette raison les écrans fermés sont placés dans un cache pour être réutilisés. Cette variable limite le nombre d&#039;instance d&#039;un écran dans le cache.&lt;br /&gt;
&lt;br /&gt;
*FormCacheLimit&lt;br /&gt;
:L&#039;opération d&#039;ouverture d&#039;un écran est une opération coûteuse, pour cette raison les écrans fermés sont placés dans un cache pour être réutilisés. Cette variable limite le nombre maximal d&#039;écran dans le cache et par conséquent la mémoire utilisée par le cache d&#039;écran.&lt;br /&gt;
&lt;br /&gt;
*FormCacheReuse&lt;br /&gt;
:Indique le nombre de fois qu&#039;un écran en cache peut être réutilisé. &lt;br /&gt;
&lt;br /&gt;
{{info|Pour pouvoir utiliser WMI la dll serviceL1000perf.dll doit être présente dans le répertoire du serveur.}}&lt;br /&gt;
{{info|Pour désactiver le cache, définir la valeur de FormCacheSize à 0}}&lt;br /&gt;
&lt;br /&gt;
====Files d&#039;attente====&lt;br /&gt;
Ces variables configurent le service de consommation de file d&#039;attente.&lt;br /&gt;
&lt;br /&gt;
Ces variables peuvent être renseignées dans une section PERF.&lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\QUEUELISTENER\nom_de_profil] &lt;br /&gt;
&lt;br /&gt;
puis référencée par la variable &amp;quot;Queue listener Profil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Queue listener Started&lt;br /&gt;
|Boolean&lt;br /&gt;
|Démarre le service de consommation de file d&#039;attente.&lt;br /&gt;
|-&lt;br /&gt;
|Queue listener queues&lt;br /&gt;
|Liste de chaînes séparées par des ,&lt;br /&gt;
|Liste des files d&#039;attente à consommer.&lt;br /&gt;
|-&lt;br /&gt;
|Queue listener Task count&lt;br /&gt;
|Entier&lt;br /&gt;
|Nombre maximal de tâches simultanées par service.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les paramètres de scrutation d&#039;une file d&#039;attente peuvent être configurés à la suite du nom de la file d&#039;attente en séparant les paramètres par un caractère &amp;quot;:&amp;quot; &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paramètre&lt;br /&gt;
!Valeur par défaut (ms)&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Initial&lt;br /&gt;
|1000&lt;br /&gt;
|Délai initial de scrutation (ms)&lt;br /&gt;
|-&lt;br /&gt;
|Max&lt;br /&gt;
|10000&lt;br /&gt;
|Délai maximal de scrutation (ms)&lt;br /&gt;
|-&lt;br /&gt;
|Increment&lt;br /&gt;
|1000&lt;br /&gt;
|Incrément du délai jusqu&#039;au délai maximal si aucun message n&#039;est disponible (ms)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Queue listener queues=MyQueue1:2000:10:20000,MyQueue2,MyQueue3:100:10:1000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avec les valeurs par défaut, une file d&#039;attente est lue initialement toutes les secondes, puis si aucun message n&#039;est reçu, ce délai monte jusqu&#039;à 10 secondes. Lorsque un message est reçu le délai est réinitialisé à 1 seconde et ainsi de suite.&lt;br /&gt;
&lt;br /&gt;
====Compteurs de performance====&lt;br /&gt;
&lt;br /&gt;
Ces variables configurent le Processus du serveur.&lt;br /&gt;
&lt;br /&gt;
Ces variables peuvent être renseignées dans une section PERF&lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\PERF\nom_de_profil] &lt;br /&gt;
&lt;br /&gt;
puis référencée par la variable &amp;quot;Performance Counters Profil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Start Performance Counters&lt;br /&gt;
|Boolean&lt;br /&gt;
|Démarre les compteurs de performance&lt;br /&gt;
|-&lt;br /&gt;
|Start Performance Clock&lt;br /&gt;
|Boolean&lt;br /&gt;
|Démarre l&#039;horloge de performance&lt;br /&gt;
|-&lt;br /&gt;
|Performance Clock Delay&lt;br /&gt;
|Cardinal&lt;br /&gt;
|Période de l&#039;horloge de performance (ms)&lt;br /&gt;
|-&lt;br /&gt;
|HTTP PerfServer Start&lt;br /&gt;
|Boolean&lt;br /&gt;
|Démarre le serveur HTTP de performance&lt;br /&gt;
|-&lt;br /&gt;
|HTTP PerfServer Port&lt;br /&gt;
|Integer&lt;br /&gt;
|Port du serveur HTTP de performance&lt;br /&gt;
|-&lt;br /&gt;
|HTTP PerfServer Protocol&lt;br /&gt;
|String&lt;br /&gt;
|Protocole du serveur HTTP de performance&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*Start Performance Counters&lt;br /&gt;
:Le serveur inclus un certain nombre de [[Compteurs de performance (monitoring)|compteurs de performance]] interrogeables par le [[Serveur de performance (monitoring)|serveur de performance]].&lt;br /&gt;
&lt;br /&gt;
*Start Performance Clock&lt;br /&gt;
: Démarre une horloge permettant de générer un évènement de monitoring.&lt;br /&gt;
&lt;br /&gt;
*Performance Clock Delay&lt;br /&gt;
: Période de l&#039;horloge de performance. (défaut 1000)&lt;br /&gt;
&lt;br /&gt;
*HTTP PerfServer Start&lt;br /&gt;
: Démarre le server HTTP de performance.&lt;br /&gt;
&lt;br /&gt;
*HTTP PerfServer Port&lt;br /&gt;
: Port du serveur HTTP de performance. (défaut 9999)&lt;br /&gt;
&lt;br /&gt;
*HTTP PerfServer Protocol&lt;br /&gt;
:Protocole du serveur HTTP de performance (défaut http)&lt;br /&gt;
&lt;br /&gt;
Voir la catégorie [[:Category:Monitoring]]&lt;br /&gt;
&lt;br /&gt;
====HTTP====&lt;br /&gt;
Ces variables peuvent être renseignées dans une section HTTP&lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\HTTP\nom_de_profil] &lt;br /&gt;
&lt;br /&gt;
puis référencée par la variable &amp;quot;HTTP Profil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Les variables suivantes configurent le protocole HTTP utilisé par le service, elles sont utilisées pour construire des URL pointant sur le service.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Version&lt;br /&gt;
!Par défaut&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|HTTP Protocol&lt;br /&gt;
|String&lt;br /&gt;
|Toute&lt;br /&gt;
|http:&lt;br /&gt;
|Protocole HTTP publique du Service (http: ou https:)&lt;br /&gt;
|-&lt;br /&gt;
|HTTP Port&lt;br /&gt;
|Integer&lt;br /&gt;
|Toute&lt;br /&gt;
|80&lt;br /&gt;
|Port HTTP publique du Service&lt;br /&gt;
|-&lt;br /&gt;
|HTTP HostName&lt;br /&gt;
|String&lt;br /&gt;
|Toute&lt;br /&gt;
|Nom local de la machine &lt;br /&gt;
|Domaine publique du serveur HTTP frontal&lt;br /&gt;
|-&lt;br /&gt;
|HTTP ServiceName&lt;br /&gt;
|String&lt;br /&gt;
|6.51&lt;br /&gt;
|Nom du service&lt;br /&gt;
|&lt;br /&gt;
Nom du service load-balancé utilisé par le service&amp;lt;br&amp;gt;&lt;br /&gt;
Ce nom peut différer du nom du service dans une configuration load balancée.&amp;lt;br&amp;gt;&lt;br /&gt;
C&#039;est ce nom qui est enregistrée dans les URLs de la registry SDATA&amp;lt;br&amp;gt;&lt;br /&gt;
Implémenté pour SOAP à partir de la version 7 &amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les variables suivantes configurent [[Serveur HTTP (server)|le service HTTP interne]] inclus dans le serveur.&lt;br /&gt;
&lt;br /&gt;
{{Version700}}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|HTTP Started&lt;br /&gt;
|boolean&lt;br /&gt;
|Démarre le serveur HTTP&lt;br /&gt;
|-&lt;br /&gt;
|HTTP Listen Protocol&lt;br /&gt;
|String&lt;br /&gt;
|Protocole HTTP écouté par le serveur HTTP embarqué&amp;lt;br&amp;gt;&lt;br /&gt;
Si cette variable n&#039;est pas défini le protocole est défini par HTTP Protocol&lt;br /&gt;
|-&lt;br /&gt;
|HTTP Listen Port&lt;br /&gt;
|Integer&lt;br /&gt;
|Port HTTP écouté par le serveur HTTP embarqué&amp;lt;br&amp;gt;&lt;br /&gt;
Si cette variable n&#039;est pas défini le port est défini par HTTP Port&lt;br /&gt;
|-&lt;br /&gt;
|HTTP Site&lt;br /&gt;
|String&lt;br /&gt;
|Répertoire du site utilisé par le serveur HTTP&lt;br /&gt;
|-&lt;br /&gt;
|HTTP Alias&lt;br /&gt;
|String&lt;br /&gt;
|Nom de section des alias de répertoire du serveur HTTP&lt;br /&gt;
|-&lt;br /&gt;
|HTTP CertFile&lt;br /&gt;
|String&lt;br /&gt;
|Si le protocole est https, représente le fichier certificat (.pem) &lt;br /&gt;
|-&lt;br /&gt;
|HTTP RootCertFile&lt;br /&gt;
|String&lt;br /&gt;
|Si le protocole est https, représente le fichier certificat de l&#039;autorité intermédiaire qui a signé le certificat &amp;quot;CertFile&amp;quot; (.pem).&amp;lt;br&amp;gt;&lt;br /&gt;
Ce paramètre est optionnel, il est utile si l&#039;autorité intermédiaire n&#039;est pas directement reconnue par le navigateur. &lt;br /&gt;
|-&lt;br /&gt;
|HTTP KeyFile&lt;br /&gt;
|String&lt;br /&gt;
|Si le protocole est https, représente le fichier clef privée (.pem ou .key) qui est liée au certificat &lt;br /&gt;
|-&lt;br /&gt;
|HTTP KeyPassword&lt;br /&gt;
|String&lt;br /&gt;
|Si le protocole est https, représente le mot de passe qui permet de décoder la clef privée&lt;br /&gt;
|-&lt;br /&gt;
|HTTP CertIssuer&lt;br /&gt;
|String&lt;br /&gt;
|Si le protocole est https, représente l&#039;émetteur du certificat du site permettant de l&#039;identifier dans le magasin Windows&lt;br /&gt;
|-&lt;br /&gt;
|HTTP CertSerial&lt;br /&gt;
|String&lt;br /&gt;
|Si le protocole est https, représente le numéro de série du certificat du site permettant de l&#039;identifier dans le magasin Windows&lt;br /&gt;
|-&lt;br /&gt;
|HTTP SSLVersion&lt;br /&gt;
|String&lt;br /&gt;
|Version du protocole SSL à utiliser: sslvTLSv1_1, sslvTLSv1_2, sslvTLSv1_3 (par défaut :sslvTLSv1_2)&lt;br /&gt;
|-&lt;br /&gt;
|HTTP SSLCipherList&lt;br /&gt;
|String&lt;br /&gt;
|Sceaux proposés par le serveur (par défaut &amp;quot;HIGH:!aNULL:!MD5:!RC4&amp;quot;) [https://www.openssl.org/docs/manmaster/apps/ciphers.html en savoir plus] Version 7.10&lt;br /&gt;
|-&lt;br /&gt;
|HTTP KeepAlive&lt;br /&gt;
|Boolean&lt;br /&gt;
|Détermine la valeur du paramètre KeepAlive des réponses du serveur HTTP.&amp;lt;br&amp;gt;&lt;br /&gt;
La valeur est True (1) par défaut et le serveur renvoi KeepAlive dans ses réponses.&amp;lt;br&amp;gt;&lt;br /&gt;
Cette valeur doit être false (0) pour une configuration load balancée.&lt;br /&gt;
|-&lt;br /&gt;
|HTTP Private Started&lt;br /&gt;
|Boolean&lt;br /&gt;
|Permet de démarrer un service http &amp;quot;privé&amp;quot;, utile dans le cadre d&#039;une configuration load balancée.&amp;lt;br&amp;gt;&lt;br /&gt;
Ce service n&#039;est adressé que par les autres services, et permet d&#039;économiser la partie SSL des échanges.&amp;lt;br&amp;gt;&lt;br /&gt;
Le port de ce service ne doit pas être exposé au clients web.&lt;br /&gt;
|-&lt;br /&gt;
|HTTP Private Port&lt;br /&gt;
|Integer&lt;br /&gt;
|Détermine la valeur du port http privé.&lt;br /&gt;
|-&lt;br /&gt;
|HTTP Log&lt;br /&gt;
|Booléen&lt;br /&gt;
|Active la journalisation des flux http (Version 10)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{tip|TLS 1.3 supporté à partir de la version 10 en utilisant OpenSSL 3.0}}&lt;br /&gt;
&lt;br /&gt;
{{tip|Le protocole/port publique peuvent être différent du protocole/port d&#039;écoute si un load balancer est utilisé.}}&lt;br /&gt;
&lt;br /&gt;
Voir aussi :&lt;br /&gt;
* [[Serveur HTTP (server)|Serveur HTTP interne]]&lt;br /&gt;
* [[Configuration_du_Serveur_HTTPS|Configuration du serveur en HTTPs]]&lt;br /&gt;
* [[Configuration_du_Serveur_HTTP_derrière_un_répartiteur_de_charge|Configuration derrière un répartiteur de charge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Certains de ces paramètres peuvent être remplacés par [[Service_1000_(server)|les paramètres de la ligne de commande]] :&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paramètre&lt;br /&gt;
!Paramètre de la ligne de commande&lt;br /&gt;
|-&lt;br /&gt;
|HTTP Listen Port&lt;br /&gt;
|HTTPPORT&lt;br /&gt;
|-&lt;br /&gt;
|HTTP KeepAlive&lt;br /&gt;
|HTTPKEEPALIVE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====HTTP ACLs====&lt;br /&gt;
{{version710}}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|HTTP ACL&lt;br /&gt;
|string&lt;br /&gt;
|Liste de règles séparées par une virgule, par ordre de priorité&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
La syntaxe d&#039;une règle ACL :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 action-IP/Nob&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*action&lt;br /&gt;
: Type de règle, doit être accept ou deny&lt;br /&gt;
*IP&lt;br /&gt;
: Addresse IP en notation pointé&lt;br /&gt;
*Nob (facultatif)&lt;br /&gt;
:Nombre de bits du masque de sous réseau, par exemple 29 correspond au masque 255.255.255.248 et défini un sous réseau de 8 adresses. &lt;br /&gt;
&lt;br /&gt;
[http://jodies.de/ipcalc Calculateur de masque]&lt;br /&gt;
&lt;br /&gt;
Exemple 1 :&lt;br /&gt;
&lt;br /&gt;
Autorise les adresses 192.168.1.0 ... 192.168.1.7 à l’exception de 192.168.1.5&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deny-192.168.1.5&lt;br /&gt;
accept-192.168.1.0/29&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple 2 :&lt;br /&gt;
&lt;br /&gt;
Autorise seulement l&#039;adresse 192.168.1.1 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
accept-192.168.1.1&lt;br /&gt;
deny-0.0.0.0/0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====HTTP Web Worker====&lt;br /&gt;
{{version800}}&lt;br /&gt;
&lt;br /&gt;
Le Web Worker est un mécanisme de notification asynchrone permettant au client Web d&#039;être notifié des événements survenant coté serveur.&lt;br /&gt;
&lt;br /&gt;
Il permet de gérer les notifications de boîte à message ainsi que les notifications de traitement. &lt;br /&gt;
&lt;br /&gt;
L&#039;utilisation du web worker améliore l&#039;expérience utilisateur.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Web worker started&lt;br /&gt;
|Integer&lt;br /&gt;
|Active (1) ou désactive (0) l&#039;utilisation du web worker&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Tip|Lorsque le web worker est activé, le client génère des requêtes msg.pending périodiques.}}&lt;br /&gt;
&lt;br /&gt;
====HTTP Web Socket====&lt;br /&gt;
{{version800}}&lt;br /&gt;
&lt;br /&gt;
Les WebSockets utilisent un protocole permettant de créé des canaux de communication full-duplex à l&#039;intérieur d&#039;une connexion TCP. &lt;br /&gt;
&lt;br /&gt;
L&#039;utilisation des WebSockets améliore l&#039;expérience utilisateur par une meilleur fluidité des échanges.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Web socket started&lt;br /&gt;
|Integer&lt;br /&gt;
|Active (1) ou désactive (0) l&#039;utilisation de WebSocket &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Tip| &lt;br /&gt;
&lt;br /&gt;
#Les WebSocket ne sont prises en charge que par le serveur HTTP embarqué et en mode &#039;&#039;&#039;HTTPs uniquement&#039;&#039;&#039;.&lt;br /&gt;
#Les WebSockets sont activées par défaut.&lt;br /&gt;
#Les WebSocket peuvent ne pas fonctionner ou provoquer des problèmes dans le cas d&#039;utilisation du serveur Sage 1000 derrière un load balancer qui ne supporterait pas le protocole WebSocket.&lt;br /&gt;
#L&#039;url utilisée doit correspondre au domaine du certificat SSL. Par exemple, en entreprise, si votre serveur est myhost sur le domaine interne xxx.yyy.zzz le nom de domaine du certificat auto-généré sera myhost.xxx.yyy.zzz. Vous devez utiliser https://myhost.xxx.yyy.zzz comme url d&#039;accès même si https://myhost est valide sur votre réseau. A défaut l&#039;établissement des connexions websockets échoueront.}}&lt;br /&gt;
&lt;br /&gt;
{{Tip|Lorsque les websockets sont actives, le dialogue d&#039;attente n&#039;est pas affiché.}}&lt;br /&gt;
&lt;br /&gt;
====HTTP CSP====&lt;br /&gt;
La [https://developer.mozilla.org/fr/docs/Web/HTTP/CSP stratégie de sécurité du contenu] permet d&#039;améliorer la sécurité des sites web.&lt;br /&gt;
&lt;br /&gt;
{{version1000}}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|HTTP CSP&lt;br /&gt;
|Liste de chaines&lt;br /&gt;
|Liste des règles séparées par &amp;quot;;&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemple &lt;br /&gt;
&lt;br /&gt;
HTTP CSP = default-src &#039;self&#039;; script-src https://example.com&lt;br /&gt;
&lt;br /&gt;
La valeur par défaut est &#039;&#039;default-src &#039;self&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====HTTP CORS====&lt;br /&gt;
Le [https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS CORS] permet d&#039;autoriser des requêtes provenant d&#039;autre domaine.&lt;br /&gt;
&lt;br /&gt;
{{version800}}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|HTTP CORS Allow origin&lt;br /&gt;
|Liste de chaines&lt;br /&gt;
|Liste des domaines autorisés&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
La liste des domaines doit être séparée par des virgules, utilisez * pour autoriser tous les domaines.&lt;br /&gt;
&lt;br /&gt;
Les domaines doivent être qualifié par le protocole, par exemple http://origin.com&lt;br /&gt;
&lt;br /&gt;
Les domaines indiqués ici seront comparés à la valeur du champ d&#039;entête Origin&lt;br /&gt;
&lt;br /&gt;
Lorsque le domain est autorisé, le service retourne dans la réponse :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Champ&lt;br /&gt;
!Valeur&lt;br /&gt;
|-&lt;br /&gt;
|Access-Control-Allow-Origin&lt;br /&gt;
|Valeur du chanmp Origin de la requête&lt;br /&gt;
|-&lt;br /&gt;
|Vary&lt;br /&gt;
|Origin&lt;br /&gt;
|-&lt;br /&gt;
|Access-Control-Allow-Credentials&lt;br /&gt;
|true&lt;br /&gt;
|-&lt;br /&gt;
|Access-Control-Allow-Methods&lt;br /&gt;
|POST,PUT,DELETE,GET,OPTION&lt;br /&gt;
|-&lt;br /&gt;
|Access-Control-Allow-Headers&lt;br /&gt;
|Valeur de Access-Control-Request-Headers de la requête&lt;br /&gt;
|-&lt;br /&gt;
|Access-Control-Max-Age&lt;br /&gt;
|86400&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====FTPs====&lt;br /&gt;
Ces variables configurent le serveur FTPs inclu dans le servcice.&lt;br /&gt;
Le serveur FTP peut être utilisé sur les containeurs.&lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\FTP\nom_de_profil] &lt;br /&gt;
&lt;br /&gt;
puis référencée par la variable &amp;quot;FTP Profil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|FTP Profil&lt;br /&gt;
|string&lt;br /&gt;
|Référence une section FTP&lt;br /&gt;
|-&lt;br /&gt;
|FTP Start&lt;br /&gt;
|1 ou 0&lt;br /&gt;
|Démarre le service FTP&lt;br /&gt;
|-&lt;br /&gt;
|FTP ACL&lt;br /&gt;
|Chaîne&lt;br /&gt;
|Définit une liste d&#039;ACL optionnelle&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====WEB====&lt;br /&gt;
Ces variables configurent le service WEB inclu dans le service.&lt;br /&gt;
&lt;br /&gt;
Ces variables peuvent être renseignées dans une section WEB&lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\WEB\nom_de_profil] &lt;br /&gt;
&lt;br /&gt;
puis référencée par la variable &amp;quot;WEB Profil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|WEB Profil&lt;br /&gt;
|string&lt;br /&gt;
|Référence une section WEB&lt;br /&gt;
|-&lt;br /&gt;
|MaxDatagridRowCount&lt;br /&gt;
|Entier&lt;br /&gt;
|Détermine le nombre maximal de lignes chargées dans une grille (défaut 5000)&lt;br /&gt;
|-&lt;br /&gt;
|GridWindowSize&lt;br /&gt;
|Entier&lt;br /&gt;
|Détermine le nombre maximal de lignes affichées dans une page de grille. (Défaut 25)&lt;br /&gt;
|-&lt;br /&gt;
|MDIForms&lt;br /&gt;
|1 ou 0&lt;br /&gt;
|Défaut 0&lt;br /&gt;
|-&lt;br /&gt;
|MDIAssistants&lt;br /&gt;
|1 ou 0&lt;br /&gt;
|Défaut 1&lt;br /&gt;
|-&lt;br /&gt;
|UseTreeBookClassic&lt;br /&gt;
|1 ou 0&lt;br /&gt;
|Défaut 0&lt;br /&gt;
|-&lt;br /&gt;
|SavePortalTabForms&lt;br /&gt;
|1 ou 0&lt;br /&gt;
|Défaut 1&lt;br /&gt;
|-&lt;br /&gt;
|DebugJS&lt;br /&gt;
|1 ou 0&lt;br /&gt;
|Utilise les javascript en mode debug (Défaut 0)&lt;br /&gt;
|-&lt;br /&gt;
|RecordMode&lt;br /&gt;
|1 ou 0&lt;br /&gt;
|Active le mode enregistrement pour JMeter (Défaut 0)&lt;br /&gt;
|-&lt;br /&gt;
|FormRedirect&lt;br /&gt;
|1 ou 0&lt;br /&gt;
|Active la redirection des urls d&#039;écran, pour IIS cette redirection doit être désactivée. (défaut 1, ativé)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Mise au point, debugger {{Version700}}====&lt;br /&gt;
Ces variables configurent le remote debugger inclus dans le service.&lt;br /&gt;
&lt;br /&gt;
Le remote debugger permet à un poste client desktop de visualiser, modifier et poser des points d&#039;arrêt dans le code métier exécuté par le service. &lt;br /&gt;
&lt;br /&gt;
Ces variables peuvent être renseignées dans une section DEBUGGER&lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\DEBUGGER\nom_de_profil] &lt;br /&gt;
&lt;br /&gt;
puis référencée par la variable &amp;quot;DEBUGGER Profil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|DEBUGGER Profil&lt;br /&gt;
|string&lt;br /&gt;
|Référence une section DEBUGGER&lt;br /&gt;
|-&lt;br /&gt;
|DEBUGGER Started&lt;br /&gt;
|Boolean&lt;br /&gt;
|Démarre le service de Remote debugging&lt;br /&gt;
|-&lt;br /&gt;
|DEBUGGER Users&lt;br /&gt;
|Strings&lt;br /&gt;
|Liste des utilisateurs autorisés à utiliser le service de remote debugging&lt;br /&gt;
|-&lt;br /&gt;
|DEBUGGER Handlers&lt;br /&gt;
|Strings&lt;br /&gt;
|Liste des handlers des évènements de trace qui seront interceptés et redirigés vers le journal d&#039;évènement, ceci vous permet de visualiser en temps réel ces traces dans la console SNMP. Les handlers possibles sont:&lt;br /&gt;
* script&lt;br /&gt;
: Evènements générés par la fonction dbgMsg() du code métier&lt;br /&gt;
* queries&lt;br /&gt;
: Evènements de trace des requêtes SQL&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{warning|L&#039;utilisation de DEBUGGER Handlers peut provoquer une forte consommation de mémoire}}&lt;br /&gt;
{{warning|Ces fonctionnalités ne doivent pas être activés sur un serveur de production}}&lt;br /&gt;
&lt;br /&gt;
====LDAP====&lt;br /&gt;
Ces variables configurent le serveur LDAP inclus dans le service.&lt;br /&gt;
&lt;br /&gt;
Ces variables peuvent être renseignées dans une section LDAP&lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\LDAP\nom_de_profil] &lt;br /&gt;
&lt;br /&gt;
puis référencée par la variable &amp;quot;LDAP Profil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|LDAP Profil&lt;br /&gt;
|string&lt;br /&gt;
|Référence une section LDAP&lt;br /&gt;
|-&lt;br /&gt;
|LDAP Started&lt;br /&gt;
|Boolean&lt;br /&gt;
|Démarre le service LDAP (défaut false).&lt;br /&gt;
|-&lt;br /&gt;
|LDAP Port&lt;br /&gt;
|Integer&lt;br /&gt;
|Port d&#039;écoute du service LDAP&lt;br /&gt;
|-&lt;br /&gt;
|LDAP Password&lt;br /&gt;
|String&lt;br /&gt;
|Mot de passe administrateur du compte system du serveur LDAP (&#039;uid=admin,ou=system&#039;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SOAP====&lt;br /&gt;
Ces variables configurent le service SOAP inclus dans le serveur.&lt;br /&gt;
&lt;br /&gt;
Ces variables peuvent être renseignées dans une section SOAP&lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\SOAP\nom_de_profil] &lt;br /&gt;
&lt;br /&gt;
puis référencées par la variable &amp;quot;SOAP Profil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|SOAP Profil&lt;br /&gt;
|string&lt;br /&gt;
|Référence une section SOAP&lt;br /&gt;
|-&lt;br /&gt;
|SOAP Log Documents&lt;br /&gt;
|Boolean&lt;br /&gt;
|Active la journalisation des documents SOAP&lt;br /&gt;
|-&lt;br /&gt;
|SOAP Log Messages&lt;br /&gt;
|Boolean&lt;br /&gt;
|Active la journalisation des messages SOAP&lt;br /&gt;
|-&lt;br /&gt;
|SOAP 5.5x&lt;br /&gt;
|Boolean&lt;br /&gt;
|Utilise l&#039;implémentation SOAP des versions 5.5x&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*SOAP 5.5x&lt;br /&gt;
:L&#039;implémentation de SOAP a été récrite en version 5.6x, en cas de problème de compatibilité avec des développements existant il est possible d&#039;utiliser l&#039;ancienne implémentation.&lt;br /&gt;
&lt;br /&gt;
====SMTP====&lt;br /&gt;
Ces variables configurent le client SMTP utilisé par le service pour envoyer des EMails.&lt;br /&gt;
&lt;br /&gt;
Ces variables peuvent être renseignées dans une section SMTP&lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\SMTP\nom_de_profil] &lt;br /&gt;
&lt;br /&gt;
puis référencés par la variable &amp;quot;SMTP Profil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|SMTP Profil&lt;br /&gt;
|string&lt;br /&gt;
|Référence une section SMTP&lt;br /&gt;
|-&lt;br /&gt;
|SMTP Host&lt;br /&gt;
|String&lt;br /&gt;
|Adresse du serveur SMTP.&lt;br /&gt;
|-&lt;br /&gt;
|SMTP Port&lt;br /&gt;
|Integer&lt;br /&gt;
|Port du serveur SMTP.&lt;br /&gt;
|-&lt;br /&gt;
|SMTP Login&lt;br /&gt;
|String&lt;br /&gt;
|Utilisateur de connexion du serveur SMTP.&lt;br /&gt;
|-&lt;br /&gt;
|SMTP Password&lt;br /&gt;
|String&lt;br /&gt;
|Mot de passe de connexion du serveur SMTP.&lt;br /&gt;
|-&lt;br /&gt;
|SMTP From&lt;br /&gt;
|String&lt;br /&gt;
|Adresse EMail de l&#039;expéditeur.&lt;br /&gt;
|-&lt;br /&gt;
|SMTP UseTLS&lt;br /&gt;
|Boolean&lt;br /&gt;
|Utilise une sécurisation TLS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SNMP====&lt;br /&gt;
Ces variables peuvent être renseignées dans une section SNMP&lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\SNMP\nom_de_profil] &lt;br /&gt;
&lt;br /&gt;
puis référencés par la variable &amp;quot;SNMP Profil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ces variables configurent l&#039;agent SNMP inclus dans le serveur. &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|SNMP Profil&lt;br /&gt;
|string&lt;br /&gt;
|Référence une section SNMP&lt;br /&gt;
|-&lt;br /&gt;
|SNMP Started&lt;br /&gt;
|Boolean&lt;br /&gt;
|Démarre l&#039;agent SNMP&lt;br /&gt;
|-&lt;br /&gt;
|SNMP Port&lt;br /&gt;
|Integer&lt;br /&gt;
|Port UDP de l&#039;agent SNMP (161)&lt;br /&gt;
|-&lt;br /&gt;
|SNMP sysName&lt;br /&gt;
|String&lt;br /&gt;
|Valeur de la variable sysName pour la MIB2&lt;br /&gt;
|-&lt;br /&gt;
|SNMP sysContact&lt;br /&gt;
|String&lt;br /&gt;
|Valeur de la variable sysContact pour la MIB2&lt;br /&gt;
|-&lt;br /&gt;
|SNMP sysLocation&lt;br /&gt;
|String&lt;br /&gt;
|Valeur de la variable sysLocation pour la MIB2&lt;br /&gt;
|-&lt;br /&gt;
|SNMP Traps&lt;br /&gt;
|liste de chaîne&lt;br /&gt;
|Référence des sections SNMPTRAP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les sections SNMPTRAP permettent de définir des points d&#039;écoute SNMP auquels seront envoyés les messages de traps.&lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\SNMPTRAP\nom_de_profil] &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|SNMP Trap Host&lt;br /&gt;
|string&lt;br /&gt;
|Nom réseau du point d&#039;écoute&lt;br /&gt;
|-&lt;br /&gt;
|SNMP Trap Port&lt;br /&gt;
|Integer&lt;br /&gt;
|Numéro du port du point d&#039;écoute&lt;br /&gt;
|-&lt;br /&gt;
|SNMP Trap Categories&lt;br /&gt;
|Liste de chaîne&lt;br /&gt;
|Catégories des traps à envoyer à ce point d&#039;écoute&amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
La liste des catégories de trap est la suivante :&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de catégorie&lt;br /&gt;
!Type de message&lt;br /&gt;
|-&lt;br /&gt;
|Service&lt;br /&gt;
|Messages relatifs au processus du service.&lt;br /&gt;
|-&lt;br /&gt;
|Automate&lt;br /&gt;
|Messages relatifs aux exécutions de l&#039;automate.&lt;br /&gt;
|-&lt;br /&gt;
|BP&lt;br /&gt;
|Messages relatifs aux exécutions des Processus métiers.&lt;br /&gt;
|-&lt;br /&gt;
|Authenticate&lt;br /&gt;
|Messages relatifs aux erreurs d&#039;authentification.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration SNMP : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[\SOFTWARE\Sage\Ligne 1000\Administration\SNMP\CONFIG_SNMP_1]&lt;br /&gt;
SNMP Started=1&lt;br /&gt;
SNMP Start=1&lt;br /&gt;
SNMP Port=161&lt;br /&gt;
SNMP sysContact = toto@sage.com&lt;br /&gt;
SNMP sysName = toto&lt;br /&gt;
SNMP sysLocation = Paris,France&lt;br /&gt;
SNMP Traps=Service,Automate&lt;br /&gt;
&lt;br /&gt;
[\SOFTWARE\Sage\Ligne 1000\Administration\SNMPTRAP\Service]&lt;br /&gt;
SNMP Trap Host=localhost&lt;br /&gt;
SNMP Trap Port=162&lt;br /&gt;
SNMP Trap Categories=Service,Authenticate&lt;br /&gt;
&lt;br /&gt;
[\SOFTWARE\Sage\Ligne 1000\Administration\SNMPTRAP\Automate]&lt;br /&gt;
SNMP Trap Host=localhost&lt;br /&gt;
SNMP Trap Port=162&lt;br /&gt;
SNMP Trap Categories=Automate,BP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PROXY====&lt;br /&gt;
&lt;br /&gt;
{{tip|Déprécié, utiliser le paramétrage dans la console d&#039;administration.}}&lt;br /&gt;
&lt;br /&gt;
Ces variables configurent le PROXY utilisé par le client HTTP.&lt;br /&gt;
&lt;br /&gt;
Ces variables peuvent être renseignées dans une section PROXY&lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\PROXY\nom_de_profil]&lt;br /&gt;
&lt;br /&gt;
puis référencée par la variable &amp;quot;PROXY Profil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|PROXY Profil&lt;br /&gt;
|string&lt;br /&gt;
|Référence une section PROXY&lt;br /&gt;
|-&lt;br /&gt;
|PROXY Host&lt;br /&gt;
|String&lt;br /&gt;
|Adresse du serveur PROXY.&lt;br /&gt;
|-&lt;br /&gt;
|PROXY Port&lt;br /&gt;
|Integer&lt;br /&gt;
|Port du serveur PROXY (défaut 8080).&lt;br /&gt;
|-&lt;br /&gt;
|PROXY Login&lt;br /&gt;
|String&lt;br /&gt;
|Utilisateur de connexion du serveur PROXY.&lt;br /&gt;
|-&lt;br /&gt;
|PROXY Password&lt;br /&gt;
|String&lt;br /&gt;
|Mot de passe de connexion du serveur PROXY.&lt;br /&gt;
|-&lt;br /&gt;
|PROXY Timeout&lt;br /&gt;
|Integer&lt;br /&gt;
|Délai d&#039;expiration du PROXY. (défaut 60 secondes)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Exceptions====&lt;br /&gt;
Ces variables configurent l&#039;enregistrement des exceptions du service.&lt;br /&gt;
&lt;br /&gt;
Ces variables peuvent être renseignées dans une section EXCEPTIONS&lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\EXCEPTIONS\nom_de_profil]&lt;br /&gt;
&lt;br /&gt;
puis référencées par la variable &amp;quot;Exceptions logs Profil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Exceptions logs Profil&lt;br /&gt;
|string&lt;br /&gt;
|Référence une section EXCEPTIONS&lt;br /&gt;
|-&lt;br /&gt;
|Exceptions logs Started&lt;br /&gt;
|boolean&lt;br /&gt;
|Enregistrer les exceptions. Vrai par défaut.&lt;br /&gt;
|-&lt;br /&gt;
|Exceptions logs path&lt;br /&gt;
|String&lt;br /&gt;
|Répertoire dans lequel seront créés les fichiers d&#039;exception.&lt;br /&gt;
|-&lt;br /&gt;
|Exceptions logs ignore&lt;br /&gt;
|Liste de chaîne&lt;br /&gt;
|Liste d&#039;exception à ignorer.&lt;br /&gt;
|-&lt;br /&gt;
|Exceptions logs write file&lt;br /&gt;
|booléen&lt;br /&gt;
|Un fichier d&#039;exception est écrit. Vrai par défaut. Il peut être inutile d&#039;écrire un fichier d&#039;exception si les exceptions sont transmises à un gestionnaire de log (voir LOG MANAGER) et permet dans ce cas ne ne pas encombrer le disque.(V8)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Captcha====&lt;br /&gt;
&lt;br /&gt;
Dans le cadre d&#039;un service public, les utilisateurs souhaitant s&#039;enregistrer peuvent être soumis à un captcha.&lt;br /&gt;
&lt;br /&gt;
Si l&#039;utilisateur commet trois erreurs lors de l&#039;authentification, il devra saisir un captcha.&lt;br /&gt;
&lt;br /&gt;
voir http://www.google.com/recaptcha&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Recaptcha Public Key&lt;br /&gt;
|string&lt;br /&gt;
|Clef publique Recaptcha&lt;br /&gt;
|-&lt;br /&gt;
|Recaptcha Private Key&lt;br /&gt;
|String&lt;br /&gt;
|Clef privée Recaptcha&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Quotas====&lt;br /&gt;
&lt;br /&gt;
Dans le cadre d&#039;un service public, les utilisateurs téléversent des fichiers dans un répertoire propres à la session.&lt;br /&gt;
&lt;br /&gt;
Ces fichiers doivent avoir une extension prévue pour des questions de sécurité.&lt;br /&gt;
&lt;br /&gt;
La taille totale du répertoire est définie pour éviter un manque de place sur le disque.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Upload Document Size&lt;br /&gt;
|integer&lt;br /&gt;
|Taille maximale en Mb d&#039;un fichier uploadé; valeur par défaut : 0 (non limité)&lt;br /&gt;
|-&lt;br /&gt;
|Upload User Quota&lt;br /&gt;
|integer&lt;br /&gt;
|Taille maximale en Mb du répertoire upload de l&#039;utilisateur par session; valeur par défaut : 50&lt;br /&gt;
|-&lt;br /&gt;
|Upload Ext Allowed&lt;br /&gt;
|String&lt;br /&gt;
|Extensions autorisées; valeur par défaut : vide (tout est autorisé)&lt;br /&gt;
|-&lt;br /&gt;
|Auto delete messages&lt;br /&gt;
|Entier&lt;br /&gt;
|Durée de conservation en jours des messages &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{tip|La liste des extensions suivantes n&#039;est jamais filtrée car le service est susceptible de créer des fichiers de ce type (xlsx,ods,xml,pdf,,csv,sxc,xls,,jpg,jpeg,png,asice)}}&lt;br /&gt;
&lt;br /&gt;
====Clefs====&lt;br /&gt;
&lt;br /&gt;
Le stockage de certaines clefs peut être externalié&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Key Cookie&lt;br /&gt;
|chaine&lt;br /&gt;
|[[keyvault_url|url d&#039;un stockage sécurisé externe]], si la clef est non trouvée, elle y sera créée&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sections SDATA===&lt;br /&gt;
Ces sections permettent de configurer les points d&#039;accès SDATA qui seront exposés par le service.&lt;br /&gt;
&lt;br /&gt;
Les noms de ces sections sont&lt;br /&gt;
&lt;br /&gt;
 [\SOFTWARE\Sage\Ligne 1000\Administration\Servers\&amp;lt;&amp;lt;nom du service&amp;gt;&amp;gt;\SData\&amp;lt;&amp;lt;incrément 1...&amp;gt;&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|DataSetName&lt;br /&gt;
|string&lt;br /&gt;
|Nom du dataset dans l&#039;URL SDATA&lt;br /&gt;
|-&lt;br /&gt;
|Title&lt;br /&gt;
|string&lt;br /&gt;
|Libellé informatif sur l&#039;usage du point d&#039;accès&lt;br /&gt;
|-&lt;br /&gt;
|Contract&lt;br /&gt;
|string&lt;br /&gt;
|Nom du paquet de service SDATA&lt;br /&gt;
|-&lt;br /&gt;
|Version&lt;br /&gt;
|string&lt;br /&gt;
|Numéro de version, peut être utilisé pour supporté plusieurs version du même contrat&lt;br /&gt;
|-&lt;br /&gt;
|Folder&lt;br /&gt;
|string&lt;br /&gt;
|Nom du dossier utilisé par ce point d&#039;accès&lt;br /&gt;
|-&lt;br /&gt;
|Database&lt;br /&gt;
|string&lt;br /&gt;
|Nom de la base de donnée utilisé pour ce point d&#039;accès (multi-bases)&lt;br /&gt;
|-&lt;br /&gt;
|Society&lt;br /&gt;
|string&lt;br /&gt;
|Nom de la société pour ce point d&#039;accès (multi-société) &lt;br /&gt;
|-&lt;br /&gt;
|Restitution&lt;br /&gt;
|string&lt;br /&gt;
|Nom de la famille de restitution pour ce point d&#039;accès (multi-société) &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemple : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[\SOFTWARE\Sage\Ligne 1000\Administration\Servers\SYFRE\SData\1]&lt;br /&gt;
DataSetName=iphone&lt;br /&gt;
Title=syfre iphone&lt;br /&gt;
Contract=ndfContract&lt;br /&gt;
Version=1&lt;br /&gt;
Folder=Test Syfre iPhone&lt;br /&gt;
Database=dbTestIPhone&lt;br /&gt;
Society=&lt;br /&gt;
Restitution=&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Section Export===&lt;br /&gt;
Cette section permet de configurer la fonction d&#039;exportation des vignettes de portail des Services. &lt;br /&gt;
&lt;br /&gt;
Deux mode d&#039;exportation sont possibles :&lt;br /&gt;
&lt;br /&gt;
*ftp&lt;br /&gt;
: Dans ce mode les vignettes sont générées et copiées dans un répertoire public accessible par ftp.&lt;br /&gt;
&lt;br /&gt;
*file&lt;br /&gt;
: Dans ce mode les vignettes sont générées et copiées dans un répertoire local du serveur. Ce mode n&#039;est utile que si le répertoire est un répertoire du Site et que celui-ci est public.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Protocol&lt;br /&gt;
|String&lt;br /&gt;
|ftp ou file&lt;br /&gt;
|-&lt;br /&gt;
|Export URL&lt;br /&gt;
|String&lt;br /&gt;
|Cette URL référence le répertoire où la vignette a été générée.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Si le protocole est &#039;ftp&#039; les variables suivantes sont utilisées :&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|FTP host&lt;br /&gt;
|String&lt;br /&gt;
|Addresse du serveur FTP&lt;br /&gt;
|-&lt;br /&gt;
|FTP Port&lt;br /&gt;
|Integer&lt;br /&gt;
|Numéro du port du serveur FTP&lt;br /&gt;
|-&lt;br /&gt;
|FTP Login&lt;br /&gt;
|String&lt;br /&gt;
|Utilisateur de connexion du serveur FTP&lt;br /&gt;
|-&lt;br /&gt;
|FTP Password&lt;br /&gt;
|String&lt;br /&gt;
|Mot de passe de connexion du serveur FTP&lt;br /&gt;
|-&lt;br /&gt;
|FTP Directory&lt;br /&gt;
|String&lt;br /&gt;
|Répertoire d&#039;exportation sur le serveur FTP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Si le protocole est &#039;file&#039; les variables suivantes sont utilisées : &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Directory&lt;br /&gt;
|String&lt;br /&gt;
|Répertoire d&#039;exportation sur le serveur.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration ftp utilisant une zone publique Free : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[\SOFTWARE\Sage\Ligne 1000\Administration\Servers\SYFRE\Export]&lt;br /&gt;
Protocol=ftp&lt;br /&gt;
Export URL=http://syfre.free.fr/sage/&lt;br /&gt;
FTP Host=ftpperso.free.fr&lt;br /&gt;
FTP Port=21&lt;br /&gt;
FTP Login=syfre&lt;br /&gt;
FTP Password=XXXXXXXXXX&lt;br /&gt;
FTP Directory=sage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Section ConfigServer===&lt;br /&gt;
&lt;br /&gt;
Cette section permet d&#039;utiliser un fichier de configuration disponible sur une url.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom de variable&lt;br /&gt;
!Type&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|url&lt;br /&gt;
|String&lt;br /&gt;
|Cette URL permet de récupérer le fichier de configuration.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un POST HTTP est effectué sur cette url avec les données suivantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;deploymentId&amp;quot;:&amp;quot;nom_système_de_la_machine&amp;quot;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le résultat attendu est &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;config&amp;quot;:&amp;quot;contenu_du_fichier_de_configuration&amp;quot;},&lt;br /&gt;
{&amp;quot;certificate&amp;quot;:&amp;quot;certificat_au_format_pfx&amp;quot;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[Exemple de configuration (server)|Exemple de configuration]]&lt;br /&gt;
*[[Service_1000_(server)|Ligne de commande]]&lt;br /&gt;
&lt;br /&gt;
{{Footer|Serveur}}&lt;br /&gt;
[[category:Serveur]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=D%C3%A9veloppement_DSM&amp;diff=14740</id>
		<title>Développement DSM</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=D%C3%A9veloppement_DSM&amp;diff=14740"/>
		<updated>2024-12-09T13:25:19Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Langage et modélisation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
===Architectures===&lt;br /&gt;
* [[Vue d&#039;ensemble 1000 (arch)|Vue d&#039;ensemble]]&lt;br /&gt;
* [[Architecture 2 Tiers (arch)|Architecture 2 Tiers]]&lt;br /&gt;
* [[Architecture 3 Tiers (arch)|Architecture 3 Tiers]]&lt;br /&gt;
&lt;br /&gt;
===Langage et modélisation===&lt;br /&gt;
&lt;br /&gt;
* [[Modèle|La modélisation]]&lt;br /&gt;
* [[Moteur de règle|Le moteur de règle]]&lt;br /&gt;
* [[:category:Règles|Les règles métiers]]&lt;br /&gt;
* [[Langage|Le langage]]&lt;br /&gt;
* [[Tableaux ouverts (lang)|Tableaux ouverts]]&lt;br /&gt;
* [[Code métier|Le code métier]]&lt;br /&gt;
* [[Files d&#039;attente|La gestion des files d&#039;attente]]&lt;br /&gt;
* [[:category:Types|Les types métiers]]&lt;br /&gt;
* [[Mode d&#039;exécution (script)|Mode d&#039;exécution]]&lt;br /&gt;
&lt;br /&gt;
===Tests unitaires===&lt;br /&gt;
&lt;br /&gt;
* [[Tests unitaires|Test unitaires]]&lt;br /&gt;
&lt;br /&gt;
===Support de fonctions métiers===&lt;br /&gt;
&lt;br /&gt;
* [[TdbfCurrency (class)|Devises]]&lt;br /&gt;
* [[TdbfCounter (class)|Compteurs]]&lt;br /&gt;
* [[TdbfUnit (class)|Unités]]&lt;br /&gt;
* [[Documents (dsm)|Documents]]&lt;br /&gt;
* [[Boites à messages (dsm)|Boîtes à Messages]]&lt;br /&gt;
* [[:category:Classes frameworks|Les classes du framework]]&lt;br /&gt;
&lt;br /&gt;
===Librairie d&#039;exécution===&lt;br /&gt;
&lt;br /&gt;
* [[:category:RTL Chaîne|Fonctions de chaînes de caractère]]&lt;br /&gt;
* [[:category:RTL Date et heure|Fonctions de dates et heures]]&lt;br /&gt;
* [[:category:RTL Conversion|Fonctions de conversion]]&lt;br /&gt;
* [[:category:RTL Variant|Fonctions variants]]&lt;br /&gt;
* [[:category:RTL Système|Fonctions systèmes]]&lt;br /&gt;
* [[:category:RTL Application|Fonctions applicatives]]&lt;br /&gt;
* [[:category:RTL Fichiers|Fonctions sur les fichiers]]&lt;br /&gt;
* [[:category:RTL Framework|Fonctions du framework]]&lt;br /&gt;
* [[:category:RTL Mise au point|Fonctions de mise au point]]&lt;br /&gt;
* [[:category:RTL Dialogues|Fonctions de dialogues]]&lt;br /&gt;
* [[:category:RTL Métier|Fonctions métiers]]&lt;br /&gt;
* [[:category:RTL Traduction|Fonctions de traduction]]&lt;br /&gt;
* [[:category:RTL Automate|Fonctions de l&#039;automate]]&lt;br /&gt;
* [[:category:RTL Contrôles|Fonctions des contrôles]]&lt;br /&gt;
&lt;br /&gt;
===Administration===&lt;br /&gt;
&lt;br /&gt;
* [[Gestion des certificats (dsm)|Gestion des certificats]]&lt;br /&gt;
&lt;br /&gt;
===Architecture métier===&lt;br /&gt;
&lt;br /&gt;
* [[Architecture multi-sociétés (partage)|Multi-sociétés et partage]]&lt;br /&gt;
&lt;br /&gt;
[[category:DSM]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=D%C3%A9veloppement_DSM&amp;diff=14739</id>
		<title>Développement DSM</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=D%C3%A9veloppement_DSM&amp;diff=14739"/>
		<updated>2024-12-09T13:24:08Z</updated>

		<summary type="html">&lt;p&gt;Syfre : /* Didactitiels */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
===Architectures===&lt;br /&gt;
* [[Vue d&#039;ensemble 1000 (arch)|Vue d&#039;ensemble]]&lt;br /&gt;
* [[Architecture 2 Tiers (arch)|Architecture 2 Tiers]]&lt;br /&gt;
* [[Architecture 3 Tiers (arch)|Architecture 3 Tiers]]&lt;br /&gt;
&lt;br /&gt;
===Langage et modélisation===&lt;br /&gt;
&lt;br /&gt;
* [[Modèle|La modélisation]]&lt;br /&gt;
* [[Moteur de règle|Le moteur de règle]]&lt;br /&gt;
* [[:category:Règles|Les règles métiers]]&lt;br /&gt;
* [[Langage|Le langage]]&lt;br /&gt;
* [[Tableaux ouverts (lang)|Tableaux ouverts]]&lt;br /&gt;
* [[Code métier|Le code métier]]&lt;br /&gt;
* [[Files d&#039;attente|La gestion des files d&#039;attente]]&lt;br /&gt;
* [[:category:Types|Les types métiers]]&lt;br /&gt;
{{IfLatest|&lt;br /&gt;
* {{PLatest|Mode d&#039;exécution (script)|Mode d&#039;exécution}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Tests unitaires===&lt;br /&gt;
&lt;br /&gt;
* [[Tests unitaires|Test unitaires]]&lt;br /&gt;
&lt;br /&gt;
===Support de fonctions métiers===&lt;br /&gt;
&lt;br /&gt;
* [[TdbfCurrency (class)|Devises]]&lt;br /&gt;
* [[TdbfCounter (class)|Compteurs]]&lt;br /&gt;
* [[TdbfUnit (class)|Unités]]&lt;br /&gt;
* [[Documents (dsm)|Documents]]&lt;br /&gt;
* [[Boites à messages (dsm)|Boîtes à Messages]]&lt;br /&gt;
* [[:category:Classes frameworks|Les classes du framework]]&lt;br /&gt;
&lt;br /&gt;
===Librairie d&#039;exécution===&lt;br /&gt;
&lt;br /&gt;
* [[:category:RTL Chaîne|Fonctions de chaînes de caractère]]&lt;br /&gt;
* [[:category:RTL Date et heure|Fonctions de dates et heures]]&lt;br /&gt;
* [[:category:RTL Conversion|Fonctions de conversion]]&lt;br /&gt;
* [[:category:RTL Variant|Fonctions variants]]&lt;br /&gt;
* [[:category:RTL Système|Fonctions systèmes]]&lt;br /&gt;
* [[:category:RTL Application|Fonctions applicatives]]&lt;br /&gt;
* [[:category:RTL Fichiers|Fonctions sur les fichiers]]&lt;br /&gt;
* [[:category:RTL Framework|Fonctions du framework]]&lt;br /&gt;
* [[:category:RTL Mise au point|Fonctions de mise au point]]&lt;br /&gt;
* [[:category:RTL Dialogues|Fonctions de dialogues]]&lt;br /&gt;
* [[:category:RTL Métier|Fonctions métiers]]&lt;br /&gt;
* [[:category:RTL Traduction|Fonctions de traduction]]&lt;br /&gt;
* [[:category:RTL Automate|Fonctions de l&#039;automate]]&lt;br /&gt;
* [[:category:RTL Contrôles|Fonctions des contrôles]]&lt;br /&gt;
&lt;br /&gt;
===Administration===&lt;br /&gt;
&lt;br /&gt;
* [[Gestion des certificats (dsm)|Gestion des certificats]]&lt;br /&gt;
&lt;br /&gt;
===Architecture métier===&lt;br /&gt;
&lt;br /&gt;
* [[Architecture multi-sociétés (partage)|Multi-sociétés et partage]]&lt;br /&gt;
&lt;br /&gt;
[[category:DSM]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=OnChangeEventId_(class)&amp;diff=14738</id>
		<title>OnChangeEventId (class)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=OnChangeEventId_(class)&amp;diff=14738"/>
		<updated>2024-12-05T10:23:12Z</updated>

		<summary type="html">&lt;p&gt;Syfre : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version1100}}&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;class function OnChangeEventID(const iProperty:string; const iOldValue:variant; const iNewValue:variant):string;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Retire l&#039;identifiant de l&#039;évènement de modification d&#039;un attribut d&#039;un objet de cette classe.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|iProperty&lt;br /&gt;
|Nom de l&#039;attribut&lt;br /&gt;
|-&lt;br /&gt;
|oldValue&lt;br /&gt;
|Ancienne valeur de l&#039;attribut&lt;br /&gt;
|-&lt;br /&gt;
|newValue&lt;br /&gt;
|Nouvelle valeur de l&#039;attribut&lt;br /&gt;
|-&lt;br /&gt;
|Return&lt;br /&gt;
|L&#039;identifiant de l&#039;évènement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{tip|La valeur NULL peut être utilisée pour indiquer &amp;quot;toute valeur&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//function TTestTask.doExecute(obj:TitObject):boolean;&lt;br /&gt;
begin&lt;br /&gt;
  if obj is WFClasseA then&lt;br /&gt;
   begin&lt;br /&gt;
     //.... do something&lt;br /&gt;
     Result := True;&lt;br /&gt;
   end&lt;br /&gt;
   else Result := False;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
//function TTestTask.Execute:boolean;&lt;br /&gt;
var aMsg:TdbmQueueMessage; &lt;br /&gt;
begin&lt;br /&gt;
  Result := False; &lt;br /&gt;
  aMsg := ReceivedMsg as TdbmQueueMessage;&lt;br /&gt;
  if Assigned(aMsg) then&lt;br /&gt;
   begin&lt;br /&gt;
     if Assigned(SourceObject) then&lt;br /&gt;
      begin&lt;br /&gt;
        Result := doExecute(SourceObject);                  &lt;br /&gt;
       end; &lt;br /&gt;
   end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
//Procedure TestRegisterTasks;&lt;br /&gt;
begin&lt;br /&gt;
  WFClasseA.RegisterOnChangeEvent(&#039;unEtat&#039;);&lt;br /&gt;
  TTestTask.Subscribe(WFClasseA.OnChangeEventId(&#039;unEtat&#039;,NULL {NULL means any value} ,WFCAState_Etat2),[&#039;unCode&#039;,&#039;unEntier&#039;],[&#039;X&#039;,2]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voir aussi :&lt;br /&gt;
&lt;br /&gt;
* [[RegisterOnChangeEvent (class)|RegisterOnChangeEvent]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Footer|Classes métiers (tech)}}&lt;br /&gt;
[[category:Classes métiers]]&lt;br /&gt;
[[Category:Version1100]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=Classe_t%C3%A2che_(stereotype)&amp;diff=14737</id>
		<title>Classe tâche (stereotype)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=Classe_t%C3%A2che_(stereotype)&amp;diff=14737"/>
		<updated>2024-12-05T10:15:02Z</updated>

		<summary type="html">&lt;p&gt;Syfre : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Version900}}&lt;br /&gt;
&lt;br /&gt;
Les classes tâche sont des classes non persistantes dont la méthode Execute peut être exécutée comme une tâche.&lt;br /&gt;
&lt;br /&gt;
Une classe tâche :&lt;br /&gt;
* Peut être utiliser comme une classe non persistante ordinaire.&lt;br /&gt;
* Peut être utiliser dans le gestionnaire de tâche.&lt;br /&gt;
* Peut être exécutée par la consommation d&#039;un message de file d&#039;attente.&lt;br /&gt;
&lt;br /&gt;
Lorsque la gestion des tâches est configurée pour le dossier, une tâche peut :&lt;br /&gt;
* Etre exécutée en asynchrone.&lt;br /&gt;
* Etre déclenchée par un événement.&lt;br /&gt;
* Etre déclenchée par la fin d&#039;une autre tâche.&lt;br /&gt;
* Etre planifiée.&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;une tâche est exécutée dans le cadre d&#039;une file d&#039;attente :&lt;br /&gt;
* L&#039;exécution de la tâche est enregistrée dans le journal des tâches.&lt;br /&gt;
* Un événement d&#039;exécution de tâche est généré.&lt;br /&gt;
&lt;br /&gt;
Sachant qu&#039;une tâche peut être configurée pour être déclenchée par un événement, il est possible d&#039;enchaîner le déclenchement de tâche :&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
&lt;br /&gt;
* Tâche 1 déclenchée par un événement métier.&lt;br /&gt;
* Tache 2 déclenchée par le succès de la tâche 1.&lt;br /&gt;
&lt;br /&gt;
Le passage de paramètre entre tâches est possible en ajoutant ces paramètres au message déclencheur de la tâche (Voir l&#039;exemple dans la méthode [[Executee (TitTask)|Execute]]).&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;exemple précédent la suite d&#039;événement est la suivante :&lt;br /&gt;
&lt;br /&gt;
* Evénement métier.&lt;br /&gt;
* Exécution de tâche 1.&lt;br /&gt;
* Evénement métier, fin d&#039;exécution de tâche 1.&lt;br /&gt;
* Exécution de tâche 2.&lt;br /&gt;
* Evénement métier, fin d&#039;exécution de tâche 2.&lt;br /&gt;
&lt;br /&gt;
===Attributs du stéréotype===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[ResultAsync (TitTask)|ResultAsync]]&lt;br /&gt;
|Indique si l&#039;exécution a été asynchrone.&lt;br /&gt;
|-&lt;br /&gt;
|[[ResultBool (TitTask)|ResultBool]]&lt;br /&gt;
|Code de retour &lt;br /&gt;
|-&lt;br /&gt;
|[[ResultCode (TitTask)|ResultCode]]&lt;br /&gt;
|Code de retour &lt;br /&gt;
|-&lt;br /&gt;
|[[ResultReason (TitTask)|ResultReason]]&lt;br /&gt;
|Raison d&#039;échec &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Méthode du stéréotype===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[CreateTaskMessage (TitTask)|CreateTaskMessage]]&lt;br /&gt;
|Retourne un message correspondant à la sérialisation de cette tâche&lt;br /&gt;
|-&lt;br /&gt;
|[[ExecuteTask (TitTask)|ExecuteTask]]&lt;br /&gt;
|Exécute la tâche en asynchrone &lt;br /&gt;
|-&lt;br /&gt;
|[[ExecuteOnEvent (TitTask)|ExecuteOnEvent]]&lt;br /&gt;
|Exécute la tâche sur un évènement (une fois)&lt;br /&gt;
|-&lt;br /&gt;
|[[SubscribeToEvent (TitTask)|SubscribeToEvent]]&lt;br /&gt;
|Abonne la tâche à un évènement&lt;br /&gt;
|-&lt;br /&gt;
|[[UnSubscribeFromEvent (TitTask)|UnSubscribeFromEvent]]&lt;br /&gt;
|Dèsabonne la tâche d&#039;un évènement&lt;br /&gt;
|-&lt;br /&gt;
|[[Schedule (TitTask)|Schedule]]&lt;br /&gt;
|Planifie la tâche&lt;br /&gt;
|-&lt;br /&gt;
|[[UnSchedule (TitTask)|UnSchedule]]&lt;br /&gt;
|Supprime la planification de la tâche&lt;br /&gt;
|-&lt;br /&gt;
|[[GetMessages (TitTask)|GetMessages]]&lt;br /&gt;
|Récupère la liste des messages de la tâche&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Méthode de classe du stéréotype===&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[OnTerminateID (TitTask)|OnTerminateID]]&lt;br /&gt;
|Retourne l&#039;identifiant de fin d&#039;exécution de la tâche&lt;br /&gt;
|-&lt;br /&gt;
|[[OnTerminateSuccessID (TitTask)|OnTerminateSuccessID]]&lt;br /&gt;
|Retourne l&#039;identifiant de fin d&#039;exécution avec succès de la tâche&lt;br /&gt;
|-&lt;br /&gt;
|[[OnTerminateFailedID (TitTask)|OnTerminateFailedID]]&lt;br /&gt;
|Retourne l&#039;identifiant de fin d&#039;exécution avec échec de la tâche&lt;br /&gt;
|-&lt;br /&gt;
|[[OnStartID (TitTask)|OnStartID]]&lt;br /&gt;
|Retourne l&#039;identifiant de début d&#039;exécution de la tâche&lt;br /&gt;
|-&lt;br /&gt;
|[[TTask.Subscribe (TitTask)|Subscribe]]&lt;br /&gt;
|Souscrit à un évènement {{Version1100}}&lt;br /&gt;
|-&lt;br /&gt;
|[[TTask.Schedule (TitTask)|Schedule]]&lt;br /&gt;
|Planifie la tâche {{Version1100}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Méthode d&#039;interface===&lt;br /&gt;
Une classe de type Tâche peut/doit supporter les méthodes suivantes :&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom &lt;br /&gt;
!Fac/Obl&lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|[[Executee (TitTask)|Execute]]&lt;br /&gt;
|Obligatoire&lt;br /&gt;
|Exécute la tâche&lt;br /&gt;
|-&lt;br /&gt;
|[[OnTerminate (TitTask)|OnTerminate]]&lt;br /&gt;
|Facultative&lt;br /&gt;
|Méthode executée sur la fin de la tâche&lt;br /&gt;
|-&lt;br /&gt;
|[[OnSuccess (TitTask)|OnSuccess]]&lt;br /&gt;
|Facultative&lt;br /&gt;
|Méthode executée sur succès&lt;br /&gt;
|-&lt;br /&gt;
|[[OnFailure (TitTask)|OnFailure]]&lt;br /&gt;
|Facultative&lt;br /&gt;
|Méthode executée sur échec&lt;br /&gt;
|-&lt;br /&gt;
|[[TaskID (TitTask)|TaskID]]&lt;br /&gt;
|Facultative&lt;br /&gt;
|Retourne un identifiant unique pour cette tâche.&lt;br /&gt;
|-&lt;br /&gt;
|[[TaskName (TitTask)|TaskName]]&lt;br /&gt;
|Facultative&lt;br /&gt;
|Retourne le nom de la tâche dans le journal.&lt;br /&gt;
|-&lt;br /&gt;
|[[TaskInfos (TitTask)|TaskInfos]]&lt;br /&gt;
|Facultative&lt;br /&gt;
|Retourne les informations de la tâche dans le journal.&lt;br /&gt;
|-&lt;br /&gt;
|[[TaskTitle (TitTask)|TaskTitle]]&lt;br /&gt;
|Facultative&lt;br /&gt;
|Retourne le titre de la tâche dans le journal.&lt;br /&gt;
|-&lt;br /&gt;
|[[TaskReference (TitTask)|TaskReference]]&lt;br /&gt;
|Facultative&lt;br /&gt;
|Retourne la référence de la tâche dans le journal.&lt;br /&gt;
|-&lt;br /&gt;
|[[EventNotification (TitTask)|EventNotification]]&lt;br /&gt;
|Facultative&lt;br /&gt;
|Créer un évènement de notification sur terminaison de la tâche&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces interfaces permettent de configurer la tâche :&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nom &lt;br /&gt;
!Usage&lt;br /&gt;
|-&lt;br /&gt;
|[[IsTaskConfigurable (TitTask)|IsTaskConfigurable]]&lt;br /&gt;
|Retourne True si la tâche est configurable&lt;br /&gt;
|-&lt;br /&gt;
|[[TaskFormConfiguration (TitTask)|TaskFormConfiguration]]&lt;br /&gt;
|Retourne le nom de l&#039;écran de configuration de la tâche&lt;br /&gt;
|-&lt;br /&gt;
|[[isTaskConfigured (TitTask)|isTaskConfigured]]&lt;br /&gt;
|Indique si la configuration de la tâche est complète&lt;br /&gt;
|-&lt;br /&gt;
|[[TaskCategory (TitTask)|TaskCategory]]&lt;br /&gt;
|Retourne le nom de la catégorie de la tâche&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
Voir aussi :&lt;br /&gt;
&lt;br /&gt;
* [[TdbmQueueMessage|Message de file d&#039;attente]]&lt;br /&gt;
* [[TdbmMessageTaskLog (class)|Journal d&#039;exécution des tâches]]&lt;br /&gt;
* [[Création d&#039;une tâche configurable (Task)|Création d&#039;une tâche configurable]]&lt;br /&gt;
* [[Création d&#039;un callback de tâche (task)|Création d&#039;un callback de tâche]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Stereotype]]&lt;br /&gt;
[[Category:Stéréotype tâche]]&lt;br /&gt;
[[Category:File d&#039;attente]]&lt;br /&gt;
[[Category:Version900]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=TTask.Schedule_(TitTask)&amp;diff=14736</id>
		<title>TTask.Schedule (TitTask)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=TTask.Schedule_(TitTask)&amp;diff=14736"/>
		<updated>2024-12-05T10:13:15Z</updated>

		<summary type="html">&lt;p&gt;Syfre : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version1100}}&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;class function Scheduler(const iPlanification:string; iAttributes:Array of string; iValues:Array of variant):boolean;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction planifie une tâche.&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;
|iPlanification&lt;br /&gt;
|Chaîne de définition de la planification&lt;br /&gt;
|-&lt;br /&gt;
|iAttributes&lt;br /&gt;
|Un tableau de propriété de la tâche qui seront initialisée lorsque la tâche sera déclenchée&lt;br /&gt;
|-&lt;br /&gt;
|iValues&lt;br /&gt;
|Un tableau de valeur correspondant aux attributs initialisés&lt;br /&gt;
|-&lt;br /&gt;
|Result&lt;br /&gt;
|True si la tâche a été posté&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Tip|Cette fonction nécessite que la gestion des tâches soit configurée}}&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
//Procedure TestRegisterTasks;&lt;br /&gt;
begin&lt;br /&gt;
  MyTask.Schedule(&#039;&amp;lt;planification RepeatValue=&amp;quot;Minutes&amp;quot; RepeatInterval=&amp;quot;1&amp;quot; StartOfPeriodDate=&amp;quot;20221203T00&amp;quot;/&amp;gt;&#039;,[&#039;unCode&#039;,&#039;unEntier&#039;],[&#039;Z&#039;,0]); &lt;br /&gt;
end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voir aussi:&lt;br /&gt;
&lt;br /&gt;
{{Footer|Classe_tâche_(stereotype)}}&lt;br /&gt;
[[Category:Stéréotype tâche]]&lt;br /&gt;
[[Category:Version1100]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=CreateTaskEvent_(TdbmEvent)&amp;diff=14735</id>
		<title>CreateTaskEvent (TdbmEvent)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=CreateTaskEvent_(TdbmEvent)&amp;diff=14735"/>
		<updated>2024-12-05T10:12:05Z</updated>

		<summary type="html">&lt;p&gt;Syfre : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&#039;delphi&#039;&amp;gt;class procedure CreateTaskEvent(const iEventId:string; iNames:Array of variant; iValues:Array of variant);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette méthode de classe crée un événement de type tâche. &lt;br /&gt;
&lt;br /&gt;
Le type de l&#039;événement est TASK&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|iEventId&lt;br /&gt;
|identifiant de l&#039;événement&lt;br /&gt;
|-&lt;br /&gt;
|iNames&lt;br /&gt;
|Tableau de noms de paramètre de l&#039;évènement&lt;br /&gt;
|-&lt;br /&gt;
|iValues&lt;br /&gt;
|Tableau de valeurs de paramètre de l&#039;évènement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Task to be triggered by an event&lt;br /&gt;
Type&lt;br /&gt;
  TMyOperationEvent = class(TitTask)&lt;br /&gt;
    function Execute():Integer;&lt;br /&gt;
    class function RegisterThisTask;&lt;br /&gt;
    class procedure Start;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
function TMyOperationEvent.Execute():Integer;&lt;br /&gt;
var idx:Integer; S:string; aMsg:TdbmQueueMessage;&lt;br /&gt;
begin&lt;br /&gt;
  Result := True;&lt;br /&gt;
&lt;br /&gt;
  // Add messages to the log&lt;br /&gt;
  ProgressMessage(&#039;On Task event&#039;);&lt;br /&gt;
 &lt;br /&gt;
  if Assigned(UserContext.TaskContext) and Assigned(userContext.TaskContext.EventContext) then&lt;br /&gt;
   begin&lt;br /&gt;
     userContext.TaskContext.AddMessage(&#039;Task context&#039;);&lt;br /&gt;
     //&lt;br /&gt;
     aMsg := userContext.TaskContext.EventContext.ReceivedMsg;&lt;br /&gt;
     if Assigned(aMsg) then&lt;br /&gt;
      begin&lt;br /&gt;
        // get message parameters&lt;br /&gt;
        //&lt;br /&gt;
        userContext.TaskContext.AddMessage(&#039;Task context has message&#039;);&lt;br /&gt;
        userContext.TaskContext.AddMessage(Format(&#039;Message parameter count:%d&#039;,[aMsg.Count]));&lt;br /&gt;
        for idx:=0 to aMsg.Count-1 do&lt;br /&gt;
         begin&lt;br /&gt;
           S := aMsg.DisplayStrings(idx);&lt;br /&gt;
           UserContext.TaskContext.AddMessage(S);&lt;br /&gt;
         end;&lt;br /&gt;
      end;&lt;br /&gt;
   end&lt;br /&gt;
   else ProgressMessage(&#039;no task context&#039;);&lt;br /&gt;
 &lt;br /&gt;
  Result := True;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
class function TMyOperation.RegisterThisTask;&lt;br /&gt;
var aReason:string;&lt;br /&gt;
begin&lt;br /&gt;
  if not SubscribeToEvent(TMyOperation.OnStartId(),aReason) then&lt;br /&gt;
   showMessage(&#039;subscribe failed &#039;+aReason); &lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
class procedure TMyOperation.Start;&lt;br /&gt;
begin&lt;br /&gt;
  TdbmEvent.CreateTaskEvent(TMyOperation.OnStartId(), [&#039;name1&#039;,&#039;name2&#039;],[&#039;value1&#039;,2]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voir aussi :&lt;br /&gt;
&lt;br /&gt;
* [[CreateCustomEvent (TdbmEvent)|CreateCustomEvent]]&lt;br /&gt;
* [[TTask.Subscribe_(TitTask)|Subscribe]]&lt;br /&gt;
&lt;br /&gt;
[[Category:TdbmEvent]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=TTask.Subscribe_(TitTask)&amp;diff=14734</id>
		<title>TTask.Subscribe (TitTask)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=TTask.Subscribe_(TitTask)&amp;diff=14734"/>
		<updated>2024-12-05T10:11:18Z</updated>

		<summary type="html">&lt;p&gt;Syfre : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{version1100}}&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;class function Subscribe(const iEventID:string; iAttributes:Array of string; iValues:Array of variant):boolean;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction abonne la classe de la tâche à un évènement.&lt;br /&gt;
&lt;br /&gt;
La tâche sera exécutée à chaque fois que l&#039;évènement est déclenché jusqu&#039;au désabonnement de la tâche.&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;
|iEventID&lt;br /&gt;
|Identifiant de l&#039;évènement sur lequel abonner la tâche&lt;br /&gt;
|-&lt;br /&gt;
|iAttributes&lt;br /&gt;
|Un tableau de propriété de la tâche qui seront initialisée lorsque la tâche sera déclenchée&lt;br /&gt;
|-&lt;br /&gt;
|iValues&lt;br /&gt;
|Un tableau de valeur correspondant aux attributs initialisés&lt;br /&gt;
|-&lt;br /&gt;
|Result&lt;br /&gt;
|True si la tâche a été posté&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Tip|Un seul abonnement est possible par couple EventID, SourceID.}}&lt;br /&gt;
{{Tip|Cette fonction nécessite que la gestion des tâches soit configurée}}&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  // manage my job&lt;br /&gt;
  MyFacade = class(TitObject)&lt;br /&gt;
   class function GetMyJobActionEventId:string;&lt;br /&gt;
   class procedure CreateEvent(const iEvent:string; obj:TitObject);&lt;br /&gt;
   class procedure CreateEventWithParams(const iEvent:string; obj:TitObject; aParamsName:Array of string; aParamsValue:Array of variant);&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
class function MyFacade.GetMyJobActionEventId:string;&lt;br /&gt;
begin&lt;br /&gt;
  Result := &#039;task.myjob.myaction.%&#039;;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
class procedure MyFacade.CreateEvent(const iEvent:string; obj:TitObject);&lt;br /&gt;
begin&lt;br /&gt;
  MyFacade.CreateEventWithParams(iEvent, obj, [], []);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
class procedure MyFacade.CreateEventWithParams(const iEvent:string; obj:TitObject; aParamsName:Array of string; aParamsValue:Array of variant);&lt;br /&gt;
var&lt;br /&gt;
  aEvent:string;&lt;br /&gt;
  vParamsName : Array of string;&lt;br /&gt;
  vParamsValue : Array of variant;&lt;br /&gt;
begin&lt;br /&gt;
  if Copy(iEvent,length(iEvent)-2,2)=&#039;.%&#039;&lt;br /&gt;
   then aEvent := Copy(iEvent,1,length(iEvent)-2)&lt;br /&gt;
   else aEvent := iEvent;&lt;br /&gt;
&lt;br /&gt;
  vParamsName := aParamsName;&lt;br /&gt;
  vParamsValue := aParamsValue;&lt;br /&gt;
  if Assigned(obj)&lt;br /&gt;
   then TdbmEvent.CreateTaskEvent(Format(&#039;%s.%s&#039;,[aEvent,obj.InstanceOID]),vParamsName,vParamsValue)&lt;br /&gt;
   else TdbmEvent.CreateTaskEvent(aEvent,vParamsName,vParamsValue);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
//Procedure TestRegisterTasks;&lt;br /&gt;
begin&lt;br /&gt;
  // Register my task subscription&lt;br /&gt;
  MyTask.Subscribe(MyFacade.GetMyJobActionEventId,[&#039;unCode&#039;,&#039;unEntier&#039;],[&#039;X&#039;,2]);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
//Procedure MyClass.foo();&lt;br /&gt;
begin&lt;br /&gt;
  // generate an event to trigger the task&lt;br /&gt;
  myFacade.CreateEventWidthParams(MyFacade.GetMyJobActionEventId, thisObject, [&#039;unCode&#039;,&#039;unEntier&#039;],[unCode,unEntier]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voir aussi:&lt;br /&gt;
&lt;br /&gt;
* [[CreateTaskEvent_(TdbmEvent)|CreateTaskEvent]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Footer|Classe_tâche_(stereotype)}}&lt;br /&gt;
[[Category:Stéréotype tâche]]&lt;br /&gt;
[[Category:Version1100]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=RegisterOnChangeEvent_(class)&amp;diff=14733</id>
		<title>RegisterOnChangeEvent (class)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=RegisterOnChangeEvent_(class)&amp;diff=14733"/>
		<updated>2024-12-05T09:55:43Z</updated>

		<summary type="html">&lt;p&gt;Syfre : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version1100}}&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;class function RegisterOnChangeEvent(const iProperty:string):string;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enregistre la classe d&#039;évènement de modification d&#039;un attribut de cette classe.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|iProperty&lt;br /&gt;
|L&#039;attribut modifié&lt;br /&gt;
|-&lt;br /&gt;
|Return&lt;br /&gt;
|L&#039;identifiant de l&#039;évènement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemple&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;&lt;br /&gt;
// see onChangeEventId&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voir aussi :&lt;br /&gt;
&lt;br /&gt;
* [[OnChangeEventId_(class)|OnChangeEventId]]&lt;br /&gt;
&lt;br /&gt;
{{Footer|Classes métiers (tech)}}&lt;br /&gt;
[[category:Classes métiers]]&lt;br /&gt;
[[Category:Version1100]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=OnChangeEventId_(class)&amp;diff=14732</id>
		<title>OnChangeEventId (class)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=OnChangeEventId_(class)&amp;diff=14732"/>
		<updated>2024-12-05T09:55:23Z</updated>

		<summary type="html">&lt;p&gt;Syfre : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version1100}}&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;class function OnChangeEventID(const iProperty:string; const iOldValue:variant; const iNewValue:variant):string;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Retire l&#039;identifiant de l&#039;évènement de modification d&#039;un attribut d&#039;un objet de cette classe.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|iProperty&lt;br /&gt;
|Nom de l&#039;attribut&lt;br /&gt;
|-&lt;br /&gt;
|oldValue&lt;br /&gt;
|Ancienne valeur de l&#039;attribut&lt;br /&gt;
|-&lt;br /&gt;
|newValue&lt;br /&gt;
|Nouvelle valeur de l&#039;attribut&lt;br /&gt;
|-&lt;br /&gt;
|Return&lt;br /&gt;
|L&#039;identifiant de l&#039;évènement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{tip|La valeur NULL peut être utilisée pour indiquer &amp;quot;toute valeur&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//function TTestTask.doExecute(obj:TitObject):boolean;&lt;br /&gt;
begin&lt;br /&gt;
  if obj is WFClasseA then&lt;br /&gt;
   begin&lt;br /&gt;
     //.... do something&lt;br /&gt;
     Result := True;&lt;br /&gt;
   end&lt;br /&gt;
   else Result := False;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
//function TTestTask.Execute:boolean;&lt;br /&gt;
var aMsg:TdbmQueueMessage; &lt;br /&gt;
begin&lt;br /&gt;
  Result := False; &lt;br /&gt;
  aMsg := ReceivedMsg as TdbmQueueMessage;&lt;br /&gt;
  if Assigned(aMsg) then&lt;br /&gt;
   begin&lt;br /&gt;
     if Assigned(SourceObject) then&lt;br /&gt;
      begin&lt;br /&gt;
        Result := doExecute(SourceObject);                  &lt;br /&gt;
       end; &lt;br /&gt;
   end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
//Procedure TestRegisterTasks;&lt;br /&gt;
begin&lt;br /&gt;
  WFClasseA.RegisterOnChangeEvent(&#039;unEtat&#039;);&lt;br /&gt;
  TTestTask.Subscribe(WFClasseA.OnChangeEventId(&#039;unEtat&#039;,NULL,WFCAState_Etat2),[&#039;unCode&#039;,&#039;unEntier&#039;],[&#039;X&#039;,2]);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voir aussi :&lt;br /&gt;
&lt;br /&gt;
* [[RegisterOnChangeEvent (class)|RegisterOnChangeEvent]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Footer|Classes métiers (tech)}}&lt;br /&gt;
[[category:Classes métiers]]&lt;br /&gt;
[[Category:Version1100]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=OnDeleteEventId_(class)&amp;diff=14731</id>
		<title>OnDeleteEventId (class)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=OnDeleteEventId_(class)&amp;diff=14731"/>
		<updated>2024-12-05T09:53:42Z</updated>

		<summary type="html">&lt;p&gt;Syfre : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version1100}}&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;class function OnDeleteEventID():string;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Retire l&#039;identifiant de l&#039;évènement de suppression d&#039;un objet de cette classe.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Return&lt;br /&gt;
|L&#039;identifiant de l&#039;évènement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemple&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voir aussi :&lt;br /&gt;
&lt;br /&gt;
* [[RegisterOnDeleteEvent_(class)|RegisterOnDeleteEvent]]&lt;br /&gt;
&lt;br /&gt;
{{Footer|Classes métiers (tech)}}&lt;br /&gt;
[[category:Classes métiers]]&lt;br /&gt;
[[Category:Version1100]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=RegisterOnDeleteEvent_(class)&amp;diff=14730</id>
		<title>RegisterOnDeleteEvent (class)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=RegisterOnDeleteEvent_(class)&amp;diff=14730"/>
		<updated>2024-12-05T09:52:46Z</updated>

		<summary type="html">&lt;p&gt;Syfre : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version1100}}&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;class function RegisterOnDeleteEvent():string;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enregistre la classe d&#039;évènement de suppression de cette classe.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Return&lt;br /&gt;
|L&#039;identifiant de l&#039;évènement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemple&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voir aussi :&lt;br /&gt;
&lt;br /&gt;
* [[OnDeleteEventId_(class)|OnDeleteEventId]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Footer|Classes métiers (tech)}}&lt;br /&gt;
[[category:Classes métiers]]&lt;br /&gt;
[[Category:Version1100]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=RegisterOnCreateEvent_(class)&amp;diff=14729</id>
		<title>RegisterOnCreateEvent (class)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=RegisterOnCreateEvent_(class)&amp;diff=14729"/>
		<updated>2024-12-05T09:51:15Z</updated>

		<summary type="html">&lt;p&gt;Syfre : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version1100}}&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;class function RegisterOnCreateEvent():string;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enregistre la classe d&#039;évènement de création de cette classe.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Return&lt;br /&gt;
|L&#039;identifiant de l&#039;évènement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemple&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;&lt;br /&gt;
// see OnCreateEventId&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voir aussi :&lt;br /&gt;
&lt;br /&gt;
* [[OnCreateEventId_(class)|OnCreateEventId]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Footer|Classes métiers (tech)}}&lt;br /&gt;
[[category:Classes métiers]]&lt;br /&gt;
[[Category:Version1100]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=OnCreateEventId_(class)&amp;diff=14728</id>
		<title>OnCreateEventId (class)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=OnCreateEventId_(class)&amp;diff=14728"/>
		<updated>2024-12-05T09:50:45Z</updated>

		<summary type="html">&lt;p&gt;Syfre : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version1100}}&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;class function OnCreateEventID():string;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Retire l&#039;identifiant de l&#039;évènement de création d&#039;un objet de cette classe.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Return&lt;br /&gt;
|L&#039;identifiant de l&#039;évènement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemple&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  MyClass = class(TdbObject)&lt;br /&gt;
   //...&lt;br /&gt;
   property CanStart:boolean; &lt;br /&gt;
  end;  &lt;br /&gt;
&lt;br /&gt;
  MyTask = class(TitTask)&lt;br /&gt;
    Function Execute():boolean;&lt;br /&gt;
    Function doExecute(obj:TitObject):boolean;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
Function MyTask.Execute():boolean;&lt;br /&gt;
var aMsg:TdbmQueueMessage; &lt;br /&gt;
begin&lt;br /&gt;
  Result := False; &lt;br /&gt;
  aMsg := ReceivedMsg as TdbmQueueMessage;&lt;br /&gt;
  if Assigned(aMsg) then&lt;br /&gt;
   begin&lt;br /&gt;
     if Assigned(SourceObject) then&lt;br /&gt;
      begin&lt;br /&gt;
        Result := doExecute(SourceObject);                  &lt;br /&gt;
       end; &lt;br /&gt;
   end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
Function MyTask.doExecute(obj:TitObject):boolean;&lt;br /&gt;
begin&lt;br /&gt;
  if obj is MyClass then&lt;br /&gt;
   begin&lt;br /&gt;
     if (obj as MyClass).CanStart then &lt;br /&gt;
      begin&lt;br /&gt;
        AddMessage(Format(&#039;object %s ...&#039;,[(obj as MyClass).Caption])); &lt;br /&gt;
        // do something ...  &lt;br /&gt;
      end&lt;br /&gt;
      else&lt;br /&gt;
      begin&lt;br /&gt;
        AddMessage(Format(&#039;objet %s ne peut pas ...&#039;),[(obj as MyClass).Caption])); &lt;br /&gt;
      end; &lt;br /&gt;
     Result := True;&lt;br /&gt;
   end&lt;br /&gt;
   else Result := False; &lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
//procedure RegisterTasks;&lt;br /&gt;
begin&lt;br /&gt;
  MyClass.RegisterOnCreateEvent();&lt;br /&gt;
&lt;br /&gt;
  MyTask.Subscribe(&lt;br /&gt;
    MyClass.OnCreateEventId(),&lt;br /&gt;
    [],[]&lt;br /&gt;
  );&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voir aussi :&lt;br /&gt;
&lt;br /&gt;
* [[RegisterOnCreateEvent_(class)|RegisterOnCreateEvent]]&lt;br /&gt;
* [[OnChangeEventId_(class)|OnChangeEventId]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Footer|Classes métiers (tech)}}&lt;br /&gt;
[[category:Classes métiers]]&lt;br /&gt;
[[Category:Version1100]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=OnCreateEventId_(class)&amp;diff=14727</id>
		<title>OnCreateEventId (class)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=OnCreateEventId_(class)&amp;diff=14727"/>
		<updated>2024-12-05T09:49:27Z</updated>

		<summary type="html">&lt;p&gt;Syfre : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version1100}}&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;class function OnCreateEventID():string;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Retire l&#039;identifiant de l&#039;évènement de création d&#039;un objet de cette classe.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Return&lt;br /&gt;
|L&#039;identifiant de l&#039;évènement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemple&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;&lt;br /&gt;
Type&lt;br /&gt;
  MyClass = class(TdbObject)&lt;br /&gt;
   //...&lt;br /&gt;
   property CanStart:boolean; &lt;br /&gt;
  end;  &lt;br /&gt;
&lt;br /&gt;
  MyTask = class(TitTask)&lt;br /&gt;
    Function Execute():boolean;&lt;br /&gt;
    Function doExecute(obj:TitObject):boolean;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
Function MyTask.Execute():boolean;&lt;br /&gt;
var aMsg:TdbmQueueMessage; &lt;br /&gt;
begin&lt;br /&gt;
  Result := False; &lt;br /&gt;
  aMsg := ReceivedMsg as TdbmQueueMessage;&lt;br /&gt;
  if Assigned(aMsg) then&lt;br /&gt;
   begin&lt;br /&gt;
     if Assigned(SourceObject) then&lt;br /&gt;
      begin&lt;br /&gt;
        Result := doExecute(SourceObject);                  &lt;br /&gt;
       end; &lt;br /&gt;
   end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
Function MyTask.doExecute(obj:TitObject):boolean;&lt;br /&gt;
begin&lt;br /&gt;
  if obj is MyClass then&lt;br /&gt;
   begin&lt;br /&gt;
     if (obj as MyClass).CanStart then &lt;br /&gt;
      begin&lt;br /&gt;
        AddMessage(Format(&#039;object %s ...&#039;,[(obj as MyClass).Caption])); &lt;br /&gt;
        // do something ...  &lt;br /&gt;
      end&lt;br /&gt;
      else&lt;br /&gt;
      begin&lt;br /&gt;
        AddMessage(Format(&#039;objet %s ne peut pas ...&#039;),[(obj as MyClass).Caption])); &lt;br /&gt;
      end; &lt;br /&gt;
     Result := True;&lt;br /&gt;
   end&lt;br /&gt;
   else Result := False; &lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
//procedure RegisterTasks;&lt;br /&gt;
begin&lt;br /&gt;
  MyClass.RegisterOnCreateEvent();&lt;br /&gt;
&lt;br /&gt;
  MyTask.Subscribe(&lt;br /&gt;
    MyClass.OnCreateEventId(),&lt;br /&gt;
    [],[]&lt;br /&gt;
  );&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voir aussi :&lt;br /&gt;
&lt;br /&gt;
* [[OnChangeEventId_(class)|OnChangeEventId]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Footer|Classes métiers (tech)}}&lt;br /&gt;
[[category:Classes métiers]]&lt;br /&gt;
[[Category:Version1100]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
	<entry>
		<id>http://wiki.sage.fr/index.php?title=RegisterOnChangeEvent_(class)&amp;diff=14726</id>
		<title>RegisterOnChangeEvent (class)</title>
		<link rel="alternate" type="text/html" href="http://wiki.sage.fr/index.php?title=RegisterOnChangeEvent_(class)&amp;diff=14726"/>
		<updated>2024-12-05T09:39:18Z</updated>

		<summary type="html">&lt;p&gt;Syfre : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version1100}}&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;class function RegisterOnChangeEvent(const iProperty:string):string;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enregistre la classe d&#039;évènement de modification d&#039;un attribut de cette classe.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|iProperty&lt;br /&gt;
|L&#039;attribut modifié&lt;br /&gt;
|-&lt;br /&gt;
|Return&lt;br /&gt;
|L&#039;identifiant de l&#039;évènement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemple&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;delphi&#039;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voir aussi :&lt;br /&gt;
&lt;br /&gt;
* [[OnChangeEventId_(class)|OnChangeEventId]]&lt;br /&gt;
&lt;br /&gt;
{{Footer|Classes métiers (tech)}}&lt;br /&gt;
[[category:Classes métiers]]&lt;br /&gt;
[[Category:Version1100]]&lt;/div&gt;</summary>
		<author><name>Syfre</name></author>
	</entry>
</feed>