IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Discussion :

Éditer la grille d'une base de donnée en conservant des identifiants uniques


Sujet :

Bases de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut Éditer la grille d'une base de donnée en conservant des identifiants uniques
    Bonjour.

    J'écris un programme qui permettra à l'utilisateur de modifier la base ie : (insérer/supprimer lignes) ou editer les champs.

    Le problème c'est l'id de la table à modifier. En effet lorsque une ligne est insérée les id des lignes suivantes ne bougent pas, si on edite la grille on obtient donc fatalement un doublon.Le problème ne se pose évidement pas si je rajoute une ligne à la fin de la table.

    J'ai donc penser à incrémenter les lignes suivantes de +1 chaque fois que l'utilisateur clique sur une ligne pour garder des id unique mais ça ne marche pas.

    Voici le code, je me suis inspiré des exemples de qtcreator et de l'article "l'accès aux données avec qt",j'avoue ne pas le comprendre très bien.Pour l'instant j'arrive à inserer des lignes mais seulement à la fin de la table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    void FenPrincipale::insertRow()
    {
        QSqlTableModel *model = qobject_cast<QSqlTableModel *>(ui->tablemesures->model());
        if (!model)
            return;
     
     
     
        QModelIndex insertIndex = ui->tablemesures->currentIndex();
        int row = insertIndex.row() == -1 ? 0 : insertIndex.row();
        QSqlTableModel model1;
        QString rowchaine = QString::number(row,10);
        model1.setTable("mesures");
        model1.setFilter(" id like '"+rowchaine+"%'");
        model1.select();
     
        int libIndex = model1.record().indexOf("id");
        for(int i = 0; i < model1.rowCount(); ++i)
        {
            QSqlRecord record = model1.record(i);
     
     
            record.setValue(libIndex, record.value(libIndex).toInt() +1);
            model1.setRecord(i, record);
        }
        model->insertRow(row);
        insertIndex = model->index(row, 0);
        ui->tablemesures->setCurrentIndex(insertIndex);
        ui->tablemesures->edit(insertIndex);
     
    }
    N'hesiter pas à demander des précisions ou des eclaircissements
    Merci

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 26
    Points : 25
    Points
    25
    Par défaut
    Salut

    Je voudrais savoir pourquoi tu veux réutiliser les id qui ont été supprimés? (Si j'ai bien compris ce que tu as écrit) En fait, j'avais rien compris du tout...

    Dans ton SGBD tu ne peux pas spécifier "auto-incrémentation" ??

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    J'y est pensé dès le départ mais je n'ai jamais réussis à mettre en place une auto-incrémentation voici le code de la création des tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #ifndef CONNECTION_H
    #define CONNECTION_H
     
    #include <QMessageBox>
    #include <QSqlDatabase>
    #include <QSqlError>
    #include <QSqlQuery>
    #include "fenprincipale.h"
    #include "QtSql"
     
    /*
        This file defines a helper function to open a connection to an
        in-memory SQLITE database and to create a test table.
     
        If you want to use another database, simply modify the code
        below. All the examples in this directory use this function to
        connect to a database.
    */
    //! [0]
     
    int FenPrincipale::createConnection()
    {
        db = QSqlDatabase::addDatabase("QSQLITE");    //Ouverture de la base de donnée avec le driver  sqlite
        db.setDatabaseName(database);
        if (!db.open()) {
            QMessageBox::critical(0, qApp->tr("Cannot open database"),
                qApp->tr("Unable to establish a database connection.\n"
                         "Aucun projet ouvert"
                         "Click Cancel to exit."), QMessageBox::Cancel);
            return false;
        }
    /* Creation des différentes tables où seront stockées les données GSi
      */
        QSqlQuery query;
     
        query.exec("create table mesures (id int primary key,matricule varchar(20),classe varchar(20),angleH double,angleV double,distanceIncl double,distanceH double,ppm double,cstPrisme double,hauteurPrisme double,classeHprisme varchar(20),code varchar(20),info1 varchar(20),info2 varchar(20),info3 varchar(20),info4 varchar(20),info5 varchar(20),numeroStation int ,indiceStationnement int, date varchar (20))");
     
        query.exec("create table prisme (id int primary key, hauteurPrisme double, plageDebut int ,plageFin int,date varchar(20))");
     
     
     
       query.exec("create table nbreStationnement (id int primary key,numeroStation varchar(20),nombreOccurence int,date varchar(20))") ;
       query.exec("create table stationStationnee(id int primary key,numeroStation varchar(20),hauteurInstrument double,hauteurPrisme double,indiceStationnement int,plageDebut int ,plageFin int,date varchar(20) )");
       query.exec("create table indexo (id int primary key, id_m int , id_p int ,id_ss int, id_ns int)");
       query.exec("INSERT into indexo (id) values (1)");     
     
       query.exec("create table infoProjet (id int primary key, nomProjet varchar(20) )");
       query.prepare ("INSERT into infoProjet (nomProjet) values (:nomProjet)");
     
       query.bindValue (":nomProjet", database);
       query.exec();
       return true;
       db.close();
    }
     
     
    //! [0]
     
    #endif
    Si tu peut me montrer comment procéder pour obtenir une auto-incrémentation ce serait pas mal, mais si ça implique de modifier l'importation des données.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 26
    Points : 25
    Points
    25
    Par défaut
    Alors je n'ai jamais utilisé SQLITE, je ne suis pas sûr de ce que je vais te donner mais avec ceci tu devrais t'en sortir si le code suivant ne fonctionne pas comme tu le veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query.exec("create table prisme (id int primary key autoincrement, hauteurPrisme double, plageDebut int ,plageFin int,date varchar(20))");
    J'ai repris une de tes requêtes. Je ne sais pas si tu as déjà essayé ceci.

    -- EDIT --
    Dans la FAQ de sqlite.org, il est dit que si tu créés une table avec "id int primary key" quand tu fais un insert sur ta table pour id tu spécifies "null" est ça auto-incrémente automatique. As-tu testé cela?

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    Je viens de tester la méthode avec "NULL" .Résultats: j'ai une table vide.

    Mais c'est pas ça le plus embêtant. En réfléchissant bien je suis plus sur du tout que l'auto-incrémentation résolve mon problème. Car l’utilisateur agit sur la base par l'intermédiaire de l'application graphique.Si on modifie la table par l'intermédiaire des fonctions QtSql est ce que les id vont automatiquement être incrémenté ?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 26
    Points : 25
    Points
    25
    Par défaut
    Ben en toute logique je dirais que oui.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    L’auto-incrémentions fonctionne mais je ne peut toujours pas insérer de ligne. Je continue à chercher.
    Merci KoreLabs.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 26
    Points : 25
    Points
    25
    Par défaut
    Je pense que tu dois maîtriser l'anglais un minimum vu que tu utilises Qt et que sa doc est essentiellement rédigée dans cette langue. Je conseillerai donc de te renseigner dans la FAQ de SQLite (lien dans un de mes messages précédents). J'ai vu qu'il y avait des exemples de codes. A mon avis, tu as simplement un problème de requêtes (syntaxe peut-être).

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Points : 119
    Points
    119
    Par défaut
    Bonjour,

    Je me permets d'intervenir dans ce débat :
    Si la colonne id que tu tentes de modifier dans ton programme est la clé primaire de la table, alors il est normal que tu ne puisses pas la modifier. En effet, qui dit PK dit référence éventuelle de Foreign-Key (relation entre tables). C'est l'information inscrite dans le champs de référence. Modifier cette info oblige alors à faire de même dans toutes les tables liées à la première... Raison pour laquelle c'est interdit.
    Ton programme fonctionnera donc si, au lieu d'utiliser la clé primaire, tu décides d'utiliser une colonne 'Ordre' (à inventer?), qui ne servira alors qu'à donner un ordre de classement.
    Par contre, la syntaxe du filtre me paraît bizarre : tu sélectionnes tous les id qui commencent par le numéro de la chaine (sens de '10%' : accepte 10, 101, 102, mais pas 11 ni 112). Sauf si ce filtre a un sens que je n'ai pas saisi, je pense qu'il vaut mieux ne pas l'utiliser, et effectuer un test pour savoir si on doit modifier la valeur ou pas.

    Voila, j'espère que j'ai pu t'aider.

    A bientôt
    M.P.

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/07/2009, 14h29
  2. [AC-2003] Enregistrer une base de donnée et gestion des erreurs
    Par mmmxtina dans le forum VBA Access
    Réponses: 2
    Dernier message: 15/07/2009, 15h25
  3. Création d'une base de données pour gestion des stocks
    Par samaaantha dans le forum Modélisation
    Réponses: 8
    Dernier message: 08/05/2008, 21h13
  4. Réponses: 2
    Dernier message: 26/06/2007, 16h23
  5. Réponses: 3
    Dernier message: 13/08/2006, 10h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo