Blame platform-demos/fr/record-collection.js.page

Packit 1470ea
Packit 1470ea
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" type="topic" id="record-collection.js" xml:lang="fr">
Packit 1470ea
Packit 1470ea
  <info>
Packit 1470ea
  <title type="text">Record collection (JavaScript)</title>
Packit 1470ea
    <link type="guide" xref="js#examples"/>
Packit 1470ea
Packit 1470ea
    <desc>Création d'une petite base de données pour trier votre discothèque</desc>
Packit 1470ea
Packit 1470ea
    <revision pkgversion="0.1" version="0.1" date="2011-02-22" status="review"/>
Packit 1470ea
    <credit type="author">
Packit 1470ea
      <name>Projet de Documentation GNOME</name>
Packit 1470ea
      <email its:translate="no">gnome-doc-list@gnome.org</email>
Packit 1470ea
    </credit>
Packit 1470ea
    <credit type="author">
Packit 1470ea
      <name>Johannes Schmid</name>
Packit 1470ea
      <email its:translate="no">jhs@gnome.org</email>
Packit 1470ea
    </credit>
Packit 1470ea
    <credit type="editor">
Packit 1470ea
      <name>Marta Maria Casetti</name>
Packit 1470ea
      <email its:translate="no">mmcasettii@gmail.com</email>
Packit 1470ea
      <years>2013</years>
Packit 1470ea
    </credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Luc Rebert,</mal:name>
Packit 1470ea
      <mal:email>traduc@rebert.name</mal:email>
Packit 1470ea
      <mal:years>2011</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Alain Lojewski,</mal:name>
Packit 1470ea
      <mal:email>allomervan@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2011-2012</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Luc Pionchon</mal:name>
Packit 1470ea
      <mal:email>pionchon.luc@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2011</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Bruno Brouard</mal:name>
Packit 1470ea
      <mal:email>annoa.b@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2011-12</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Luis Menina</mal:name>
Packit 1470ea
      <mal:email>liberforce@freeside.fr</mal:email>
Packit 1470ea
      <mal:years>2014</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
<title>Record collection</title>
Packit 1470ea
Packit 1470ea
<synopsis>
Packit 1470ea
  

Dans ce tutoriel, vous allez apprendre :

Packit 1470ea
  <list>
Packit 1470ea
    <item>

comment vous connecter à une base de données en utilisant « libgda »

</item>
Packit 1470ea
    <item>

comment insérer et parcourir des enregistrements dans une table de base de données

</item>
Packit 1470ea
  </list>
Packit 1470ea
</synopsis>
Packit 1470ea
Packit 1470ea
<section id="intro">
Packit 1470ea
  <title>Introduction</title>
Packit 1470ea
  

Cet exemple utilise le langage Javascript. Nous allons vous montrer comment vous connecter à une base de données et l'utiliser à partir d'un programme GTK en utilisant la bibliothèque GDA (GNOME Data Access). Vous devez bien sûr avoir déjà installé cette dernière.

Packit 1470ea
  

La bibliothèque GDA (GNOME Data Access) vous permet d'accéder de manière universelle à différentes sortes et types de sources de données, depuis les plus traditionnels systèmes de bases de données relationnelles, jusqu'à des sources aussi diverses qu'un serveur de messagerie, un répertoire LDAP, etc. Pour de plus amples informations et pour une documentation et l'API complète, consultez le <link href="http://library.gnome.org/devel/libgda/stable/">Site Web de GDA</link>.

Packit 1470ea
  

Bien que la plus grosse partie du programme se réfère à l'interface utilisateur (GUI), nous allons orienter notre tutoriel sur les fonctions bases de données (avec des explications sur certaines autres fonctions que nous jugeons pertinentes). Pour de plus amples informations sur les programmes GNOME en Javascript, consultez le tutoriel <link xref="image-viewer.js">Programme visionneur d'images</link>.

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="anjuta">
Packit 1470ea
  <title>Création d'un projet dans Anjuta</title>
