|
|
1
|
+# Documentation de la syntaxe d'un rapport
|
|
|
2
|
+
|
|
|
3
|
+Ce document décrit comment écrire un rapport.
|
|
|
4
|
+
|
|
|
5
|
+## Syntaxe d'un rapport
|
|
|
6
|
+
|
|
|
7
|
+Comme écrit dans la page de présentation des rapports, ceux-ci sont décrits dans un fichier de type *properties*.
|
|
|
8
|
+
|
|
|
9
|
+La syntaxe a été uniformisée en version 9.
|
|
|
10
|
+
|
|
|
11
|
+### Identifiant d'un rapport
|
|
|
12
|
+
|
|
|
13
|
+Chaque rapport possède un identifiant unique; celui-ci est utilisé pour identifier toute sa description dans le fichier globale.
|
|
|
14
|
+
|
|
|
15
|
+Voici un premier exemple de rapport pour mieux comprendre comment cela s'organise :
|
|
|
16
|
+
|
|
|
17
|
+```properties
|
|
|
18
|
+report.llCommonTripGearUseFeatures.modelType=LL
|
|
|
19
|
+report.llCommonTripGearUseFeatures.name=Liste des équipements
|
|
|
20
|
+report.llCommonTripGearUseFeatures.description=Afficher les équipements
|
|
|
21
|
+report.llCommonTripGearUseFeatures.columns=Equipement,Nombre,Utilisé dans la marée,Mesures
|
|
|
22
|
+report.llCommonTripGearUseFeatures.repeatVariable.1.name=gearUseFeaturesId
|
|
|
23
|
+report.llCommonTripGearUseFeatures.repeatVariable.1.type=java.lang.String
|
|
|
24
|
+report.llCommonTripGearUseFeatures.repeatVariable.1.request=Select g.id \
|
|
|
25
|
+From fr.ird.observe.entities.data.ll.common.TripImpl m \
|
|
|
26
|
+Join m.gearUseFeatures g \
|
|
|
27
|
+Where \
|
|
|
28
|
+m.id In :tripId \
|
|
|
29
|
+and g in elements (m.gearUseFeatures) \
|
|
|
30
|
+Order By g.gear.label2
|
|
|
31
|
+report.llCommonTripGearUseFeatures.request.1.location=0,0
|
|
|
32
|
+report.llCommonTripGearUseFeatures.request.1.layout=row
|
|
|
33
|
+report.llCommonTripGearUseFeatures.request.1.request=Select \
|
|
|
34
|
+concat(CASE When g.gear.code IS NULL Then 'Aucun code' Else g.gear.code End, ' - ', g.gear.label2), \
|
|
|
35
|
+g.number, \
|
|
|
36
|
+( CASE g.usedInTrip When true Then 'Oui' Else Case g.usedInTrip When false Then 'Non' Else 'Indéterminé' End End )\
|
|
|
37
|
+From fr.ird.observe.entities.data.ll.common.GearUseFeaturesImpl g \
|
|
|
38
|
+Where g.id = :gearUseFeaturesId
|
|
|
39
|
+report.llCommonTripGearUseFeatures.request.1.repeat.name=gearUseFeaturesId
|
|
|
40
|
+report.llCommonTripGearUseFeatures.request.1.repeat.layout=column
|
|
|
41
|
+report.llCommonTripGearUseFeatures.operations.1.type=ComputeMeasurementsLongline
|
|
|
42
|
+```
|
|
|
43
|
+
|
|
|
44
|
+Ici l'identifiant est ```llCommonTripGearUseFeatures```.
|
|
|
45
|
+
|
|
|
46
|
+Par convention, on utilise le domaine métier **ll**, suivi du sous-domaine métier **Common**, puis enfin un suffixe qui
|
|
|
47
|
+exprime ce que le rapport doit produire **TripGearUseFeatures**.
|
|
|
48
|
+
|
|
|
49
|
+Dans le fichier global, toutes les entrées commençants par **report.llCommonTripGearUseFeatures** permettent alors de
|
|
|
50
|
+décrire le rapport.
|
|
|
51
|
+
|
|
|
52
|
+### Méta-données d'un rapport
|
|
|
53
|
+
|
|
|
54
|
+Il existe cinq méta-données pour un rapport (dont trois sont obligatoires) :
|
|
|
55
|
+
|
|
|
56
|
+```properties
|
|
|
57
|
+report.xxx.modelType=PS ou LL
|
|
|
58
|
+report.xxx.name=Nom du rapport
|
|
|
59
|
+report.xxx.description=Description du rapport
|
|
|
60
|
+report.xxx.columns=En-tetes des colonnes du rapport (séparées par des virgules) [Optionnel]
|
|
|
61
|
+report.xxx.rows=En-tetes des lignes du rapport (séparées par des virgules) [Optionnel]
|
|
|
62
|
+```
|
|
|
63
|
+
|
|
|
64
|
+```report.xxx.modelType``` permet de définir le domaine métier sur lequel porte le rapport, valeurs possibles :
|
|
|
65
|
+
|
|
|
66
|
+* **PS** pour le domaine *Senne*
|
|
|
67
|
+* **LL** pour le domaine *Palangre*.
|
|
|
68
|
+
|
|
|
69
|
+En *V10*, on ajoutera certainement **COMMON** pour les marées agnostiques.
|
|
|
70
|
+
|
|
|
71
|
+```report.xxx.name``` permet de définir le nom du rapport, ce texte est celui affiché dans la liste déroulante des
|
|
|
72
|
+rapports à sélectionner dans l'assitant.
|
|
|
73
|
+
|
|
|
74
|
+```report.xxx.description``` permet de définir une description longue d'un rapport, ce texte est celui affiché
|
|
|
75
|
+comme description lorsqu'un rapport est sélectionné dans l'assitant.
|
|
|
76
|
+
|
|
|
77
|
+```report.xxx.colomns``` **[Optionnel]** permet de définir les en-tetes de colonnes de manière fixe.
|
|
|
78
|
+
|
|
|
79
|
+```report.xxx.rows``` **[Optionnel]** permet de définir les en-tetes de lignes de manière fixe.
|
|
|
80
|
+
|
|
|
81
|
+Il est possible de ne pas les indiquer si le rapport n'a pas d'en-tetes de colonnes ou de lignes fixes; Ces en-tetes
|
|
|
82
|
+seront alors définies via les requêtes du rapport.
|
|
|
83
|
+
|
|
|
84
|
+### Variables d'un rapport
|
|
|
85
|
+
|
|
|
86
|
+Dans notre premier exemple, il n'y avait pas de variable (mais des variables de répétition). La syntaxe de ces deux
|
|
|
87
|
+notions est exactement la même, au détail près qu'une variable est préfixée par ```variable``` alors qu'une variable de
|
|
|
88
|
+répétition est préfixée par ```repeatVariable```.
|
|
|
89
|
+
|
|
|
90
|
+Comme indiqué dans le préambule, l'ordre de description des variables est important, cet ordre sera utilisé pour :
|
|
|
91
|
+
|
|
|
92
|
+* afficher les variables dans l'interface graphique,
|
|
|
93
|
+* effectuer le calcul de l'univers des variables (dans le cas où des variables sont inter-dépendantes).
|
|
|
94
|
+
|
|
|
95
|
+**À noter que l'outil de rapport utilise uniquement l'ordre induit dans la description du rapport, si par exemple la
|
|
|
96
|
+première variable était dépendante de la seconde, alors le rapport ne pourra jamais être exécuté puisque la première
|
|
|
97
|
+variable attend que la seconde soit remplie...**
|
|
|
98
|
+
|
|
|
99
|
+Pour décrire une variable trois lignes sont nécessaires, comme on peut le voir dans l'exemple suivant :
|
|
|
100
|
+
|
|
|
101
|
+```properties
|
|
|
102
|
+report.xxx.variable.1.name=speciesGroup
|
|
|
103
|
+report.xxx.variable.1.type=fr.ird.observe.dto.referential.common.SpeciesGroupReference
|
|
|
104
|
+report.xxx.variable.1.request=Select distinct sg \
|
|
|
105
|
+From TripImpl t \
|
|
|
106
|
+Join t.routeObs r \
|
|
|
107
|
+Join r.activity a \
|
|
|
108
|
+Join a.set c \
|
|
|
109
|
+Join c.catches ca with ca.totalCount Is Not Null Or ca.catchWeight Is Not Null \
|
|
|
110
|
+Join ca.species e \
|
|
|
111
|
+Join e.speciesGroup sg \
|
|
|
112
|
+Where t.id In :tripId \
|
|
|
113
|
+Order By sg.code
|
|
|
114
|
+```
|
|
|
115
|
+
|
|
|
116
|
+```report.xxx.variable.1.name``` définit l'alias de la variable que l'on pourra ensuite utiliser dans le
|
|
|
117
|
+reste de la définition du rapport (par exemple dans d'autres variables, variables de répétition, requêtes ou opérations).
|
|
|
118
|
+
|
|
|
119
|
+```report.xxx.variable.1.type``` définit le type de la variable. Ce type doit être un type de *dto* ou une
|
|
|
120
|
+*référence de dto*. On ne peut pas ici utiliser un type d'*entité*, puisque l'interface graphique (selon le principe de
|
|
|
121
|
+séparation des couches) n'a pas connaissance du modèle des entités.
|
|
|
122
|
+
|
|
|
123
|
+Techniquement, chaque type d'entité possède son type de *dto* et chaque type de *dto* possède un type de *référence*.
|
|
|
124
|
+
|
|
|
125
|
+La notion de référence est utilisée dans l'application partout où l'on utilise des listes déroulantes, mais aussi dans
|
|
|
126
|
+l'arbre de navigation; la notion de *dto* étant utilisée au niveau d'un formulaire.
|
|
|
127
|
+
|
|
|
128
|
+À partir d'un type de référence, l'application est capable d'en déduire :
|
|
|
129
|
+* le nom de la donnée à afficher
|
|
|
130
|
+* comment décorer la donnée
|
|
|
131
|
+* comment transformer l'entité
|
|
|
132
|
+
|
|
|
133
|
+```report.xxx.variable.1.request``` définit la requête **hql** pour récupérer l'univers des valeurs de
|
|
|
134
|
+la variable.
|
|
|
135
|
+
|
|
|
136
|
+Il est possible de documenter cette variable en utilise une quatrième ligne optionnelle :
|
|
|
137
|
+
|
|
|
138
|
+```properties
|
|
|
139
|
+report.xxx.variable.1.comment=Un commentaire optionnel pour documenter la variable
|
|
|
140
|
+```
|
|
|
141
|
+
|
|
|
142
|
+**À noter que l'utilisation d'une variable dans le reste du rapport se fait toujours via son identifiant technique
|
|
|
143
|
+(*topiaId*), ce qui ne sera pas le cas d'une variable de répétition qui elle utilisera toujours le type décrit.**
|
|
|
144
|
+
|
|
|
145
|
+**À noter aussi que l'on peut utiliser pour décrire une variable, de la variable spéciale *tripId* qui reflète la
|
|
|
146
|
+sélection des marées sur lequel on veut appliquer le rapport**.
|
|
|
147
|
+
|
|
|
148
|
+
|
|
|
149
|
+Voici un second exemple de deux variables dont la seconde utilise la première :
|
|
|
150
|
+
|
|
|
151
|
+```properties
|
|
|
152
|
+report.xxx.variable.1.name=discardMode
|
|
|
153
|
+report.xxx.variable.1.type=fr.ird.observe.dto.data.ps.observation.SpeciesFateDiscardModeDto
|
|
|
154
|
+report.xxx.variable.1.request=Select distinct new fr.ird.observe.dto.data.ps.observation.SpeciesFateDiscardModeDto(sf.discard) \
|
|
|
155
|
+From TripImpl t \
|
|
|
156
|
+Join t.routeObs r \
|
|
|
157
|
+Join r.activity a \
|
|
|
158
|
+Join a.set c \
|
|
|
159
|
+Join c.catches ca with ca.totalCount Is Not Null \
|
|
|
160
|
+Join ca.speciesFate sf \
|
|
|
161
|
+Where t.id In :tripId \
|
|
|
162
|
+Order By sf.discard
|
|
|
163
|
+report.xxx.variable.2.name=speciesGroup
|
|
|
164
|
+report.xxx.variable.2.type=fr.ird.observe.dto.referential.common.SpeciesGroupReference
|
|
|
165
|
+report.xxx.variable.2.request=Select distinct sg \
|
|
|
166
|
+From TripImpl t \
|
|
|
167
|
+Join t.routeObs r \
|
|
|
168
|
+Join r.activity a \
|
|
|
169
|
+Join a.set c \
|
|
|
170
|
+Join c.catches ca with ca.totalCount Is Not Null \
|
|
|
171
|
+Join ca.speciesFate sf with sf.discard = :discardMode \
|
|
|
172
|
+Join ca.species e \
|
|
|
173
|
+Join e.speciesGroup sg \
|
|
|
174
|
+Where t.id In :tripId \
|
|
|
175
|
+Order By sg.code
|
|
|
176
|
+```
|
|
|
177
|
+
|
|
|
178
|
+Cet exemple est intéressant car il nous permet de voir comment utiliser un type qui ne reflète pas exactement une entité.
|
|
|
179
|
+
|
|
|
180
|
+Ici **SpeciesFateDiscardModeDto** est un objet que l'on a ajouté dans le code de l'application pour refléter les différents modes de captures :
|
|
|
181
|
+* conservé (sf.discard = ```false```)
|
|
|
182
|
+* rejeté (sf.discard = ```true```)
|
|
|
183
|
+* non connu (sf.discard = ```NULL```)
|
|
|
184
|
+
|
|
|
185
|
+### Variables de répétition d'un rapport
|
|
|
186
|
+
|
|
|
187
|
+Comme indiqué plus haut, la syntaxe d'une variable de répétition est identique à celle d'une simple variable.
|
|
|
188
|
+
|
|
|
189
|
+Pour décrire une variable de répétition, trois lignes sont nécessaires, comme on peut le voir dans l'exemple suivant :
|
|
|
190
|
+
|
|
|
191
|
+```properties
|
|
|
192
|
+report.xxx.repeatVariable.1.name=gearUseFeaturesId
|
|
|
193
|
+report.xxx.repeatVariable.1.type=java.lang.String
|
|
|
194
|
+report.xxx.repeatVariable.1.request=Select g.id \
|
|
|
195
|
+From fr.ird.observe.entities.data.ll.common.TripImpl m \
|
|
|
196
|
+Join m.gearUseFeatures g \
|
|
|
197
|
+Where \
|
|
|
198
|
+m.id In :tripId \
|
|
|
199
|
+and g in elements (m.gearUseFeatures) \
|
|
|
200
|
+Order By g.gear.label2
|
|
|
201
|
+```
|
|
|
202
|
+
|
|
|
203
|
+```report.xxx.repeatVariable.1.name``` définit l'alias de la variable de répétition à utiliser dans une requête, autre variable de répétition ou opération
|
|
|
204
|
+
|
|
|
205
|
+```report.xxx.repeatVariable.1.type``` définit le type de la variable de répétition. Contrairement aux variables, les
|
|
|
206
|
+variables de répétition sont utilisées en interne pour exécuter le rapport, on peut donc utiliser directement des types d'*entité*,
|
|
|
207
|
+ou bien des types *simples* qui correspondent aux types d'une colonne en base (**java.lang.String**, **java.lang.Float**, ...)
|
|
|
208
|
+
|
|
|
209
|
+**À noter que contrairement aux variables, ici le type de la donnée sera toujours utilisé tel quel dans les autres requêtes :
|
|
|
210
|
+si on définit une variable de type *entité*, c'est bien l'entité qui sera injectée dans la requête *hql*, et non pas juste son identifiant technique.**
|
|
|
211
|
+
|
|
|
212
|
+```report.xxx.repeatVariable.1.request``` définit la requête **hql** pour récupérer l'univers des valeurs de la variable de répétition
|
|
|
213
|
+
|
|
|
214
|
+Il est possible d'utiliser dans une requête de variable de répétition, un alias sur toute variable du rapport (dont la
|
|
|
215
|
+variable spéciale **tripId**), ainsi que tout autre alias de variable de répétition.
|
|
|
216
|
+
|
|
|
217
|
+**À noter que l'outil de rapport utilise uniquement l'ordre induit dans la description du rapport, si par exemple la
|
|
|
218
|
+première variable de répétition était dépendante de la seconde, alors le rapport ne pourra jamais être exécuté puisque la
|
|
|
219
|
+première variable attend que la seconde soit calculée...**
|
|
|
220
|
+
|
|
|
221
|
+Il est possible de documenter cette variable de répétition en utilisant une ligne optionnelle :
|
|
|
222
|
+
|
|
|
223
|
+```properties
|
|
|
224
|
+report.xxx.repeatVariable.1.comment=Un commentaire optionnel pour documenter la variable de répétition
|
|
|
225
|
+```
|
|
|
226
|
+
|
|
|
227
|
+### requêtes d'un rapport
|
|
|
228
|
+
|
|
|
229
|
+On distingue deux types de requêtes :
|
|
|
230
|
+
|
|
|
231
|
+* des requêtes *simples*
|
|
|
232
|
+* des requêtes utilisant une variable de répétition (pour celles-ci on doit décrire en plus alors la variable de répétition à utiliser)
|
|
|
233
|
+
|
|
|
234
|
+Les deux types de requêtes nécessitent les trois lignes, comme décrit dans l'exemple suivant :
|
|
|
235
|
+
|
|
|
236
|
+```properties
|
|
|
237
|
+report.xxx.request.1.location=0,0
|
|
|
238
|
+report.xxx.request.1.layout=row
|
|
|
239
|
+report.xxx.request.1.request=Select \
|
|
|
240
|
+concat(CASE When g.gear.code IS NULL Then 'Aucun code' Else g.gear.code End, ' - ', g.gear.label2), \
|
|
|
241
|
+g.number, \
|
|
|
242
|
+( CASE g.usedInTrip When true Then 'Oui' Else Case g.usedInTrip When false Then 'Non' Else 'Indéterminé' End End )\
|
|
|
243
|
+From fr.ird.observe.entities.data.ll.common.GearUseFeaturesImpl g \
|
|
|
244
|
+Where g.id = :gearUseFeaturesId
|
|
|
245
|
+```
|
|
|
246
|
+
|
|
|
247
|
+```report.xxx.request.1.location``` définit la position dans le résultat final où positionner le résultat de cette requête.
|
|
|
248
|
+
|
|
|
249
|
+```report.xxx.request.1.layout``` définit la disposition à utiliser pour placer le résultat de cette requête dans le résultat final. Deux valeurs sont possibles :
|
|
|
250
|
+
|
|
|
251
|
+* **row** pour signifier que le résultat de la requête sera positionné en ligne à partir de la position précedemment définie. Ce mode correspond exactement au resultat de la requête
|
|
|
252
|
+* **column** pour signifier que le résultat de la requête sera positionne en colonne à partir de la position précedemment définie. Ce mode est une transposition du résultat de la requête : une ligne du résultat de la requête sera une colonne dans le résultat final
|
|
|
253
|
+
|
|
|
254
|
+```report.xxx.request.1.request``` définit le code **hql** qui permet de construire le résultat à placer ensuite dans le résultat final du rapport
|
|
|
255
|
+
|
|
|
256
|
+Pour une requête avec variable de répétition, il faut alors ajouter les deux lignes suivantes :
|
|
|
257
|
+
|
|
|
258
|
+```properties
|
|
|
259
|
+report.xxx.request.1.repeat.name=gearUseFeaturesId
|
|
|
260
|
+report.xxx.request.1.repeat.layout=column
|
|
|
261
|
+```
|
|
|
262
|
+
|
|
|
263
|
+```report.xxx.request.1.repeat.name``` définit le nom de la variable de répétition à utiliser. La requête sera exécutée
|
|
|
264
|
+autant de fois qu'il y a de valeurs dans l'univers calculé de la variable de répétition.
|
|
|
265
|
+
|
|
|
266
|
+**À noter qu'il faut alors que le corps de cette requête doit utiliser l'alias de cette variable de répétition, même si dans les faits, rien ne l'oblige, mais le résultat sera alors toujours le même...**
|
|
|
267
|
+
|
|
|
268
|
+```report.xxx.request.1.repeat.layout``` définit la disposition à utiliser pour constuire le résultat final de la requête appliqué à chaque valeur de la variable de répétition. Deux valeurs sont possibles :
|
|
|
269
|
+
|
|
|
270
|
+* **row** pour signifier que pour chaque valeur de l'univers de la variable de répétition, le résultat de la requête sera positionné sur la même ligne;
|
|
|
271
|
+* **column** pour signifier que pour chaque valeur de l'univers de la variable de répétition, le résultat de la requête sera positionné sur la même colonne.
|
|
|
272
|
+
|
|
|
273
|
+**À noter qu'aucune vérification n'est effectuée sur la cohérence entre la disposition de la requête et la disposition
|
|
|
274
|
+de la variable de répétition. On peut alors obtenir un résultat final de la requête incohérent si les dispositions ne sont pas compatibles.**
|
|
|
275
|
+
|
|
|
276
|
+Il est possible de documenter cette requête en utilisant une ligne optionnelle :
|
|
|
277
|
+
|
|
|
278
|
+```properties
|
|
|
279
|
+report.xxx.request.1.comment=Un commentaire optionnel pour documenter la requête
|
|
|
280
|
+```
|
|
|
281
|
+
|
|
|
282
|
+### Opérations d'un rapport
|
|
|
283
|
+
|
|
|
284
|
+On distingue deux types d'opérations :
|
|
|
285
|
+
|
|
|
286
|
+* celles sans paramétrage (une seule ligne est alors nécessaire)
|
|
|
287
|
+* celles savec paramétrage (dans ce cas deux lignes sont nécessaires pour la décrire).
|
|
|
288
|
+
|
|
|
289
|
+Les deux types d'opération nécessitent une première ligne pour déclarer le type d'opération à exécuter, comme décrit
|
|
|
290
|
+dans l'exemple suivant :
|
|
|
291
|
+
|
|
|
292
|
+```properties
|
|
|
293
|
+report.xxx.operations.1.type=SumIntRow
|
|
|
294
|
+```
|
|
|
295
|
+
|
|
|
296
|
+```report.xxx.operations.1.type``` définit le type d'opération à réaliser.
|
|
|
297
|
+
|
|
|
298
|
+Dans le cas où l'opération est paramétrable, on doit alors ajouter une autre ligne avec le paramétrage de l'opération :
|
|
|
299
|
+
|
|
|
300
|
+```properties
|
|
|
301
|
+report.xxx.operations.1.parameters=0|1
|
|
|
302
|
+```
|
|
|
303
|
+
|
|
|
304
|
+```report.xxx.operations.1.parameters``` définit alors le paramétrage à utiliser pour exécuter l'opération.
|
|
|
305
|
+
|
|
|
306
|
+Il est possible de documenter cette opération en utilisant une ligne optionnelle :
|
|
|
307
|
+
|
|
|
308
|
+```properties
|
|
|
309
|
+report.xxx.operations.1.comment=Un commentaire optionnel pour documenter l'opération
|
|
|
310
|
+```
|
|
|
311
|
+
|
|
|
312
|
+Les opérations disponibles et leur documentation est décrite dans le document [suivant](./embedded-operations.html).
|
|
|
313
|
+
|
|
|
314
|
+## Pour aller plus loin
|
|
|
315
|
+
|
|
|
316
|
+Vous pouvez aussi consulter la [documentation des rapports embarqués par l'application](./embedded-reports.html). |