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

Macros et VBA Excel Discussion :

Problème de calcul dans une requête SQL [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut Problème de calcul dans une requête SQL
    Bonjour,

    J'ai un soucis dans une requête SQL que j'ai inséré dans mon fichier Excel. Cette requête a pour but d'aller rechercher des informations dans 3 tables différentes et de faire un filtre sur différents champs. Selon le filtre, un calcul doit être effectué.

    Voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    'Commissions
    Commissions = "SELECT A.ad_societe as Société, A.ad_nom as Nom, A.ad_prenom as Prénom,  " & _
                " D.do_nodoc as Numéro, D.do_type as Type, D.do_date1 as Date, dt.dl_compte, " & _
                " (IIF(dt.dl_tva_inc<>1, dt.dl_montant, dt.dl_montant - dt.dl_tva_mnt)) as Mnt" & _
                " FROM ((adresses AS A " & _
                " INNER JOIN  document As D ON A.ad_numero = D.do_adr1 )" & _
                " INNER JOIN  detail As DT ON D.do_numero= dt.dl_numero )" & _
                " WHERE ((D.do_type=17) OR (D.do_type=20)) AND (D.do_paye<>1) AND (D.do_period<>1) AND (dt.dl_compte Like '3000.%')" & _
                " ORDER BY dt.dl_tva_inc " & _
    Cependant, le calcul ne s'effectue pas et la colonne MNT reste toujours vide. Pouvez-vous m'aider ?

    Merci d'avance pour votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    tu te connecte sur quelle type de base de données, Access,Sql serveur ,Oracle?

    tu fais ta connexion Via ADO ou DAO?

    dt.dl_compte est un champ numérique ou texte?

  3. #3
    Membre habitué
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    Je me connecte via une liaison ado et je fais une connexion sur des fichiers DBF

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Sub conNect()
        Set cN = New ADODB.Connection
        dbPath = Path
            cN.ConnectionString = "Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=d:\2015;Exclusive=No;"
        cN.Open
    End Sub
    dt.dl_compte est un champ texte.

    Merci pour ton aide

  4. #4
    Invité
    Invité(e)
    Par défaut
    je ne voie rien qui cloche dans ta requête!
    enlève quand c'est possible les parenthèse inutile pour la lisibilités!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Commissions = "SELECT A.ad_societe as Société, A.ad_nom as Nom, A.ad_prenom as Prénom,  " & _
                " D.do_nodoc as Numéro, D.do_type as Type, D.do_date1 as Date, dt.dl_compte, " & _
                " IIF(dt.dl_tva_inc<>1, dt.dl_montant, dt.dl_montant - dt.dl_tva_mnt) as Mnt" & _
                " FROM ((adresses AS A " & _
                " INNER JOIN  document As D ON A.ad_numero = D.do_adr1 )" & _
                " INNER JOIN  detail As DT ON D.do_numero= dt.dl_numero )" & _
                " WHERE (D.do_type=17 OR D.do_type=20) AND D.do_paye<>1 AND D.do_period<>1 AND dt.dl_compte Like '3000.%'"  & _
                " ORDER BY dt.dl_tva_inc "
    dégraisse ta close Where pour voir ou ça cloche:
    Code Exemple : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Commissions = "SELECT A.ad_societe as Société, A.ad_nom as Nom, A.ad_prenom as Prénom,  " & _
                " D.do_nodoc as Numéro, D.do_type as Type, D.do_date1 as Date, dt.dl_compte, " & _
                " IIF(dt.dl_tva_inc<>1, dt.dl_montant, dt.dl_montant - dt.dl_tva_mnt) as Mnt" & _
                " FROM ((adresses AS A " & _
                " INNER JOIN  document As D ON A.ad_numero = D.do_adr1 )" & _
                " INNER JOIN  detail As DT ON D.do_numero= dt.dl_numero )" & _
                " WHERE (D.do_type=17 OR D.do_type=20) AND dt.dl_compte Like '3000.%'"   & _
                " ORDER BY dt.dl_tva_inc "
    tu dis que colonne MNT reste toujours vide! test avec un left join!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     " LEFT JOIN  document As D ON A.ad_numero = D.do_adr1 )" & _
                " LEFT JOIN  detail As DT ON D.do_numero= dt.dl_numero )" & _
    Dernière modification par Invité ; 26/08/2015 à 09h41.

  5. #5
    Membre habitué
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    J'ai fait ce que tu m'as dit, mais aucun changement.
    Ce calcul dt.dl_montant - dt.dl_tva_mnt) as Mnt ne se fait pas. la colonne est vide.

  6. #6
    Invité
    Invité(e)
    Par défaut
    et comme ça! (on teste le IIF)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Commissions = "SELECT A.ad_societe as Société, A.ad_nom as Nom, A.ad_prenom as Prénom,  " & _
                " D.do_nodoc as Numéro, D.do_type as Type, D.do_date1 as Date, dt.dl_compte, " & _
                " dt.dl_montant - dt.dl_tva_mnt as Mnt" & _
                " FROM ((adresses AS A " & _
                " INNER JOIN  document As D ON A.ad_numero = D.do_adr1 )" & _
                " INNER JOIN  detail As DT ON D.do_numero= dt.dl_numero )" & _
                " WHERE (D.do_type=17 OR D.do_type=20) AND D.do_paye<>1 AND D.do_period<>1 AND dt.dl_compte Like '3000.%'"  & _
                " ORDER BY dt.dl_tva_inc "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Commissions = "SELECT A.ad_societe as Société, A.ad_nom as Nom, A.ad_prenom as Prénom,  " & _
                " D.do_nodoc as Numéro, D.do_type as Type, D.do_date1 as Date, dt.dl_compte, " & _
                " IIF(dt.dl_tva_inc<>1, 'Y', 'N') as Mnt" & _
                " FROM ((adresses AS A " & _
                " INNER JOIN  document As D ON A.ad_numero = D.do_adr1 )" & _
                " INNER JOIN  detail As DT ON D.do_numero= dt.dl_numero )" & _
                " WHERE (D.do_type=17 OR D.do_type=20) AND D.do_paye<>1 AND D.do_period<>1 AND dt.dl_compte Like '3000.%'"  & _
                " ORDER BY dt.dl_tva_inc "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Commissions = "SELECT A.ad_societe as Société, A.ad_nom as Nom, A.ad_prenom as Prénom,  " & _
                " D.do_nodoc as Numéro, D.do_type as Type, D.do_date1 as Date, dt.dl_compte, " & _
                " dt.dl_tva_in, dt.dl_montant, dt.dl_tva_mnt as Mnt" & _
                " FROM ((adresses AS A " & _
                " INNER JOIN  document As D ON A.ad_numero = D.do_adr1 )" & _
                " INNER JOIN  detail As DT ON D.do_numero= dt.dl_numero )" & _
                " WHERE (D.do_type=17 OR D.do_type=20) AND D.do_paye<>1 AND D.do_period<>1 AND dt.dl_compte Like '3000.%'"  & _
                " ORDER BY dt.dl_tva_inc "

  7. #7
    Membre habitué
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    Ci-dessous les résultats pour les 3 requêtes. Colonne mnt vide à chaque fois..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     "SELECT A.ad_societe as Société, A.ad_nom as Nom, A.ad_prenom as Prénom,  " & _
                " D.do_nodoc as Numéro, D.do_type as Type, D.do_date1 as Date, dt.dl_compte, " & _
                " IIF(dt.dl_tva_inc<>1, 'Y', 'N') as Mnt" & _
                " FROM ((adresses AS A " & _
                " INNER JOIN  document As D ON A.ad_numero = D.do_adr1 )" & _
                " INNER JOIN  detail As DT ON D.do_numero= dt.dl_numero )" & _
                " WHERE (D.do_type=17 OR D.do_type=20) AND D.do_paye<>1 AND D.do_period<>1 AND dt.dl_compte Like '3000.%'"  & _
                " ORDER BY dt.dl_tva_inc "
    Colonne MNT vide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     "SELECT A.ad_societe as Société, A.ad_nom as Nom, A.ad_prenom as Prénom,  " & _
                " D.do_nodoc as Numéro, D.do_type as Type, D.do_date1 as Date, dt.dl_compte, " & _
                " IIF(dt.dl_tva_inc<>1, 'Y', 'N') as Mnt" & _
                " FROM ((adresses AS A " & _
                " INNER JOIN  document As D ON A.ad_numero = D.do_adr1 )" & _
                " INNER JOIN  detail As DT ON D.do_numero= dt.dl_numero )" & _
                " WHERE (D.do_type=17 OR D.do_type=20) AND D.do_paye<>1 AND D.do_period<>1 AND dt.dl_compte Like '3000.%'"  & _
                " ORDER BY dt.dl_tva_inc "
    Colonne MNT vide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    "SELECT A.ad_societe as Société, A.ad_nom as Nom, A.ad_prenom as Prénom,  " & _
                " D.do_nodoc as Numéro, D.do_type as Type, D.do_date1 as Date, dt.dl_compte, " & _
                " dt.dl_tva_in, dt.dl_montant, dt.dl_tva_mnt as Mnt" & _
                " FROM ((adresses AS A " & _
                " INNER JOIN  document As D ON A.ad_numero = D.do_adr1 )" & _
                " INNER JOIN  detail As DT ON D.do_numero= dt.dl_numero )" & _
                " WHERE (D.do_type=17 OR D.do_type=20) AND D.do_paye<>1 AND D.do_period<>1 AND dt.dl_compte Like '3000.%'"  & _
                " ORDER BY dt.dl_tva_inc "
    Colonne MNT vide

  8. #8
    Invité
    Invité(e)
    Par défaut
    il faut cherche là ou ça va pas, dans les close Where, les valeurs, les inner jion!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Commissions = "SELECT * FROM adresses AS A "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Commissions = "SELECT * document As D  WHERE (D.do_type=17 OR D.do_type=20) "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Commissions = "SELECT * detail As DT  WHERE dt.dl_compte Like '3000.%'"

  9. #9
    Membre habitué
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    tout ça fonctionne, j'ai déjà testé..

    J'ai simplifié au max et si je laisse que ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    "SELECT adresses.ad_societe, Document.do_montant, Document.do_pmt, Document.do_montant - Document.do_pmt as Solde" & _
                " FROM adresses, document" & _
                " WHERE Adresses.ad_numero = Document.do_adr1"

    la colonne ad_societe s'affiche avec les valeurs justes
    la colonne do_montant s'affiche avec les valeurs justes
    la colonne do_pmt s'affiche avec les valeurs justes
    la colonne solde s'affiche mais reste vide.

    les deux champs sont numériques.. je sèche complètement.
    Je vais continuer de faire des essais.

  10. #10
    Invité
    Invité(e)
    Par défaut
    fais ce test!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "SELECT adresses.ad_societe, Document.do_montant, Document.do_pmt, Document.do_montant + Document.do_pmt as Solde" & _
                " FROM adresses, document" & _
                " WHERE Adresses.ad_numero = Document.do_adr1"

  11. #11
    Membre habitué
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    Merci pour ton aide, mais le résultat est toujours le même...

  12. #12
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "SELECT adresses.ad_societe, Document.do_montant, Document.do_pmt, val(Document.do_montant) - val(Document.do_pmt) as Solde" & _
                " FROM adresses, document" & _
                " WHERE Adresses.ad_numero = Document.do_adr1"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "SELECT adresses.ad_societe, Document.do_montant, Document.do_pmt, Cdbl(Document.do_montant) - cdbl(Document.do_pmt) as Solde" & _
                " FROM adresses, document" & _
                " WHERE Adresses.ad_numero = Document.do_adr1"

  13. #13
    Membre habitué
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    Dans les 2 cas, une erreur s'affiche

    "Erreur Automation"

    En pièce jointe, le fichier Document.dbf

    dbf.zip

    J'exécute aussi ce code après la requête, est-ce que pourrait avoir un lien ?

    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
    'Feuil 1 - Affiche dans la feuille 1 la liste des postes ouverts débiteurs
    Set rs = New ADODB.Recordset
    rs.Open Debiteurs_ouverts, cN
    nb_col = rs.Fields.Count
    For j = 0 To nb_col - 1
        Feuil1.Cells(1, j + 1).Value = rs.Fields(j).Name
    Next j
    rs.MoveFirst
    i = 2
    While Not rs.EOF
        For j = 1 To nb_col - 1
            Feuil1.Cells(i, j) = rs(j - 1)
        Next
        i = i + 1
       rs.MoveNext
    Wend

  14. #14
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    'Feuil 1 - Affiche dans la feuille 1 la liste des postes ouverts débiteurs
    Set rs = New ADODB.Recordset
    rs.Open Debiteurs_ouverts, cN
    For j = 0 To rs.Fields.Count - 1
       Sheets("Feuil1").range("A1").Offset(0,j).Value = rs.Fields(j).Name
    Next j
    Sheets("Feuil1").range("A2").CopyFromRecordset rs
    mais je ne voie pas de corrélation avec ton problème! et pour l’instant je sèche!

  15. #15
    Membre habitué
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    Alors,

    Si j'inverse l'ordre des colonnes dans le select. Le calcul se fait ! mais du coup la dernière colonne reste vide. Donc dans ce cas là do_montant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Debiteurs_ouverts = "SELECT adresses.ad_societe, Document.do_montant + Document.do_pmt as Solde, Document.do_montant" & _
                " FROM adresses, document" & _
                " WHERE Adresses.ad_numero = Document.do_adr1"
    Donc j'ai bien l'impression que le problème vient de ce code ? Qu'en penses-tu ?

    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
    'Feuil 1 - Affiche dans la feuille 1 la liste des postes ouverts débiteurs
    Set rs = New ADODB.Recordset
    rs.Open Debiteurs_ouverts, cN
    nb_col = rs.Fields.Count
    For j = 0 To nb_col - 1
        Feuil1.Cells(1, j + 1).Value = rs.Fields(j).Name
    Next j
    rs.MoveFirst
    i = 2
    While Not rs.EOF
        For j = 1 To nb_col - 1
            Feuil1.Cells(i, j) = rs(j - 1)
        Next
        i = i + 1
       rs.MoveNext
    Wend

  16. #16
    Invité
    Invité(e)
    Par défaut
    reprend le code que je viens de te donner poste #14!
    Dernière modification par AlainTech ; 03/09/2015 à 21h46.

  17. #17
    Membre habitué
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    cette erreur s'affiche :

    Erreur d'exécution (9)
    L'indice n'appartient pas à la sélection

  18. #18
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    'Feuil 1 - Affiche dans la feuille 1 la liste des postes ouverts débiteurs
    Set rs = New ADODB.Recordset
    rs.Open Debiteurs_ouverts, cN
    For j = 0 To rs.Fields.Count - 1
       Feuil1.range("A1").Offset(0,j).Value = rs.Fields(j).Name
    Next j
    Feuil1.range("A2").CopyFromRecordset rs
    dans mon Code précédant il fallait mettre le nom de la feuille telle qu'elle est vue dans Excel pas dans VBA!

  19. #19
    Membre habitué
    Femme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    J'ai mis ceci et tout est OK

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Set rs = New ADODB.Recordset
    rs.Open Debiteurs_ouverts, cN
    For j = 0 To rs.Fields.Count - 1
        Feuil1.Range("A1").Offset(0, j).Value = rs.Fields(j).Name
    Next j
    Feuil1.Range("A2").CopyFromRecordset rs
    Un GRAND merci pour ton aide

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

Discussions similaires

  1. Récupérer une variable calculée dans une requête SQL
    Par nanar1 dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/01/2009, 11h45
  2. Problème d'espaces dans une requête SQL
    Par Wonesek dans le forum SQL
    Réponses: 9
    Dernier message: 22/04/2008, 16h46
  3. Problème de cumul dans une requête SQL
    Par soso78 dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 13/09/2007, 05h56
  4. Problème avec like dans une requête SQL
    Par Boublou dans le forum SQL
    Réponses: 2
    Dernier message: 16/08/2007, 15h46
  5. Récupérer la valeur des champs calculés dans une requète SQL dans vba
    Par FrédéricCM dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 28/06/2006, 16h29

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