Introduction▲
L'intérêt de cette note technique (et du composant OCI Mapper) est double :
· pour les bases de données utilisant 4D for Oracle, OCI Mapper offre une transition de 4D for Oracle à 4D for OCI sans aucune modification du code source ;
· pour les développeurs qui utilisent 4D for OCI ou la programmation OCI en général pour la 1re fois, OCI Mapper montre comment implémenter une couche qui contienne des commandes d'un niveau supérieur par rapport à celles plus bas niveau de 4D for OCI.
Les développeurs 4D for Oracle devraient tirer profit, dans cette note technique, des comparaisons entre les commandes 4D for Oracle et les commandes 4D for OCI, ainsi qu'une solide introduction à la programmation 4D for OCI, via le composant OCI Mapper.
Les développeurs 4D for OCI devraient trouver OCI Mapper utile en tant qu'exemple d'implémentation d'une couche, à la manière d'une API, pour un développement 4D for OCI. En mettant à jour OCI Mapper, on a essayé de corriger les problèmes antérieurs et aussi de clarifier l'architecture du composant, en quoi il diffère de 4D for Oracle, et quels points mériteraient une amélioration. Le composant OCI Mapper est fourni en «open source». Le développeur est libre d'y apporter toutes modifications ; en fait, il y est même invité.
Il faut noter que la majorité des modifications apportées à OCI Mapper sont documentées dans le code.
Il faut aussi noter que, pour ne couvrir des sujets déjà abordés dans la précédente note technique, les comparaisons de performance entre 4D for Oracle et 4D for OCI ne sont pas reprises dans cette note. Consultez la note 03-44 citée plus haut pour les comparaisons de performances entre les 2 plugins.
Aperçu de 4D for Oracle et 4D for OCI▲
Adapté de la note technique 03-44, “Migrating from 4D for Oracle to 4D for OCI using OCI Mapper”.
4D for Oracle et 4D for OCI sont des plugins de connectivité. Ils fournissent tous deux un ensemble de commandes externes qui permettent à 4e Dimension de communiquer avec des bases de données Oracle.
Leurs fonctionnalités premières sont d'afficher, manipuler et modifier les données stockées dans une base de données Oracle. La combinaison de ces deux plugins avec l'interface de développement de 4e Dimension offre un environnement de création d'applications frontales pour des bases de données Oracle.
Cependant, les deux plugins diffèrent dans le niveau de support de 4D et d'Oracle :
Supports |
4D for Oracle |
4D for OCI |
---|---|---|
4D 2004 |
Non |
Oui |
Commandes Haut Niveau |
Oui |
Non |
Commandes Bas Niveau |
Certaines commandes |
Oui |
Pilote OCI/Client Oracle |
Version 7.x ou 8.x |
Version 8.1.6 ou supérieure |
Il faut remarquer qu'avec 4D 2004, 4D for OCI s'impose pour le développement orienté Oracle. En même temps, les commandes haut niveau qui existent dans 4D for Oracle, ne sont plus supportées.
Avantage à utiliser 4D for OCI à la place de 4D for Oracle▲
Pourquoi utiliser 4D for OCI au lieu de 4D for Oracle ?▲
Une raison simple est, bien sûr, que 4D for Oracle n'est plus supporté dans la version récente de 4e Dimension (2004). Cependant, des raisons plus pertinentes existent.
4D for Oracle fournit beaucoup de commandes haut niveau et bas niveau, qui permettent au développeur d'exécuter des tâches très variées. En même temps, l'architecture de 4D for Oracle est restrictive, puisqu'elle ne permet pas au développeur d'influencer le fonctionnement des commandes.
Quant à 4D for OCI, il fournit des commandes très bas niveau qui permettent au développeur d'implémenter des solutions sur mesure.
bas niveau
Parce que 4D for OCI offre une souplesse et des commandes bas niveau, le développeur a une maîtrise de la programmation Oracle.
Il est aussi montré dans la note technique 03-44 que le code 4D for OCI s'exécute plus rapidement que celui avec 4D for Oracle.
Dans quel cadre s'intègre OCI ?▲
L'inconvénient dans l'utilisation de 4D for OCI provient aussi de sa puissance : les commandes bas niveau.
Développer une base en n'utilisant que des commandes bas niveau représente un énorme travail de codage.
Il est préférable d' « emballer » les commandes OCI dans une couche, façon API, qui convienne au projet envisagé. OCI Mapper représente l'une de ces couches.
Introduction à OCI Mapper▲
OCI Mapper est une couche qui imite les commandes haut niveau de 4D for Oracle.
OCI Mapper est fourni sous la forme d'un composant 4D (incluant le code source).
Les méthodes y sont implémentées en utilisant les commandes et 4D for OCI.
Architecture▲
Voici comment OCI Mapper s'intègre dans un développement orienté Oracle :
Dans le schéma ci-dessus, le framework est fourni par le développeur, le plugin par 4D, et l' API par Oracle.
OCI Mapper 2004.3 en profondeur▲
OCI Mapper 2004.3 apporte une multitude de corrections et d'améliorations par rapport à la version d'origine.
Dans cette section, nous apportons un éclairage sur cette mise à jour ainsi que des informations importantes pour les développeurs 4D for Oracle et 4D for OCI.
Développeurs 4D for Oracle▲
La raison d'être de OCI Mapper pour les développeurs 4D for Oracle, est de leur offrir un moyen de passer de 4D 2003 à 4D 2004, donc de 4D for Oracle à 4D for OCI, sans modification aucune du code source. OCI Mapper utilise les mêmes noms de commandes que 4D for Oracle, et reproduit le comportement de ces commandes.
L'idée est de permettre à l'ancienne base 4D for Oracle d'être prête et exploitable avec 4D for OCI aussi rapidement que possible.
Le deuxième but de OCI Mapper est de montrer aux développeurs 4D for Oracle la différence de programmation entre 4D for OCI et 4D for Oracle.
Il est donc recommandé de voir OCI Mapper non comme une solution, mais comme un moyen didactique.
Développeurs 4D for OCI▲
Le but principal de OCI Mapper pour les développeurs 4D for OCI est de leur fournir un exemple d'implémentation d'un framework qui enveloppe les commandes 4D for OCI dans un jeu de commandes haut niveau.
Encore une fois, OCI Mapper ne doit pas être considéré comme une solution, mais comme un outil d'apprentissage.
Notes importantes pour OCI Mapper 2004.3▲
Cette section met en lumière les limites de OCI Mapper.
Curseurs simultanés
Alors que OCI Mapper fournit la possibilité d'avoir plusieurs curseurs simultanément (l'état des curseurs est stocké dans des tableaux), il ne fournit pas celle d'avoir plusieurs ensembles de paramètres en sortie, pour la récupération des données.
Par exemple, supposons 2 curseurs curseur1 et curseur2 :
Définir les paramètres en sortie pour curseur1.
Définir les paramètres en sortie pour curseur2.
Exécuter curseur1.
Naviguer dans le résultat.
Dans ce cas, le résultat est retourné dans les paramètres de sortie de curseur2, et non de curseur1. Au lieu de cela, il aurait fallu :
Définir les paramètres en sortie pour curseur1.
Exécuter curseur1.
Naviguer dans le résultat.
Fermer curseur1.
Répéter les étapes pour curseur2.
Cependant, le développeur est libre de modifier OCI Mapper en vue d'implémenter plusieurs ensembles de paramètres en sortie.
Gestion des erreurs▲
Il y a des cas dans le code de OCI Mapper où les appels 4D for OCI sont exécutés sans être suivis de code de gestion d'erreur. Cependant, dans ces cas-là, il est important de comprendre que lorsqu'une erreur s'est produite, il est probable qu'il s'agisse d'un défaut dans la conception de OCI Mapper.
Ceci est différent de la gestion standard d'erreurs où il s'agit de rediriger le code si le comportement « normal » ne s'est pas produit.
À des fins de débogage, il est souvent utile d'installer une gestion d'erreur personnalisée en utilisant OD ON ERROR CALL (la méthode CheckError devra être utilisée). De cette façon, dès qu'une erreur 4D for OCI se produit, la gestion d'erreur installée la traitera.
De plus, comme précisé auparavant, une version de OCI Mapper avec un mode débogage sera bientôt disponible. Bien évidemment le développeur est libre de modifier OCI Mapper en vue d'implémenter une meilleure gestion d'erreurs.
LOBs▲
Cette version d'OCI Mapper ne supporte pas les objets binaires (LOB). Les LOBs correspondent aux types Blob et Image dans 4D et aux types RAW, LONG RAW, BLOB, CLOB, et NCLOB dans Oracle.
Dans la programmation OCI, les données de type LOB ne sont pas gérées dans l'exécution des requêtes comme les autres données. Une fois la requête exécutée, un code supplémentaire est nécessaire pour gérer les opérations sur les LOBs (la copie de données LOB est effectuée de manière manuelle).
Si le développeur souhaite ajouter le support des LOBs dans OCI Mapper, les commandes à retoucher sont OD BIND TOWARDS 4D (pour la définition des paramètres de sortie), OD BIND TOWARDS SQL (pour la définition des paramètres d'entrée), OD EXECUTE CURSOR (où le curseur est exécuté) et enfin OD Load rows cursor (où les données sont recherchées et chargées).
Notes importantes sur des méthodes de OCI Mapper 2004.3▲
Cette partie couvre des informations importantes relatives à des méthodes projet spécifiques à OCI Mapper 2004-3.
Méthode projet : CheckError
Cette méthode projet gère les erreurs remontées par 4D for OCI. Elle peut être utilisée comme une méthode propre de gestion d'erreurs via la commande OD ON ERROR CALL. Cette méthode a été totalement refondue dans OCI Mapper 2004-3.
Les changements importants sont :
• un message d'erreur est généré quelle que soit l'erreur ;
• un handle erreur OCI peut contenir plusieurs erreurs. CheckError fera une itération de toutes ces erreurs dans le handle ;
• du code a été ajouté pour une utilisation simplifiée de OD Last Error ;
• tous les appels 4D for OCI ont été supprimés (placés dans oci_tool_GetErrorInfo pour une utilisation plus générale).
Si le développeur n'est pas familier avec la gestion d'erreur OCI, il lui est fortement recommandé de regarder de plus près la méthode CheckError.
Méthode projet : OD BIND TOWARDS 4D
Note pour les développeurs 4D for Oracle : le mot « BIND » peut induire en erreur. En effet, dans l'esprit OCI, les paramètres en sortie correspondent à « DEFINE » et non à « BIND ». Donc le libellé correct de cette commande aurait dû être « OD DEFINE OUTPUT PARAMETERS ».
Méthode projet : OD Clone 4D Table
Cette méthode projet est utilisée pour créer une copie d'une table 4D dans Oracle. Des remarques importantes sont cependant à relever :
• les sous-tables ne sont pas supportées ;
• bien que l'option existe au niveau de l'interface utilisateur, ces types ne sont couramment pas supportés par OCI Mapper (se référer à la note plus haut sur les Blobs).
Méthode projet : OD Cursor state
Cette méthode n'était pas efficace dans la précédente version de OCI Mapper parce que l'état du curseur n'était pas correctement mis à jour par d'autres méthodes d'OCI Mapper. Cette version le corrige.
Méthode projet : OD Execute object
Cette méthode ne supporte pas l'exécution d'objets situés dans des packages Oracle.
Un code supplémentaire est nécessaire pour naviguer dans un package et localiser l'objet souhaité.
Méthode projet : OD GET SERVER LIST
Cette méthode est utilisée pour lire les entrées du fichier, « tnsnames.ora ».
Elle utilise la méthode OCIGetTnsnamesPath pour lire le chemin du dossier d'Oracle. Malheureusement, OCIGetTnsnamesPath n'est pas supportée pour la version 10g d'Oracle. Le chemin de la clé de registre ORACLE_HOME a été modifié dans Oracle 10g. De fait, OCIGetTnsnamesPath ne regarde pas au bon endroit pour situer le répertoire d'Oracle.
Le développeur peut contourner ce problème soit en localisant le répertoire d'Oracle d'une manière ou d'une autre, soit en créant la clé de registre exigée par OCIGetTnsnamesPath. Cette clé est : HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ORACLE_HOME.
Méthode projet : OD Last Error
Cette méthode ne fonctionnait pas dans la précédente version de OCI Mapper.
Ceci est corrigé. Voir les commentaires d'entête pour la méthode CheckError pour plus d'informations.
Note : « error » ici signifie que le code de retour de la commande 4D for OCI est OCI_ERROR. OD Last Error ne remonte donc pas les valeurs OCI_NO_DATA ou OCI_SUCCESS_WITH_INFO, puisque techniquement parlant, ce ne sont pas des erreurs.
Note pour les programmeurs 4D for Oracle : le seul paramètre supporté ici est le paramètre « message ». Les autres paramètres de la commande dans 4D for Oracle n'existent pas dans 4D for OCI. De plus, les codes d'erreur retournés ne seront pas les mêmes que 4D for Oracle. Vous aurez besoin de consulter la documentation d'Oracle pour les codes d'erreurs. Par exemple le retour de la valeur 936 par la méthode signifie l'erreur ORA-00936.
Méthode projet : OD Login
Note pour les développeurs 4D for Oracle : le paramètre « mode » de 4D for Oracle n'existe plus.
Méthode projet : OD ON ERROR CALL
Note pour les développeurs 4D for Oracle : les paramètres passés à votre méthode de gestion d'erreurs sont différents de ceux de 4D for Oracle. Plusieurs paramètres qui existent dans 4D for Oracle n'existent simplement pas dans 4D for OCI.
Voici la liste complète des paramètres dans 4D for Oracle :
$1 |
Entier long |
Identificateur de l'objet responsable de l'erreur |
$2 |
Entier long |
Code de l'erreur qui a déclenché l'appel d'erreur |
$3 |
Texte |
Description de l'erreur |
$4 |
Entier long |
Origine de l'erreur (100;200;300) |
$5 |
Entier long |
Position de l'erreur dans la commande, nombre du premier caractère de l'erreur depuis le début du texte de la commande |
$6 |
Texte |
Nom de la commande responsable de l'erreur |
Les paramètres $1, $5 et $6 n'existent pas dans 4D for OCI.
Votre méthode de gestion d'erreurs doit être modifiée pour accepter les paramètres suivants :
C_ENTIER LONG
(
$1
)
`Code de retour de la fonction où s'est produite l'erreur
`(ex. : OCI_ERROR, OCI_INVALID_HANDLE, etc.)
C_ENTIER LONG
(
$2
)
`handle erreur OCI (le handle erreur contient tous les « enregistrements » d'erreurs qui contiennent l'erreur effective)
Pour plus de détails sur les actions à faire sur les paramètres, voir le code source la méthode CheckError.
Méthode projet : OD SET OPTIONS
Note pour les développeurs 4D for Oracle : il y a plusieurs options de 4D for Oracle qui ne sont plus disponibles dans OCI Mapper :
Option |
N° |
Description |
---|---|---|
kNoWait |
4 |
Pour un contexte uniquement. Spécifie qu'une erreur doit être retournée si le contexte pour lequel l'option KwithLock a été choisie est verrouillé à l'ouverture. La requête est alors de type SELECT…FOR UPDATE OF…NOWAIT. Dans le cas contraire, la requête attendra que les enregistrements soient déverrouillés. |
kWithLock |
8 |
Pour un contexte uniquement. Spécifie que le contexte doit verrouiller les enregistrements trouvés. La requête sera de type SELECT…FOR UPDATE OF…si au moins un bind a l'option kForUpdate. |
kDistinctLines |
16 |
Pour un contexte uniquement. Spécifie que le contexte doit être activé en ajoutant le mot-clé DISTINCT à la clause SELECT du contexte (ce qui supprime les enregistrements redondants du résultat). Le contexte est alors mis automatiquement en mode Lecture Seule. |
kDeferred |
64 |
Permet d'utiliser le mode différé des OCI pendant l'envoi de requêtes vers un Oracle Server version 7. |
Les options fixées avec OD SET OPTIONS sont globales dans OCI Mapper et ne s'appliquent pas à des objets en particulier comme dans 4D for Oracle.
Référentiel des commandes OCI Mapper 2004.3▲
Il est à noter que seules les commandes haut niveau d'OCI Mapper sont listées ici. Pour les commandes bas niveau, il faut directement consulter le code source du composant OCI Mapper lui-même.
Toutes les commandes dans ce composant possèdent un entête qui décrit ce que fait la commande et énumère les paramètres entrée/sortie.
OD BIND TOWARDS 4D
Permet de définir les paramètres de sortie.
OD BIND TOWARDS SQL
Permet d'associer les paramètres d'entrée.
OD Clone 4D Table
Crée une table Oracle avec les colonnes correspondant aux champs 4D de la table.
OD COMMIT
Appelle OCITransCommit pour une connexion donnée.
OD Create cursor
La fonction OD Create cursor crée un curseur pour la connexion spécifiée.
OD Cursor state
La méthode OD Cursor state informe l'utilisateur de l'état du curseur spécifié.
OD DROP CURSOR
Libère la mémoire utilisée par un curseur qui a été précédemment créé avec OD Create cursor.
OD EXECUTE CURSOR
Exécute la requête SQL associée au curseur sur le serveur Oracle.
OD Execute object
Permet d'exécuter une procédure stockée ou une fonction stockée qui n'est pas située dans un package Oracle.
OD Execute SQL
Permet d'envoyer une requête SQL et stocker les résultats dans des champs, variables, ou tableaux 4e Dimension en spécifiant l'ID du Login.
OD GET COLUMN ATTRIBUTES
Permet de retrouver tous les types et tailles des colonnes résultant de la requête SQL précédemment associée à un curseur. Cette méthode peut être exécutée après l'appel à OD Set SQL in cursor pour associer la requête SQL au curseur.
OD Get column title
Permet de retrouver le nom d'une colonne dans le résultat de la requête, après exécution de OD Set SQL in cursor.
OD Get NB Mode
Permet de connaître le statut courant du mode non-blocking (non bloquant).
OD Get options
Retourne un entier long représentant les options globales d'OCI Mapper.
OD GET SERVER LIST
Lit le fichier ‘TNSNAME.ORA' et retourne un tableau contenant la liste des serveurs.
OD Last Error
Retourne le nombre représentant le dernier code d'erreur de 4D for OCI. Ces nombres seront listés dans la documentation Oracle pour le serveur cible.
OD Load rows cursor
Tire avantage de la gestion des tableaux par 4D for OCI pour charger les enregistrements résultant de l'exécution de la requête par OD EXECUTE CURSOR.
OD Login
Se connecte à un serveur Oracle en utilisant les paramètres de connexion spécifiés et retourne un identifiant de connexion.
OD Login dialog
Affiche la boîte de dialogue de connexion à un serveur Oracle. Elle permet à l'utilisateur de choisir un serveur et spécifier un nom d'utilisateur et mot de passe.
OD Login state
Retourne un entier indiquant si oui ou non l'ID de connexion spécifié correspond à une connexion ouverte.
OD LOGOUT
Ferme la connexion spécifiée.
OD Number of columns
Retourne le nombre de colonnes dans le résultat de la requête. Cette fonction peut être utilisée à tout moment après un appel à la méthode OD Set SQL in cursor exécutée avec succès.
OD Number rows processed
Retourne soit le nombre d'enregistrements chargés par OD Load rows cursor lors de l'exécution du curseur pour une requête de type SELECT, soit le nombre d'enregistrements insérés, modifiés ou supprimés pour une requête de type INSERT, UPDATE ou DELETE. Cette fonction s'utilise suite à une requête exécutée avec succès.
OD ON ERROR CALL
Installe une méthode de gestion d'erreur qui sera exécutée à chaque fois qu'une erreur se produit. Cela vous permet de gérer les erreurs d'exécution et de supprimer la gestion d'erreur par défaut.
OD ROLLBACK
Annule une transaction Oracle.
OD SET NB MODE
Permet d'établir le mode non-blocking (non bloquant).
OD SET OPTIONS
Permet de spécifier les options globales pour le comportement d'OCI Mapper.
OD Set SQL in cursor
Permet d'associer une requête SQL à un curseur. La fonction envoie la requête au serveur Oracle. La requête est exécutée à l'appel de OD EXECUTE CURSOR.
Procédure d'installation d'OCI Mapper 2004.3▲
Il faut noter que 4D 2004 et 4D for OCI 2004 sont requis par OCI Mapper 2004-3.
Installation d'OCI Mapper dans une nouvelle base▲
1. Ouvrez la base avec 4D Insider.
2. Ouvrez le menu Composants et sélectionnez Installer/Mettre à jour…
3. Naviguez pour localiser le fichier “OCI Mapper 2004-3.4CP” et cliquez sur le bouton Ouvrir.
4. 4D Insider installe le composant OCI Mapper. Veillez à bien copier la table « OCI_Mapper » :
5. Quittez 4D Insider.
6. Ouvrez la base avec 4D.
7. Insérez un appel à la méthode OCI_TOOL_INITVAROCI dans la méthode base Sur Ouverture.
8. Enfin, veillez à ce que le plugin 4D for OCI soit installé dans la base.
Mise à jour d'une précédente version d'OCI Mapper▲
1. Ouvrez la base avec 4D Insider.
2. Ouvrez le menu Composants et sélectionnez Installer/Mettre à jour…
3. Naviguez pour localiser le fichier “OCI Mapper 2004-3.4CP” et cliquez sur le bouton Ouvrir.
4. 4D Insider installe le composant OCI Mapper. Si vous rencontrez cette erreur, allez à l'étape 5 :
5. Désinstallez d'abord la version précédente du composant OCI Mapper. Ouvrez le pop-up menu Base et choisissez Groupes & Composants :
6. Sélectionnez le composant OCI Mapper :
7. Ouvrez le menu Composants et choisissez Désinstaller…:
8. Cliquez sur le bouton OK pour désinstaller OCI Mapper.
9. Répétez les étapes 1 à 4 pour installer une nouvelle version de OCI Mapper.
Mise à jour d'une base 4D for Oracle avec OCI Mapper▲
1. Ouvrez la base avec 4D Insider.
2. Ouvrez le menu Composants et choisissez Installer/Mettre à jour…
3. Naviguez pour localiser le fichier “OCI Mapper 2004-3.4CP” et cliquez sur le bouton Ouvrir.
4. 4D Insider installe le composant OCI Mapper. Veillez à bien copier la table « OCI_Mapper » :
5. Quittez 4D Insider.
6. Ouvrez la base avec 4D.
7. Re-tokenisez toutes les méthodes utilisant les commandes 4D for Oracle.
8. Quittez 4D.
9. Supprimez le plugin 4D for Oracle des dossiers Win4DX et/ou Mac4DX.
10. Installez le plugin 4D for OCI.
11. Enfin veillez à appeler OCI_TOOL_INITVAROCI au démarrage de votre base et oci_tool_Initprocvar au démarrage de chaque nouveau process qui utilisera OCI Mapper.
Ressources utiles▲
Ressources 4D▲
Documentation 4D for Oracle
ftp://ftp.4d.com/ACI_PRODUCT_REFERENCE_LIBRARY/4D_PRODUCT_DOCUMENTATION/PDF_Docs_by_4D_Product_A-Z/4D_Oracle/ [ftp://ftp.4d.com/ACI_PRODUCT_REFERENCE_LIBRARY/4D_PRODUCT_DOCUMENTATION/PDF_Docs_by_4D_Product_A-Z/4D_Oracle/]
Documentation 4D for OCI
Incluse dans le package d'installation de 4D 2004
ou https://4d.developpez.com/documentation/#docPDFConnect
Documentation générale
https://4d.developpez.com/oracle-sql/#connectdoc
Notes techniques
Introduction aux OCI (4D-200406-18-FR)
4D for OCI et PL/SQL (4D-200501-01-FR)
4D for OCI et la lecture des métadonnées (4D-200504-11-FR)
Tech tips
4D for OCI et APPLIQUER A SELECTION
Écrire dans une colonne LONG RAW
Lire dans une colonne LONG RAW
4D for OCI et les fonctions non documentées pour les dates
4D for OCI et les colonnes de type date
4D for OCI sous Mac OSX
Où trouver le composant OCI MAPPER ?
Utilisation du plugin 4D for OCI et du composant OCI Mapper
Ressources Oracle▲
Oracle Call Interface Programmer's Guide, 10g Release 2 (10.2)
http://download-west.oracle.com/docs/cd/B19306_01/appdev.102/b14250/toc.htm
Oracle Call Interface Programmer's Guide, Release 8.1.6
http://download-west.oracle.com/docs/cd/A87862_01/NT817CLI/index.htm
Conclusion▲
OCI Mapper offre une méthode simple de migration de 4D for Oracle vers 4D for OCI. Il peut ainsi aider à minimiser le temps et le coût de développement de 4D for OCI.
En outre, OCI Mapper est un bon exemple d'implémentation d'une interface haut niveau pour 4D for OCI, ce qui peut faciliter la phase de développement et augmenter la productivité.
Base exemple▲
Télécharger la base exemple.