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 :

besoin d'aide pour concevoir une requête [AC-2007]


Sujet :

Requêtes et SQL.

  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 besoin d'aide pour concevoir une requête
    Bonsoir,
    J'ai un pb à résoudre mais je n'arrive pas à trouver une logique de raisonnement pour établir une requête.

    J'ai 1 table Article : codeArt, prix1, prix2
    1 table HistoArticleVente : Cod_art, dernierPrix, date, cod_cli
    1 table Clients :CodeCli

    Je veux dans un formulaire Facture avec sous Form Lignes vendre les articles Qd l'utilisateur ouvre le ménu déroulant pour choisir son article, je voudrais avoir dans les colonnes de ma liste exactement ceci :
    codeArt, prix1, Prix2, dernierPrix, cod_cli.

    Donc cela permettra de voir le prix normal (prix1), le prix réduit (prix2) et le dernier prix auquel à été vendu le produit au client en cours.

    Mais il peut arriver que l'article n'ai jamais été vendu au client.

    Exemple:
    T_ARTICLE =
    article1, 10, 20

    T_HISTOARTICLEVENTE =
    article1, 11, 31052009,DUPONT
    article1, 12, 30032009,BERNARD
    article1, 13, 30062009,BERNARD

    Si vente à BERNARD de l'article 1, je voudrais voir dans ma liste déroulante :
    article1, 10, 20, 13, BERNARD
    (13 parce que la date la plus récente est le 30062009 et son prix 13)

    Si vente à BILLOU de l'article 1, je voudrais voir :
    article1, 10, 20, ,


    Je n'arrive pas à trouver comment je dois faire ma requête ?

    Pour l'instant, j'obtiens tout en reliant T_ARTICLES et T_HISTOARTICLEVENTE.
    Mais comment faire pour filtrer ma liste sur le tiers s'il est présent dans la requête, sinon sur la ligne sans tiers ET aussi filtrer sur les dates les plus récentes : pour BERNARD, la date la plus récente est le 30062009 mais pour DUPONT c'est le 31052009.

    Est-ce qu'une bonne âme peut m'aider ?

    Merci d'avance
    Thibault

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Bonjour,

    copié-collé de mon post d'il y a 5' dans une autre file...

    Pour résoudre ce type de problème en général je crée une fonction globale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public function get_dernier_prix(a,c)
    Comme son nom l'indique cette fonction doit chercher le dernier prix vendu pour l'article a au client c, et renvoie null s'il n'y en a pas
    Ensuite elle peut être appelée dans n'importe quelle requete

    Par contre il faudrait mettre le client dans un champ à part et non en dernière colonne pour qu'il soit utilisable dans la requête qui génère la liste déroulante
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,

    Essaie ceci
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT CodeArt,CodeCli, Prix1, Prix2, DernierPrix
    FROM Articles LEFT JOIN
     (HistoArticleVente As Histo LEFT JOIN Clients
     ON Clients.CodeCli = Histo.Cod_Cli) ON Histo.Cod_Art = Articles.CodeArt
    WHERE Histo.Date IS NULL
    OR Histo.Date =
       (SELECT Max(Date) FROM HistoArticleVente
      WHERE Cod_Cli = Clients.CodeCli AND Cod_Art = Articles.CodeArt);

  4. #4
    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

    Pour la fonction, cela me dépasse en termes de connaissance donc je ne sais pas comment exploiter cette solution.

    Pour le code SQL, je l'ai adapté à mes vrais noms de champs. Mais cela ne marche pas.
    J'ai un doute sur le code à cet endroit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT CodeArt,CodeCli, Prix1, Prix2, DernierPrix
    FROM Articles
    DernierPrix n'appartient pas à la table Articles !

    J'ai essayé quand même le code pour "voir" : la requête s'exécute mais j'ai pas le DernierPrix !!

    une idée ?

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,

    tibofo, si tu te limites à la table Articles (ou T_Article) il est sûr que tu n'obtiendras jamais le champ DernierPrix puisqu'il appartient à la table des historique.
    La requête donnée renvoie tous les articles de la table Article plus s'il existe le dernier prix pour chaque client.

    Exemple :
    Articles =
    Article1, 10, 20
    Article2, 15, 25
    Article3, 35, 45
    Clients =
    BERNARD
    DUPONT
    HistoArticleVente =
    article1, 11, 31052009,DUPONT
    article1, 12, 30032009,BERNARD
    article1, 13, 30062009,BERNARD

    La requête donne en sortie
    Article1, BERNARD, 10 , 20, 13
    Article1, DUPONT, 10 , 20, 11
    Article2, , 15, 25,
    Article3, , 35, 45

    Tu peux également adapter la requête pour un client donné
    Exemple : Ici uniquement les infos pour le client BERNARD
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT CodeArt, Prix1, Prix2, DernierPrix
    FROM Articles LEFT JOIN
     (HistoArticleVente AS Histo LEFT JOIN Clients
     ON Clients.CodeCli = Histo.Cod_Cli) ON Histo.Cod_Art = Articles.CodeArt
    WHERE
     (Clients.CodeCli="BERNARD" OR Clients.CodeCli IS NULL)
      AND
     (Histo.Date IS NULL OR
      Histo.Date=(SELECT Max(Date) FROM HistoArticleVente
      WHERE Cod_Cli = Clients.CodeCli AND Cod_Art = Articles.CodeArt));

  6. #6
    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 Ilank pour ton suivi.

    J'ai relu et relu ton code pour essayer de bien le comprendre. Et je me suis dit "je vais tenter" de simplifier ma démarche en utilisant ton code et en essayant progressivement les résultats. J'ai encore qq chose qui "coince" mais je sui prêt du but grâce à toi.

    J'ai laissé (pour l'instant) 2 tables (je donne les vrais noms) dbo_articles et dbo_ART_DERNIERES_VENTES et j'ai borné sur 2 articles pour mieux "voir" les incidences

    1er code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT dbo_ARTICLES.COD_ART, dbo_ARTICLES.DGN, dbo_ARTICLES.PRX_VEN_HT_1, dbo_ARTICLES.PRX_VEN_HT_2, dbo_ART_DERNIERES_VENTES.Client_Livré, dbo_ART_DERNIERES_VENTES.Code_article, dbo_ART_DERNIERES_VENTES.Prix_Unitaire_Net, dbo_ART_DERNIERES_VENTES.Date_Dern_Vente
    FROM dbo_ARTICLES LEFT JOIN dbo_ART_DERNIERES_VENTES ON dbo_ARTICLES.COD_ART = dbo_ART_DERNIERES_VENTES.Code_article
    WHERE (((dbo_ARTICLES.COD_ART)="3422111")) OR (((dbo_ARTICLES.COD_ART)="3424004"));
    ce qui me donne :


    Je constate que l'article 3422111 apparait 3 fois pour le même client et que sa date la plus récente est le 30042009

    Je rajoute dans le code, le critère de sélection avec le Max :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT dbo_ARTICLES.COD_ART, dbo_ARTICLES.DGN, dbo_ARTICLES.PRX_VEN_HT_1, dbo_ARTICLES.PRX_VEN_HT_2, dbo_ART_DERNIERES_VENTES.Client_Livré, dbo_ART_DERNIERES_VENTES.Code_article, dbo_ART_DERNIERES_VENTES.Prix_Unitaire_Net, dbo_ART_DERNIERES_VENTES.Date_Dern_Vente
    FROM dbo_ARTICLES LEFT JOIN dbo_ART_DERNIERES_VENTES ON dbo_ARTICLES.COD_ART = dbo_ART_DERNIERES_VENTES.Code_article
    WHERE (((dbo_ARTICLES.COD_ART)="3422111") 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
      WHERE dbo_ART_DERNIERES_VENTES.Code_article = dbo_ARTICLES.[COD_ART]))) OR (((dbo_ARTICLES.COD_ART)="3424004"));
    Et là j'obtiens :


    Donc la ligne est bonne pour mon client 34065 qui apparaissait 3 fois, mais cela m'a fait disparaitre les autres clients qui n'apparaissaient qu'une fois !!

    Sais-tu ce que que je dois adapter ou faire ?
    merci
    thibault

  7. #7
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Tant pis pour la solution avec une fonction qui est pourtant bien plus jolie

    Ta requête a trouvé le max tous clients confondus, il faut compléter le test du max :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT dbo_ARTICLES.COD_ART, dbo_ARTICLES.DGN, dbo_ARTICLES.PRX_VEN_HT_1, dbo_ARTICLES.PRX_VEN_HT_2, dbo_ART_DERNIERES_VENTES.Client_Livré, dbo_ART_DERNIERES_VENTES.Code_article, dbo_ART_DERNIERES_VENTES.Prix_Unitaire_Net, dbo_ART_DERNIERES_VENTES.Date_Dern_Vente
     
    FROM (dbo_ARTICLES LEFT JOIN dbo_ART_DERNIERES_VENTES ON dbo_ARTICLES.COD_ART = dbo_ART_DERNIERES_VENTES.Code_article)
    WHERE (((dbo_ARTICLES.COD_ART)="3422111") 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 (((dbo_ARTICLES.COD_ART)="3424004"));

    Comme il y a 2 fois la même table j'ai mis un alias la 2e fois pour pas qu'il s'embrouille
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  8. #8
    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
    Un grand merci à vous 2

    Nico84 ton code marche parfaitement. J'avoue en voyant la solution que je n'aurais jamais trouvé et qu'en plus, je ne la comprends pas !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND x.Client_Livré=dbo_ART_DERNIERES_VENTES.Client_Livré
    trop le coup du si le client de la même table et le même de la même table !!
    je ne pige rien à ce bout de code en +

    Si tu veux m'éclairer, je suis preneur.

    Mais en tout cas, M E R C I !!!
    Thibault

  9. #9
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    C'est forcément 2 fois la même table puisqu'on veut le maximum sur cette table donc on cherche la date de la table croisée avec les articles qui est égale à la date maxi de la table seule

    Dans le test sur l'article en réalité c'est pareil mais comme l'article est aussi dans la table dbo_ARTICLES cela a permis de faire un test qui semble être sur 2 tables distinctes mais ce n'est qu'apparent

    PS : si tu veux comprendre la requête, prends le temps de la mettre en forme comme l'a fait ilank et utilise des alias pour les noms de table
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  10. #10
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,

    en fait la copie de la table Histo remplace la table Client indiquée dans la première requête.

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

Discussions similaires

  1. Besoin d'aide pour créer une requête
    Par cedric/copy dans le forum ASP
    Réponses: 6
    Dernier message: 13/03/2009, 16h29
  2. Besoin d'aide pour créer une requête
    Par fabien59420 dans le forum Requêtes et SQL.
    Réponses: 44
    Dernier message: 26/05/2008, 11h08
  3. [MySQL] besoin d'aide pour exécuter une requête et en récupérer le résultat
    Par fast462 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 28/05/2007, 10h30
  4. besoin d 'aide pour formuler une requête
    Par cdu dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/04/2006, 19h38
  5. besoin d'aide pour optimiser une requête
    Par jisse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 09h41

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