Packit 1470ea
  

Avant de commencer à programmer, vous devez ouvrir un nouveau projet dans Anjuta. Ceci crée tous les fichiers qui vous sont nécessaires pour construire et exécuter votre programme plus tard. C'est aussi utile pour tout regrouper en un seul endroit.

Packit 1470ea
  <steps>
Packit 1470ea
    <item>
Packit 1470ea
    

Lancez Anjuta et cliquez sur <guiseq><gui>Fichier</gui><gui>Nouveau</gui><gui>Projet</gui></guiseq> pour ouvrir l'assistant de création de projet.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

Cliquez sur l'onglet <gui>JS</gui>, choisissez <gui>JavaScript générique</gui>, cliquez sur <gui>Continuer</gui> et renseignez les champs requis avec vos informations. Mettez <file>discotheque</file> (sans accent) comme nom du projet et répertoire.

Packit 1470ea
   	</item>
Packit 1470ea
    <item>
Packit 1470ea
    

Cliquez sur <gui>Appliquer</gui> et votre projet est créé. Ouvrez <file>src/main.js</file> depuis l'onglet <gui>Projet</gui> ou l'onglet <gui>Fichiers</gui>. Il contient un exemple de programme très basique.

Packit 1470ea
    </item>
Packit 1470ea
  </steps>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="structure">
Packit 1470ea
  <title>Structure du programme</title>
Packit 1470ea
  <media type="image" mime="image/png" src="media/record-collection.png"/>
Packit 1470ea
  

Cet exemple est une application GTK simple (avec une seule fenêtre) pouvant insérer des enregistrements dans une table de base de données et également consulter tous les enregistrements de cette table. Cette table possède deux champs : id, un entier et name, une variable de type caractère. La première section de l'application (en haut) vous permet d'insérer un enregistrement dans la table. La dernière (en bas) vous permet d'afficher tous les enregistrements de cette table. Son contenu est mis à jour à chaque fois qu'un nouvel enregistrement est inséré et au démarrage de l'application.

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="start">
Packit 1470ea
  <title>Début du plaisir</title>
Packit 1470ea
  

Commençons par examiner le squelette du programme :

Packit 1470ea
  
Packit 1470ea
const GLib = imports.gi.GLib;
Packit 1470ea
const Gtk = imports.gi.Gtk;
Packit 1470ea
const Gda = imports.gi.Gda;
Packit 1470ea
const Lang = imports.lang;
Packit 1470ea
Packit 1470ea
function Demo () {
Packit 1470ea
  this._init ();
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
Demo.prototype = {
Packit 1470ea
Packit 1470ea
  _init: function () {
Packit 1470ea
    this.setupWindow ();
Packit 1470ea
    this.setupDatabase ();
Packit 1470ea
    this.selectData ();
Packit 1470ea
  }
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
Gtk.init (null, null);
Packit 1470ea
Packit 1470ea
var demo = new Demo ();
Packit 1470ea
Packit 1470ea
Gtk.main ();]]>
Packit 1470ea
  <list>
Packit 1470ea
    <item>

Lignes 1‒4 : importations initiales. Faites surtout attention à la ligne 3, qui commande à Javascript l'importation de la bibliothèque GDA, la cible de ce tutoriel.

</item>
Packit 1470ea
    <item>

Lignes 6‒17 : définition de la classe Demo. Faites surtout attention aux lignes 13‒15, où nous appelons 3 méthodes qui font tout le travail. Elles sont détaillées plus bas.

</item>
Packit 1470ea
    <item>

Lignes 19‒23 : lancement de l'application.

</item>
Packit 1470ea
  </list>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="design">
Packit 1470ea
  <title>Conception de l'application</title>
Packit 1470ea
  

Examinons la méthode setupWindow. C'est elle qui crée l'interface utilisateur. Comme l'interface utilisateur n'est pas notre sujet, nous en expliquons seulement les parties pertinentes.

Packit 1470ea
  
