Requête SQL en VBA avec liaison odbc

Bon j'y arrive gentiment. Cette fois j'ai tous les documents, la requête est correcte. Par contre, ça ne provient pas du signe - mais du calcul effectué dans le requête dt.dl_montant - dt.dl_tva_mnt :

En fait il ne le fait pas et du coup il ne m'affiche pas tous les montants..

'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, dt.dl_montant" & _
                " 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.%') AND NOT (dt.dl_tva_inc=1) " & _
                " UNION ALL" & _
                " 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" & _
                " 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.%') AND (dt.dl_tva_inc=1) " & _
                " UNION ALL"

   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, -dt.dl_montant" & _
                " 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=22) AND (D.do_paye<>1) AND (D.do_period<>1) AND (dt.dl_compte Like '3000.%') AND NOT (dt.dl_tva_inc=1) " & _
                " UNION ALL" & _
                " 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" & _
                " 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=22) AND (D.do_paye<>1) AND (D.do_period<>1) AND (dt.dl_compte Like '3000.%') AND (dt.dl_tva_inc=1)"
                   

et avec un alias?, soit pour les 4 select :

(dt.dl_montant) as mnt

(-dt.dl_montant) as mnt

(dt.dl_montant - dt.dl_tva_mnt) as mnt

(-dt.dl_montant + dt.dl_tva_mnt) as mnt

Merci pour ta réponse.

Mais toujours pas de résultat.. Bon je désespère pour aujourd'hui.

Je refais des essais et des recherches demain.

En relisant mieux la requête, on peut simplifier avec un IIF. Est-ce que la requête suivante marche sur ton PC :

'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 " & _
            " UNION ALL"

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=22) AND (D.do_paye<>1) AND (D.do_period<>1) AND (dt.dl_compte Like '3000.%') " & _
            " ORDER BY dt.dl_tva_inc "

Merci pour ta réponse et pour la simplification de la requête.

Mais la colonne MNT reste vide. Ce *%&ç#§| de calcul ne se fait pas.. .. Je ne comprends vraiment pas pourquoi.

Au départ, j'ai fait mes requêtes dans MSQuery et le calcul passait sans problème.

J'ai fait des tests et j'ai simplifié la requête au max

"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"

mais impossible d'afficher quoique ce soit dans cette colonne solde.. Le champ reste définitivement vide.

Je viens de mettre cette requête dans MS Query et elle fonctionne.. Je ne vois vraiment pas d'où peut venir ce problème.

Désolé, avec tous les tests que je peux faire de mon côté sur mes fichiers dbf (non créés par FoxPro), les requêtes très similaires aboutissent avec des calculs justes.

Et Excel semblent indiquer qu'il reconnait les bons formats de données pour les colonnes dans tes fichiers DBF (ouverts sous Excel)

Je ne sais pas quoi te dire de plus pour t'aider

Quand tu récupères simplement une colonne numérique (et sans aucun calcul), tu obtiens des données? Et dans ce cas, elles sont transcrites dans Excel avec un format numérique? (car dans ce cas, on pourrait peut être intégrer la formule dans une des colonnes excel)

J'ai résolu le problème. Il ne provenait pas de la requête.

Mais de ce code-ci

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 = 0 To nb_col - 1
        Feuil1.Cells(i, j+1) = rs(j)
    Next
    i = i + 1
    rs.MoveNext
Wend

En fait la dernière colonne restait toujours vide..

J'ai remplacé par ce code :

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

et tout fonctionne.

Merci pour ton aide

Rechercher des sujets similaires à "requete sql vba liaison odbc"