Comment protéger des ensembles d'opérations par des transactions


Introduction
1. Les transactions avec InterBaseExpress (IBX)
Les transactions à plusieurs niveaux
2. Les transactions avec dbExpress
3. Les transactions avec ADO (dbGo)


Introduction


Vous avez certainement entendu parler des transactions : il y a les immobilières, les mobilières et ... les autres. La plupart des SGBD (systèmes de gestion de base de données) dignes de ce nom mettent en œuvre des transactions. Du sens général du mot, on retiendra qu'il y a un échange entre (au moins) deux acteurs qui se conclue par un accord. L'échange a pour but d'établir l'accord. Si l'accord est conclu, l'objet de l'échange est validé (la base est mise à jour), sinon, chacun revient aux conditions initiales (les données sont rétablies à leurs valeurs initiales).

Le mécanisme de transaction est d'abord employé par la base elle-même, en interne, pour maintenir sa cohérence : par exemple lorsque vous avez demandé qu'un index soit maintenu sur une colonne d'une table, à chaque mise à jour, un SGBD correctement construit :

  1. Met à jour la donnée
  2. Met à jour l'index.
Si un problème se pose lors de la mise à jour de l'index, la mise à jour de la donnée est annulée : ou bien toutes les opérations sont effectuées, ou bien aucune.

Ce mécanisme est intéressant bien entendu pour des opérations effectuées au niveau de l'application. Par exemple, dans un schéma volontairement simplifié, on ajoutera une ligne à la facture si l'article est retiré du stock. Supposons que l'article manque en stock, la ligne doit être retirée.

Voyons ceci en détail :

  1. Réservation du stock
  2. Inscription de la ligne de la facture
  3. Acceptation par le client de la ligne au vu de la quantité et du prix
  4. Sortie effective du stock
En mono-poste, pas de problèmes particuliers. En revanche, si l'on travaille en réseau, un autre opérateur peut être en train de vendre le même article. Ce qui peut donner la succession suivante

1° client Etape 2° client
Réservation du stock pour le 1° client 1
2 Réservation du stock pour le 2° client
Inscription de la ligne de la facture 3 Inscription de la ligne de la facture
Acceptation par le client de la ligne au vu de la quantité et du prix 4 Acceptation par le client de la ligne au vu de la quantité et du prix
Sortie effective du stock : le stock est décrémenté 5
6 Tentative de sortie effective du stock mais le stock s'avère insuffisant
Le stock a été définitivement affecté au 1° client à l'étape 5, et, à l'étape 6, le 2° client ne trouve plus ce qui était pourtant disponible à l'étape 2.

Bien sûr on aurait pu procéder à l'affectation dès l'étape 1. Mais, si le 1° client, au vu du prix, refuse la commande, la vente est alors perdue pour le client 2 puisque le stock affecté dès l'étape 1 ne lui est pas disponible à l'étape 2.

Pour éviter cela, on regroupe les séquences d'opération ainsi :

1° client Etape 2° client
Début de transaction 1 Début de transaction
Réservation du stock pour le 1° client 2
Inscription de la ligne de la facture 3
Acceptation par le client de la ligne au vu de la quantité et du prix 4
Sortie effective du stock : le stock est décrémenté 5
Fin de transaction 6 Fin de transaction
Début de transaction 7 Début de transaction
8 Réservation du stock pour le 2° client
9 Inscription de la ligne de la facture
10 Acceptation par le client de la ligne au vu de la quantité et du prix
11 Sortie effective du stock : le stock est décrémenté
Fin de transaction 12 Fin de transaction
Chacun des deux groupes sera isolé au sein de ce que l'on appellera une transaction.
La transaction est visible pour tous les clients, c'est ce qu'indiquent les marques de début et de fin de transaction dans chaque colonne.

Nous remarquons que c'est au niveau de l'application que doivent être délimitées les transactions : c'est le développeur qui définit les opérations qui constituent une transaction.

Dans la pratique, on évitera de mettre dans la transaction des actions d'attente de la décision des clients.
De plus, les SGBD utilisent des méthodes plus sophistiquées que la sérialisation des transactions telle qu'elle est induite du tableau : attendre d'avoir fini le 1° client pour traiter le 2° client introduit des goulots d'étranglement très pénalisant. Mais pour la compréhension logique de ce qui se passe, la présentation ci-dessus est suffisamment simple et complète.

Dans le langage SQL, on dispose d'un ordre pour démarrer et de deux ordres pour terminer une transaction.
Pour le début de transaction, on utilise SET TRANSACTION, tandis que pour la fin de transaction, on utilise COMMIT (ou ROLLBACK) selon que l'on valide (ou invalide) les modifications de la base effectuées au cours de la transaction.
Ces ordres seront mis en œuvre directement par le programmeur ou par l'intermédiaire de composants qui le feront pour lui.

Nous allons en voir l'application dans 3 cas :


1. Les transactions avec InterBaseExpress (IBX)


Avant de commencer à parler de nos transactions, il faut souligner que toutes les opérations effectuées avec les IBX sont d'ores et déjà inscrite dans une transaction fondamentale. Cette transaction fondamentale a pour effet de faire apparaître la base de données à chacun, comme s'il en était le seul utilisateur.
Dans ces conditions, on voit mal comment on pourrait mettre en œuvre des transactions fines, puisque tout ce que fait un utilisateur en lecture et en écriture est isolé dans la transaction fondamentale.
Eh bien cela est possible si l'on paramètre correctement la transaction fondamentale en donnant à la propriété Params d'IBTransaction1 les valeurs

IBTransaction1
Params ... read_committed
rec_version
nowait

read_committed permet à la transaction de voir les valeurs validées par les autres transactions (notamment d'autres utilisateurs) et même de mettre à jour ces valeurs à son tour.

TIBTransaction propose des méthodes qui exécutent les ordres SQL vus ci-dessus. Ce sont

StartTransaction 
Commit
Rollback
Cependant l'inconvénient de Commit et de Rollback c'est qu'ils obligent à réactiver la transaction. Cela est coûteux, pour une simple mise à jour.
Heureusement, nous avons à disposition une variation de ces commandes qui maintient la transaction ouverte. Ce sont

CommitRetaining
RollbackRetaining
Voyons maintenant comment programmer notre transaction

Plaçons sur un Data Module un composant TIBDatabase et TIBTransaction

Nous relions les deux composants en indiquant les propriétés

IBDatabase1.DefaultTransaction = IBTransaction1 IBTransaction1.DefaultDatabase = IBDatabase1
et mettons IBTransaction1.Params comme indiqué plus haut à read_committed, rec_version et nowait

Note : Nous ne détaillons ici que ce qui est en rapport avec les transactions.
.

Voyons la séquence de validation de la ligne de commande (qui peut se trouver dans le gestionnaire d'événement d'un bouton de la Form).

procedure ReservationDeLigne;
begin
try

IBTransaction1.CommitRetaining; //Début de la transaction
if StockSuffisant then
InsererLaLigne
else
Abort;
if AcceptationDeLaLigne then
SortieEffectiveDuStock
else
Abort;
IBTransaction1.CommitRetaining; //Fin normale de la transaction
except
IBTransaction1.RollbackRetaining; //Fin anormale de la transaction
end
end;
Cette méthode est en fait une succession de validations de la transaction fondamentale. Le premier CommitRetaining a pour but de marquer le point de départ auquel on reviendrait en cas de RollbackRetaining.


Les transactions à plusieurs niveaux


Lorsque l'on écrit des transactions, celles-ci peuvent se trouver incluses ultérieurement dans un transaction plus globale.
Par exemple, nous avons une transaction pour une ligne de la facture.
Mais il est tout à fait possible d'avoir également une transaction globale au niveau de la facture au sein de laquelle se produisent les transactions au niveau de chaque ligne.
Nous allons mettre en place une méthode qui prend cela en compte d'une manière très intéressante.
En écrivant différemment la procédure ci-dessus, nous n'aurons même pas besoin de la modifier le jour où elle se trouve prise dans une transaction globale (et ceci, quel que soit le nombre de transaction globale que nous serions amenés à emboîter par la suite).

Tout d'abord nous ajoutons la propriété NiveauDeTransaction en lecture seule dans le DataModule :

private
FNiveauDeTransaction: Integer;
public
property NiveauDeTransaction : Integer read FNiveauDeTransaction;
Ceci nous permettra de gérer en interne du DataModule le niveau de transaction et de savoir à l'extérieur du DataModule si nous sommes ou non dans une transaction.

Maintenant, pour gérer nos transactions, en tout point de l'application, nous allons créer 3 procédures publiques dans le DataModule.

public procedure TransactionStart; procedure TransactionCommit; procedure TransactionRollback; implementation procedure TransactionStart; begin if FNiveauDeTransaction = 0 then IBTransaction1.CommitRetaining; Inc(FNiveauDeTransaction); end procedure TransactionCommit; begin if FNiveauDeTransaction > 0 then Dec(FNiveauDeTransaction); if FNiveauDeTransaction = 0 then IBTransaction1.CommitRetaining; end procedure TransactionRollback; begin if FNiveauDeTransaction > 0 then IBTransaction1.RollbackRetaining; FNiveauDeTransaction := 0; end
Bien entendu, nous nous interdisons désormais de faire appel à IBTransaction1. Pour gérer nos transactions, nous ferons désormais appel exclusivement aux 3 procédures ci-dessus.

Note : Comme vous pouvez le constater, la procédure TransactionStart ne met pas en œuvre IBTransaction1.StartTransaction comme on pourrait s'y attendre. En effet, nous ne créons pas de nouvelles transactions. Mais nous nous appuyons sur la transaction fondamentale (voir plus haut). Chaque Commit intervient comme un point de validation de cette transaction. C'est pourquoi on le trouve dans procedure TransactionStart; et dans procedure TransactionCommit;

Par exemple, la réservation de la ligne de facture s'écrit maintenant :

function ReservationDeLigne : boolean; begin Result := True; try DataModule1.TransactionStart; //Début de la transaction if StockSuffisant then InsererLaLigne else Abort; if AcceptationDeLaLigne then SortieEffectiveDuStock else Abort; DataModule1.TransactionCommit; //Fin normale de la transaction except DataModule1.TransactionRollback; //Fin anormale de la transaction Result := False; end end;
Supposons maintenant que la ligne de facture ne sera définitivement validée que lorsque la facture sera validée dans son ensemble.
Par exemple, si nous achetons un parquet à poser avec de la colle, ou nous prenons l'ensemble, ou rien.
Le client peut également décider d'annuler, au vu du prix.

Donc nos transactions élémentaires se trouvent maintenant incluses dans une transaction globale au niveau de la facturation. (Nous avons dit au début que nous simplifions en ayant une seule opération pour la commande et la facture).

function Facturation : boolean; begin Result := True; try DataModule1.TransactionStart; //Début de la transaction repeat if not ReservationDeLigne then Abort; until DerniereLigne; DataModule1.TransactionCommit; //Fin normale de la transaction except DataModule1.TransactionRollback; //Fin anormale de la transaction Result := False; end end;
Nous remarquons que nos transactions au niveau des lignes n'ont pas été modifiées lorsque nous les avons englobées dans la transaction au niveau de la facture.
De même, si nous devons englober un jour la transaction du niveau de la facture dans une transaction d'ensemble, nos procédures ne seront pas à modifier.

Un dernier mot sur l'incidence des commandes Retaining utilisées de manière répétée : elles ne laissent pas la base de données InterBase dans un état optimum. C'est pourquoi, il est souhaitable de faire tourner les utilitaires d'InterBase de manière régulière


2. Les transactions avec dbExpress


(en préparation)


3. Les transactions avec ADO (dbGo)


Avec ADO, nous disposons de la gestion explicite des transactions dans TADOConnection ainsi que nous le voyons dans l'exemple ci-dessous.

procedure ReservationDeLigne; begin try ADOConnection1.BeginTrans; //Début de la transaction if StockSuffisant then InsererLaLigne else Abort; if AcceptationDeLaLigne then SortieEffectiveDuStock else Abort; ADOConnection1.CommitTrans; //Fin normale de la transaction except ADOConnection1.RollbackTrans; //Fin anormale de la transaction end end;
Dans ce tutoriel, nous avons vu comment protéger des ensembles d'opérations par des transactions.

Réunion de travail à la Société Descartes

 Créée en 1985, la société Descartes se consacre au développement de solutions de gestion et de communication.


Ses principaux clients sont :
  • les grands comptes (France Télécom, La Poste, SNCF, ...) pour lesquels la société DESCARTES développe des applications verticales de métiers, ensuite largement diffusées
  • les PME-PMI
  • les Associations, Fédérations et Syndicats professionnels.
Actuellement, les logiciels de la gamme Descartes sont utilisés par des associations de quelques dizaines de membres à plusieurs milliers de membres et qui gèrent des budgets qui vont de quelques centaines d'Euros à plusieurs millions d'Euros.

Notre environnement de développement est Windows pour les postes clients et Linux pour les serveurs Internet.

En plus de ces développements, nous sommes régulièrement consultés au sein même de la profession informatique :
  • dans le champ Microsoft, nous avons apporté notre savoir-faire à la révision technique de «Professionnal Business Objects», «Professionnal Distributed Objects», «Enterprise Application Architecture» parus chez Wrox
     
  • dans le champ Borland devenu CodeGear, il est régulièrement fait appel à notre expertise, notamment au sein de l’ Association d’entraide des développeurs francophones ou dans des conférences professionnelles.


La société Descartes est également organisme de formation agréé.

Alexa

Collectivités locales et associations
Thumbnail image of descartes.frDescartes
Logiciels de gestion des adhérents et de comptabilité pour les collectivités locales, associations et syndicats.
www.descartes.fr
Site info for descartes.fr Site Info icon

APCE

Agence Pour la Création d'Entreprises

Liste des logiciels de comptabilité
pour associations

Mac

Prix
indicatifs en HT

Associé à d'autres applications

Remarques

Descartes Compta

 

99 '

X

- Logiciel de comptabilité complet :
journaux, grand livre, balance, comptes de résultat et bilan.


Apéros-Assos

Rencontres-débats mensuelles des acteurs de la vie associative sont organisées par Masterima avec le partenariat du mensuel "Association mode d'emploi", du CJDES (Centre des Jeunes Dirigeants de l'Economie Sociale), de la CPCA (Conférence Permanente des Coordinations Associatives), du Groupe SOS, de "Juris Associations" et du "Monde des Initiatives".
DESCARTES présente le logiciel de gestion créé pour les associations loi 1901. Site Internet : www.descartes.fr

Google

Annuaire : Collectivités locales et associations
Descartes - http://www.descartes.fr
Logiciels de gestion des adhérents et de comptabilité pour les collectivités locales, associations et syndicats.

Informatique.es

Annuaire Professionnel
Descartes
http://www.descartes.fr

Logiciels de gestion des adherents et de comptabilite pour les collectivites locales, associations et syndicats.


Links-AZ

Web Directory
Descartes
Logiciels de gestion des adhérents et de comptabilité pour les collectivités locales, associations et syndicats.
http://www.descartes.fr

unQuebec

plus qu'un simple moteur de recherche
Thumbnail image of descartes.frDescartes
Logiciels de gestion des adhérents et de comptabilité pour les collectivités locales, associations et syndicats. [Site en français]

XMC

X-Mines-Consult : l'expérience de 500 ingénieurs
DESCARTES réalise des outils logiciels pour les Associations en exploitant toutes les possibilités du Content Management System à partir de logiciels libres.

YEBA

Portail des associations de Provence - Alpes - Côte d'Azur

La solution Descartes pour les associations

Cette solution se compose de Descartes Fédéral (gestion des adhérents) et Descartes Compta (comptabilité générale, analytique, immobilisations, budgétaire et prévisionnelle, interfaçable avec Fédéral).


zoozne

Thumbnail image of descartes.fr Descartes
Logiciels de gestion des adhérents et de comptabilité pour les collectivités locales, associations et syndicats.
www.descartes.fr
Site info for descartes.frSite Info icon

 

L'organisation des équipes et le process de développement est basé chez Descartes sur 4 pôles

  1. L'équipe de développement
  2. L'équipe de tests
  3. L'équipe d'intégration
  4. L'équipe de production

Une fois le cahier des charges établi avec le client, celui-ci est fourni à l'équipe de développement.
Celle construit une maquette qui est présentée au client pour validation.

L'objectif est de disposer de toute la précision nécessaire aussi tôt que possible : il est plus facile de déplacer une fenêtre sur un plan qu'une fois la maison construite.
Dans le même ordre d'idée, l'emplacement est moins déterminé par les autres éléments dans la phase du plus de masse que dans la phase suivante du plan de détails.

La maquette une fois adaptée et approuvée, nous construisons un jeu de données couvrant le maximum de situations possibles (simple visiteur enregsitré / membre / rédacteur / éditeur / organisateur / adminsitrateur par exemple).

L'équipe de développement dispose de ses outils et vient puiser auprès des testeurs tout ou partie de l'environnement qu'elle juge utilie.

L'équipe de tests repart à chaque campagne de test d'un environnement identique à l'environnement de production.

Les éléments testés qui nécessitent un complément d'adaptation technique sont retournés à l'équipe de développement.
Ceux qui ont passés tous les tests unitaires de détails et fonctionnels d'ensembles soint envoyés à l'équipe d'intégration.

L'équipe d'intégration procède à une ultime vérification dans un environnement de pré-production identique à l'environnement de production tant au niveau applicatif qu'au niveau des données.

Une fois l'intégration réussie, celle-ce est montrée au client qui l'approuve.

Elle est alors mise en production.

 

Nous réalisons des sites Web sur-mesure.

Voici quelques unes de nos réalisations récentes :

 

Site Collet Consulting
Ce site réalisé par Descartes permet à cet expert en transports aériens et en aéroports de se faire une belle place sur Internet
Collet-Consulting.com

 

Site X-Mines-Consult
Ce site réalisé par Descartes permet à cette association de plus de 500 ingénieurs d'organiser missions, réunions et communications.
X-Mines-Consult.com

 

Site management-asociatif
Ce site, réalisé par Descartes en collaboratin avec le consultant Internet Rémy Birambeau ,
permet à l'association du Management Associatif de recruter les participants aux formations.

management-associatif.org

 

Nous assurons la prestation complète
de la conception à la réalisation,
ainsi que la mise en ligne, l'hébergement, l'assistance, la maintenance et le référencement.


 

 

texte on a texte

Nous mettons à disposition des outils de travail collaboratif :
  • Lire et partager des emails
  • Gérer et partager des contacts
  • Planifier et partager calendrier et rendez-vous
  • Organiser et superviser des projets en équipe
  • Gérer, assigner et partager des tâches
  • Centraliser et partager vos documents
  • Rédiger à plusieurs
  • Relier les travaux en un document unique

Si vous êtes intéressé(e), contactez-nous

Nous pensons que c'est la volonté politique de développement de la fédération ou de l'association qui préside à l'ensemble de la démarche associative : la projection sur le terrain sera différente selon que l'on souhaite renforcer la centralisation ou la décentralisation et les outils doivent être adaptés à chaque cas.

Ils doivent également s'intégrer de manière cohérente avec :
o la communication de l'association,
o la gestion quotidienne,
o et la vision stratégique à long terme,
o tout en tenant compte de l'existant.


Nous vous proposons l'organisation qui prend en compte vos objectifs
au mieux de vos intérêts politiques, humains, matériels et budgétaires.

Nous sommes capables de mobiliser rapidement une équipe pluri-disciplinaire rassemblant les meilleurs spécialistes capables de répondre à votre demande
  • en management
  • en organisation
  • en communication

Nous sommes capables de mobiliser rapidement une équipe pluri-disciplinaire rassemblant les meilleurs spécialistes capables de répondre à votre demande
  • en management
  • en organisation
  • en communication

Descartes intervient avec des consultants de haut niveau, spécialement formés au management des associations

A d h é r e n t s



Utilisation courante de Fédéral 1 j.

Dans ce stage d'une journée, les utilisateurs apprennent à saisir les données dans Fédéral, à imprimer les états et à faire les sauvegardes.


Création d'états dans Fédéral 1 j.

Il s'agit d'apprendre dans cette journée à modifier et adapter la présentation des états existants et à créer de nouveaux états.


Création de requêtes dans Fédéral 1 j.

Dans ce stage d'une journée, il s'agit de connaître les nombreuses possibilités d'interrogation du fichier, pour répondre aux questions les plus précises.

C o m p t a b i l i t é

Formation à Descartes Compta
Organisation de la saisie comptable 1 j.
Cette journée permet aux utilisateurs de préparer leurs saisies et de saisir, puis classer les documents comptables pour retrouver facilement tout élément.
o Saisie des écritures par journaux et par exercice.
o Impression des états.
o Rapprochement de banque et lettrage des pièces.

Opérations de clôture de l'exercice 1 j.
Dans cette journée, les utilisateurs apprennent à mener les opérations de clôture de l'exercice comptable :
o Vérifications préalables à la clôture.
o Impresssion des documents de clôture.
o Archivage des données et ouverture de l'exercice suivant.




Utilisation concertée de la bureautique 1 j.
Dans ce stage d'une journée, il s'agit de permettre aux utilisateurs d'être efficace avec leur traitement de texte et leur tableur, en harmonie avec les logiciels Descartes :

o Publipostage dans Word à partir des données de Fédéral.
o Présentation de rapport dans Excel à partir des résultats comptables.
o Envoi d'e-mails à partir des données de Fédéral

La matinée pour construire son site Web
24 juin

Après une présentation d'ensemble
  • permettant à chacun de mettre en ligne son contenu,

nous vous guiderons individuellement dans
  • la réalisation de votre site
    à partir de votre ordinateur portable (1)


animé par Henri Cesbron Lavau,
assisté de Michel Coudreuse.

Cette matinée a été très appréciée. En voici quelques témoignages :

J’ai bien apprécié la session de formation collective que vous avez animée en compagnie de Michel Coudreuse le 23 juin dernier sur la conception de sites Web avec l’outil Joomla.

C’était concret, clair, et je vois beaucoup mieux comment je vais pouvoir concevoir mon site, en vous en confiant d'ailleurs la réalisation et l’hébergement dans le cadre de votre proposition de service dont le rapport qualité/prix est attractif.

PC² - Philippe Copello Consulting


Merci encore pour la session de formation de ce matin. En peu de temps vous avez réussi à me convaincre que mon objectif est atteignable. Si je confie le développement initial de mon site ainsi que son hébergement à Descartes, je serai sans doute en mesure d'en assurer par moi-même l'évolution. Il faut bien sûr que je poursuive l'effort d'apprentissage,effort à ma portée sans doute. En tous les cas vous avez pu aborder toutes les notions requises en une matinée. Merci également pour la générosité de votre offre.

Pierre Nassif

Participation : 125 EHT (TTC si à titre individuel)

8 participants max. pour 2 animateurs 8h45-12h30 Paris 2°

Inscrivez vous en cliquant sur ce lien :
E-mail: Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.

(1) Si vous le souhaitez, nous pouvons vous fournir un ordinateur pour la matinée.

Organisme de formation n° 11750918075

Le 5 avril nous avons participé à notre premier BarCamp à La Cantine Paris 2°.

Un BarCamp est en quelque sorte l'auberge espagnole de la réunion de teckies, version réseau social : chacun y trouve ce qu'il apporte aux autres.
En fait, cette formule nous vient des Etats-Unis où ses règles de fonctionnement ont été décrites.


L'ambiance très stimulante permet d'échanger rapidement les informations les plus récentes sur les technologies émergentes

L’AFUP (Association Française des Utilisateurs de PHP) dont nous sommes membre actif a organisé le samedi 7 juin son premier PhpCamp.

Il s'est tenu à La Cantine, un espace ouvert à tous, 151 rue Montmartre Paris 2° de 10h00 à 18h00 où nous nous sommes retrouvés.

Il s'agissait d'un BarCamp, c'est à dire d'un rendez-vous de professionnels au cours duquel :

- chacun des 40 participants s'est présenté en 3 mots (étiquettes ou tags), le plus souvent centrés sur le PHP, mais ouverts à la sérendipité (terme qui a circulé). Ainsi on a eut : PHP, Zend framework, RIA (Rich Internet Application), ORM (Object Relatioal Mapping), mais aussi environnements de développements ... des ressources durables

- les propositions de sujets à traiter ont été mises en commun et organisées sur un tableau : certains directement issus des tags comme ORM, RIA, Framewrok, d'autres venants des propositions faites ensuite par les participants comme Bug Tracking, Développement IDE, etc.

- les groupes de présentation / discussion se sont ensuite formés au fil des heures et en fonction des sujets dans les divers pôles de La Cantine. Il y avait 2, parfois 3 sujets simultanés, ce qui impliquait de choisir.

Chacun apportait son retour d'expérience ou simplement ses questions. Les conclusions furent souvent nuancées. Ce qui a été très intéressant, c'est d'avoir eu l'occasion de bien saisir le contexte de leurs validités au fil des nombreux échanges de la journée et de repartir avec une quantité impressionnante de liens et de contacts.

Sous-catégories

Cet article permet de faire pointer vers lui le menu Gestion. Mais, du fait de la programmation de l'index.php du template, l'article n'est pas affiché : en lieu et place, c'est le module Jumi qui s'affiche.