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

PyQt Python Discussion :

Requete SQL avec parametres valeurs QComboBox [QtGui]


Sujet :

PyQt Python

  1. #1
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut Requete SQL avec parametres valeurs QComboBox
    Bonjour,

    Je continu toujours avec mon application, parmi mes fonctions, c'est la comparaison des valeurs pour deux périodes (mois et mois-1)
    lorsque j’exécute la requête dans l'éditeur de SQLITE3 le résultat est affiché comme je le voulais :

    Ci-dessous le requête :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE VIEW tmp_comparaison AS SELECT ident, intitule,
                               SUM(CASE WHEN periode ='2021-03' THEN montant ELSE 0 END) '2021-03',
                               SUM(CASE WHEN periode ='2020-03' THEN montant ELSE 0 END) '2020-03'
                               FROM factures
                               WHERE periode in ('2021-03', '2020-03')
                               GROUP BY ident

    J'ai voulu paramétré cette requête en utilisant deux combobox, le premier pour la période Mois et l'autre Mois-1 et afficher le résultat sur un tableview.
    Le problème, le tableau est vide !!!!

    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
    mois = self.ui.cb_mois.currentText()
    mois_ant = self.ui.cb_mois_ant.currentText()
     
                requete = QSqlQuery()
                requete.prepare('''CREATE VIEW tmp_comparaison AS SELECT ident, intitule,
                    SUM(CASE WHEN periode =:mois THEN montant ELSE 0 END) :mois,
                    SUM(CASE WHEN periode =:mois_ant THEN montant ELSE 0 END) :mois_ant
                    FROM factures
                    WHERE periode in (:mois, :mois_ant)
                    GROUP BY reference
                    ORDER BY identt''')
                requete.bindValue(":mois", mois)
                requete.bindValue(":mois_ant", mois_ant)
                requete.exec()
     
            self.model_comparaison_ventes = QSqlRelationalTableModel()
            self.model_comparaison_ventes.setTable("tmp_comparaison")
            self.model_comparaison_ventes.select()
            self.ui.tableView_comparaison.setModel(self.model_comparaison_ventes)
    Je ne vois pas où est le problème, au secours

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Si ce code s'exécute dès le démarrage je ne serais pas étonné que les comboBox ne renvoient rien.

    Ajoute un print(mois, mois_ant) pour voir.

  3. #3
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut
    Bonjour VinsS,

    J'ai rajouté print(mois, mois_ant) avant la requête et après, il s'affiche les valeurs sélectionnées dans les deux combobox. Seulement, le résultat est le même.

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Dans ce cas on peut soupçonner que la syntaxe de la requête fasse défaut.

    Tu aurais peut-être plus de réponses sur le forum SQL: https://www.developpez.net/forums/f4/bases-donnees/

    Edit: Je viens de voir dans ta requête: ORDER BY identt, le double t final est volontaire ?

  5. #5
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut
    Salut,

    Je l'ai corrigé, le problème persiste.
    Je voudrais poser une question : Est ce que l'insertion des variables mois et mois_ant qui sont de type CHAR
    dans la requête sous la forme :mois et :mois_ant est juste ? c-a-d avec les deux points (:)

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Ce qui me semble étrange est que l'appel à QSqlQuery se fasse sans lui indiquer la base de données... et que les appels à prepare et exec ne testent pas les valeurs de retour.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut
    Salut wiztricks,
    Ce qui me semble étrange est que l'appel à QSqlQuery se fasse sans lui indiquer la base de données
    La connexion à la base de données est déjà ouverte car les combobox affichent les valeurs des périodes à partir d'une table

    et que les appels à prepare et exec ne testent pas les valeurs de retour
    j’avoue, que je ne sais pas comment je teste le retour desdites valeurs.

  8. #8
    Membre averti
    Profil pro
    Administrateur
    Inscrit en
    Mai 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2008
    Messages : 237
    Points : 433
    Points
    433
    Par défaut
    Puisque vous créez votre vue dynamiquement, à quel moment vous la supprimer ?
    Essayez de ne pas écrire vos alias mois et mois_avant de manière non dynamique


    --
    Toute fois, votre colonne période devrait être de type date afin de profiter des fonctions date par exemple comme ceci

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT
    	ident,
    	intitule,
    	SUM(CASE WHEN strftime('%Y-%m', periode) =:mois THEN montant ELSE 0 END) as mois,
    	SUM(CASE WHEN strftime('%Y-%m', periode) =:mois_ant THEN montant ELSE 0 END) as mois_ant
     
    FROM factures
    WHERE strftime('%Y-%m', periode) IN (:mois, :mois_ant)
    GROUP BY reference
    ORDER BY ident

  9. #9
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut
    Merci manzeki pour votre réponse,

    La vue créée dynamiquement, elle est supprimée en quittant l'application.
    Le champ "periode" n'est pas un de type date il est de type caractère composé de année - mois (exemple : 2021-04)
    c'est pour cela, je ne peux utiliser les fonctions date.

    Autre précision, quand j'exécute cette requête dans l'application sans le choix des valeurs des combobox le résultat est affiché dans QtableView

  10. #10
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Points : 92
    Points
    92
    Par défaut
    Bonjour,

    J'ai trouvé la solution qui était en face de moi mais, il a fallu plusieurs modifications et test.
    Ci-dessous la requête pour celui qui en a besoin pour afficher les données sous forme de colonnes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    requete = QSqlQuery()
    requete.exec_('CREATE VIEW tmp_comparaison AS SELECT ident, intitule, SUM(CASE WHEN periode = "'+ mois +'" THEN montant ELSE 0 END) AS "'+ mois +'", SUM(CASE WHEN periode = "'+ mois_ant +'" THEN montant ELSE 0 END) AS "'+ mois_ant +'" FROM factures GROUP BY ident  ORDER BY intitule')

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

Discussions similaires

  1. Tabledatasource et requete sql avec parametres
    Par aidonsnous dans le forum VB.NET
    Réponses: 3
    Dernier message: 15/12/2013, 09h29
  2. requete SQL avec parametre de la méthode
    Par flora806 dans le forum JDBC
    Réponses: 6
    Dernier message: 11/06/2009, 16h59
  3. [VBA]Requete SQL avec parametre numérique
    Par Pitou5464 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 06/09/2006, 10h33
  4. Probleme de requete SQL avec la valeur NULL
    Par samyghan dans le forum Installation
    Réponses: 8
    Dernier message: 12/03/2006, 17h24
  5. [JDBC] retour de requete sql avec valeur NULL
    Par maxxou dans le forum JDBC
    Réponses: 3
    Dernier message: 13/09/2004, 14h40

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