« Vue locale (langage) » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
| Ligne 404 : | Ligne 404 : | ||
!Opération | !Opération | ||
|- | |- | ||
|Money | |source:Money | ||
|Money | |vue:Money = sum(source) | ||
|sum(Value) group by CodeDevise | |sum(Value) group by CodeDevise | ||
|- | |- | ||
|MoneyDT | |source:MoneyDT | ||
|Money | |vue:Money = sum(source) | ||
|sum(Value) group by CodeDevise | |sum(Value) group by CodeDevise | ||
|- | |- | ||
|Money | |source:Money | ||
|MoneyDT | |vue:MoneyDT = sum(source) | ||
|** ERREUR ** | |** ERREUR ** | ||
|- | |- | ||
|MoneyDT | |source:MoneyDT | ||
|MoneyDT | |vue:MoneyDT = sum(source) | ||
|sum(Value) group by CodeDevise,Date,RPConv,RPValue,TCConv,TCValue | |sum(Value) group by CodeDevise,Date,RPConv,RPValue,TCConv,TCValue | ||
|- | |- | ||
|Money | |source:Money | ||
|Currency | |vue:Currency = sum(source) | ||
|sum (Value) | |sum (Value) | ||
|- | |- | ||
|MoneyDT | |source:MoneyDT | ||
|Currency | |vue:Currency = sum(source) | ||
|sum (Value) | |sum (Value) | ||
|- | |- | ||
|MoneyDT | |source:MoneyDT | ||
|Currency( | |vue:Currency = sum(source:TCValue) | ||
|sum (TCValue) | |sum (TCValue) | ||
|- | |- | ||
|MoneyDT | |source:MoneyDT | ||
|Currency( | |vue:Currency = sum(source:RPValue) | ||
|sum (RPValue) | |sum (RPValue) | ||
|- | |- | ||
|Currency | |source:Currency | ||
|Currency | |vue:Currency = sum(source) | ||
|sum (Value) | |sum (Value) | ||
|} | |} | ||
Version du 12 mai 2016 à 09:42
{{#images:version650-32x32.png|stock}}
Les vues locales sont des type de données vues déclarées localement à l'intérieur d'une opération.
Par exemple le code suivant déclare une vue MyView et effectue une recherche sur cette vue :
<source lang="delphi"> function foo(const S:string):Integer; Type
MyView = viewof(ClassA) unCode:string = unCodeA; unEntier:Integer = refB.unEntierB; end;
var inst:MyView; begin
inst := MyView.Find('unCode=%1',,true,['B1']);
if Assigned(inst) then
begin
...
end;
end </source>
Le périmètre du type est limité à la procédure, il n'est donc pas possible de passer les objets de la vue en paramètre à d'autres fonctions (pour cela utilisez une vue globale).
La syntaxe pour définir une vue locale :
BNF style grammar :
<nom_vue> ::= ViewOf(<class_dec>) [<attributes>] end
<class_dec> ::= <class_names> | <class_name> <class_dec>
<class_names> ::= <class_name>| [<class_name> ,]
<class_name> ::= identifier
<class_dec> ::= distinct
<attributes> ::= <attribute_def> | <attribute_def> <where_def>
<attribute_def> ::= <simple_attribute_def> | <simple_attribute_def> <attribute_directive>
<simple_attribute_def> ::= <attribute_dec> | <attribute_dec> = <attribute_ref>
<attribute_dec> ::= <attribute_name> : <type_name>
<attribute_ref> ::= <main_class_attribute_name> | <operator>(<main_class_attribute_name>)
<operator> ::= <aggregate_operator> | <date_operator> | <join_operator>
<aggregate_operator> ::= count|sum|max|min
<date_operator> ::= year|month|quarter|week|day|dayofyear|dayofweek|hour|minute|second
<join_operator> ::= join
<attribute_directive> ::= primary | orderby | orderby desc
<where_def> ::= [ <expression> ]
Type
NomDeVue = ViewOf(NomDeClassePrincipale)
Attribut : Type;
Attribut : Type = AliasDe;
Attribut : Type = operator(AliasDe);
Attribut : Type = AliasDe primary;
Attribut : Type = AliasDe orderby;
Attribut : Type = AliasDe orderby desc;
[ expression ]
end;
Les vues peuvent utiles pour effectuer des traitement sur des classes complexes, par exemples :
Curseur sur une classe vue :
<source lang="delphi"> function foo(const S:string):Integer; Type
MyView = viewof(ClassA) newCode:string; unCode:string = unCodeA; unEntier:Integer = refB.unEntierB; end;
var inst:MyView; cursor:MyViewCursor begin
Result := 0;
cursor := MyView.CreateCursorWhere(unCode=%1,',true,[S]);
foreach inst in cursor do
begin
Result := Result + inst.unEntier;
end;
end; </source>
Vue sur une interface :
<source lang="delphi"> function foo(const S:string):Integer; Type
MyView = viewof(InterfaceA, ClassA1, ClassA2) unCode:string = unCodeA primary; .... end;
begin
...
end; </source>
Vue sur des combinaisons uniques d'attributs :
<source lang="delphi"> function foo(const S:string):Integer; Type
MyView = viewof(ClassA distinct) unCode:string = unCodeA primary; unEntier:Integer = refB.unEntierB; end;
begin
...
end; </source>
Vue avec agrégats :
<source lang="delphi"> function foo(const S:string):Integer; Type
MyView = viewof(ClassA) unCode:string = unCodeA primary; unEntier:Integer = sum(unEntier); end;
begin
...
end; </source>
Vue avec agrégats sur un montant :
<source lang="delphi"> Type
myView = viewof(WFClasseX) mysum:TMoney = sum(credit) orderby; end;
var sel:TSelector; inst:MyView; S,stag:string; begin
sel := MyView.CreateSelector(,,true,[]);
S := ; stag := ;
foreach inst in Sel.AsCursor do
begin
S := S+stag+Formatfloat('0.00',inst.mysum.Value);
stag := ',';
end;
showmessage(S);
Result := FALSE;
end; </source>
select sum(t0.credit) "mysum",t0.credit_CodeDevise "mysum_CodeDevise" from dbo.WFCLASSEX t0 group by t0.credit_CodeDevise order by sum(t0.credit)
Vue avec agrégats sur un attribut enfant :
<source lang="delphi"> Type
myView = viewof(WFClasseX) mysum:TMoney = sum(credit:TCValue) orderby; end;
begin
...
end; </source>
select sum(t0.credit_TCValue) "mysum" from dbo.WFCLASSEX t0 order by sum(t0.credit_TCValue)
Vue avec un opérateur de date :
<source lang="delphi"> function foo(const S:string):Integer; Type
MyView = viewof(ClassC distinct) unCode:string = unCodeC primary; unMois:Integer = month(uneDate); end;
begin
...
end; </source>
Vue avec filtre :
<source lang="delphi"> function foo(const S:string):Integer; Type
MyView = viewof(ClassA) unCodeAA:string = unCodeA; unCodeBB:string = refB.unCodeB; [ unCodeA='A1' ] end;
begin
...
end; </source>
Vue avec jointure :
<source lang="delphi"> //Procedure expensePendings(req:Tjson; var res:TObject); Type
ExpenseView = viewOf(TNoteFrais) vp: TValideurPossible = join(ValidationEtat.EtatPossible.EtatMetier, EtatNF); aManager:string = vp.ContactEtablissement.oidutilisateur; // aDate:TDatetime = nDate; aRef:string = referencePiece; aReason:string = Caption; aAmountOrg:TMoney = MontantTTC; aAmountAct:TMoney = MontantRetenu; aQuantity:TQuantity = Quantite; aUser:string = Salarie.Operateur.oidutilisateur; aType:string = FraisSalarie.Caption; aMode:Integer = FraisSalarie.modeRemboursement; aAmountMax:TMoney = FraisSalarie.montantPlafond; aStatus:Integer = Statut; end;
var json:TJson; ls:TSelector; indx,ctn:Integer; inst:ExpenseView;
AWhere,AOrder:string; Args:Array[0..5] of variant;
begin
json := TJson.Create(); res := json; // AWhere := '(aManager=%1) and (aStatus=%2)'; Args[0] := GlbUserName; Args[1] := StatutNF_AValider; AOrder := 'aUser,-aDate';
indx := 0; ctn := 0;
ls := ExpenseView.CreateSelector(AWhere,AOrder,true,Args);
foreachP inst in ls.AsCursor do
begin
. . .
end;
end; </source>
Dans cette exemple le modèle est celui-ci :
La classe TEtatMetier est atteinte par deux chemins différents, un issu de la classe TValideurPossible et un issu de la classe TNoteFrais. La jointure est réalisée sur l'objet TEtatMetier.
vp: TValideurPossible = join(ValidationEtat.EtatPossible.EtatMetier, EtatNF);
- TValideurPossible est la classe qui va être jointe
- vp défini un alias sur cette classe qui peut être ensuite utilisé dans la définition de la vue.
- ValidationEtat.EtatPossible.EtatMetier est le chemin issu de la classe jointe
- EtatNF est le chemin issu de la classe de la vue.
Opérateur portant sur un type numérique :
| Opérateur | Arguments | Action |
|---|---|---|
| sum | 1 | Effectue la somme de l'attribut |
| min | 1 | Effectue la somme de l'attribut |
| max | 1 | Retourne le max de l'attribut |
| add | 2 | Retourne la somme de deux attributs |
| sub | 2 | Retourne la différence entre deux attributs |
| sumdiff | 2 | Retourne la somme de la différence entre deux attributs |
| mindiff | 2 | Retourne le min de la différence entre deux attributs |
| maxdiff | 2 | Retourne le max de la différence entre deux attributs |
| sumconcat | 2 | Retourne la somme de la somme entre deux attributs |
| minconcat | 2 | Retourne la min de la somme entre deux attributs |
| maxconcat | 2 | Retourne le max de la somme entre deux attributs |
| count | 1 | Compte le nombre d'attribut |
Opérateur portant sur OID :
| Opérateur | Arguments | Action |
|---|---|---|
| count | 1 | Compte les éléments de la vue |
Opérateur portant sur une date :
Ces opérateur prennent une date comme argument.
| Opérateur | Arguments | Action |
|---|---|---|
| year | 1 | Retourne l'année de la date |
| quarter | 1 | Retourne le trimestre de la date |
| month | 1 | Retourne le mois de la date |
| dayofyear | 1 | Retourne le jour de l'année de la date |
| dayofweek | 1 | Retourne le jour de la semaine de la date |
| hour | 1 | Retourne le nombre d'heures de la date |
| minute | 1 | Retourne le nombre de minutes de la date |
| second | 1 | Retourne le nombre de secondes de la date |
| millisecond | 1 | Retourne le nombre de millisecondes de la date |
Opérateur portant sur une référence :
| Opérateur | Arguments | Action |
|---|---|---|
| join | 2 | Réalise une jointure sur une référence |
Agrégat portant sur un montant :
C'est le type de l'attribut défini dans la vue qui détermine le résultat de l'agrégation.
| Type Source | Type Vue | Opération |
|---|---|---|
| source:Money | vue:Money = sum(source) | sum(Value) group by CodeDevise |
| source:MoneyDT | vue:Money = sum(source) | sum(Value) group by CodeDevise |
| source:Money | vue:MoneyDT = sum(source) | ** ERREUR ** |
| source:MoneyDT | vue:MoneyDT = sum(source) | sum(Value) group by CodeDevise,Date,RPConv,RPValue,TCConv,TCValue |
| source:Money | vue:Currency = sum(source) | sum (Value) |
| source:MoneyDT | vue:Currency = sum(source) | sum (Value) |
| source:MoneyDT | vue:Currency = sum(source:TCValue) | sum (TCValue) |
| source:MoneyDT | vue:Currency = sum(source:RPValue) | sum (RPValue) |
| source:Currency | vue:Currency = sum(source) | sum (Value) |
Voir aussi :
