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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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
    Membre averti
    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
    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
    Membre averti
    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
    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
    Membre averti
    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
    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
    Membre averti
    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
    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
    Membre averti
    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
    Par défaut
    Ben en toute logique je dirais que oui.

  7. #7
    Membre averti
    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
    Par défaut
    L’auto-incrémentions fonctionne mais je ne peut toujours pas insérer de ligne. Je continue à chercher.
    Merci KoreLabs.

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