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 :

Trouver valeur proche [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Profil pro
    Webmaster
    Inscrit en
    Octobre 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2009
    Messages : 125
    Points : 82
    Points
    82
    Par défaut [Résolu]Trouver valeur proche
    Bonjour à tous,

    J'ai 2 tables dans ma base de données :

    Table1
    CompteClients | Libellé | Montant
    101100 | blabla | 65000
    101180 | blabla | -65000
    101200 | blabla | 65000
    104000 | blabla | -54000
    104120 | blabla | 26000
    106200 | blabla | -30000
    106180 | blabla | 25000
    106800 | blabla | -41258
    ...

    Table2
    CompteClients | Libellé1
    101000 | A
    104000 | B
    106000 | C
    106100 | D
    106200 | E
    106300 | F
    106800 | G
    ...

    J'aimerai savoir comment regrouper dans une 3e table :

    CompteClients | Libellé | Montant | Libellé1
    101100 | blabla | 65000 | A
    101180 | blabla | -65000 | A
    101200 | blabla | 65000 | A
    104000 | blabla | -54000 | B
    104120 | blabla | 26000 | B
    106200 | blabla | -30000 | E
    106180 | blabla | 25000 | D
    106800 | blabla | -41258 | G
    ...

    Dans ma table2, je n'ai pas forcément les ComptesClients de la table1. Dans ce cas, comment avoir une valeur approchée comme dans l'exemple ? simplement ?

    J'espère que j'ai été clair. Si non, alors demandez moi des précisions, j'essaierai d'être plus clair...

    D'avance merci,

    Souri84

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 085
    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 085
    Points : 5 200
    Points
    5 200
    Par défaut
    Bonjour,

    Une suggestion : créer une fonction publique get_libelle(compte) qui va chercher (en VBA) le libelle le plus adapté

    Ensuite c'est tout simple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select *, get_libelle(compte) from table1
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  3. #3
    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 586
    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 586
    Points : 34 255
    Points
    34 255
    Par défaut
    salut,
    autre approche sous SQL :
    - passer par le delta Table1.CompteClient - Table2.CompteClient
    - effectuer un filter MIN() sur le rendu
    - en déduire le libellé
    - compléter le reste de la requête en conséquence
    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

  4. #4
    Membre régulier
    Profil pro
    Webmaster
    Inscrit en
    Octobre 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2009
    Messages : 125
    Points : 82
    Points
    82
    Par défaut
    Merci déjà pour vos réponses rapides.

    Vos 2 solutions m'intéressent mais dans ce cas, j'ai des questions :


    Le VBA Access est-il différent du VBA Excel (d'habitude, je suis sur Excel mais pour l'occasion, mes tables étant trop importantes, je me suis dit qu'Access serait plus approprié...)
    Comment créé t'on une fonction publique ? avez vous des tutoriaux (je n'ai pas encore regardé sur le site... )

    Pour la seconde solution, Pourriez vous détailler un peu plus car je n'ai pas trop compris (désolé, je ne connais pas trop Access...)

    Encore merci,

    Souri84

  5. #5
    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 586
    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 586
    Points : 34 255
    Points
    34 255
    Par défaut
    un peu de lecture ici :
    http://heureuxoli.developpez.com/office/word/vba-all/

    avec cela tu devrais déjà bien avancer
    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

  6. #6
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 085
    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 085
    Points : 5 200
    Points
    5 200
    Par défaut
    Bonjour,

    Une fonction publique se place dans un module. Dans ton cas elle serait qqch comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Function get_libelle(s)
    Dim rst As DAO.Recordset
    get_libelle = ""
    if not isnull(s) then
      Set rst = CurrentDb.OpenRecordset("SELECT libelle FROM Table2 WHERE CompteClient<='" & s & "' order by CompteClient desc;")
      If Not rst.EOF Then get_libelle = rst!libelle
      rst.Close
    end if
    End Function
    Attention c'est une méthode qui n'est pas optimum en temps de réponse donc pas adaptée sur de grosses tables ou des requêtes qui remontent bcp de lignes

    Edit : fonction corrigée
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  7. #7
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    La fonction ci-dessus est fausse.

    Si le test IF n'est pas validé, le rst.close génrera une erreur sur Objet non défini

  8. #8
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    sans code avec 3 requetes imbriquées

    la première R1 : rassemble toutes les données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Table1.COmpteClients, Table1.libelle, Table1.montant, Table2.CompteClients, Abs(First(Abs([table1]![COmpteClients])-Abs([table2]![CompteClients]))) AS Expr1, Table2.libelle1
    FROM Table1, Table2
    GROUP BY Table1.COmpteClients, Table1.libelle, Table1.montant, Table2.CompteClients, Table2.libelle1;
    la deuxieme R2 : calcule le plus petit ecart
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT R1.Table1.CompteClients, Min(Abs([Expr1])) AS Expr2
    FROM R1
    GROUP BY R1.Table1.CompteClients
    ORDER BY R1.Table1.CompteClients, Min(Abs([Expr1]));
    la troisieme R3 : lie le + petit écart (R2) à l'enregistrement qui le mérite (R1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT R1.Table1.CompteClients, R1.libelle, R1.montant, R1.libelle1
    FROM R1 INNER JOIN R2 ON (R1.Table1.CompteClients = R2.CompteClients) AND (R1.Expr1 = R2.Expr2);
    ce qui donne

    CompteClients libelle montant libelle1
    101100 blabla 65000 A
    101180 blabla -65000 A
    101200 blabla 65000 A
    104000 blabla -54000 B
    104120 blabla 26000 B
    106180 blabla 25000 E
    106200 blabla -30000 E
    106800 blabla -41258 G

    la 7ème ligne sort E car le plus petit ecart entre 106180 et 106200 est 20

  9. #9
    Membre régulier
    Profil pro
    Webmaster
    Inscrit en
    Octobre 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2009
    Messages : 125
    Points : 82
    Points
    82
    Par défaut
    Excusez moi pour la réponse tardive... je vais étudier tout ça !!

    Merci pour vos réponses et la réactivité de ces forums !!

  10. #10
    Membre régulier
    Profil pro
    Webmaster
    Inscrit en
    Octobre 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2009
    Messages : 125
    Points : 82
    Points
    82
    Par défaut
    La réponse de Nico84 me conviendrait bien je pense, d'après ce que je comprends du VBA. Par contre, j'ai une erreur et comme je ne comprends pas encore très bien le VBA Access... j'ai une erreur d'execution 3265. Sur microsoft, ils disent que c'est dû aux ActiveX Object Data... Mais là, c'est un peu trop compliqué pour moi...

    Pour la méthode de helas, elle pourrait fonctionner sauf que :
    Ce n'est pas le plus petit écart qu'il me faut, c'est le compte juste en dessous.
    Un exemple bidon :
    Si mon compte = 168000 et que celui-ci n'existe pas, il ne doit pas aller dans le regroupement supérieur comme dans ton exemple mais bien dans le code de regroupement inférieur.

    Pour plus de clarté, voici mon petit fichier anonymisé et où j'ai laissé un exemple bidon de mes 3 tables. J'ai oté les formulaires, les requêtes déjà existantes et tout et tout, afin que vous puissiez m'aider plus facilement...

    Fichier ici

    Je sais que j'en demande beaucoup mais cela me faciliterai la vie car là Excel atteint ces limites pour cette petite application...

  11. #11
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 085
    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 085
    Points : 5 200
    Points
    5 200
    Par défaut
    Bonsoir,

    Pour que ça marche il doit falloir cocher une ou 2 références dans les outils VBA, soit microsoft DAO xx object library soit microsoft activx data objects ...
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  12. #12
    Membre régulier
    Profil pro
    Webmaster
    Inscrit en
    Octobre 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2009
    Messages : 125
    Points : 82
    Points
    82
    Par défaut
    Salut,

    Merci pour ta réponse, même si je commence à retraiter mes bases sur Excel (laisse tomber comment ça rame...) j'aimerai avoir la solution de ce petit problème. Mes références cochées ont l'air bonne, j'ai l'air d'avoir celles qu'il faut :



    Dis moi ce que tu en penses...

    A+

  13. #13
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 085
    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 085
    Points : 5 200
    Points
    5 200
    Par défaut
    Bof

    J'en ai un peu plus et pas dans le même ordre mais je ne pense pas que ça vienne de là...

    Vérifie bien le nom des champs ou voici une autre syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function get_libelle(s)
    get_libelle = DMax("CompteClients", "Table2", "CompteClients<='" & s & "'")
    End Function
    Dans les 2 cas j'ai supposé que CompteClients est une string
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  14. #14
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    dans le cas où c'est le nombre inferieur qui est pris R1 devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT Table1.COmpteClients, Table1.libelle, Table1.montant, Table2.CompteClients, First([table1]![COmpteClients]-[table2]![CompteClients]) AS Expr1, Table2.libelle1 FROM Table1, Table2 GROUP BY Table1.COmpteClients, Table1.libelle, Table1.montant, Table2.CompteClients, Table2.libelle1 HAVING (((First([table1]![COmpteClients]-[table2]![CompteClients]))>=0));
    et ainsi le résultat correspond

  15. #15
    Membre régulier
    Profil pro
    Webmaster
    Inscrit en
    Octobre 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2009
    Messages : 125
    Points : 82
    Points
    82
    Par défaut
    Merci tous les 2 pour vos réponses,

    Je regarde cela à 14h et je vous dis quoi !

    Encore merci !!

  16. #16
    Membre régulier
    Profil pro
    Webmaster
    Inscrit en
    Octobre 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2009
    Messages : 125
    Points : 82
    Points
    82
    Par défaut
    Merci !!!
    C'est bon... j'ai enfin réussi à remplir ma table... grâce à Hélas... désolé Nico84, je me suis plus penché sur les requêtes cette fois... et ça fonctionne du tonnerre...

    Encore merci !!!!

    Souri84

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

Discussions similaires

  1. Trouver valeurs d'une table n'existant pas dans une autre table
    Par aliasjcdenton dans le forum Langage SQL
    Réponses: 7
    Dernier message: 13/10/2011, 11h41
  2. trouver valeur la plus proche dans une colonne
    Par niepoc dans le forum Général Python
    Réponses: 10
    Dernier message: 05/06/2009, 16h02
  3. Trouver valeur maximum d'une variable matricielle
    Par Mr_JF dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/02/2008, 16h36
  4. Trouver valeur numérique <>0
    Par javelot69 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 24/01/2008, 15h52
  5. Trouver valeurs min et max de x et y ?
    Par innova dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 16/01/2008, 23h37

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