Code source wiki de Fonctions avancées : paramétrage des exports tabulés paramétrables
Modifié par Doriane Bautista le 2024/07/19 14:30
Afficher les derniers auteurs
author | version | line-number | content |
---|---|---|---|
1 | {{box title="**Sommaire**"}} | ||
2 | {{toc/}} | ||
3 | {{/box}} | ||
4 | |||
5 | page en cours de construction | ||
6 | |||
7 | = A savoir avant de commencer = | ||
8 | |||
9 | L'export de données muséologiques vers un tableur met en évidence la particularité de leur organisation technique. | ||
10 | |||
11 | Pour pouvoir répondre aux exigence scientifiques de leur description, il n'est pas possible d'utiliser des grilles de saisie de type tableur, avec juste des lignes et des colonnes, il faudrait un nombre inifini de colonnes. | ||
12 | |||
13 | Les grilles de saisie dans Flora,s'appuient donc sur deux notions extrèmement puissantes : **les blocs répétables et les champs multivalués** | ||
14 | |||
15 | == //Comprendre les blocs répétables et les champs multivalués// == | ||
16 | |||
17 | Ces deux notions sont fondamentales en informatique muséologique. Elles permettent de s'affranchir des limites techniques imposées par les bases de données traditionnelles (tables de jointures). | ||
18 | Historiquement on appelait cela des bases de données XML, aujourd'hui (entre informaticiens) on parlerait plutôt de NoSql | ||
19 | |||
20 | Ces notions sont fonctionnellement très puissantes en saisie, mais elles imposent quelques rêgles** quand on veut remettre les données "à plat"** pour des affichages, des impressions, des exports. | ||
21 | |||
22 | (% class="box infomessage" %) | ||
23 | ((( | ||
24 | Ces rêgles peuvent paraitre "exotiques" quand on a l'habitude de manipuler un tableur ou une base de donnée SQL. Cet article wiki a donc pour but d'expliciter tout ce qui peut etre exploité pour une **"remise à plat sans perte de sens" **de données muséologiques dans un tableur en lignes / colonnes | ||
25 | ))) | ||
26 | |||
27 | //Exemple ~:// | ||
28 | |||
29 | [[image:1698219762510-708.png]] | ||
30 | |||
31 | |||
32 | (% class="wikigeneratedid" %) | ||
33 | __**Dans un export CSV pour excel ou calc,:**__ | ||
34 | |||
35 | * Par défaut **les champs multivaluées seront concaténés avec un séparateur virgule+espace entre chaque valeur.**.. donc ça marche tout seul | ||
36 | ** Exemple : si je demande à exporter juste le champ Auteuir-Exécutant, dans une colonne je récupererai les 4 auteurs ci dessus, séparés par virgule+espace, mais sans savoir de quel "type" ils dépendent | ||
37 | * Par contre, pour les blocs répétables, comme il n'est pas possible de générer un nombre de colonnes variables dans l'export, en général **on concaténera les champs d'un même blocs, puis les différentes occurences d'un même bloc dans une seule et unique Colonne** | ||
38 | ** Exemple : si je demande à exporter Le bloc "Création-exécution" dans une colonne ,je devrai paramétrer le mode de concaténation des différents champs qu'il contient, aisni que le mode de concaténation de chaque occurence de bloc. de facto j'aurai besoin de pouvoir paramétrer des séparateurs, ajouter des libellés de champs....bref "formater" la conaténation des blocs | ||
39 | |||
40 | = Paramètres généraux d'un modele etp = | ||
41 | |||
42 | dans l'entête du fichier etp les paramétres suivants pourront etre défini | ||
43 | |||
44 | **<table** | ||
45 | |||
46 | **name="MUS_STRATIGRAPHIE"** | ||
47 | //nom interne de la table à exporter// | ||
48 | |||
49 | **charset="ISO-8859-1" ** | ||
50 | //jeu de caractere du fichier résultat | ||
51 | Attention, il est préférable de conserver ce paramétre car les publications réalisées sont ensuiote déclarées avec un type mime et une extension CSV, de manière a étre ouvertes automatiquement dans Excel par un double clic sur le nom de fichier// | ||
52 | |||
53 | **separator="\t"** | ||
54 | //Le séparateur tabulation est préférable car il est certain qu'il n'a pas été saisi dans une des notices exportées, la publication génére **donc un fichier CSV mais dont les sépareurs de colonnes sont des tabulations**// | ||
55 | |||
56 | **compressChar=" ; "** | ||
57 | //caracteres utilisé lors de concaténation automatiques de données dans des blocs répétables// | ||
58 | |||
59 | **newLine="\r\n"** | ||
60 | //caracteres délimitant les changement d'enregistrement \r=chr(13) |n=chr(10)// | ||
61 | |||
62 | **multiValueSeparator=', '** | ||
63 | //caracteres utiliser pour concaténer les données des champs multivaluées virgule+espace// | ||
64 | |||
65 | **valueDelimiter='"'>** | ||
66 | //ne pas modifier, permet d'englober les contenus de colonne contenant des \n ou des apsotrophes pour éviter und écalage à l'oiuverture du fichier csv publié// | ||
67 | |||
68 | |||
69 | //Exemple ~:// | ||
70 | [[image:1698143160183-538.png||class="img-thumbnail"]] | ||
71 | |||
72 | |||
73 | = Export d'un champ = | ||
74 | |||
75 | Les exemples ci aprés sont issus de l'export CSV de la table Stratigraphie, mais sont transposables dans toutes les tables de Flora | ||
76 | |||
77 | == Formatage automatique selon le mode de saisie == | ||
78 | |||
79 | Par défaut, Flora mettra en forme l'export des champs en fonction de leur mode de saisie de la manière suivante | ||
80 | |||
81 | === Champs texte libre sur une seule ligne === | ||
82 | |||
83 | //Exemple ~:// | ||
84 | |||
85 | (% style="text-align:center" %) | ||
86 | [[image:1698221408368-344.png||class="img-thumbnail"]] | ||
87 | |||
88 | La ligne ci dessous génèrera une colonne dont le titre sera égal au label et les contenus alimentés par le champs cité dans name | ||
89 | |||
90 | **<field name='TYPE_UE' label='Type Unité d_enregistrement '/> ** | ||
91 | |||
92 | (% class="box warningmessage" %) | ||
93 | ((( | ||
94 | //Attention ne pas mettre d'apostrophe ou guillemets à l'interieur d'un contenu de la balise label (cela génére une erreur bloquante à la publication)// | ||
95 | ))) | ||
96 | |||
97 | * **name :** nom interne du champ dans la table Flora | ||
98 | * **label : **intitulé qu'aura la colonne dans le fichier csv | ||
99 | |||
100 | (% style="text-align:center" %) | ||
101 | [[image:1698233535559-410.png||class="img-thumbnail"]] | ||
102 | |||
103 | === Champs texte libre multiligne (avec retours à la ligne) === | ||
104 | |||
105 | (% style="text-align:center" %) | ||
106 | [[image:1698220705279-359.png||class="img-thumbnail"]] | ||
107 | |||
108 | **<field name='PRECISION_UE' label='Précisions UE '/> **aura pour résultat | ||
109 | |||
110 | (% style="text-align:center" %) | ||
111 | [[image:1698220966238-507.png||class="img-thumbnail"]] | ||
112 | |||
113 | === Champs multivalués liés à des listes, thésaurus ou table d'autorité === | ||
114 | |||
115 | (% style="text-align:center" %) | ||
116 | [[image:1698220773700-234.png||class="img-thumbnail"]] | ||
117 | |||
118 | **<field name='INTERPRETATION' label='Interpretation'/> **aura pour résultat | ||
119 | |||
120 | (% style="text-align:center" %) | ||
121 | [[image:1698221043701-405.png||class="img-thumbnail"]] | ||
122 | |||
123 | (% class="box infomessage" %) | ||
124 | ((( | ||
125 | Par défaut Flora exporte la valeur "affichée" du champ. c'est à dire le même contenu textuel que ce qui s'affiche dans les vues. | ||
126 | Il est possible de demander l'export de la valeur "interne" du champ (code pour les listes, unique_key pour les tables d'autorité, recordId pour les thésaurus), dans ce cas il faut spécifier display=''false' dans le champs field | ||
127 | <field name='INTERPRETATION' label='Interpretation '** display='false"/> ** | ||
128 | ))) | ||
129 | |||
130 | |||
131 | == Formatages personnalisés sur un champ == | ||
132 | |||
133 | * **dataBefore :** separateur avant la donnee du champ, répété en cas de multivaluation (Chaine vide si non defini) | ||
134 | * **dataMultiValueSeparator : **separateur de champ multivalue (Si non defini c'est celui qui est defini dans l'attribut multiValueSeparator du tag 'table', ou si non defini c'est '/' slash par defaut) | ||
135 | * **dataAfter : **separateur apres la donnee du champ répété en cas de multivaluation (Chaine vide si non defini) | ||
136 | |||
137 | **Exemple : <field name='INTERPRETATION' label='Interpretation' dataBefore="texte avant " dataAfter=" texte aprés" dataMultiValueSeparator=" ; "/>** | ||
138 | |||
139 | (% style="text-align:center" %) | ||
140 | [[image:1698221647528-156.png||class="img-thumbnail"]] | ||
141 | |||
142 | (% class="box infomessage" %) | ||
143 | ((( | ||
144 | **Truc et astuce : **utiliser des retours lignes comme séparateur **avec \n **peut améliorer la lisibilité des données dans le tableur | ||
145 | ))) | ||
146 | |||
147 | **<field name='INTERPRETATION' label='Interpretation' dataBefore="texte avant : " dataAfter=" (texte aprés)" dataMultiValueSeparator="\n"/>** | ||
148 | |||
149 | (% style="text-align:center" %) | ||
150 | [[image:1698221798735-336.png||class="img-thumbnail"]] | ||
151 | |||
152 | == Exporter une valeur constante == | ||
153 | |||
154 | Toutes les lignes auront la même valeur dans la colonne | ||
155 | |||
156 | **<constant name="C1" label="Constante1" dataDefValue="myConstante1" />** | ||
157 | |||
158 | (% style="text-align:center" %) | ||
159 | [[image:1698229509017-535.png||class="img-thumbnail"]] | ||
160 | |||
161 | == Exporter un ou plusieurs champs d'une table d'autorité liée == | ||
162 | |||
163 | (% class="wikigeneratedid" %) | ||
164 | par défaut, les champs liés à des table d'autorité s'exportent avec la concaténation standard des champs de la table liée (dans Flora on appelle ça le digest de la table, il est défini dans le fichierconf/local/musee/db/A.musee.xml digest ou link-digest s'il est défini). | ||
165 | De facto, tout se retrouve dans une seule et même colonne | ||
166 | |||
167 | (% class="wikigeneratedid" %) | ||
168 | **Exemple avec le champ qui lie la Table Stratigraphie à la Table Opération** | ||
169 | |||
170 | (% class="box infomessage" %) | ||
171 | ((( | ||
172 | pour la table Opération le link-digest est composé des champs suivants | ||
173 | <concat param1="TYPE_OPERATION,30/NOM,50, : /NUM_IDENTIFIANT,20, - /OPERATEUR,60,- /DATE_OPERATION_DEBUT,20, du /DATE_OPERATION_FIN,20, au "/> | ||
174 | ))) | ||
175 | |||
176 | (% class="wikigeneratedid" %) | ||
177 | A minima, l'export sera réalisé ainsi, avec le champ DISPLAY_OPERATION qui n'est pas répété ni multivalué. c'est un champ caché de Flora qui ne contient que la première de toutes les opérations potentiellement liées à la notice stratigraphie | ||
178 | |||
179 | (% class="wikigeneratedid" %) | ||
180 | **<field name='DISPLAY_OPERATION' label='Opération1'/> ** | ||
181 | |||
182 | (% class="wikigeneratedid" %) | ||
183 | [[image:1698222516214-545.png]] | ||
184 | |||
185 | (% class="wikigeneratedid" %) | ||
186 | il est donc possible "d'éclater" les champs de la table liée par colonne via le **linked_field. **Chaque champ exportée de la table liée sera positionné dans un colonne dédiée. de cette manière on n'est p^lus bridé par le digest ou le link-digest | ||
187 | |||
188 | (% class="wikigeneratedid" %) | ||
189 | **<linked_field name='DISPLAY_OPERATION'> | ||
190 | <field name='NUM_IDENTIFIANT' label="Identifiant Opération" /> | ||
191 | <field name='TYPE_OPERATION' label="Type opération" dataBefore="(" dataAfter=")" /> | ||
192 | </linked_field>** | ||
193 | |||
194 | (% class="wikigeneratedid" %) | ||
195 | [[image:1698222350876-551.png]] | ||
196 | |||
197 | |||
198 | SI on utilise le champ OPERATION (dans le bloc découverte de la grille de saisie), IL est possible d'y saisir plusieurs Opérations liées | ||
199 | Dans ce cas, le découpage sera respecté dans chacune des colonnes, mais il ny' aura toujours que 2 colonnes | ||
200 | |||
201 | **<linked_field name='OPERATION'> | ||
202 | <field name='NUM_IDENTIFIANT' label="Identifiant(s) Opération" /> | ||
203 | <field name='TYPE_OPERATION' label="Type opération(s)" dataBefore="(" dataAfter=")" /> | ||
204 | </linked_field>** | ||
205 | |||
206 | [[image:1698222944107-105.png]] | ||
207 | |||
208 | |||
209 | (% class="box infomessage" %) | ||
210 | ((( | ||
211 | **Question : **pourquoi y a t'il parfois des virgule et des points virgules entre chaque valeur de la colonne Type opération.. d'ou viennent ces points virgules ? | ||
212 | **Réponse : **en fait L**e champ Opération(s) dans la table Stratigraphie n'est pas multivalué mais il est positionné dans un bloc répétable** | ||
213 | |||
214 | (% style="text-align:center" %) | ||
215 | [[image:1698226080684-439.png||height="478" width="1071"]] | ||
216 | |||
217 | **Rappel : ** | ||
218 | Dans les paramétrages généraux du fichier etp on a défini **compressChar=" ; " **//caracteres utilisés lors de concaténation automatiques de données dans des blocs répétables. c'est donc lui qui est utilisé dans le cas présent . les points virgules marquent donc les séparations de blocs répétables// | ||
219 | Et on a aussi défini **multiValueSeparator=', ' **//caracteres utiliser pour concaténer les données des champs multivaluées virgule+espace c'est donc lui qui est utilisé dans le cas présent pour lexport du champ TYpe Opération de la table Opération..champ qui est multivaléu dans ladite table// | ||
220 | |||
221 | |||
222 | (% style="text-align:center" %) | ||
223 | [[image:1698226465622-838.png||height="285" width="966"]] | ||
224 | |||
225 | |||
226 | Cet exemple illustre la complexité de manipulation des données muséologique car les blocs répétables et champs multivalués y sont légion | ||
227 | Mais il faut retenir que le paramétrage par défaut des exports etp gére tout cela de manière transparente avec des réglages par défaut qui rendent les données lisibles à minima | ||
228 | ))) | ||
229 | |||
230 | = Concaténation libre de champs dans une seule colonne = | ||
231 | |||
232 | Dans de nombreux cas il sera nécéssaire de regrouper différents champs de la table dans une seule et même colonne | ||
233 | |||
234 | //Exemple : concaténer tous les champs de Données intrinsèque d'une notice Stratigraphie dans une seule colonne// | ||
235 | |||
236 | (% style="text-align:center" %) | ||
237 | [[image:1698234060502-846.png]] | ||
238 | |||
239 | De facto il sera judicieux | ||
240 | |||
241 | * de ne pas perdre les libellés de champs (on les indiquera dans **dataBefore**) | ||
242 | * de n'avoir des séparateurs de champs que si un au moins des champs précédents est non vide...sinon le contenu de la colonne commencera par un séparateur (on les indiquera dans **dataJoinSeparator**) | ||
243 | |||
244 | == A minima == | ||
245 | |||
246 | on va donc créer une "boite" qui va assembler les données de la colonne en concaténant les champs cités | ||
247 | |||
248 | **<concat name="donnees_descr_intr label="Données descriptives intrinsèques">** | ||
249 | <field name='TEXTURE' dataBefore='Texture '/> | ||
250 | <field name='STRUCTURE' dataBefore='Structure ' dataJoinSeparator=" ; "/> | ||
251 | <field name='COULEUR' dataBefore='Couleur ' dataJoinSeparator=" ; "/> | ||
252 | <field name='RISQUE_INTRUSION' dataBefore='Risque d_intrusion ' dataJoinSeparator=", " /> | ||
253 | <field name='DESCRIPTION_INTRINSEQUE' dataJoinSeparator="\n"/> | ||
254 | **</concat>** | ||
255 | |||
256 | |||
257 | [[image:1698234916860-664.png]] | ||
258 | |||
259 | == Ajout de données avant - aprés == | ||
260 | |||
261 | Cette "boite" concat est vue comme un "groupe" de données. a ce titre il est possible de lui adjoindre les paramétres suivants | ||
262 | |||
263 | * **groupDataBefore **: donnee avant le groupe | ||
264 | * **groupDataAfter **: donnee apres le groupe | ||
265 | |||
266 | **<concat name="donnees_descr_intr label="Données descriptives intrinsèques"** | ||
267 | |||
268 | **~ groupDataBefore="texte avant le groupe\n"** | ||
269 | |||
270 | **~ groupDataAfter="\ntexte aprés le groupe"** | ||
271 | |||
272 | **>** | ||
273 | <field name='TEXTURE' dataBefore='Texture '/> | ||
274 | <field name='STRUCTURE' dataBefore='Structure ' dataJoinSeparator=" ; "/> | ||
275 | <field name='COULEUR' dataBefore='Couleur ' dataJoinSeparator=" ; "/> | ||
276 | <field name='RISQUE_INTRUSION' dataBefore='Risque d_intrusion ' dataJoinSeparator=", " /> | ||
277 | <field name='DESCRIPTION_INTRINSEQUE' dataJoinSeparator="\n"/> | ||
278 | **</concat>** | ||
279 | |||
280 | //A noter les \n qui se transforment en retour à la ligne dans la colonne et le datajoinSeparator qui poermet de choisir si on veut un point virgule ou un retour ligne entre chaque champs// | ||
281 | |||
282 | [[image:1698235351939-869.png]] | ||
283 | |||
284 | == Ajout de données par défaut entre les champs du groupe == | ||
285 | |||
286 | Dans l'exemple ci-aprés, on a positionnés les séparateurs de champs dans chacun des champs avec le DataJoinSeparator | ||
287 | |||
288 | on pourrait aussi définir une valeur par défaut pour tous les champs du groupe, le **subGroupDataSeparator** ce qui simplifie le paramétrage | ||
289 | |||
290 | <concat name="donnees_descr_intr" label="Données descriptives intrinsèques" | ||
291 | groupDataBefore="texte avant le groupe\n" | ||
292 | groupDataAfter="\ntexte aprés le groupe" | ||
293 | |||
294 | **subGroupDataSeparator=" - champ suivant - "** | ||
295 | |||
296 | **~ > | ||
297 | **<field name='TEXTURE' dataBefore='Texture '/> | ||
298 | <field name='STRUCTURE' dataBefore='Structure ' /> | ||
299 | <field name='COULEUR' dataBefore='Couleur ' /> | ||
300 | <field name='RISQUE_INTRUSION' dataBefore='Risque d_intrusion ' /> | ||
301 | <field name='DESCRIPTION_INTRINSEQUE' **dataJoinSeparator="\n"/>** | ||
302 | **</concat>** | ||
303 | |||
304 | //**A noter : **comme on a conservé un DataJoinSeparator sur le dernier champ (car on voulait un retour ligne dans ce cas),le subGoupDAtaSeparator ne s'y applique pas car ce n'est qu'une valeur par dfaut// | ||
305 | |||
306 | //**résultat obtenu :** Nous avons mis en rouge le subGoupDataSeparator pour bien comprendre qu'il s'applique "à chaque champ", mais pas à chaque valeur d'un champ multivalué. | ||
307 | Dans notre jargon technique on dira que le field dans un concat est un sous-groupoe// | ||
308 | |||
309 | [[image:1698235881598-485.png]] | ||
310 | |||
311 | (% class="box infomessage" %) | ||
312 | ((( | ||
313 | les notions de subGroupDataBefore et subGroupDataAfter peuvent aussi etre paramétrées mais n'ont pas grand intéret dans les concat, elles seront plutôt utilisées dans le cas des blocs répétables | ||
314 | ))) | ||
315 | |||
316 | = Export des champs d'un bloc répétable = | ||
317 | |||
318 | Tout ce qui est décrit ci dessus sera exploitable dans les exports de bloc répétable.Un export de bloc répétable pourra contenir des fields, des linked_field, des concats, des constantes | ||
319 | |||
320 | Globalement il ressemblera beaucoup à un concat, à la différence prés qu'un concat ne se joue qu'une seule fois, alors que le bloc de champs se jouera dans l'export autant de fois qu'il y a de groupe saisis dans la notice courante | ||
321 | |||
322 | (% class="box infomessage" %) | ||
323 | ((( | ||
324 | On peut se representer cela comme une boucle d'éxécution qui tournera tant qu'il existe encore un bloc répété à exporter | ||
325 | ))) | ||
326 | |||
327 | //Exemple avec un bloc de champ répétable contenant 3 champs avec une saisie lacunaire (il est rare que tous les champs soient remplis dans un bloc)// | ||
328 | |||
329 | (% style="text-align:center" %) | ||
330 | [[image:1698249410427-526.png||class="img-thumbnail"]] | ||
331 | |||
332 | le paramétrage de l'export sera défini tel que : | ||
333 | |||
334 | **~ <group_field name="INTERVENANT" | ||
335 | groupDataType = "group" | ||
336 | label = "Intervenants" | ||
337 | groupDataSubGroupSeparator = "\n\n" | ||
338 | \\> ** | ||
339 | |||
340 | **~ <field name='PERSONNE_INTERVENANT' label='Intervenant'/> | ||
341 | <field name='FONCTION_INTERVENANT' label='Fonction ' dataBefore=" (" dataAfter=")"/> | ||
342 | <field name='PRECISION_INTERVENANT' label='Précisions intervenant ' dataJoinSeparator="\n"/> | ||
343 | </group_field>** | ||
344 | |||
345 | et génerera la colonne ci dessous | ||
346 | |||
347 | (% style="text-align:center" %) | ||
348 | [[image:1698249964685-586.png||class="img-thumbnail"]] | ||
349 | |||
350 | (% class="box infomessage" %) | ||
351 | ((( | ||
352 | Les labels des field dans un group_field de type group ne sont pas exportés, nous les conservons pour que le fichier etp soit plus lisible car on ne connait pas toujours les noms internes de champs (name) | ||
353 | Dans ce cas, les "Sous groupe" seront alimentés via une boucle tournant sur chaque occurence de bloc, générant au final une seule colonne | ||
354 | ))) | ||
355 | |||
356 | La nouveauté ici c'est le **groupDataSubGroupSeparator **qui permet de définir le séparateur qui s'exporte **entre chaque sous-groupe** (deux sauts de ligne \n dans le cas présent) | ||
357 | |||
358 | (% class="box infomessage" %) | ||
359 | ((( | ||
360 | Un sous-groupe est un ensemble de champs qui appartiennent a la même entite : au meme bloc de champs (type=set), a la même notice liée ou a la même notice qui référence la notice courante | ||
361 | ))) | ||
362 | |||
363 | Il est possible de choisir un** type= "sous groupe"** | ||
364 | |||
365 | <group_field name="INTERVENANT" | ||
366 | **groupDataType ** = **"SubGroup"** | ||
367 | label = "Intervenants" | ||
368 | ~> | ||
369 | |||
370 | <field name='PERSONNE_INTERVENANT' label='Intervenant'/> | ||
371 | <field name='FONCTION_INTERVENANT' label='Fonction ' dataBefore=" (" dataAfter=")"/> | ||
372 | <field name='PRECISION_INTERVENANT' label='Précisions intervenant ' dataJoinSeparator="\n"/> | ||
373 | </group_field> | ||
374 | |||
375 | (% class="wikigeneratedid" %) | ||
376 | Dans ce cas chaque élément du groupe générera sa propre colonne, donc ce n'est pas trés différent d'avoir positionné ces 3 champs directement dans le template etp, sans tenir compte du group_field, ou bien directement dans un concat, mais avec la contrainte de ne pouvoir y inclure que des champs du bloc répétable courant | ||
377 | |||
378 | |||
379 | A noter que pour les type=SUbGroup le label du group_field est ignoré et que ce sont les labels de chaque élément qui sont pris en compte dans les intitulé de colonne | ||
380 | |||
381 | (% style="text-align:center" %) | ||
382 | [[image:1698308536947-443.png||class="img-thumbnail"]] | ||
383 | |||
384 | |||
385 | == Paramétrages complémentaires pour les blocs répétables == | ||
386 | |||
387 | il est possible d'inclure aussi dans un group_field | ||
388 | |||
389 | * une concaténation formalisée des champs du bloc répétable courant via le tag concat | ||
390 | * des champs des notices liées a un des champs du bloc via le tag 'linked_field' | ||
391 | * des notices qui référencent la notice courante : tag 'reference' pour les liens parent/enfants. ce tag est étudié plus loin dans l'article | ||
392 | |||
393 | === Ajout de données avant - après chaque sous-groupe === | ||
394 | |||
395 | * **subGroupDataBefore **: séparateur avant les données d'un sous-groupe (Chaine vide si non défini) | ||
396 | * **subGroupDataSeparator **: séparateur entre les données d'un sous-groupe (Espace si non défini) | ||
397 | * **subGroupDataAfter **: séparateur après les donnes d'un sous-groupe (Chaine vide si non défini) | ||
398 | |||
399 | === Ajout de données avant - après le groupe === | ||
400 | |||
401 | Uniquement si groupDataType="group" car la colonne unique contiendra une concaténation de tous les sous-groupes en un seul groupe | ||
402 | |||
403 | * **groupDataBefore **: séparateur avant les données du groupe (Chaine vide si non défini) | ||
404 | * **groupDataSubGroupSeparator **: séparateur entre les sous-groupes (' / ' espace slash espace si non défini) | ||
405 | * **groupDataAfter **: séparateur après les données du groupe (Chaine vide si non défini) | ||
406 | |||
407 | === Exemple global === | ||
408 | |||
409 | <**group_field **name="INTERVENANT" | ||
410 | groupDataType = "**group**" | ||
411 | label = "Intervenants" | ||
412 | groupDataBefore = "- texte avant le groupe -\n" | ||
413 | groupDataSubGroupSeparator = "\n{séparateur par défaut entre les sous groupe}\n" | ||
414 | groupDataAfter = "\n-texte aprés le groupe" | ||
415 | subGroupDataBefore = "- texte avant le sousgroupe - " | ||
416 | subGroupDataSeparator = " {séparateur par défaut dans le sous groupe} " | ||
417 | subGroupDataAfter = " - texte aprés avant le sousgroupe -" | ||
418 | \\> | ||
419 | \\ <field name='PERSONNE_INTERVENANT' label='Intervenant'/> | ||
420 | <field name='FONCTION_INTERVENANT' label='Fonction ' dataBefore=" (" dataAfter=")"/> | ||
421 | <field name='PRECISION_INTERVENANT' label='Précisions intervenant ' dataJoinSeparator="\n"/> | ||
422 | </group_field> | ||
423 | |||
424 | (% style="text-align:center" %) | ||
425 | [[image:1698310122900-966.png||class="img-thumbnail"]] | ||
426 | |||
427 | == Filtre sur les données du groupe == | ||
428 | |||
429 | D'un certaine manière un bloc répétable peut être considéré comme une table liée embarquée dans la notice courante | ||
430 | |||
431 | Il sera donc possible de filtrer les occurences d'un bloc répatable en fonction du contenu d'un ou de plusieurs de ces champs avec une syntaxe de type Sql [NOM_DU_CHAMP] opérateur [VALEUR]. De facto seuls les blocs répondant à cette condition seront exportés , les autres seront ignorés | ||
432 | |||
433 | === Masquer des sous-groupes === | ||
434 | |||
435 | //Exemple : je voudrais n'exporter que les blocs Intervenants dont le champ Fonction est rempli// | ||
436 | |||
437 | <**group_field **name="INTERVENANT" | ||
438 | groupDataType = "**group**" | ||
439 | label = "Intervenants" | ||
440 | **subGroupDataFilter **= "(FONCTION_INTERVENANT != null)" | ||
441 | groupDataBefore = "- texte avant le groupe -\n" | ||
442 | groupDataSubGroupSeparator = "\n{séparateur par défaut entre les sous groupe}\n" | ||
443 | groupDataAfter = "\n-texte aprés le groupe" | ||
444 | subGroupDataBefore = "- texte avant le sousgroupe - " | ||
445 | subGroupDataSeparator = " {séparateur par défaut dans le sous groupe} " | ||
446 | subGroupDataAfter = " - texte aprés avant le sousgroupe -" | ||
447 | \\> | ||
448 | <field name='PERSONNE_INTERVENANT' label='Intervenant'/> | ||
449 | <field name='FONCTION_INTERVENANT' label='Fonction ' dataBefore=" (" dataAfter=")"/> | ||
450 | <field name='PRECISION_INTERVENANT' label='Précisions intervenant ' dataJoinSeparator="\n"/> | ||
451 | </group_field> | ||
452 | |||
453 | |||
454 | Seul le bloc n° 2 est exporté | ||
455 | |||
456 | (% style="text-align:center" %) | ||
457 | [[image:1698310843667-475.png||class="img-thumbnail"]] | ||
458 | |||
459 | === Masquer des champs dans un sous-groupe === | ||
460 | |||
461 | //Exemple : je voudrais n'exporter que les blocs Intervenants dont le champ Fonction est rempli// | ||
462 | |||
463 | <group_field name="INTERVENANT" | ||
464 | groupDataType = "**group**" | ||
465 | label = "Intervenants" | ||
466 | groupDataBefore = "- texte avant le groupe -\n" | ||
467 | groupDataSubGroupSeparator = "\n{séparateur par défaut entre les sous groupe}\n" | ||
468 | groupDataAfter = "\n-texte aprés le groupe" | ||
469 | subGroupDataBefore = "- texte avant le sousgroupe - " | ||
470 | subGroupDataSeparator = " {séparateur par défaut dans le sous groupe} " | ||
471 | subGroupDataAfter = " - texte aprés avant le sousgroupe -" | ||
472 | \\> | ||
473 | \\ <field name='PERSONNE_INTERVENANT' label='Intervenant'/> | ||
474 | <field name='FONCTION_INTERVENANT' label='Fonction ' dataBefore=" (" dataAfter=")"/> | ||
475 | <field name='PRECISION_INTERVENANT' label='Précisions intervenant ' dataJoinSeparator="\n" **inputGroupFieldFilter="(FONCTION_INTERVENANT is null)**"/> | ||
476 | </group_field> | ||
477 | |||
478 | dans le lLoc n° 2 le cchamp PRECISIONS_INTERVENANT n'est pas exporté | ||
479 | |||
480 | (% style="text-align:center" %) | ||
481 | [[image:1698311103593-686.png||class="img-thumbnail"]] | ||
482 | |||
483 | === Limiter le nombre de sous-groupe exportés === | ||
484 | |||
485 | (% class="wikigeneratedid" %) | ||
486 | **subGroupDataMultMaxi**="1" fera en sorte que seul le premier bloc sera exporté | ||
487 | |||
488 | (% class="wikigeneratedid" %) | ||
489 | **subGroupDataMultMaxi**="4" fera en sorte que seuls les 4 premiers blocs seront exportés | ||
490 | |||
491 | == Imbrication de groupes == | ||
492 | |||
493 | Il n'y a pas de limite au nombre de niveaux imbriqués, il est donc possible de "suivre" la strucre hiérarchique d'un bloc répétable | ||
494 | |||
495 | Exemple avec les lots archéo | ||
496 | |||
497 | <group_field name="LOT_ELEMENT" | ||
498 | groupDataType = "group" | ||
499 | label = "Archéo - lot" | ||
500 | groupDataSubGroupSeparator = "\n\n" | ||
501 | subGroupDataSeparator = "" | ||
502 | > | ||
503 | <field name='DOMAINE_ELEMENT' /> | ||
504 | <field name='DENOMINATION_ELEMENT' dataJoinSeparator=" ; " /> | ||
505 | <field name='APPELLATION_ELEMENT' dataJoinSeparator=" ; " /> | ||
506 | <field name='TYPOLOGIE_ELEMENT' dataJoinSeparator=" ; " /> | ||
507 | |||
508 | <group_field name="LOT_DENOMBREMENT" | ||
509 | groupDataType = "group" | ||
510 | label = "Element - lot" | ||
511 | groupDataBefore ="\n" | ||
512 | groupDataSubGroupSeparator = " ; " | ||
513 | subGroupDataSeparator = "" | ||
514 | > | ||
515 | <field name='LOT_TYPE_ELEMENT' dataBefore="" /> | ||
516 | <field name='LOT_NB_FRAGMENTS' dataBefore=" (" dataAfter=")"/> | ||
517 | <field name='LOT_QTE_ESTIMEE' dataBefore=" (" dataAfter=")"/> | ||
518 | </group_field> | ||
519 | |||
520 | <field name='ELEMENT_NB_FRAGMENT' dataJoinSeparator="\nNb Tot. " /> | ||
521 | <field name='ELEMENT_NMI' dataJoinSeparator="\nNMI " /> | ||
522 | <field name='ELEMENT_POIDS' dataJoinSeparator="\nPoids " dataAfter=" g" /> | ||
523 | <field name='ELEMENT_PRECISION' dataJoinSeparator="\n" /> | ||
524 | </group_field> | ||
525 | |||
526 | (% style="text-align:center" %) | ||
527 | [[image:1719328382500-862.png||class="img-thumbnail"]] | ||
528 | |||
529 | = Export des via des liens par héritage (référence) = | ||
530 | |||
531 | Des notices qui référencent la notice courante : tag 'reference' | ||
532 | |||
533 | Actuellement ce tag s'appuie sur l'index Q des liens inverses entre table (sans précision du champ qui établit le lien). | ||
534 | |||
535 | ON ne pourra donc pas l'utiliser pour faire remonter la liste des notices filles liées à une notice méré car dans MUS_BIEN plusieurs champs sont liés à MUS_BIEN | ||
536 | |||
537 | (% class="box infomessage" %) | ||
538 | ((( | ||
539 | A noter c'est **compressChar **en entete qui est utilisé comme séparateur de notices liées | ||
540 | ))) | ||
541 | |||
542 | il permettra par exemple de | ||
543 | |||
544 | == lister les notices récolement ou constat d'état liées à un bien dans un export des biens == | ||
545 | |||
546 | <?xml version="1.0" encoding="ISO-8859-1"?> | ||
547 | <export-conf> | ||
548 | <table name="MUS_BIEN" charset="ISO-8859-1" separator="\t"** compressChar="\n" **newLine="\r\n" multiValueSeparator=', ' valueDelimiter='"'> | ||
549 | |||
550 | <field name='UNIQUE_KEY' label='Unique Key'/> | ||
551 | <field name='MUSEE' label='Préfixe'/> | ||
552 | <field name='NUM_INVENTAIRE' label='Numéro D'inventaire'/> | ||
553 | |||
554 | **<reference source='musee' table='MUS_RECOLEMENT'** | ||
555 | groupDataType = "subGroup" | ||
556 | label = "Récolements et localisations" | ||
557 | subGroupDataBefore = "" | ||
558 | subGroupDataSeparator = ", " | ||
559 | subGroupDataAfter = "" > | ||
560 | |||
561 | <field name='ETAT_MODIFIE_LE' label='Réalisé le/> | ||
562 | <field name='ETAT_MODIFIE_PAR' label='Réalisé par/> | ||
563 | **<linked_field name='EMPLACEMENT' label='Emplacement théorique'>** | ||
564 | <field name='LABEL_PARENT' label='Empl. référence hiéra' display='true'/> | ||
565 | </linked_field> | ||
566 | |||
567 | **~ <linked_field name='EMPLACEMENT_NOUVEAU' label='Emplacement nouveau'>** | ||
568 | <field name='LABEL_PARENT' label='Empl. référence hiéra' display='true'/> | ||
569 | </linked_field> | ||
570 | </reference> | ||
571 | |||
572 | |||
573 | Il serait théoriquement possible de filtrer récolement | ||
574 | |||
575 | **subGroupDataFilter **= "(ETAT_AVANCE_RECOL != '6')" | ||
576 | |||
577 | et relocalisations | ||
578 | |||
579 | **subGroupDataFilter **= "(ETAT_AVANCE_RECOL = '6')" | ||
580 | |||
581 | == lister les notices exemplaires liées à une notice bib == | ||
582 | |||
583 | <?xml version="1.0" encoding="ISO-8859-1"?> | ||
584 | <export-conf> | ||
585 | <table name="UNIMARC" charset="ISO-8859-1" separator="\t" compressChar="||" newLine="\r\n" > | ||
586 | |||
587 | .... | ||
588 | |||
589 | <linked_field name='712a'> | ||
590 | <field name='210a' label='712a-Nom' display='true'/> | ||
591 | <field name='210b' label='712a-Subdivision' display='true'/> | ||
592 | </linked_field> | ||
593 | |||
594 | <reference source='system' table='ICOMM_ITEM' | ||
595 | groupDataType = "subGroup" | ||
596 | label = "Exemplaires" | ||
597 | subGroupDataBefore = "{ " | ||
598 | subGroupDataSeparator = ", " | ||
599 | subGroupDataAfter = "}" > | ||
600 | <field name='STATUS' label='EX-STATUS_DISPLAY' display='true'/> | ||
601 | <field name='CODE' label='Ex-CODE' display='false'/> | ||
602 | <field name='SITE' label='Ex-Bibliothèque' display='true'/> | ||
603 | </reference> | ||
604 | |||
605 | |||
606 | == lister les biens liés à un colis == | ||
607 | |||
608 | (% class="box infomessage" %) | ||
609 | ((( | ||
610 | A noter : le tag reference peut imbrique des linked_field, ce qui permet de remonter jusqu'à MUS_BIEN en passant par MUS_JOIN_COLIS | ||
611 | ))) | ||
612 | |||
613 | <?xml version="1.0" encoding="ISO-8859-1"?> | ||
614 | <export-conf> | ||
615 | <table name="MUS_COLIS" charset="ISO-8859-1" separator="\t" **compressChar="\n"** newLine="\r\n" multiValueSeparator=', ' valueDelimiter='"'> | ||
616 | |||
617 | <field name='ETAT_MODIFIE_LE' label='Etat modifié le'/> | ||
618 | <field name='ETAT_AVANCE_COLIS' label='Etat d_avancement'/> | ||
619 | <field name='UNIQUE_KEY' label='Numéro de Code'/> | ||
620 | |||
621 | <linked_field name='LOCATION_REFERENCE' label='Emplacement de référence'> | ||
622 | <field name='LABEL_PARENT' label='Empl. référence hiéra' display='true'/> | ||
623 | </linked_field> | ||
624 | <linked_field name='LOCATION_CURRENT' label='Localisation actuelle '> | ||
625 | <field name='LABEL_PARENT' label='Loc. Actuelle hiéra' display='true'/> | ||
626 | </linked_field> | ||
627 | |||
628 | **<reference source='musee' table='MUS_JOIN_COLIS'** | ||
629 | groupDataType = "subGroup" | ||
630 | label = "Biens liés" | ||
631 | subGroupDataBefore = "" | ||
632 | subGroupDataSeparator = ", " | ||
633 | subGroupDataAfter = "" > | ||
634 | |||
635 | * | ||
636 | ** <linked_field name='BIEN' label='Bien'> | ||
637 | **~ <field name='DISPLAY' label='Bien' display='true'/> | ||
638 | </linked_field> | ||
639 | |||
640 | </reference>** | ||
641 | |||
642 | **<reference source='musee' table='MUS_JOIN_COLIS_MOUV'** | ||
643 | groupDataType = "subGroup" | ||
644 | label = "Biens en mvmnt liés" | ||
645 | subGroupDataBefore = "" | ||
646 | subGroupDataSeparator = ", " | ||
647 | subGroupDataAfter = "" > | ||
648 | **<linked_field name='MOUVEMENT_BIEN' label='Bien'>** | ||
649 | <field name='DISPLAY' label='Bien' display='true'/> | ||
650 | </linked_field> | ||
651 | </reference> | ||
652 | |||
653 | |||
654 | = Autres paramétrages = | ||
655 | |||
656 | == Conversions de dates et datations == | ||
657 | |||
658 | **dataDateFormatDisplay**='yyyy-MM-dd' | ||
659 | |||
660 | dataDateFormatDisplay='yyyy' | ||
661 | |||
662 | ..... | ||
663 | |||
664 | //Cela fonctionne pour les champs dates, time et datation// | ||
665 | |||
666 | time <field name='CREATE_DATE' label='Saisi le' dataDateFormatDisplay='yyyy-MM-dd'/> | ||
667 | |||
668 | date <field name='ETAT_MODIFIE_LE' label='Etat modifié le ' dataDateFormatDisplay='yyyy-MM-dd'/> | ||
669 | |||
670 | datation <field name='DATATION_BIEN_DEBUT' dataDateFormatDisplay='yyyy' /> Pour l'instant les dates Avant Jésus-Christ ne sont pas mentionnées comme telmes quand on applique cette conversion | ||
671 | |||
672 | (% class="box infomessage" %) | ||
673 | ((( | ||
674 | Attention Excel applique ensuite ses propres automates de formatage à l'ouverture du fichier | ||
675 | ))) | ||
676 | |||
677 | == valeur par défaut == | ||
678 | |||
679 | **dataDefValue**="maValeurtextuelle" | ||
680 | |||
681 | si le field, linked_field, concat, group_feld est vide, c'est cette valeur qui sera exportée | ||
682 | |||
683 | //Exemple : utilisé dans l'export e-recolnat pour avoir par défaut la colonne langue = FR sans devoir la saisir dans toutes les notices. si le champ Langue de notice est non vide il écrasera la dataDefValue// | ||
684 | |||
685 | == Données textuelles ajoutées en multilangue == | ||
686 | |||
687 | Flora gére des fichiers de mots clés pour la traduction des labels textuels dans les différentes languies (dans les fichiers *.properties) | ||
688 | |||
689 | [[image:1698311785574-970.png||height="133" width="841"]] | ||
690 | |||
691 | ces mots clés peuvent etre utilisés dans toutes les valeurs textuelles posées dans les tags | ||
692 | |||
693 | //Exemple// | ||
694 | |||
695 | <field name='TYPE_UE' label='Type Unité d_enregistrement ' dataBefore='**${menu.label.inventory} **: '/> | ||
696 | |||
697 | (% style="text-align:center" %) | ||
698 | [[image:1698311964289-353.png||class="img-thumbnail"]] | ||
699 | |||
700 | |||
701 | == Export des liens ark vers les images == | ||
702 | |||
703 | Il est toujorus délicat d'incorporer les images en tant que telles dans une colonne excel ou calc car cela rend enuite le fichier difficile à manipuler, et dans le cas de calc elels ne suivent pas les tris réalisés sur le tableau ce qui rend les onnées incohérentes | ||
704 | |||
705 | de plus sur de gros volumes cela peut générer des fichiers de trop grande taille, surtout si on intégre les images originales au liue de se contenter des imagettes | ||
706 | |||
707 | Nous avons donc choisi de publier les images dans les tablmeurs vai des liens ark | ||
708 | |||
709 | la colonne devra donc etre paramétrée ainsi | ||
710 | |||
711 | **name="PHOTO_INV" **=nom du champ contenant le lien vers la phototheque (si l'export concerne MUS_PHOTO on indiquera UNIQUE_KEY) | ||
712 | |||
713 | **subGroupDataMultMaxi="1" **Nombre de notices photos lues**, **il est recommandé de ne mettre qu'un seul lien ark car de facto le lien sera automatiquemenrt clicable dans excel (aprés avoir cliqué dans la cellule) | ||
714 | |||
715 | **dataMultMaxi="1" **Nombre de fichiers images lus par notice photo, il est recommandé de ne mettre qu'un seul lien ark car de facto le lien sera automatiquemenrt clicable dans excel (aprés avoir cliqué dans la cellule) | ||
716 | |||
717 | **dataBefore="${flora-url}/ark:**" reprendra automatiquement la racine de l'url de votre applucation flora. SI cette url est accessible par internet et que vous avecz activé le service ark sur votre application, la visualisation des uimages sera possible sur tout poste de travail connecté à internet | ||
718 | |||
719 | **dataAfter="/low" **renverra l'imagette, | ||
720 | |||
721 | * si on met** /medium **on aura un fichier de 800 pixels, | ||
722 | * si on met **/high** on aura l'image originale non redimensionnées (mais pas la THDEF) | ||
723 | |||
724 | <linked_field name="PHOTO_INV" | ||
725 | label="Image" | ||
726 | inputRecordFilter="" | ||
727 | groupDataType="group" | ||
728 | subGroupDataSeparator=" ~~ " | ||
729 | subGroupdataMultiValueSeparator="|" | ||
730 | subGroupDataMultMaxi="1" | ||
731 | > | ||
732 | |||
733 | <class_extractor | ||
734 | extractorClassName="com.ezida.services.musee.extractor.MusPhotoArkExtractor" | ||
735 | name="PHOTO_INV_ARK" | ||
736 | label="" | ||
737 | inputRecordFilter="" | ||
738 | |||
739 | dataJoinSeparator="|" | ||
740 | dataMultiValueSeparator="|" | ||
741 | dataMultMaxi="1" | ||
742 | dataBefore="${flora-url}/ark:" | ||
743 | dataDefValue="" | ||
744 | dataAfter="/low"/> | ||
745 | </linked_field> | ||
746 | |||
747 | |||
748 | résultat obtenu.. avec un clic sur le lien ark exporté | ||
749 | |||
750 | (% style="text-align:center" %) | ||
751 | [[image:1698400681257-169.png||class="img-thumbnail"]] | ||
752 | |||
753 | |||
754 | Avec Excel vous pouvez utiliser ce lien ark pour intégrer l'image dans la cellule si vous le souhaitez, mais ce n'est pas automatique. le plus simple est de procéder par copie d'écran partielle | ||
755 | |||
756 | * Touche Impr Ecran de votre ordinateur, | ||
757 | * selection de la zone image à copier, | ||
758 | * puis Edition/coller dans la cellule de votre choix | ||
759 | |||
760 | SI aprés avoir appuyé sur Impr Ecran vous ne pouvez pas selectionner une zone à l'écran, utilisez un outil de capture. dans le présent arcticle nous avons utilisé le freeware Screenpresso | ||
761 | |||
762 | //Note ! La ligne excel ne s'agrandit pas toute seule, à vous de le faire pour garder une bonne lisibilité. Dans Excel, si vous triez les lignes, les images ainsi collées vont suivre (mais pas dans calc de Libre office)// | ||
763 | |||
764 | [[image:1698401052018-622.png]] | ||
765 | |||
766 | |||
767 | |||
768 | |||
769 |