« Version 2025 r2 (release note) » : différence entre les versions
| Ligne 11 : | Ligne 11 : | ||
<source lang="delphi">class function AllocOID:TOID;</source> | <source lang="delphi">class function AllocOID:TOID;</source> | ||
* Alloue un oid de la classe | |||
: Peut être utile dans les tests unitaires | |||
* Méthode ToJson() | * Méthode ToJson() | ||
| Ligne 17 : | Ligne 19 : | ||
* Sérialize l'objet en json | * Sérialize l'objet en json | ||
:SA peut être un TJsonArray ou un TJsonStruct | : SA peut être un TJsonArray ou un TJsonStruct | ||
===Classes SQL=== | ===Classes SQL=== | ||
Version du 16 avril 2025 à 15:36
PREVIEW
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>
Sélecteur
- lastOpeStamp, lastAffectedStamp
- Attributs mis à jour par la dernière opération assembliste.
- 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
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 ;