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 :

[QxOrm 1.2.2] Génération d'identifiants pour insertion dans une collection


Sujet :

QxOrm

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 151
    Par défaut [QxOrm 1.2.2] Génération d'identifiants pour insertion dans une collection
    Hello !

    Petite question: comment faire pour générer l'id (long auto-incrementé) de la classe ORM Toto pour l'insert dans une QxCollection<long, Toto : : Ptr> ?

    (je sais pas si je suis très clair)...

    Merci par avance !

  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 sais pas si je suis très clair
    => j'avoue que je comprends pas trop la question

    Un ID est généré pendant l'appel à la fonction qx::dao::insert.
    A noter : la fonction qx::dao::insert peut prendre en paramètre une instance, un pointeur vers une instance, ou bien une collection d'objets (je ne sais pas si ça répond à ta question).
    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 très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 151
    Par défaut
    Note: Je suis en train de me rendre compte que je n'ai peut être pas bien compris la notion de relation. Voir autre post que je vais écrire plus tard.

    Ok, donc désolé, je ré-explique:
    J'ai créé une table Form comme ceci:

    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
     
    class Form
    {
    public:
    // -- typedef
        typedef Form This;
        typedef boost::shared_ptr<This> Ptr;
        typedef qx::QxCollection<long, FormPage::Ptr> ListPageT;
     
    public:
        Form() {}
        virtual ~Form() {}
     
    public:
        long id;
        QString name;
        ListPageT pages;
    };
    Le formulaire est composé de pages (je ne donne pas le code de FormPage car c'est basique, disons que c'est une classe qui ressemble à Form.

    On veut maintenant créer un formulaire avec des pages.
    Du coup, j'insère mes éléments comme ceci:
    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
     
    Form::Ptr formToORM( const core::form::Form & formDoc )
    {
        Form::Ptr dbForm( new Form() );
        {
            using namespace core;
            dbForm->name = formDoc.name().c_str();
            BOOST_FOREACH( const form::FormPage & page, formDoc.pages() )
            {
                FormPage::Ptr dbFormPage = formPageToORM( page );
                dbForm->pages.insert( dbFormPage->id, dbFormPage );
            }
        }
        return dbForm;
    }
    Le problème qui se pose est que je n'ai pas l'id avant qu'il ne soit inséré dans la bdd à l'appel de cette fonction:
    dbForm->pages.insert( dbFormPage->id, dbFormPage );

    En fait, je crois que je n'ai pas bien compris: l'insert d'une collection prend un id (premier paramètre de la template) qui ne représente pas du tout l'id de l'enregistrement de la relation dans la BDD, c'est ça ? Je crois que je confonds les deux tout simplement !

  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
    En fait, je crois que je n'ai pas bien compris: l'insert d'une collection prend un id (premier paramètre de la template) qui ne représente pas du tout l'id de l'enregistrement de la relation dans la BDD, c'est ça ? Je crois que je confonds les deux tout simplement !
    Oui tu confonds je pense : qx::QxCollection n'a absolument rien à voir avec la notion de relation dans QxOrm !
    Il faut que tu vois la classe qx::QxCollection comme un conteneur classique, du même style que std::vector, QList ou boost::unordered_map.
    Pour plus de détails sur ce nouveau conteneur, il y a une explication dans la FAQ : Pourquoi QxOrm fournit un nouveau type de container qx::QxCollection<Key, Value> ?
    Si ce n'est toujours pas clair malgré l'explication de la FAQ => n'hésite pas à me redemander...

    Donc, le 1er élément du template qx::QxCollection est une clé (pour accéder rapidement à la valeur associée), pas forcément un ID provenant d'une BDD (c'est une hash_table en fait).
    Dans le cas d'un élément provenant d'une BDD, ça parait logique de mettre comme clé son ID (mais ce n'est pas une obligation).

    Concernant ton code, de ce que je comprends, tu as une structure FormA et PageA que tu souhaites convertir en FormB et PageB en utilisant les méthodes formToORM() et formPageToORM().
    Je vois 2 solutions à ta problématique :
    1- soit tu décides d'utiliser un autre conteneur car tu ne connais pas de clé au moment de l'appel à formPageToORM() (car ton objet n'est pas encore en BDD) => à ce moment là, tu peux utiliser une QList<FormPage:: Ptr> par exemple.
    2- soit tu continues à utiliser qx::QxCollection et c'est à toi de définir une clé au moment de l'insertion dans la collection. Tu peux utiliser la logique suivante dans ton code : si ma page n'existe pas encore en BDD, j'utilise une clé négative. Ce qui donnerait quelque chose comme ça :
    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
    Form::Ptr formToORM( const core::form::Form & formDoc )
    {
        Form::Ptr dbForm( new Form() );
        {
            using namespace core;
            dbForm->name = formDoc.name().c_str();
            long lKey = 0;
            BOOST_FOREACH( const form::FormPage & page, formDoc.pages() )
            {
                FormPage::Ptr dbFormPage = formPageToORM( page );
                if (page->id != 0) { lKey = page->id; }
                else { lKey--; }
                dbForm->pages.insert( lKey, dbFormPage );
            }
        }
        return dbForm;
    }
    Ensuite, au moment de faire la sauvegarde en BDD, tu testes la clé :
    - si clé positive => je fais un update
    - si clé négative => je fais un insert

    EDIT : Pense à la méthode reserve() pour optimiser un peu ton code
    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 très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 151
    Par défaut
    Ah ok d'accord, je vois !

    Merci pour toutes ces explications.
    En fait, je croyais que quand j'allais faire l'insert de ma classe Form avec qx::dao::insert, ça allait enregistrer toutes les relations (donc également les pages qui sont dans la collection).

    Je vais voir comment je peux faire du coup
    Merci !

  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
    je croyais que quand j'allais faire l'insert de ma classe Form avec qx::dao::insert, ça allait enregistrer toutes les relations
    C'est le même principe que pour le fetch :
    * qx::dao::insert : ne va insérer que dans 1 seule table ;
    * qx::dao::insert_with_relation : va insérer dans plusieurs tables.
    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. [DEBUTANT] - Pb pour ajout dans une collection
    Par bdaboah dans le forum VB.NET
    Réponses: 2
    Dernier message: 18/12/2009, 15h26
  2. Formulaire pour insertion dans une bdd
    Par cobolons dans le forum Langage
    Réponses: 6
    Dernier message: 17/04/2009, 18h59
  3. [HTML 4.0] Formulaire pour insertion dans une bdd
    Par cobolons dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 17/04/2009, 08h53
  4. Problème format de champs pour insertion dans une base FileMaker
    Par guiguikawa dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 28/03/2007, 22h27
  5. [ODBC] Récupération d'une donnée pour insertion dans une autre table
    Par rom950 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/03/2006, 17h13

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