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

Requêtes et SQL. Discussion :

mauvais résultat dans ma requête


Sujet :

Requêtes et SQL.

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    683
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 683
    Points : 237
    Points
    237
    Par défaut mauvais résultat dans ma requête
    Bonsoir,
    P.S : edit de mon post pour ajouter un exemple de ma base sous Access03 en PJ

    J'ai une requête qui relie 2 tables ARTICLES et ART_DERNIERES_VENTES (elle est plutôt complexe et les "Forumeurs" m'ont souvent aidé dessus).

    Mon problème est que le résultat n'est pas totalement bon : il me manque des lignes.
    A force de chercher : j'ai trouvé qu'il me manque des lignes Si le client n'est jamais présent dans la table des Historiques --> du coup, les articles qui n'ont pas d'historique, pour le client demandé, ne ressortent pas.

    Et j'ai besoin d'avoir TOUS les articles (mêmes ceux qui n'ont jamais été vendu)


    Voici le code SQL :
    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
    SELECT dbo_ARTICLES.COD_ART, dbo_ARTICLES.DGN, dbo_ARTICLES.DEB_TRF_1 AS TARIF1, dbo_ARTICLES.PRX_VEN_HT_1 AS PV1, dbo_ARTICLES.DEB_TRF_2 AS TARIF2, dbo_ARTICLES.PRX_VEN_HT_2 AS PV2, Switch(
    [TARIF1]>[TARIF2] And Format(Now(),"yyyymmdd")>=[TARIF1] And Format(Now(),"yyyymdd")>[TARIF2], [PV1],
    [TARIF1]>[TARIF2] And Format(Now(),"yyyymmdd")<[TARIF1] And Format(Now(),"yyyymmdd")>=[TARIF2],[PV2],
    [TARIF1]>[TARIF2] And Format(Now(),"yyyymmdd")<[TARIF1] And [TARIF2]="0",0,
    [TARIF1]<[TARIF2] And Format(Now(),"yyyymmdd")<[TARIF1] And Format(Now(),"yyyymmdd")<[TARIF2],0,
    [TARIF1]<[TARIF2] And Format(Now(),"yyyymmdd")>=[TARIF1] And Format(Now(),"yyyymmdd")<[TARIF2],[PV1],
    [TARIF1]<[TARIF2] And Format(Now(),"yyyymmdd")>[TARIF1] And Format(Now(),"yyyymmdd")>=[TARIF2],[PV2],
    [TARIF1]<[TARIF2] And [DEB_TRF_1]="0" And Format(Now(),"yyyymmdd")>=[TARIF2],[PV2],
    [TARIF1]<[TARIF2] And [DEB_TRF_1]="0" And Format(Now(),"yyyymmdd")<[TARIF2],0,
    [TARIF1]=[TARIF2] AND Format(Now(),"yyyymmdd")>=[TARIF1] And PV1>PV2,[PV1],
    [TARIF1]=[TARIF2] AND Format(Now(),"yyyymmdd")>=[TARIF1] And PV1<PV2,[PV2],
    [TARIF1]=[TARIF2] AND Format(Now(),"yyyymmdd")>=[TARIF1] And PV1=PV2,[PV2],
    [TARIF1]=[TARIF2] AND Format(Now(),"yyyymmdd")<[TARIF1],0
    ) AS TARIFENCOURS, dbo_ARTICLES.STK_REEL, dbo_ARTICLES.QTE_ATE, dbo_ART_DERNIERES_VENTES.Client_Livré, dbo_ART_DERNIERES_VENTES.Date_Dern_Vente, dbo_ART_DERNIERES_VENTES.Qté_Livrée, dbo_ART_DERNIERES_VENTES.Prix_Unitaire_Net, dbo_ART_DERNIERES_VENTES.Ref_Commande, dbo_ART_DERNIERES_VENTES.Numéro_Pièce, dbo_ART_DERNIERES_VENTES.Code_article
    FROM dbo_ARTICLES LEFT JOIN dbo_ART_DERNIERES_VENTES ON dbo_ARTICLES.COD_ART = dbo_ART_DERNIERES_VENTES.Code_article
    WHERE (((dbo_ART_DERNIERES_VENTES.Client_Livré)=[Formulaires]![Bon de commande]![CODCLI] 
    Or (dbo_ART_DERNIERES_VENTES.Client_Livré) Is Null)
    AND ((dbo_ART_DERNIERES_VENTES.Date_Dern_Vente) Is Null 
    Or (dbo_ART_DERNIERES_VENTES.Date_Dern_Vente)=(SELECT Max([Date_Dern_Vente]) 
    
    FROM dbo_ART_DERNIERES_VENTES AS x   
    WHERE x.Code_article = dbo_ARTICLES.[COD_ART] AND x.Client_Livré=dbo_ART_DERNIERES_VENTES.Client_Livré)));
    Je pense que cela vient du AND en rouge

    J'ai tenté quelques modifs : supprimer ce bout de code, mettre un OR, mettre un <> au lieu de =.... Mais rien à faire, je n'obtiens pas tous mes articles (1 ligne par article)

    Est-ce que quelqu'un voit une solution que je pourrais appliquer ?

    Merci
    Thibault
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 612
    Points : 34 292
    Points
    34 292
    Par défaut
    salut,
    dans le cas où tu as des critères de type IS Null et des jointures externes, ne faudrait-il pas compléter la clause par
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    x.Client_Livré=dbo_ART_DERNIERES_VENTES.Client_Livré OR x.Client_Livré Is Null
    ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    683
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 683
    Points : 237
    Points
    237
    Par défaut
    Merci JPCHECK pour ton regard.

    J'ai essayé mais cela ne marche pas mieux. En cherchant de mon côté, j'ai trouvé que, peut-être, je pourrais passer par un UNION.

    J'ai essayé 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
    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
    SELECT dbo_ARTICLES.COD_ART, dbo_ARTICLES.DGN, dbo_ARTICLES.DEB_TRF_1 AS TARIF1, dbo_ARTICLES.PRX_VEN_HT_1 AS PV1, dbo_ARTICLES.DEB_TRF_2 AS TARIF2, dbo_ARTICLES.PRX_VEN_HT_2 AS PV2, Switch(
    [TARIF1]>[TARIF2] And Format(Now(),"yyyymmdd")>=[TARIF1] And Format(Now(),"yyyymdd")>[TARIF2], [PV1],
    [TARIF1]>[TARIF2] And Format(Now(),"yyyymmdd")<[TARIF1] And Format(Now(),"yyyymmdd")>=[TARIF2],[PV2],
    [TARIF1]>[TARIF2] And Format(Now(),"yyyymmdd")<[TARIF1] And [TARIF2]="0",0,
    [TARIF1]<[TARIF2] And Format(Now(),"yyyymmdd")<[TARIF1] And Format(Now(),"yyyymmdd")<[TARIF2],0,
    [TARIF1]<[TARIF2] And Format(Now(),"yyyymmdd")>=[TARIF1] And Format(Now(),"yyyymmdd")<[TARIF2],[PV1],
    [TARIF1]<[TARIF2] And Format(Now(),"yyyymmdd")>[TARIF1] And Format(Now(),"yyyymmdd")>=[TARIF2],[PV2],
    [TARIF1]<[TARIF2] And [DEB_TRF_1]="0" And Format(Now(),"yyyymmdd")>=[TARIF2],[PV2],
    [TARIF1]<[TARIF2] And [DEB_TRF_1]="0" And Format(Now(),"yyyymmdd")<[TARIF2],0,
    [TARIF1]=[TARIF2] AND Format(Now(),"yyyymmdd")>=[TARIF1] And PV1>PV2,[PV1],
    [TARIF1]=[TARIF2] AND Format(Now(),"yyyymmdd")>=[TARIF1] And PV1<PV2,[PV2],
    [TARIF1]=[TARIF2] AND Format(Now(),"yyyymmdd")>=[TARIF1] And PV1=PV2,[PV2],
    [TARIF1]=[TARIF2] AND Format(Now(),"yyyymmdd")<[TARIF1],0
    ) AS TARIFENCOURS, dbo_ARTICLES.STK_REEL, dbo_ARTICLES.QTE_ATE, dbo_ART_DERNIERES_VENTES.Client_Livré, dbo_ART_DERNIERES_VENTES.Date_Dern_Vente, dbo_ART_DERNIERES_VENTES.Qté_Livrée, dbo_ART_DERNIERES_VENTES.Prix_Unitaire_Net, dbo_ART_DERNIERES_VENTES.Ref_Commande, dbo_ART_DERNIERES_VENTES.Numéro_Pièce, dbo_ART_DERNIERES_VENTES.Code_article
    FROM dbo_ARTICLES LEFT JOIN dbo_ART_DERNIERES_VENTES ON dbo_ARTICLES.COD_ART = dbo_ART_DERNIERES_VENTES.Code_article
    WHERE (((dbo_ART_DERNIERES_VENTES.Client_Livré)="02044" 
    Or (dbo_ART_DERNIERES_VENTES.Client_Livré) Is Null)
    AND ((dbo_ART_DERNIERES_VENTES.Date_Dern_Vente) Is Null 
    Or (dbo_ART_DERNIERES_VENTES.Date_Dern_Vente)=(SELECT Max([Date_Dern_Vente]) 
     
    FROM dbo_ART_DERNIERES_VENTES AS x   
    WHERE x.Code_article = dbo_ARTICLES.[COD_ART] AND x.Client_Livré=dbo_ART_DERNIERES_VENTES.Client_Livré OR x.Client_Livré IS NULL )))
     
    UNION
     
    SELECT dbo_ARTICLES.COD_ART, dbo_ARTICLES.DGN, dbo_ARTICLES.DEB_TRF_1 AS TARIF1, dbo_ARTICLES.PRX_VEN_HT_1 AS PV1, dbo_ARTICLES.DEB_TRF_2 AS TARIF2, dbo_ARTICLES.PRX_VEN_HT_2 AS PV2, Switch(
    [TARIF1]>[TARIF2] And Format(Now(),"yyyymmdd")>=[TARIF1] And Format(Now(),"yyyymdd")>[TARIF2], [PV1],
    [TARIF1]>[TARIF2] And Format(Now(),"yyyymmdd")<[TARIF1] And Format(Now(),"yyyymmdd")>=[TARIF2],[PV2],
    [TARIF1]>[TARIF2] And Format(Now(),"yyyymmdd")<[TARIF1] And [TARIF2]="0",0,
    [TARIF1]<[TARIF2] And Format(Now(),"yyyymmdd")<[TARIF1] And Format(Now(),"yyyymmdd")<[TARIF2],0,
    [TARIF1]<[TARIF2] And Format(Now(),"yyyymmdd")>=[TARIF1] And Format(Now(),"yyyymmdd")<[TARIF2],[PV1],
    [TARIF1]<[TARIF2] And Format(Now(),"yyyymmdd")>[TARIF1] And Format(Now(),"yyyymmdd")>=[TARIF2],[PV2],
    [TARIF1]<[TARIF2] And [DEB_TRF_1]="0" And Format(Now(),"yyyymmdd")>=[TARIF2],[PV2],
    [TARIF1]<[TARIF2] And [DEB_TRF_1]="0" And Format(Now(),"yyyymmdd")<[TARIF2],0,
    [TARIF1]=[TARIF2] AND Format(Now(),"yyyymmdd")>=[TARIF1] And PV1>PV2,[PV1],
    [TARIF1]=[TARIF2] AND Format(Now(),"yyyymmdd")>=[TARIF1] And PV1<PV2,[PV2],
    [TARIF1]=[TARIF2] AND Format(Now(),"yyyymmdd")>=[TARIF1] And PV1=PV2,[PV2],
    [TARIF1]=[TARIF2] AND Format(Now(),"yyyymmdd")<[TARIF1],0
    ) AS TARIFENCOURS, dbo_ARTICLES.STK_REEL, dbo_ARTICLES.QTE_ATE, dbo_ART_DERNIERES_VENTES.Client_Livré, dbo_ART_DERNIERES_VENTES.Date_Dern_Vente, dbo_ART_DERNIERES_VENTES.Qté_Livrée, dbo_ART_DERNIERES_VENTES.Prix_Unitaire_Net, dbo_ART_DERNIERES_VENTES.Ref_Commande, dbo_ART_DERNIERES_VENTES.Numéro_Pièce, dbo_ART_DERNIERES_VENTES.Code_article
    FROM dbo_ARTICLES LEFT JOIN dbo_ART_DERNIERES_VENTES ON dbo_ARTICLES.COD_ART = dbo_ART_DERNIERES_VENTES.Code_article
    WHERE (((dbo_ART_DERNIERES_VENTES.Client_Livré)<>"02044" 
    Or (dbo_ART_DERNIERES_VENTES.Client_Livré) Is Null)
    AND ((dbo_ART_DERNIERES_VENTES.Date_Dern_Vente) Is Null 
    Or (dbo_ART_DERNIERES_VENTES.Date_Dern_Vente)=(SELECT Max([Date_Dern_Vente]) 
     
    FROM dbo_ART_DERNIERES_VENTES AS x   
    WHERE x.Code_article = dbo_ARTICLES.[COD_ART] )));

    Dans ce cas, avec l'exemple de la pièce jointe, j'obtiens bien mes 4 articles si j'utilise le client 02044. Mais sur l'article 1106011 (celui qui me manquait), les colonnes (concernant en fait l'historique) sont alimentés par la dernière vente d'un autre client.

    Que c'est dur les requêtes !!!!

    une autre idée ?

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 612
    Points : 34 292
    Points
    34 292
    Par défaut
    attention à bien avoir un bon parenthésage dans ta requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE x.Code_article = dbo_ARTICLES.[COD_ART] AND (x.Client_Livré=dbo_ART_DERNIERES_VENTES.Client_Livré OR x.Client_Livré IS NULL ))))
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    683
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 683
    Points : 237
    Points
    237
    Par défaut
    encore merci
    les paranthèses n'ont rien changé. En désespoir, j'ai changé la conception même de ma requête en passant par un union des 2 tables puis en filtrant le résultat

  6. #6
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 612
    Points : 34 292
    Points
    34 292
    Par défaut
    et ta nouvelle requête est-elle opérationnelle ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

Discussions similaires

  1. Numerotation d'un résultat dans une requête
    Par fonzidima dans le forum Requêtes et SQL.
    Réponses: 21
    Dernier message: 16/12/2012, 21h45
  2. Mauvais résultat d'une requête SQL
    Par ramoucha23 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/08/2011, 16h45
  3. Réponses: 2
    Dernier message: 28/05/2010, 09h54
  4. mauvais encodage dans la requête?
    Par HeadCoder dans le forum Débuter
    Réponses: 2
    Dernier message: 17/05/2010, 17h48
  5. Réponses: 19
    Dernier message: 03/02/2009, 10h52

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