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 :

Débuter avec QxOrm


Sujet :

QxOrm

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Inscrit en
    Octobre 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 69
    Par défaut Débuter avec QxOrm
    Bonjour,
    Voilà, J'ai beaucoup de zones d'ombres quant à l'utilisation de QxOrm dans un projet. Pour ce qui est de la compilation, à part changer quelques lignes dans le fichier QxOrm.pri, il n'y a pas eu trop de problèmes.
    C'est à l'utilisation que j'ai des soucis.
    Voici par exemple, une classe que j'ai déclarée
    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
    #ifndef PRODUCT_H 
    #define PRODUCT_H  
    
    #include "precompiled.h" 
    #include <QxMemLeak.h> 
    #include <QString>  
    
    class Product { 
    
    public: 
       QString m_code; 
       QString m_name; 
       int m_price;  
    
    public: 
       Product(); 
       Product(QString code, QString name, int price);  
       virtual~Product() {}
    };
    
    QX_REGISTER_HPP_PRODUCT(Product,qx::trait::no_base_class_defined,1)
    
      #endif // PRODUCT_H
    Voici le .cpp correspondant
    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
    #include "product.h"  
    QX_REGISTER_CPP_PRODUCT(Product)  
    
    namespace qx 
    { 
       template <> void register_class(QxClass<Product> &t) 
       { 
         t.m_code(&Product::m_code, "code");
         t.m_name(&Product::m_name, "name");
         t.m_price(&Product::m_price, "price"); 
       } 
    }  
    Product::Product() {  }
    Product::Product(QString code, QString name, int price)
        :m_code(code), m_name(name), m_price(price)  
    {  }
    
    Voici le contenu de mon export.h
    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
    #ifndef PRODUCT_EXPORT_H_ 
    #define PRODUCT_EXPORT_H_
    
    #ifdef _BUILDING_PRODUCT
    #define PRODUCT_DLL_EXPORT    QX_DLL_EXPORT_HELPER
    #else
    #define PRODUCT_DLL_EXPORT    QX_DLL_IMPORT_HELPER
    #endif
    
    #ifdef _BUILDING_PRODUCT
    #define QX_REGISTER_HPP_PRODUCT    QX_REGISTER_HPP_EXPORT_DLL
    #define QX_REGISTER_CPP_PRODUCT    QX_REGISTER_CPP_EXPORT_DLL
    #else
    #define QX_REGISTER_HPP_PRODUCT    QX_REGISTER_HPP_IMPORT_DLL
    #define QX_REGISTER_CPP_PRODUCT    QX_REGISTER_CPP_IMPORT_DLL
    #endif
    
    #endif//PRODUCT_EXPORT_H_
    Et voici mon .pro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    QT += core sql gui  
    TARGET = product 
    TEMPLATE = lib 
    CONFIG += plugin 
    DESTDIR = ../../plugins 
    DEFINES += _BUILDING_PRODUCT 
    PRECOMPILED_HEADER = precompiled.h  
    INCLUDEPATH += "C:/Program Files/QxOrm/include" 
    LIBS += "C:/Program Files/QxOrm/lib/libQxOrmd.a" 
    SOURCES += product.cpp 
    HEADERS += precompiled.h \ 
                     export.h \ 
                     product.h
    J'ai essayé de faire ce petit test en lisant les tutoriels sur "drug" et sur qxBlog. Mais déjà à la compilation, j'ai les messages d'erreur suivants
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     In function 'void qx::register_class(T&) [with T = qx::QxClass<Product>]': 
    ..\product\product.cpp:9: error: 'class qx::QxClass<Product>' has no member named 'm_code'
    ..\product\product.cpp:10: error: 'class qx::QxClass<Product>' has no member named 'm_name'
    ..\product\product.cpp:11: error: 'class qx::QxClass<Product>' has no member named 'm_price'
    Est-ce que mon code est bien écrit ? Comment est-ce que je dois changer mon code lorsque je rends mes attributs privés ? Pourquoi déclarer les classes de cette manière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class QX_BLOG_DLL_EXPORT author
    avec la macro ? Chez moi, j'ai un message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Skip identifier QX_BLOG_DLL_EXPORT
    .

    En gros, j'aimerais des explications sur l'utilisation de QxOrm.

    Excusez-moi si mes questions ont l'air terre à terre ou bêtes(peut être que je n'ai pas encore le niveau), mais j'ai vraiment besoin de comprendre l'utilisation de cette bibliothèque
    Merci d'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


    Tout d'abord, merci de t'intéresser à la bibliothèque QxOrm

    Pour débuter, je conseille de regarder (et de compiler) les projets de test présents dans le dossier "./test/" de la distribution de QxOrm.
    Concernant ton code, voici plusieurs remarques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include "precompiled.h" 
    #include <QxMemLeak.h>
    Ces 2 lignes de code apparaissent dans ton fichier "product.h" => ce n'est pas la bonne place :
    * precompiled.h (ou peu importe comment tu l'appelles) est un fichier pré-compilé qui permet de réduire les temps de compilation. Ce fichier doit se trouver dans chaque fichier source *.cpp (et pas dans les *.h).
    * QxMemLeak.h : permet de détecter les fuites mémoires. Ce fichier doit également se trouver dans tes fichiers sources *.cpp.

    -----------------------------

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QX_REGISTER_HPP_PRODUCT(Product,qx::trait::no_base_class_defined,1)
    Le dernier paramètre (1) permet d'assurer une compatibilité ascendante pour la serialization des données.
    Je te conseille de mettre 0 pour le moment sur chacune de tes classes.
    On en reparlera plus tard si tu souhaites avoir plus d'infos à ce sujet...

    -----------------------------

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    namespace qx 
    { 
       template <> void register_class(QxClass<Product> &t) 
       { 
         t.m_code(&Product::m_code, "code");
         t.m_name(&Product::m_name, "name");
         t.m_price(&Product::m_price, "price"); 
       } 
    }
    Ce n'est pas de cette façon qu'il faut déclarer une classe persistante.
    t est une instance de type qx::QxClass<T> => les méthodes m_code, m_name et m_price ne sont pas définies pour ce type.
    Pour déclarer un identifiant (clé primaire de ta BDD), il faut écrire : t.id(...).
    Et pour déclarer une propriété de ta classe (colonne de ta BDD), il faut écrire : t.data(...).
    Ce qui donne ceci avec ton bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    namespace qx 
    { 
       template <> void register_class(QxClass<Product> &t) 
       { 
         t.id(&Product::m_code, "code");
         t.data(&Product::m_name, "name");
         t.data(&Product::m_price, "price"); 
       } 
    }
    -----------------------------

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class QX_BLOG_DLL_EXPORT author
    Cette macro permet d'exporter/importer une classe d'une DLL sous Windows.
    Elle est utile pour le compilateur Microsoft Visual C++ par exemple.
    Pour GCC, elle n'est pas utile mais il vaut mieux l'écrire si tu veux faire un code portable.
    Dans ton cas, il faut que tu utilises la macro que tu as toi-même définie : PRODUCT_DLL_EXPORT.
    Ou alors tu l'enlèves si tu ne souhaites pas faire de code portable et que tu travailles essentiellement avec GCC.

    -----------------------------

    Comment est-ce que je dois changer mon code lorsque je rends mes attributs privés ?
    Si tu veux rendre tes propriétés "protected" ou "private", il faut que tu ajoutes à la définition de ta classe : QX_REGISTER_FRIEND_CLASS(Product)

    Voilà les 1ères choses que j'ai vu à partir de ton code.
    Si tu as d'autres soucis, n'hésite pas
    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 confirmé

    Inscrit en
    Octobre 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 69
    Par défaut
    Merci pour ta réponse si cordiale, je commence à y voir plus clair.
    Maintenant mon code compile, seulement il a fallu que j'ajoute cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QX_REGISTER_PRIMARY_KEY(Product, QString)
    Je crois que par défaut, les clés primaires sont de type long avec QxOrm.
    Merci, je vais "mieux" lire les exemples et je posterai si j'ai un problème.
    Merci.

  4. #4
    Membre confirmé

    Inscrit en
    Octobre 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 69
    Par défaut
    Bonjour,
    Je reviens avec un nouveau problème. Voilà, j'ai une classe Product qui a 2 relations manytoone avec 2 classes ProductForm et ProductFamily. Bon, je vais essayer d'aller à l'essentiel; j'ai fait un petit test pour voir si çà marche avec ce code
    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
    QSharedPointer<Product> p = QSharedPointer<Product>(         
        new Product("C1", "Paracetamol", 100, QDate(2011,12,2), true));
    QSharedPointer<ProductForm> f1 = QSharedPointer<ProductForm>( 
        new ProductForm("C", "Comprimés") );
    QSharedPointer<ProductFamily> fam = QSharedPointer<ProductFamily>(    
        new ProductFamily("A", "Antibiotiques") );  
    
    qx::dao::save(f1);
    qx::dao::save(fam);
    
    p->setFamily(fam); 
    p->setForm(f1);
    
    qx::dao::save(p);
    L'enregistrement de ProductFamily et de ProductForm marche mais au niveau de celui de Product, j'ai un message d'erreur comme quoi la requête ne peut être exécutée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [QxOrm] execute sql query failed : INSERT INTO product (cip, name, price, expireDate, taxable, family_id, form_id) VALUES (:cip, :name, :price, :expireDate, :taxable, :family_id, :form_id) QPSQL: Unable to create query
       "ERREUR:  erreur de syntaxe sur ou près de « ( »
     LINE 1: EXECUTE  ('C1', 'Paracetamol', 100, '2011-12-02', TRUE, 'A',...
    J'ai besoin d'un petit peu d'aide.
    Merci

  5. #5
    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
    Il vaut mieux que tu crées un nouveau sujet sur le forum pour chaque nouveau problème que tu pourrais rencontrer...

    Ensuite juste une remarque sur le code, il vaut mieux tester la valeur de retour quand tu appelles les fonctions 'qx::dao::XXX' => le retour est de type QSqlError et permet de savoir si l'exécution s'est déroulée sans problème.

    Si ta classe possède des relations, tu peux utiliser au moment de l'enregistrement : qx::dao::save_with_all_relation, ça te fera gagner quelques lignes de code.

    Enfin pour ton erreur, bah....... c'est bizarre.
    La requête SQL me semble correcte et il n'y a pas de caractères spéciaux au moment de l'insertion en base.
    C'est peut-être lié à un type de colonne de ta table product qui n'est peut-être pas le bon ?
    As-tu essayé d’exécuter la requête à la main (avec pgAdmin par exemple) ?
    Quelle est la version de Postgres ?
    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.

  6. #6
    Membre confirmé

    Inscrit en
    Octobre 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 69
    Par défaut
    Ensuite juste une remarque sur le code, il vaut mieux tester la valeur de retour quand tu appelles les fonctions 'qx::dao::XXX' => le retour est de type QSqlError et permet de savoir si l'exécution s'est déroulée sans problème.
    Oui, je le fais, ici je l'ai enlevé juste pour la simplicité du code
    As-tu essayé d’exécuter la requête à la main (avec pgAdmin par exemple) ?
    Oui et çà marche
    Quelle est la version de Postgres ?
    C'est la version 9.0

    Si non, voilà une partie du code source si çà peut aider.
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    /* abstractproduct.h */
     
    #ifndef ABSTRACTPRODUCT_H
    #define ABSTRACTPRODUCT_H
     
    #include <QtCore/QString>
    #include <QtCore/QDate>
    #include <QtCore/QSharedPointer>
     
    #include "abstractproductfamily.h"
    #include "abstractproductform.h"
     
    class AbstractProduct
    {
        QX_REGISTER_FRIEND_CLASS(AbstractProduct)
     
    public:
        AbstractProduct() { }
     
        AbstractProduct(QString cip)
            : m_cip(cip)
        {
     
        }
     
        AbstractProduct(QString cip, QString name, double price, QDate expireDate, bool taxable)
            : m_cip(cip), m_name(name), m_price(price), m_expireDate(expireDate), m_taxable(taxable)
        {
     
        }
     
        virtual ~AbstractProduct() { }
     
        QString cip() const { return m_cip; }
        QString name() const { return m_name; }
        double price() const { return m_price; }
        QDate expireDate() const { return m_expireDate; }
        bool isTaxable() const { return m_taxable; }
     
        QSharedPointer<AbstractProductFamily> family() const { return m_family; }
        QSharedPointer<AbstractProductForm> form() const { return m_form; }
     
        void setCip(QString cip) { m_cip = cip; }
        void setName(QString name) { m_name = name; }
        void setPrice(double price) { m_price = price; }
        void setExpireDate(QDate expireDate) { m_expireDate = expireDate; }
        void setTaxable(bool taxable) { m_taxable = taxable; }
     
        void setFamily(QSharedPointer<AbstractProductFamily> family) { m_family = family; }
        void setForm(QSharedPointer<AbstractProductForm> form) { m_form = form; }
     
     
    protected:
        QString m_cip;
        QString m_name;
        double m_price;
        QDate m_expireDate;
        bool m_taxable;
     
        QSharedPointer<AbstractProductFamily> m_family;
        QSharedPointer<AbstractProductForm> m_form;
    };
     
    QX_REGISTER_PRIMARY_KEY(AbstractProduct, QString)
    QX_REGISTER_ABSTRACT_CLASS(AbstractProduct)
    REGISTER_HPP_PRODUCT(AbstractProduct, qx::trait::no_base_class_defined, 0)
     
    #endif // ABSTRACTPRODUCT_H
     
    /* abstractproduct.cpp */
     
    #include "precompiled.h"
    #include "abstractproduct.h"
     
    #include <QxMemLeak.h>
     
    REGISTER_CPP_PRODUCT(AbstractProduct)
     
    namespace qx
    {
        template <> void register_class(QxClass<AbstractProduct> &t)
        {
            t.id(&AbstractProduct::m_cip, "cip");
            t.data(&AbstractProduct::m_name, "name");
            t.data(&AbstractProduct::m_price, "price");
            t.data(&AbstractProduct::m_expireDate, "expireDate");
            t.data(&AbstractProduct::m_taxable, "taxable");
     
            t.relationManyToOne(&AbstractProduct::m_family, "family_id");
            t.relationManyToOne(&AbstractProduct::m_form, "form_id");
     
        }
    }
    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
     
    #ifndef PRODUCT_H
    #define PRODUCT_H
     
    #include "../core/abstractproduct.h"
    #include "productfamily.h"
    #include "productform.h"
     
    class Product : public AbstractProduct
    {
    public:
        Product() : AbstractProduct() { }
     
        Product(QString cip)
            : AbstractProduct(cip)
        {
     
        }
     
        Product(QString cip, QString name, double price, QDate expireDate, bool taxable)
            : AbstractProduct(cip, name, price, expireDate, taxable)
        {
     
        }
    };
     
    REGISTER_HPP_PRODUCT(Product, AbstractProduct, 0)
     
    #endif // PRODUCT_H
     
    /* product.cpp */
     
    #include "../core/precompiled.h"
    #include "product.h"
     
    #include <QxMemLeak.h>
     
    REGISTER_CPP_PRODUCT(Product)
     
    namespace qx
    {
        template <> void register_class(QxClass<Product> &t)
        {
            t.setName("product");
        }
    }
    Merci

  7. #7
    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
    C´est quoi PxAbstractProduct et PxProduct ?
    Pourquoi tu utilises de temps en temps ces classes au lieu de AbstractProduct et Product ?
    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. débuter avec Visual .NET
    Par akimmm dans le forum MFC
    Réponses: 4
    Dernier message: 28/10/2005, 05h53
  2. [GridBagLayout] Comment débuter avec ce layout
    Par Bighobbit dans le forum Débuter
    Réponses: 12
    Dernier message: 28/09/2005, 18h13
  3. [MFC je crois] Débuter avec visual c++
    Par flzox dans le forum MFC
    Réponses: 6
    Dernier message: 28/06/2005, 19h31
  4. [JAXP] Débuter avec XML et Java
    Par Fleep dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 04/05/2005, 12h27
  5. Débuter avec Java
    Par reptils dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 11/07/2004, 22h26

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