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 :

requête sql dans microsoft access


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut requête sql dans microsoft access
    Bonjour. J'ai le problème suivant:

    J'ai deux tables. La première a bcp de champs (c'est une liste d'expéditions) dont un qui m'intéresse, LE POIDS. La deuxième table contient un barême tarifaire suivant le poids de l'expédition et la zone d'expédition.
    -ex.première table:

    REFERENCE COLIS POIDS
    00426051 1 3.8
    00426114 1 10

    1 310
    -ex.deuxième table:

    Weight Zone 1 Zone 2
    5 5.48 7.32
    10 6.72 8.97
    20 8.39 11.22
    30 10.25 13.69
    40 13.02 17.41
    50 14.79 19.76
    60 16.88 22.55
    70 18.88 25.22
    80 20.93 27.96
    90 23.00 30.75
    100 23.95 31.97

    En gros ce que je veux faire c'est d'abord de rechercher la bonne ligne dans la deuxième table. Pour indication, lorsque le poids de l'expédition est entre deux tranches de poids il faut choisir celle qui est supérieure (par exemple, si poids expédition = 35 kg, il faut lire la ligne qui contient 40 sous 'WEIGHT' de la table 2).

    Une première étape peut être de construire la requête comme cela:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM table1, table2
    WHERE table1.POIDS <= table2.Weight;

    Par contre, cela me donne tous les tuples entre table1 et table2 qui satisfont la condition. J'ai essayé avec DISTINCT, LIMIT, RAND...je ne peux pas obtenir ce que je veux. Est-ce que quelqu'un pourrait-il m'aider? Merci d'avance et bon week-end

  2. #2
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    Hello Mladenski et bienvenue sur le forum

    voila, je te livre en vitesse le SQL de ma requête qui fait ce genre de boulot.
    comme je n'ai pas trop le temps de l'adapter à ton cas exactement, j'espère que tu pourras y trouver ton bonheur, sinin reviens sur le forum pour la suite de l'aide
    SELECT Tarif.Transporteur, Tarif.Département, Tarif.[Poids mini], Tarif.[Poids maxi], Tarif.[Type de tarif], Tarif.[Unité de calcul], Tarif.[Prix par unité], Round(([plus]+0.0049+IIf([Type de tarif]="Forfait",[Prix par unité],Round(0.049+Formulaires!Démarrage!arg21/[Unité de calcul],1)*[Prix par unité])),2) AS [sans coef], Val(Formulaires!Démarrage!arg21) AS poids_total, Coefficients.Coef_transp, Tarif.Plus, Round([Coef_transp]*([plus]+0.0049+IIf([Type de tarif]="Forfait",[Prix par unité],Round(0.049+Formulaires!Démarrage!arg21/[Unité de calcul],1)*[Prix par unité])),2) AS prix
    FROM Tarif, Coefficients
    WHERE (((Tarif.Département)=[Formulaires]![Démarrage]![arg20]) AND ((Tarif.[Poids mini])<=[Formulaires]![Démarrage]![arg21]) AND ((Tarif.[Poids maxi])>=[Formulaires]![Démarrage]![arg21]))
    ORDER BY Round([Coef_transp]*([plus]+0.0049+IIf([Type de tarif]="Forfait",[Prix par unité],Round(0.049+Formulaires!Démarrage!arg21/[Unité de calcul],1)*[Prix par unité])),2);
    sachant qu pour que cette requête fonctionne dans tous les cas, j'ai écris certaines valeurs dans des cses cachées de mon formulaire démarrage dont je suis sûr qu'il est toujours ouvert
    le département stocké dans [Formulaires]![Démarrage]![arg20]
    le poids à transporter dans [Formulaires]![Démarrage]![arg21]

    PS: note bien que je n'ai rien écris en SQL mais que je suis juste passé par le mode création de requête où j'ai mis les champs et les calculs que je voulais et puis mes tests et mes tris

    2°PS après lecture: on a besoin de deux champs de poids dans la table des tarifs de transport pour avoir sur la même ligne un poids mini et un poids maxi

  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,
    mladenski en fait la première requête doit rechercher dans table2 le premier enregistrement dont la valeur du champ Weight>= au champ poids de table1

    ex:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
    FROM Table1, Table2
    WHERE Table2.Weight=(SELECT First(Weight) FROM Table2 WHERE Weight>=Table1.Poids)

  4. #4
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonjour,

    Je suis d'accord avec Ilank, sauf sur un point : l'utilisation de First(...)
    Les fonctions First et Last sont analogues aux méthodes MoveFirst et MoveLast d'un objet Recordset DAO. Elles renvoient la valeur d'un champ spécifié respectivement dans le premier ou le dernier enregistrement des résultats produits par une requête. Étant donné que les enregistrements ne sont en général renvoyés dans aucun ordre particulier (sauf si la requête comporte une clause ORDER BY), les enregistrements renvoyés par ces fonctions sont arbitraires.
    Min(...) me semble plus sûr.

    Autre chose.
    Si le poids du colis est supérieur à la dernière tranche, la requête ne retourne rien.
    Soit on prends en compte ce cas dans la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Table1.REFERENCE, Table1.COLIS, Table1.POIDS, Table2.Weight, Table2.[Zone 1], Table2.[Zone 2]
    FROM Table1, Table2
    WHERE Table2.Weight=(Select Min(Weight) FROM Table2 Where Weight>Table1.POIDS) 
       OR (Table1.POIDS>(Select Max(Weight) FROM Table2) AND Table2.Weight=(Select Max(Weight) FROM Table2));
    soit on ajoute une ligne dans la deuxième table avec un poids qui ne sera jamais atteint :
    99999 23.95 31.97

    A+

  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
    Bonsoir,
    tu as raison LedZep. En fait, en parlant de premier je voulais parler du plus petit je me suis embrouillé tout seul.

Discussions similaires

  1. exécution d'une requête SQL dans access
    Par skyarnangel dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 25/02/2009, 11h18
  2. Mystère de requêtes SQL dans un contexte Access-SQLServer
    Par Samuel Galan dans le forum Access
    Réponses: 5
    Dernier message: 29/05/2008, 13h42
  3. Problême requête SQL dans access..Erreur 3079
    Par DavidGG dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 18/01/2008, 17h48
  4. Réponses: 13
    Dernier message: 28/09/2007, 11h55
  5. Requête SQL dans l'entête d'un ETAT ACCESS
    Par dchaillot dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 25/01/2006, 13h04

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