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

QxOrm Discussion :

Édition d'un enregistrement conditionnel


Sujet :

QxOrm

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Par défaut Édition d'un enregistrement conditionnel
    Bonjour,

    Je souhaiterai mettre à jour un enregistrement uniquement si la colonne status n'a pas changé d'état entre-temps. Est-il prévu d'ajouter une interface update_by_query(), ou quelque chose du genre, dans une prochaine version ? Comment puis-je faire cela avec la version 1.1.6 ?

    Merci.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 482
    Par défaut


    Je ne comprends pas trop ta question : est-ce que tu peux mettre un exemple plus précis de ce que tu veux faire exactement stp ?

    Si tu veux faire un update sur une instance uniquement si une certaine propriété de ta classe a changé, pourquoi tu ne gères pas ça directement dans le code C++ ?

    QxOrm fournit un pointeur intelligent qui peut t'aider à faire cette détection : qx::dao::ptr<T>.
    Tu trouveras des explications sur la FAQ de QxOrm : http://qt.developpez.com/faq/?page=b...smart-pointers

    En gros, c'est un pointeur (ou smart-pointer) qui marche de la même façon que boost::shared_ptr et QSharedPointer. Il permet en plus de conserver un état (en gros c'est un clone de ton instance) après un fetch d'un élément de la base => tu peux donc à tout moment savoir si telle ou telle propriété a changé.

    Voici un exemple rapide :
    * tu fais un fetch sur un object (ou bien un collection d'objets) en passant en paramètre un pointeur qx::dao::ptr<T>
    * une fois ce fetch effectué, tu peux utiliser la méthode isDirty() pour savoir si ton instance a été modifiée (donc si ton enregistrement en BDD doit être mis à jour)
    * tu peux également récupérer l'instance d'origine (celle qui correspond aux valeurs inscrites en base pendant ton fetch) en utilisant la méthode getOriginal() du pointeur intelligent => tu peux alors comparer les propriétés que tu souhaites (ton status par exemple).
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  3. #3
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Par défaut
    tu peux également récupérer l'instance d'origine
    Ce cas est un solution possible à ce problème.

    Une autre méthode est de se reposé sur le SGBD en ajoutant une clause suplémentaire permettant de s'assuré que la mise à jour ne s'effectue uniquement que si l'enregistrement n'a pas été modifié entre-temps.

    exemple:
    - table : id, date, status, info
    - un enregistrement : id= 1, date='', status=10, info=''
    - un processus met à jour le status à 2 et un autre processus met à jour le status à 20
    - le second un processus doit effectué sa mise à jour uniquement si le status est toujours à 10

    Cela peut justifier la mise en place d'une méthode update_by_query(). Ceci évite de faire deux requêtes vers le SGBD et de mettre en oeuvre un verrou dans les processus.

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 482
    Par défaut
    Ok donc tu voudrais pouvoir écrire quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    qx::QxSqlQuery query("ma_table.status = 10");
    QSqlError daoError = qx::dao::update_by_query(query, mon_instance);
    Et ça génèrerait une requête de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE ma_table SET ... WHERE ma_table.id=? AND ma_table.status=10
    C'est bien ça l'idée du truc ?

    Je vois un petit problème à ça, c'est le paramètre de retour (QSqlError) qu'il faudrait changer. En effet, avec ce type de paramètre, tu n'auras aucun moyen de savoir si ton enregistrement a eu lieu ou non (car à priori, pas d'erreur générée même si aucun enregistrement modifié en BDD).

    Est-ce que tu peux me confirmer tout ça stp ?
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  5. #5
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Par défaut
    C'est bien l'idée.

    Concernant la valeur de retour, la méthode doit avoir le même comportement que la méthode update de base.

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 482
    Par défaut
    Ok merci, ce sera dans la prochaine version...
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/10/2008, 00h14
  2. créations d'enregistrements conditionnels
    Par chenevert dans le forum Modélisation
    Réponses: 1
    Dernier message: 28/06/2007, 11h51
  3. Requête d'édition des enregistrements liés à un autre
    Par zakuli dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 17/04/2007, 17h44
  4. Réponses: 2
    Dernier message: 11/01/2007, 11h18
  5. [CR] selection d'enregistrement conditionnele
    Par planetevoyage dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 29/03/2005, 14h02

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