Packit 1470ea
  setupWindow: function () {
Packit 1470ea
    this.window = new Gtk.Window ({title: "Data Access Demo", height_request: 350});
Packit 1470ea
    this.window.connect ("delete-event", function () {
Packit 1470ea
      Gtk.main_quit();
Packit 1470ea
      return true;
Packit 1470ea
      });
Packit 1470ea
Packit 1470ea
    // main box
Packit 1470ea
    var main_box = new Gtk.Box ({orientation: Gtk.Orientation.VERTICAL, spacing: 5});
Packit 1470ea
    this.window.add (main_box);
Packit 1470ea
Packit 1470ea
    // first label
Packit 1470ea
    var info1 = new Gtk.Label ({label: "Insert a record", xalign: 0, use_markup: true});
Packit 1470ea
    main_box.pack_start (info1, false, false, 5);
Packit 1470ea
Packit 1470ea
    // "insert a record" horizontal box
Packit 1470ea
    var insert_box = new Gtk.Box ({orientation: Gtk.Orientation.HORIZONTAL, spacing: 5});
Packit 1470ea
    main_box.pack_start (insert_box, false, false, 5);
Packit 1470ea
Packit 1470ea
    // ID field
Packit 1470ea
    insert_box.pack_start (new Gtk.Label ({label: "ID:"}), false, false, 5);
Packit 1470ea
    this.id_entry = new Gtk.Entry ();
Packit 1470ea
    insert_box.pack_start (this.id_entry, false, false, 5);
Packit 1470ea
Packit 1470ea
    // Name field
Packit 1470ea
    insert_box.pack_start (new Gtk.Label ({label: "Name:"}), false, false, 5);
Packit 1470ea
    this.name_entry = new Gtk.Entry ({activates_default: true});
Packit 1470ea
    insert_box.pack_start (this.name_entry, true, true, 5);
Packit 1470ea
Packit 1470ea
    // Insert button
Packit 1470ea
    var insert_button = new Gtk.Button ({label: "Insert", can_default: true});
Packit 1470ea
    insert_button.connect ("clicked", Lang.bind (this, this._insertClicked));
Packit 1470ea
    insert_box.pack_start (insert_button, false, false, 5);
Packit 1470ea
    insert_button.grab_default ();
Packit 1470ea
Packit 1470ea
    // Browse textview
Packit 1470ea
    var info2 = new Gtk.Label ({label: "Browse the table", xalign: 0, use_markup: true});
Packit 1470ea
    main_box.pack_start (info2, false, false, 5);
Packit 1470ea
    this.text = new Gtk.TextView ({editable: false});
Packit 1470ea
    var sw = new Gtk.ScrolledWindow ({shadow_type:Gtk.ShadowType.IN});
Packit 1470ea
    sw.add (this.text);
Packit 1470ea
    main_box.pack_start (sw, true, true, 5);
Packit 1470ea
Packit 1470ea
    this.count_label = new Gtk.Label ({label: "", xalign: 0, use_markup: true});
Packit 1470ea
    main_box.pack_start (this.count_label, false, false, 0);
Packit 1470ea
Packit 1470ea
    this.window.show_all ();
Packit 1470ea
  },]]>
Packit 1470ea
  <list>
Packit 1470ea
    <item>

Lignes 22 et 27 : création des 2 entrées (pour les 2 champs) dans lesquelles l'utilisateur saisit les choses à insérer dans la base de données.

</item>
Packit 1470ea
    <item>

Lignes 31‒34 : création du bouton « Insert ». Le signal clicked de ce bouton est connecté à la méthode privée _insertClicked de la classe. Cette méthode est décrite ci-dessous.

</item>
Packit 1470ea
    <item>

Ligne 39 : création de l'élément graphique (TextView) où nous affichons le contenu de la table.

</item>
Packit 1470ea
    <item>

Ligne 44 : création de l'étiquette où nous affichons le nombre d'enregistrements dans la table. Au début, elle est vide et est mise à jour ultérieurement.

