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 :

QTableView, QSqlTableModel et gestion de l'index


Sujet :

Bases de données

  1. #1
    Membre habitué

    Inscrit en
    Mars 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 10
    Par défaut QTableView, QSqlTableModel et gestion de l'index
    Bonjour,

    Voili voilà l'énoncé du problème... Soit une table SQLite toute bête (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(256), exist BOOLEAN) qui contenait 10 enregistrements sur lesquelles il n'en reste plus que 5, admettont :
    • id, name, exist
    • 2, toto, true
    • 3, jean, false
    • 5, joe, true
    • 7, marc, true
    • 9, alf, false

    Nottez bien que l'enregistrement avec id=1 a été supprimé...


    Je souhaites à la fois :
    • Afficher en temps réel le contenu complet de la table à mon utilisateur (qui va être modifiée par l'utilisateur ou certains évènements internes)
    • Effectuer des opérations courantes sélection (diverses), insertion, suppression...


    Avertissement : c'est la première fois que j'utilise QSqlTableModel donc il n'est vraiment pas exclu que je m'y prenne de travers

    Je pensais avoir trouvé une solution élégante qui consistait à créer un modèle pour ma table (QSqlTableModel) et l'assigner à une vue (QTableView), mais je bloque sur la gestion de ma clef primaire dans le modèle. Je m'explique.
    L'affichage temps réel de ma table fonctionne à merveille, je suis juste obligé de passer par le modèle pour effectuer mes écritures dans la table (opération insert, update et remove) ce qui ne me pose à priori aucun problème. De l'autre coté j'ai besoins d'effectuer des opérations de lecture(, comptage, etc) sur un groupe donné d'enregistrements (exemple savoir s'il y a des entrées avec exist à vrai ou faux, faire un select du premier enregistrement selon un tri donné, etc). D'après ce que j'ai compris, je ne peux passer par le modèle sans quoi je modifie l'affichage, ce que je ne souhaites pas ! Je fais donc des select au travers de simples QSqlQuery.

    Indépendamment, tout cela fonctionne à merveille, mais je n'ai pas de solution quand vient le moment d'effectuer une écriture dans la table via le modèle suite aux opérations de lectures faites en dehors : j'ai juste mon id, mais aucun moyen de retrouver l'enregistrement correspondant dans le modèle qui semble fonctionner avec son propre index !!!

    Opération update au travers du modèle (cf: article qui va bien L'accès aux données avec Qt pour lequel son auteur reçoit au passage toute ma sympathie)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QSqlRecord record = model.record(i);
    record.setValue(2, "a new name");
    model.setRecord(i, record);
    i est l'index du modèle, qui diffère systématiquement de ma clef primaire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [*]index (row) du modèle      Table : id, name, exist
    [*]0                                   2, toto, true
    [*]1                                   3, jean, false
    [*]2                                   5, joe, true
    [*]3                                   7, marc, true
    [*]4                                   9, alf, false
    Existe-t-il un moyen pour retrouver la ligne du modèle (row) depuis l'index de la table ou une autre méthode qui répondrait à ma problématique ?

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2009
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 277
    Par défaut
    Salux !

    Je ne suis pas sur d'avoir bien saisi ton problème, mais il me semble que tu mélanges deux trois choses.

    Un QModelIndex sert à représenter plusieurs choses (en vrac: tables, arbres, etc.)
    Il possède donc ses propres "coordonnées" pour pouvoir être localisé et affiché correctement.
    Imagine que tu fasses un SELECT ... ORDER BY id DESC : la "position" du QModelIndex n'aura rien à voir avec id. D'ailleurs, il y a la fonction data pour se faire.

    Ensuite, j'ai un peu de mal à comprendre ce qui ne marche pas :
    1. Arrives-tu à faire tes INSERT correctement ?
    2. Peux-tu récupérer un QSqlRecord ou un QModelIndex pointant sur la dernière valeur ?


    Si je peux me permettre une remarque, j'aurais tendance à ajouter une colonne "derniere_modif" de type timestamp qui me permettrait de localiser le dernier ajout/modif simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM MATABLE WHERE derniere_modif = LAST(derniere_modif)
    Voilà, j'espère avoir répondu à ce que tu attendais

  3. #3
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut
    Hello,
    Après avoir utilisé les QSqlTableModel couplés aux QTableView, je ne peux que te conseiller d'abandonner et d'utiliser Le QtableWidget à la place (cf discussion). Cela devient en effet ingérable des que tu t'éloigne un peu des fonctionnalités déjà présentes.

Discussions similaires

  1. gestion du z-index
    Par 7804j dans le forum jQuery
    Réponses: 4
    Dernier message: 10/07/2011, 13h39
  2. Gestion des Tab Index sur une page
    Par Fngonka dans le forum ASP.NET
    Réponses: 2
    Dernier message: 17/07/2008, 13h55
  3. Gestion des Z-index
    Par joubizo dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 08/07/2008, 18h51
  4. gestion abonne sur index.jsp
    Par BOUBOU81 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 04/07/2007, 20h48

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