Jérôme CUTRONAJérôme CUTRONA
[email protected]@univ-reims.fr
03:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013 11
PHPPHPInterface base de donnéesInterface base de données
2203:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013
Problème de conception poséProblème de conception posé
Transcription d'un MCD en modèle objet PHP Transcription d'un MCD en modèle objet PHP permettant de manipuler la base de donnéespermettant de manipuler la base de données
Règles de transcription :Règles de transcription : Une entité (attributs) devient une classe (attributs)Une entité (attributs) devient une classe (attributs)
Un enregistrement correspond donc une instanceUn enregistrement correspond donc une instance DF / CIFDF / CIF Associations n,mAssociations n,m
3303:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013
MCD MCD modèle objet : Entité modèle objet : Entité
MCDMCD Modèle objetModèle objet
<?php<?phpclassclass Auteur Auteur {{ privateprivate $$autidautid ; ; privateprivate $$autnomautnom ; ; privateprivate $$autprnautprn ; ; privateprivate $$autnaissautnaiss ; ; privateprivate $$autadrautadr ; ; privateprivate $$autcommautcomm ; ; privateprivate $$autloginautlogin ; ; privateprivate $$autpasswdautpasswd ; ; privateprivate $$autadminautadmin ; ; privateprivate $$autmailautmail ; ;}}?>?>
AuteurAuteur
AUTIDAUTID int(11)int(11)AUTNOM AUTNOM varchar(50)varchar(50)AUTPRN AUTPRN varchar(50)varchar(50)AUTNAISS AUTNAISS int(11)int(11)AUTADR AUTADR varchar(255)varchar(255)AUTCOMM AUTCOMM varchar(255)varchar(255)AUTLOGIN AUTLOGIN varchar(50)varchar(50)AUTPASSWD AUTPASSWD varchar(50)varchar(50)AUTADMIN AUTADMIN smallint(6)smallint(6)AUTMAIL AUTMAIL varchar(150)varchar(150)
4403:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013
MCD MCD modèle objet : DF / CIF modèle objet : DF / CIF
MCDMCD Modèle objetModèle objet<?php<?phpclassclass Departement Departement {{ privateprivate $$depiddepid ; ; privateprivate $$depnomdepnom ; ; privateprivate $$regidregid ; ; privateprivate $$regionregion ; ;
functionfunction getRegion getRegion() …() …}}
classclass Region Region {{ privateprivate $$regidregid ; ; privateprivate $$regnomregnom ; ;
functionfunction getDepartements getDepartements() …() …}}?>?>
DépartementDépartement
DEPIDDEPID int(11)int(11)DEPNOM DEPNOM varchar(50)varchar(50)
RégionRégion
REGIDREGID int(11)int(11)REGNOM REGNOM varchar(50)varchar(50)
AppartenirAppartenir
1,11,1
1,n1,n
5503:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013
MCD MCD modèle objet : Association n,m modèle objet : Association n,m
MCDMCD Modèle objetModèle objet<?php<?phpclassclass Camping Camping {{ privateprivate $$cmpidcmpid ; ; privateprivate $$cmpnomcmpnom ; ; functionfunction getEmplacements getEmplacements() …() … functionfunction getTypePlaces getTypePlaces() …() …}}classclass Emplacements Emplacements {{ privateprivate $$nbPlacesnbPlaces ; ; privateprivate $$cmpidcmpid ; ; privateprivate $$tplidtplid ; ; privateprivate $$campingcamping ; ; privateprivate $$typeplacetypeplace ; ; functionfunction getCamping getCamping() …() … functionfunction getTypePlace getTypePlace() …() …}}......
TypePlaceTypePlace
TPLIDTPLID int(11)int(11)TPLNOM TPLNOM varchar(50)varchar(50)
EmplacementsEmplacementsnbPlacesnbPlaces
1,n1,n
0,n0,n
CampingCamping
CMPIDCMPID int(11)int(11)CMPNOM CMPNOM varchar(50)varchar(50)
6603:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013
MCD MCD modèle objet : Association n,m modèle objet : Association n,m
MCDMCD Modèle objetModèle objet
......classclass TypePlace TypePlace {{ privateprivate $$tplidtplid ; ; privateprivate $$tplnomtplnom ; ; functionfunction getCampings getCampings() …() … functionfunction getEmplacements getEmplacements() …() …}}?>?>
TypePlaceTypePlace
TPLIDTPLID int(11)int(11)TPLNOM TPLNOM varchar(50)varchar(50)
EmplacementsEmplacementsnbPlacesnbPlaces
1,n1,n
0,n0,n
CampingCamping
CMPIDCMPID int(11)int(11)CMPNOM CMPNOM varchar(50)varchar(50)
7703:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013
Problème de conception poséProblème de conception posé
Table AuteurTable Auteur
AUTIDAUTID int(11)int(11)AUTNOM AUTNOM varchar(50)varchar(50)AUTPRN AUTPRN varchar(50)varchar(50)AUTNAISS AUTNAISS int(11)int(11)AUTADR AUTADR varchar(255)varchar(255)AUTCOMM AUTCOMM varchar(255)varchar(255)AUTLOGIN AUTLOGIN varchar(50)varchar(50)AUTPASSWD AUTPASSWD varchar(50)varchar(50)AUTADMIN AUTADMIN smallint(6)smallint(6)AUTMAIL AUTMAIL varchar(150)varchar(150)
<?php<?phpclassclass Auteur Auteur {{ privateprivate $$autidautid ; ; privateprivate $$autnomautnom ; ; privateprivate $$autprnautprn ; ; privateprivate $$autnaissautnaiss ; ; privateprivate $$autadrautadr ; ; privateprivate $$autcommautcomm ; ; privateprivate $$autloginautlogin ; ; privateprivate $$autpasswdautpasswd ; ; privateprivate $$autadminautadmin ; ; privateprivate $$autmailautmail ; ; publicpublic functionfunction __construct __construct((......)) …… publicpublic functionfunction lecture lecture(($$idid)) …… publicpublic functionfunction ecriture ecriture()() ……}}?>?>
8803:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013
Problème de conception poséProblème de conception posé<?php<?phpclassclass Personne Personne {{ privateprivate $$persidpersid ; ; privateprivate $$grpnumgrpnum ; ; privateprivate $$persnompersnom ; ; privateprivate $$persprnmpersprnm ; ; privateprivate $$persadpersad ; ; privateprivate $$perscpperscp ; ; privateprivate $$persvillepersville ; ; privateprivate $$perstelperstel ; ; privateprivate $$persmailpersmail ; ; privateprivate $$persetatpersetat ; ; publicpublic functionfunction __construct __construct((......)) …… publicpublic functionfunction lecture lecture(($$idid)) …… publicpublic functionfunction ecriture ecriture()() ……}}?>?>
Table PersonneTable Personne
PERSIDPERSID int(11)int(11)
GRPNUM GRPNUM int(11)int(11)
PERSNOM PERSNOM varchar(50)varchar(50)
PERSPRNM PERSPRNM varchar(50)varchar(50)
PERSAD PERSAD varchar(100varchar(100))
PERSCP PERSCP varchar(5)varchar(5)
PERSVILLE PERSVILLE varchar(50)varchar(50)
PERSTEL PERSTEL varchar(10)varchar(10)
PERSMAIL PERSMAIL varchar(100varchar(100))
PERSETAT PERSETAT varchar(20)varchar(20)
9903:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013
Approche proposéeApproche proposée
Créer un Créer un modèle des objetsmodèle des objets "ligne BD" "ligne BD" Doivent pouvoir gérer un enregistrement :Doivent pouvoir gérer un enregistrement :
les les valeursvaleurs et leurs et leurs étiquettesétiquettes gestion des gestion des entrées / sorties avec la BDentrées / sorties avec la BD : :
lecture / insertion / mise à jourlecture / insertion / mise à jour accès aux valeursaccès aux valeurs de façon sure de façon sure modification des valeursmodification des valeurs de façon sure de façon sure affichageaffichage production de production de formulaireformulaire d'insertion / modification d'insertion / modification chargementchargement à partir de donnéesà partir de données issues d'un issues d'un
formulaire / de la lecture de la base de donnéesformulaire / de la lecture de la base de données
101003:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013
Conception du modèleConception du modèle
Classe ?Classe ? attributsattributs méthodes concrètesméthodes concrètes pas de méthodes "obligatoires"pas de méthodes "obligatoires"
Classe abstraite ?Classe abstraite ? attributsattributs méthodes concrètesméthodes concrètes méthodes abstraites "obligatoires"méthodes abstraites "obligatoires"
Interface ?Interface ? méthodes "obligatoires"méthodes "obligatoires"
111103:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013
Gestion des attributs (1)Gestion des attributs (1)
Solution classique :Solution classique : ajout de ajout de données membresdonnées membres dans la dans la classe concernéeclasse concernée impossibilitéimpossibilité d'écrire des d'écrire des méthodes génériquesméthodes génériques à un à un
niveau supérieur de la hiérarchieniveau supérieur de la hiérarchie gestion des gestion des étiquettesétiquettes associées aux valeurs associées aux valeurs ??
Approche proposée :Approche proposée : tableau associatiftableau associatif des des valeurs d’une ligne d’une tablevaleurs d’une ligne d’une table
confinementconfinement, , itérationitération, , accèsaccès facilitéfacilité possibilité d'écrire des possibilité d'écrire des méthodes génériquesméthodes génériques tableau associatif tableau associatif des des étiquettes étiquettes associées aux associées aux
valeursvaleurs méthode d'méthode d'initialisation du tableau des valeursinitialisation du tableau des valeurs
121203:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013
Conception du modèleConception du modèle
Classe ?Classe ? attributsattributs méthodes concrètesméthodes concrètes pas de méthodes "obligatoires"pas de méthodes "obligatoires"
Classe abstraite ?Classe abstraite ? attributsattributs méthodes concrètesméthodes concrètes méthodes abstraites "obligatoires"méthodes abstraites "obligatoires"
Interface ?Interface ? méthodes "obligatoires"méthodes "obligatoires"
131303:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013
Constitution d'une Constitution d'une classe génériqueclasse générique : : tableau associatiftableau associatif des des valeursvaleurs
ClésClés = noms des champs de la table= noms des champs de la table ValeursValeurs = valeurs d'une ligne de la table= valeurs d'une ligne de la table
Approche proposéeApproche proposée
class Auteurclass Auteurextendsextends
EnregistrementEnregistrement
AuteurAuteur
EnregistrementEnregistrement
__construct()__construct()initAttributsinitAttributs()()
EnregistrementEnregistrement
__construct()__construct()initAttributsinitAttributs()()
$$valeursvaleurs
cléclé valeurvaleur
$$valeursvaleurs
cléclé valeurvaleur
Création de l'objetCréation de l'objetInitialisation de l'objetInitialisation de l'objet
$$valeursvaleurs
cléclé valeurvaleur
''AUTIDAUTID'' nullnull
''AUTNOMAUTNOM'' nullnull
$$valeursvaleurs
cléclé valeurvaleur
''AUTIDAUTID'' 12341234
''AUTNOMAUTNOM'' ""ZolaZola""Lecture dans la BDLecture dans la BD
141403:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013
Gestion des attributs (2)Gestion des attributs (2)
classclass Enregistrement Enregistrement {{
// Attributs de l'enregistrement// Attributs de l'enregistrement
protectedprotected $$valeursvaleurs == arrayarray()() ;;
/* Initialisation des noms des champs/* Initialisation des noms des champs
qui sont les clés du tableau $valeurs */qui sont les clés du tableau $valeurs */
protectedprotected functionfunction initAttributs initAttributs((
$$_cles_cles /* Tableau des clés *//* Tableau des clés */) {) {
$$thisthis->->valeurs valeurs == arrayarray()() ;;
foreachforeach ((array_keysarray_keys(($$_cles_cles)) asas $$clecle))
$$thisthis->->valeursvaleurs[[$$clecle]] == nullnull ;;
}}
151503:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013
Solutions possibles :Solutions possibles :1.1. Accès R/W par Accès R/W par $$autaut->->valeursvaleurs[[''AUTIDAUTID'']]
2.2. Accès R par Accès R par $$aut-aut->>donnedonne((''AUTIDAUTID''))Accès W par Accès W par $$aut-aut->>affecteaffecte((''AUTIDAUTID', ', 1212))
3.3. Accès R/W par Accès R/W par $$aut-aut->>AUTIDAUTID
AuteurAuteur
Accès aux attributsAccès aux attributs
EnregistrementEnregistrement
__construct()__construct()initAttributsinitAttributs()()
$$valeursvaleurs
''AUTIDAUTID'' 12341234
''AUTNOMAUTNOM'' ""ZolaZola""
•Confinement Confinement •Itération possible Itération possible •Accès sûr Accès sûr ??•Accès simple Accès simple ??
$$valeursvaleurs doit être doit être publicpublic !!
Syntaxe assez lourdeSyntaxe assez lourdeSurcharge de Surcharge de __get()__get() et et __set()__set()
161603:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013
Gestion des attributs (3)Gestion des attributs (3)
/* Surcharge de /* Surcharge de __get__get pour donner accès aux pour donner accès aux valeurs sous la forme $e->un_champs */valeurs sous la forme $e->un_champs */
publicpublic functionfunction __get(__get(
$$_cle_cle /** Nom du champs *//** Nom du champs */)) {{
ifif ((array_key_existsarray_key_exists(($$_cle_cle,,
$$thisthis->->valeursvaleurs))))
returnreturn $$thisthis->->valeursvaleurs[[$$_cle_cle]] ;;
throwthrow newnew ExceptionException((
""Champs 'Champs '$$_cle_cle' inconnu dans '' inconnu dans '""
..get_classget_class(($$thisthis))..""''"")) ;;
}}
171703:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013
Gestion des attributs (4)Gestion des attributs (4)
/* Surcharge de /* Surcharge de __set__set pour donner accès aux pour donner accès aux valeurs sous la forme $e->un_champs=val */valeurs sous la forme $e->un_champs=val */
publicpublic functionfunction __set(__set(
$$_cle_cle /** Nom du champs *//** Nom du champs */,,
$$_val_val /** Nouvelle valeur *//** Nouvelle valeur */)) {{
ifif ((array_key_existsarray_key_exists(($$_cle_cle,,
$$thisthis->->valeursvaleurs))))
returnreturn $$thisthis->->valeursvaleurs[[$$_cle_cle]] == $$_val_val ;;
throwthrow newnew ExceptionException((
""Champs 'Champs '$$_cle_cle' inconnu dans '' inconnu dans '""
..get_classget_class(($$thisthis))..""''"")) ;;
}}
181803:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013
Gestion des étiquettesGestion des étiquettes
ValeursValeurs : : Tableau associatifTableau associatif au niveau de la classe mère au niveau de la classe mère Accès simple à l'aide de Accès simple à l'aide de __get__get et et __set__set Traitements au niveau de la classe mèreTraitements au niveau de la classe mère Méthode d'Méthode d'initialisationinitialisation initAttributsinitAttributs(($$_cles_cles) )
ÉtiquettesÉtiquettes : : Tableau associatifTableau associatif Propriété de la classe mère Propriété de la classe mère ?? Communes à toutes les entités d'une classe dérivéeCommunes à toutes les entités d'une classe dérivée
Attribut statiqueAttribut statique de la classe dérivée de la classe dérivée
Méthode abstraite Méthode abstraite etiquettes()etiquettes() (classe mère)(classe mère)
Utilisable pour l'Utilisable pour l'initialisation des attributsinitialisation des attributs
191903:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013
Définition des méthodes (1)Définition des méthodes (1)
Chargement de données :Chargement de données : à partir de à partir de donnéesdonnées issues d'un issues d'un formulaireformulaire (tableau) (tableau) à partir de la à partir de la lecturelecture de la de la base de donnéesbase de données (tableau) (tableau)
possible si les possible si les clésclés de ces tableaux sont de ces tableaux sont identiquesidentiques à à celles du tableau des valeurscelles du tableau des valeurs
démarche : démarche : pour chaque clépour chaque clé du tableau des valeurs, du tableau des valeurs, sisi cette dernière est cette dernière est présenteprésente dans le tableau des dans le tableau des données fournies alors données fournies alors affecteraffecter la valeur fournie la valeur fournie
implémentationimplémentation possible dans la possible dans la classe mèreclasse mère
202003:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013
Définition des méthodes (2)Définition des méthodes (2)
Lecture BD nécessiteLecture BD nécessite : : de connaître la de connaître la tabletable de connaître la de connaître la clé primaireclé primaire de de transférertransférer les données lues dans les valeurs les données lues dans les valeurs
Écriture BD nécessiteÉcriture BD nécessite : : de connaître la de connaître la tabletable de connaître la de connaître la clé primaireclé primaire de savoir si l'on doit de savoir si l'on doit insérerinsérer ouou mettre à jourmettre à jour la table la table
lecture préalable lecture préalable de disposer des valeursde disposer des valeurs
212103:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013
Définition des méthodes (3)Définition des méthodes (3)
Connaître la tableConnaître la table : : Donnée des classes dérivéesDonnée des classes dérivées A la charge des classes dérivéesA la charge des classes dérivées Obligation d'implémentationObligation d'implémentation
méthode abstraite méthode abstraite table()table() de la classe mère de la classe mère
Connaître la clé primaireConnaître la clé primaire : : Donnée des classes dérivéesDonnée des classes dérivées A la charge des classes dérivéesA la charge des classes dérivées Obligation d'implémentationObligation d'implémentation
méthode abstraite méthode abstraite cle_pri()cle_pri() de la classe mère de la classe mère
222203:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013
Bilan (partiel) des méthodesBilan (partiel) des méthodes
class Auteurclass Auteurextendsextends
EnregistrementEnregistrement
AuteurAuteur
EnregistrementEnregistrementtabletable()()""AuteurAuteur""cle_pricle_pri()()""AUTIDAUTID""etiquettesetiquettes()()……
__construct()__construct()initAttributsinitAttributs()()
lecturelecture()()ecritureecriture()()
$$valeursvaleurs
''AUTIDAUTID'' 12341234
''AUTNOMAUTNOM'' ""ZolaZola""
EnregistrementEnregistrementtabletable()()
cle_pricle_pri()()etiquettesetiquettes()()
__construct()__construct()initAttributsinitAttributs()()
lecturelecture()()ecritureecriture()()
$$valeursvaleurs
cléclé valeurvaleur
232303:24:5403:24:54 Programmation Web 2012-2013Programmation Web 2012-2013
Définition des méthodes (4)Définition des méthodes (4)
LectureLecture : : table / clé primaire connuestable / clé primaire connues SELECT * FROM SELECT * FROM tabletable WHERE WHERE clé_priclé_pri==idid ChargementChargement
ÉcritureÉcriture : : table / clé primaire connuestable / clé primaire connues Si Si idid existe dans la base existe dans la base mise à jour mise à jour SELECT COUNT(*) FROM SELECT COUNT(*) FROM tabletable WHERE WHERE clé_priclé_pri==idid == 1 == 1 UPDATEUPDATE tabletable WHERE WHERE clé_priclé_pri==idid
Sinon Sinon insertion insertion SELECT COUNT(*) FROM SELECT COUNT(*) FROM tabletable WHERE WHERE clé_priclé_pri==idid == 0== 0 INSERTINSERT INTO INTO tabletable
242403:24:5403:24:54 Programmation Web 2012-2013Programmation Web 2012-2013
Définition des méthodes (5)Définition des méthodes (5)
Affichage Affichage :: Peut être fait de façon Peut être fait de façon génériquegénérique grâce au grâce au parcoursparcours
des des attributsattributs etet étiquettesétiquettes Serait plus judicieux d'être Serait plus judicieux d'être spécialiséspécialisé par les classes par les classes
dérivéesdérivées
Production de formulaire Production de formulaire :: Éléments de formulaireÉléments de formulaire et non formulaire complet et non formulaire complet Peut être fait de façon Peut être fait de façon génériquegénérique grâce au grâce au parcoursparcours
des des attributs et étiquettesattributs et étiquettes Serait plus judicieux d'être Serait plus judicieux d'être spécialiséspécialisé par les classes par les classes
dérivéesdérivées
252503:24:5403:24:54 Programmation Web 2012-2013Programmation Web 2012-2013
Bilan (1)Bilan (1)
abstractabstract classclass Enregistrement Enregistrement {{
protectedprotected $$valeursvaleurs == arrayarray()() ;;
abstractabstract publicpublic functionfunction __construct(__construct($$_id_id==nullnull) ) ;;
protectedprotected functionfunction initAttributs initAttributs(($$_cles_cles) { … }) { … }
abstractabstract protectedprotected functionfunction table table() () ;;
abstractabstract protectedprotected functionfunction cle_pri cle_pri()() ;;
abstractabstract public public functionfunction etiquettes etiquettes()() ;;
publicpublic functionfunction etiquette etiquette(($$_cle_cle)) { … }{ … }
publicpublic functionfunction lecture lecture(($$_id_id)) { … }{ … }
publicpublic functionfunction ecriture ecriture() { … } () { … }
publicpublic functionfunction chargement chargement(($$_donnees_donnees)) { … }{ … }
publicpublic functionfunction affichage affichage()() { … }{ … }
publicpublic functionfunction formulaire formulaire() { … }() { … }
262603:24:5403:24:54 Programmation Web 2012-2013Programmation Web 2012-2013
Bilan (2)Bilan (2)
publicpublic functionfunction __get(__get($$_cle_cle) { … }) { … }
publicpublic functionfunction __set(__set($$_cle_cle, , $$_val_val) { … }) { … }
publicpublic functionfunction __isset(__isset($$_cle_cle) { … }) { … }
publicpublic functionfunction __unset(__unset($$_cle_cle)) { … }{ … }
} } // Fin class Enregistrement // Fin class Enregistrement
classclass Etendue Etendue extendsextends Enregistrement Enregistrement {{
constconst table table == " "la_tablela_table" " ;;
constconst cle_pri cle_pri == " "LA_CLE_PRILA_CLE_PRI" " ;;
staticstatic privateprivate $$labelslabels
== arrayarray((''XXXXXXXXXX' ' =>=> ' 'Etiquette XEtiquette X', ...', ...)) ;;
publicpublic functionfunction __construct(__construct($$_id_id==nullnull)) {{
$$thisthis->->initAttributsinitAttributs((selfself::$::$labelslabels)) ;;
ifif (isset((isset($$_id_id))))
$$thisthis->->lecturelecture(($$_id_id)) ; ; }}
272703:24:5403:24:54 Programmation Web 2012-2013Programmation Web 2012-2013
Bilan (3)Bilan (3)
protectedprotected functionfunction table table()() {{
returnreturn selfself::::table table ;;
}}
protectedprotected functionfunction cle_pri cle_pri()() {{
returnreturn selfself::::cle_pri cle_pri ;;
}}
protectedprotected functionfunction etiquettes etiquettes()() {{
returnreturn selfself::$::$labelslabels ;;
}}
publicpublic functionfunction affichage affichage()() { { // ...// ...
}}
publicpublic functionfunction formulaire formulaire()() {{ // ... // ...
}}
} } // Fin class Etendue// Fin class Etendue
282803:24:5403:24:54 Programmation Web 2012-2013Programmation Web 2012-2013
Implémentations plus élaboréesImplémentations plus élaborées
Requête d'informationRequête d'information
Liste des champsListe des champs
Nature des champsNature des champs
Type de cléType de clé