</item>
Packit 1470ea
  </list>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="connect">
Packit 1470ea
  <title>Connexion à la base de données et initialisation</title>
Packit 1470ea
  

Le code permettant de se connecter à la base de données est dans la méthode setupDatabase ci-dessous :

Packit 1470ea
  
Packit 1470ea
  setupDatabase: function () {
Packit 1470ea
    this.connection = new Gda.Connection ({provider: Gda.Config.get_provider("SQLite"),
Packit 1470ea
                                          cnc_string:"DB_DIR=" + GLib.get_home_dir () + ";DB_NAME=gnome_demo"});
Packit 1470ea
    this.connection.open ();
Packit 1470ea
Packit 1470ea
    try {
Packit 1470ea
      var dm = this.connection.execute_select_command ("select * from demo");
Packit 1470ea
    } catch (e) {
Packit 1470ea
      this.connection.execute_non_select_command ("create table demo (id integer, name varchar(100))");
Packit 1470ea
    }
Packit 1470ea
  },]]>
Packit 1470ea
  <list>
Packit 1470ea
    <item>
Packit 1470ea
      

Lignes 2‒3 : création de l'objet Connection de GDA. Il faut transmettre quelques propriétés à son constructeur :

Packit 1470ea
      <list>
Packit 1470ea
        <item>
Packit 1470ea
          

provider : l'un des fournisseurs reconnus par GDA. GDA prend en charge SQLite, MySQL, PostgreSQL, Oracle et beaucoup d'autres. Pour les besoins de l'exemple, nous utilisons une base de données SQLite car elle est déjà incluse par défaut dans la plupart des distributions et elle est facile à utiliser (elle n'a besoin que d'un fichier comme base de données).

Packit 1470ea
        </item>
Packit 1470ea
        <item>
Packit 1470ea
          

cnc_string : la chaîne de connexion. Elle peut être différente en fonction du fournisseur. La syntaxe pour SQLite est : DB_DIR=CHEMIN;DB_NAME=NOM2FICHIER. Dans cet exemple, nous accédons à une base de données nommée gnome_demo dans le dossier personnel de l'utilisateur (notez l'appel à la fonction get_home_dir de GLib).

Packit 1470ea
        </item>
Packit 1470ea
      </list>
Packit 1470ea
      <note>
Packit 1470ea
        

Si le fournisseur n'est pas reconnu par GDA, ou si la chaîne de connexion n'est pas complète, la ligne 2 provoque une exception. Donc, en pratique, il faut gérer cette exception grâce à l'instruction JavaScript try...catch.

Packit 1470ea
      </note>
Packit 1470ea
    </item>
Packit 1470ea
Packit 1470ea
    <item>

Ligne 4 : ouverture de la connexion. Pour le fournisseur SQLite, si la base de donnée n'existe pas, elle est créée à cette étape.

</item>
Packit 1470ea
    <item>
Packit 1470ea
      

Lignes 6‒10 : tentative de faire une simple instruction « select » pour vérifier que la table existe (ligne 7). Si elle n'existe pas (parce que la base de données vient juste d'être créée), cette instruction provoque une exception qu'il faut gérer grâce au bloc try...catch. Dans ce cas, il faut exécuter l'instruction « create table » pour créer la table (ligne 9).

Packit 1470ea
      

In order to run the SQL commands above we are using the GDA connection methods execute_select_command and execute_non_select_command. They are simple to use, and just require two arguments: The Connection object and the SQL command to be parsed.

Packit 1470ea
    </item>
Packit 1470ea
  </list>
Packit 1470ea
Packit 1470ea
  

À ce niveau, nous avons configuré la base de données et cette dernière est fonctionnelle.

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="select">
Packit 1470ea
  <title>Sélection</title>
Packit 1470ea
  

Après connexion à la base de données, le constructeur de notre exemple appelle la méthode selectData. C'est elle qui récupère tous les enregistrements de la table et qui les affiche dans l'élément graphique TextView. Regardons à quoi elle ressemble :

