« Version 2025 r2 (release note) » : différence entre les versions

De Wiki1000
Ligne 368 : Ligne 368 :


===ToJson()===
===ToJson()===
<source lang="delphi">procedure ToJson(SA:TJsonArray);</source>


Sérialize tous les objets retournés par le sélecteur au format JSon comptabible avec les tables react
Sérialize tous les objets retournés par le sélecteur au format JSon comptabible avec les tables react
<source lang="delphi">procedure ToJson(SA:TJsonArray);</source>


'''Exemple:'''
'''Exemple:'''
Ligne 391 : Ligne 391 :
end;
end;
</source>
</source>
* Sérialize tous les objets retournés par le sélecteur


===UpdateFrom()===
===UpdateFrom()===

Version du 26 avril 2025 à 09:13

Modèle:Version2025r1

PREVIEW

Langage

  • Paramètre de type classe
Les paramètres de type classe peuvent être passé directement

<source lang="delphi"> Type

 MyClass1 = class
   class procedure foo(rg:TRegClass);
 end;
 MyClass2 = class
   ....
 end;
 MyClass3 = class
   procedure oldbar();
   procedure newbar();
 end;

class procedure MyClass1.foo(rg:TRegClass); begin

 // => MyClass2
 showMessage(rg.aClassName);

end;

procedure MyClass3.oldbar(); var rg:TRegClass; begin

 ModelManager.FindClass('MyClass2');
 myClass1.foo(rg);

end;

procedure MyClass3.newbar(); begin

 myClass1.foo(MyClass2);

end; </source>

Modèle

Classes

  • Méthode AllocOID

<source lang="delphi">class function AllocOID:TOID;</source>

  • Alloue un oid de la classe
Peut être utile dans les tests unitaires
  • Méthode ToJson()

<source lang="delphi">procedure ToJson(SA:variant);</source>

  • Sérialize l'objet en json
SA peut être un TJsonArray ou un TJsonStruct

Classes SQL

  • Options de rôle : NoRefIndex
  • Options de rôle : NoForeignKey

Script

Trace

<source lang="delphi">procedure dbgClear();</source>

Vide la trace

<source lang="delphi">procedure dbgEnable(value:boolean);</source>

Active / désactive la trace

Vue locale

  • Une vue locale peut contenir des attributs "oidXXX" sans définir le rôle

Exemple:

<source lang="delphi"> Type

 vue1 = viewOf(ClassA)
  p1:TEnum(enumName) = ...;
  oidRef:TOID = oidrefB;
  ..
  idRefB:TOID = oidrefB notInSelect;
  [ (idRefB=%ArgRefB) and ....]
 end;

</source>

  • Une vue locale peut contenir des attributs non mappés dans la définition.

Exemple:

<source lang="delphi"> Type

 vue1 = viewOf(ClassA)
   ACount:Integer = count(oid)
   oidRef:TOID;
   codeRef:string;
   libelleRef:string;
  ..
  [  ...]
 end;

var sel:TSelector; begin

 sel := vue1.createSelector();
 case iGroupBy of
  'refB':
    begin
      sel.AddColumn('oidrefB','oidRef'); 
      sel.AddColumn('refB.code','codeRef'); 
      sel.AddColumn('refB.Caption','libelleRef'); 
    end;
  'refC':
    begin
      sel.AddColumn('oidrefC','oidRef'); 
      sel.AddColumn('refC.code','codeRef'); 
      sel.AddColumn('refC.Caption','libelleRef'); 
    end;
 end; 

end; </source>

  • Paramètre de type de donnée

<source lang="delphi"> Type

 vue1 = viewOf(ClassA)
  p1:TEnum(enumName) = ...;
 end;

</source>

  • Qualifier d'attribut NotInGroupBy

<source lang="delphi"> Type

 vue1 = viewOf(ClassA)
  p1:string = expression('...') notInGroupBy;
 end;

</source>

  • Héritage de vue locale

<source lang="delphi"> Type

 vue1 = viewOf(ClassA)
  p1:string = ...;
  [...]
 end;
 vue2 = viewOf(vue1)
  p1:string = ...;
  [inherited and (...)]
 end;

</source>

Exemple:

<source lang="delphi"> //function GetSelector(iGroupBy:string; iFilter:TJsonArray):TSelector; Type

 // défini une classe de base avec tous les filtres
 //
 vueEcritureLettrage = viewOf(TEcriture)
   lettrable:boolean = compteGeneral.lettrable notInSelect; 
   idEtablissement:TOID = piece.oidEtablissement notInSelect; 
   idCompteGeneral:TOID = oidCompteGeneral notInSelect; 
   idRoleTiers:TOID = oidroleTiers notInSelect; 
   [(lettrable=true) 
     and ((oidLettrageEcriture=) or (dateLettrage=0)) 
     and (typeEcriture<>0)
     and (piece.lot.origineLot<>0)
     and (eDate>=%ArgDateInf) 
     and (eDate<=%ArgDateSup) 
     and (idEtablissement=%ArgEtablissement) 
     and (idCompteGeneral=%ArgCompteGeneral)
     and (idRoleTiers=%ArgRoleTiers)
   ] 
 end;
 // Hérite de tous les filtres
 //
 vueEcritureLettrageGroupBy = viewOf(vueEcritureLettrage)
   dateMin:TDatetime = min(eDate);
   dateMax:TDatetime = max(eDate); 
   ACount:Integer = count(oid); 
   credit:Currency = sum('credit:TCValue'); 
   debit:Currency = sum('debit:TCValue'); 
   solde:Currency = sumDiff(debit,credit); 
   [inherited] 
 end; 

begin

 Result := vueLettrageGroupBy.CreateSelector(,,True,[]);

end; </source>

  • Scope de vue locale

Une vue locale peut être référencée en dehors de la méthode où elle est définie.

<source lang="delphi"> procedure Class1.foo; Type

 vue1 = viewOf(ClassA)
  p1:string = ...;
 end;

begin

 ...

end;

procedure Class2.bar; Type

 vue2 = viewOf(class1.foo.vue1)
  p1:string = ...;
 end;

begin

 ...

end; </source>

  • Expression Exists()

Une expression existe peut être utilisée dans les filtres comme une valeur logique

Note : Une expression Exists() est beaucoup plus rapide qu'un "Count<>0"

<source lang="delphi"> Type

 vue1 = viewOf(ClassA)
  id:string = ...;
 end;
 vue2 = viewOf(ClassB)
  id:string = ...;
  bb:boolean = vue1.Exists('(id=self.id)',True,[]) notInSelect;
  [(bb=true) and (....)]
 end;

</source>

  • Expression de Sous requête

Une expression peut être définie par une sous requête

<source lang="delphi"> Type

 VueTauxADate = ViewOf(TTauxADate)
   idTVA : TOid = oidTVA;
   tDate : Date = tDate;
   taux : float = taux; 
 end;
 vueMontantTVA = viewOf(TEcriture)
   dateEcriture:TDatetime=eDate notInSelect;
   oidTVA:TOID = ProfilTVA.oidTVA notInSelect; 
   oidPiece:TOID = oidPiece; 
   montantTVAReel:Currency = vueTauxADate.select('taux * self.montant_TCValue /100','(tDate<=self.dateEcriture)and(idTVA=self.oidTVA)',,True,[]); 
   montantTVAReel_CodeDevise:string = montantTVAReel:CodeDevise; 
 end; 

</source>

Sélecteur

  • lastOpeStamp, lastOpeAffected, lastOpeFirstOID
Attributs mis à jour par la dernière opération assembliste.
  • operationId, operation
Permet d'enregistrer les opérations dans la table TdbfLogOpe
S'applique à CopyTo()
  • RmvParameter()
Permet de retirer un paramètre qui a été ajouté par AddParameter()
  • Amélioration de CopyTo
Permet de créer des objets à partir d'un sélecteur
  • CopyTo, Update, UpdateFrom
Fonctionne sur les classes de stéréotype SQL

TdbfLogOpe

Classe SQL définie par le framework et permettant d'enregistrer les opérations du sélecteur

<source lang="delphi">

 TdbfLogOpe = Class(TsqlObject)
 public
   property action: StringS[128];
   property id: SQLIdentity;
   property oidSourceObject: TOID;
   property oidTargetObject: TOID;
   property opeId: StringS[128];
   property operation: StringS[128];
   property SourceObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;
   property TargetObject: Ref(roGeneric,roNotExternal,roNoForeignKey,roNoRoleIndex) of TitObject;
 end;

</source>

  • opeId, operationId
Un identifiant unique (guid) identifiant l'ensemble des opérations
  • opération
Nom de l'opération dans l'ensemble des opérations
  • action
Action de l'opération
Par exemple INSERT pour un CopyTo
  • oidSourceObject