Packit 1470ea
  
Packit 1470ea
  selectData: function () {
Packit 1470ea
    var dm = this.connection.execute_select_command  ("select * from demo order by 1, 2");
Packit 1470ea
    var iter = dm.create_iter ();
Packit 1470ea
Packit 1470ea
    var text = "";
Packit 1470ea
Packit 1470ea
    while (iter.move_next ()) {
Packit 1470ea
      var id_field = Gda.value_stringify (iter.get_value_at (0));
Packit 1470ea
      var name_field = Gda.value_stringify (iter.get_value_at (1));
Packit 1470ea
Packit 1470ea
      text += id_field + "\t=>\t" + name_field + '\n';
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    this.text.buffer.text = text;
Packit 1470ea
    this.count_label.label = "" + dm.get_n_rows () + " record(s)";
Packit 1470ea
  },]]>
Packit 1470ea
  <list>
Packit 1470ea
    <item>

Line 2: The SELECT command. We are using the GDA connection's execute_select_command method for that. It returns a DataModel object, which is later used to retrieve the rows.

</item>
Packit 1470ea
    <item>

Ligne 3 : création d'un objet Iter qui sert à itérer sur les enregistrements de DataModel.

</item>
Packit 1470ea
    <item>

Ligne 7 : Itération sur tous les enregistrements en les récupérant à l'aide de l'objet Iter. À cet endroit, la variable Iter contient les informations trouvées. La méthode move_next retourne le message false quand elle atteint le dernier enregistrement.

</item>
Packit 1470ea
    <item>
Packit 1470ea
      

Lignes 8‒9 : nous faisons deux choses dans chaque ligne :

Packit 1470ea
      <list>
Packit 1470ea
        <item>

Utilisez la méthode get_value_at d'Iter qui n'a besoin que d'un argument : le numéro de colonne à récupérer, en commençant par 0. Comme notre commande SELECT ne retourne que deux colonnes, nous récupérons donc les colonnes 0 et 1.

</item>
Packit 1470ea
        <item>

La méthode get_value_at retourne l'information sur les champs au format GValue de GLib. Pour convertir ce format en chaîne de caractères, utilisez simplement la fonction globale value_stringify de GDA. C'est ce que nous faisons ici puis nous enregistrons les résultats dans les variables id_field et name_field.

</item>
Packit 1470ea
      </list>
Packit 1470ea
    </item>
Packit 1470ea
    <item>

Ligne 11 : concaténation des deux chaînes pour former une seule ligne de texte en les séparant par "=>" et enregistrement dans la variable text.

</item>
Packit 1470ea
    <item>

Ligne 14 : à la fin de la boucle, tous les enregistrements sont formatés dans la variable text. À cette ligne, nous attribuons le contenu de cette variable au TextView.

</item>
Packit 1470ea
    <item>

Ligne 15 : affichage du nombre d'enregistrements dans la table avec la fonction get_n_rows de DataModel.

</item>
Packit 1470ea
  </list>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="insert">
Packit 1470ea
  <title>Insertion</title>
Packit 1470ea
  

Bien, nous savons comment nous connecter à une base de données et comment sélectionner des lignes dans une table. Il est temps maintenant d'apprendre à faire une insertion à l'aide de la commande INSERT dans la table. Souvenez-vous, dans la méthode setupWindow, nous avions relié le signal clicked du bouton <gui>Insert</gui> à la méthode _insertClicked. Voyons la mise en place de cette méthode.

Packit 1470ea
  