identifiant de l'objet source dans l'opération
Par exemple l'objet source de la copie pour un CopyTo
  • oidTargetObject
identifiant de l'objet cible dans l'opération
Par exemple l'objet copié par un CopyTo

Exemple d'utilisation:

<source lang="delphi">

// Créer des écritures a partir des réglements
//
procedure  _doCreateEcritureReglements(iOidPiece:string; iOpeId:string);
var sel:TSelector; 
begin
  sel := vueEcritureReglement.CreateSelector('(oidBordereau=%1)',,True,[oidBordereauReglement]); 
  sel.AddParameter('ArgBordereau',oidBordereauReglement); 
  sel.Operation := 'EcrReg'; 
  sel.OpeId := iOpeId; 
  // 
  sel.CopyTo('TEcriture',['oidpiece','eDate','sens','sensProrata','regimeTVA','typeEcriture'],[
   iOidPiece,
   BordereauReglement.dateReglement, 
   sens_credit,
   sens_credit, 
   regimeTVA_Encaissements,
   typeEcriture_Brouillard 
  ]); 
end;


Type

 vueUpdateReglement = viewOf(TReglement)
  vl:TdbfLogOpe = join('(opeId=%ArgOpeId) and (operation=%ArgOperation) and (oidSourceObject=self.oid)'); 
  oidEcriture:TOID = oidEcriture; 
  oidTargetEcriture:TOID = vl.oidTargetObject; 
  oidBordereau:TOID = oidBordereauReglement; 
 end; 
// Met à jour l'oidEcriture créée sur les réglements correspondants
..
procedure _doUpdateReglementEcriture(iOidPiece:string; iOpeId:string);
var sel:TSelector; 
begin
  sel := vueUpdateReglement.CreateSelector('(oidBordereau=%1)',,True,[oidBordereauReglement]); 
  sel.AddParameter('ArgOpeId',iOpeId); 
  sel.AddParameter('ArgOperation','EcrReg'); 
  //
  sel.Update(['oidEcriture'],['oidTargetEcriture']); 
end; 

</source>

ToJson()

<source lang="delphi">procedure ToJson(SA:TJsonArray);</source>

Sérialize tous les objets retournés par le sélecteur au format JSon comptabible avec les tables react

Exemple:

<source lang="delphi">

//procedure GetData(SRows:TJsonArray); Type

 myView = viewOf(...)
  ...
 end; 

var sel:TSelector; begin

 // Selector to retreive the data
 // 
 sel := myView.CreateSelector(,,True,[]);
 sel.ToJson(SRows); 

end; </source>

UpdateFrom()

<source lang="delphi"> function updateFrom(sel:TSelector; iMatchedProps:Array of string; iUpdatedProps:Array of string; iUpdatedValue:Array of variant):Integer; </source>

Permet de mettre à jour une classe à partir d'un sélecteur et d'une colonne de correspondance.

Exemple :

<source lang="delphi"> Type

 // Update the temp table 
 vueTemp = viewOf(TempLettrage)
   reference1:string = reference1;
   reference2:string = reference2;
   modeLettrage:Integer = modeLettrage; 
 end;
  
 vueRef1 = viewOf(TempLettrage)
   //ACount:Integer = count(id);
   ATotal:Currency = sumSign(montant:TCValue,sens,'1');
   reference1:string = reference1; 
   [(modeLettrage=0) and (reference1<>)] 
 end; 

var selT,selG:TSelector; begin

 withP long transaction do
   begin
    // for updating the temp table on "match" 
    selT := vueTemp.CreateSelector(,,True,[]);
    // Lettrage sur reference 1 
    selG := vueRef1.CreateSelector('(ATotal=0)',,True,[]);
    selG.useCTE := True; 
    selT.UpdateFrom(selG,['reference1'],['modeLettrage'],[1]); 
   end;

end; </source>

with CTE as (
select sum(case when t0.sens=1 then ISNULL(t0.montant_TCValue, 0) else -ISNULL(t0.montant_TCValue, 0) end)  as "ATotal",t0.reference1  as "reference1"
from dbo.TEMPLETTRAGE t0 WITH (NOLOCK)
where ((t0.modeLettrage = 0) and (t0.reference1 IS NOT NULL))
group by t0.reference1
)
merge into dbo.TEMPLETTRAGE tm0 using (
SELECT  *
FROM CTE
Where (ATotal = 0.0000)
) tm1 on (tm1.reference1=tm0.reference1)
when matched then update set
tm0.modeLettrage = 1
;