Packit 1470ea
  _insertClicked: function () {
Packit 1470ea
    if (!this._validateFields ())
Packit 1470ea
      return;
Packit 1470ea
Packit 1470ea
    // Gda.execute_non_select_command (this.connection,
Packit 1470ea
    //   "insert into demo values ('" + this.id_entry.text + "', '" + this.name_entry.text + "')");
Packit 1470ea
Packit 1470ea
    var b = new Gda.SqlBuilder ({stmt_type:Gda.SqlStatementType.INSERT});
Packit 1470ea
    b.set_table ("demo");
Packit 1470ea
    b.add_field_value_as_gvalue ("id", this.id_entry.text);
Packit 1470ea
    b.add_field_value_as_gvalue ("name", this.name_entry.text);
Packit 1470ea
    var stmt = b.get_statement ();
Packit 1470ea
    this.connection.statement_execute_non_select (stmt, null);
Packit 1470ea
Packit 1470ea
    this._clearFields ();
Packit 1470ea
    this.selectData ();
Packit 1470ea
  },]]>
Packit 1470ea
  

Packit 1470ea
    We have learned how to use the GDA connection's methods execute_select_command and execute_non_select_command to quickly execute SQL commands on the database. GDA allows one to build a SQL statement indirectly, by using its SqlBuilder object. What are the benefits of this? GDA will generate the SQL statement dynamically, and it will be valid for the connection provider used (it will use the same SQL dialect the provider uses). Let's study the code:
Packit 1470ea
  

Packit 1470ea
  <list>
Packit 1470ea
    <item>

Lignes 2‒3 : vérification du bon renseignement par l'utilisateur de tous les champs. Le code de la méthode privée _validateFields est vraiment simple et vous pouvez le consulter dans le programme source complet de l'exemple.

</item>
Packit 1470ea
    <item>

Ligne 5 : la façon la plus rapide pour faire l'insertion à l'aide de la commande INSERT. Celle-ci est mise en commentaire car nous voulons vous montrer comment utiliser l'objet SqlBuilder pour construire une instruction SQL qui soit indépendante de la base de données.

</item>
Packit 1470ea
    <item>

Ligne 7 : création de l'objet SqlBuilder. Nous devons transmettre le type d'instruction que nous voulons construire. Cela peut être SELECT, UPDATE, INSERT ou DELETE.

</item>
Packit 1470ea
    <item>

Ligne 8 : détermination du nom de la table sur laquelle l'instruction construite va agir (le code INSERT INTO demo est généré)

</item>
Packit 1470ea
    <item>

Lignes 9‒10 : détermination des champs et de leurs valeurs qui font partie de l'instruction. Le premier argument est le nom du champ (comme dans la table). Le second est la valeur pour ce champ.

</item>
Packit 1470ea
    <item>

Ligne 11 : fabrication de l'objet Statement généré dynamiquement et qui représente une instruction SQL.

</item>
Packit 1470ea
    <item>

Ligne 12 : enfin, exécution de l'instruction SQL (INSERT).

</item>
Packit 1470ea
    <item>

Ligne 14 : effacement des champs « id » et « name » à l'écran. Le code de la méthode privée _clearFields est vraiment simple et vous pouvez le consulter dans le programme source complet de l'exemple.

</item>
Packit 1470ea
    <item>

Ligne 15 : mise à jour de l'affichage à l'écran en faisant un nouveau SELECT.

</item>
Packit 1470ea
  </list>
Packit 1470ea
  <note>

Vous pouvez aussi faire usage de paramètres pour construire l'instruction. En utilisant les objets SqlBuilder et des paramètres, vous êtes moins exposé à des attaques du type injection SQL. Consultez la <link href="http://library.gnome.org/devel/libgda/stable/">documentation GDA</link> pour plus d'informations sur les paramètres.

</note>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="run">
Packit 1470ea
  <title>Exécution de l'application</title>
Packit 1470ea
  

Tout le programme nécessaire doit maintenant être en place, donc essayez de l'exécuter. Vous disposez maintenant d'une base de donnée pour votre discothèque !

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="impl">
Packit 1470ea
 <title>Implémentation de référence</title>
Packit 1470ea
 

Si vous rencontrez des difficultés avec ce tutoriel, comparez votre programme à ce <link href="record-collection/record-collection.js">programme de référence</link>.

Packit 1470ea
</section>
Packit 1470ea
</page>