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

VBA Access Discussion :

Filtrer des enregistrements en fonction d'une distance à une adresse


Sujet :

VBA Access

  1. #1
    Membre régulier
    Inscrit en
    Mai 2012
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 219
    Points : 94
    Points
    94
    Par défaut Filtrer des enregistrements en fonction d'une distance à une adresse
    Bonjour à tous !

    Je m'attaque à la mise en place d'un système de tri des enregistrement en fonction de leur adresse. L'idée est d'avoir, dans une requête de plusieurs milliers de lignes, un moyen d'afficher uniquement les enregistrement dont le code postal rempli un certain critère. Plusieurs solutions s'offrent à moi :

    -Lister tous les codes postaux qui rentrent dans mon critère manuellement, sachant que je cherche à déterminer les communes qui sont à moins de 50km et/ou moins de 40minutes en temps d'un code postal. Ca pourrait convenir mais j'ai peur que ça ne mette un temps fou à tout mettre à la main après avoir vérifié avec google map.

    -Mettre en place un système de géolocalisation automatique comme dans le tutoriel du site, mais là ce sont plutôt mes compétences qui vont faire défaut, c'est un système complet certes mais complexe à mettre en place. Une fois mis en place un champ calculé me donne la différence en km entre les deux points et n'affiche l'enregistrement que si elle est inférieure à un nombre (50 par exemple).

    Voilà ce que j'ai trouvé mais je ne sais pas laquelle appliquer ni comment, ni s'il existe un moyen plus simple !

    Je suis preneur de toute idée .

    Sardaucar

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour

    Pour la slection par distance une solution simple mais pas parfaite est de travailler avec un rectangle de recherche.

    Si tu as la longitude et latitude de ton point il doit etre assez facile de calculer :

    • Longitude +25 km
    • Latitude + 25 km
    • Longitude - 25 km
    • Latitude - 25 km


    Et de chercher toutes les villes dont les latitudes et longitudes sont dans l'interval defini.

    on pourrait sans doute etre plus precis en approximant un cercle avec plusieurs intervals

    un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    .....[].....
    ...[----]...
    ..[------]..
    ...[----]...
    .....[].....
    Pour la duree je n'ai aucune idee a part de calculer les trajets avec Google Map, si c'est possible, entre les villes qui sont dans ton "cercle".

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Et evidement le coup du rectangle de recherche ca marche bien si tu utilses 50km a vol d'oiseau, dans les zones de montagne, 2 villes dans deux vallees differentes peuvent etre a moins de 50km par les airs et a plus de 50 km par la route.

    Enfin cela permettrai neanmoins de reduire les calculs de distances parce que calculer approximativement ((36000 x 36000) / 2) distances entre les villes ca va sans doute prendre pas mal de temps.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    René, Sardaucar

    Je vous propose une autre approche pour aborder votre problème. Pourquoi ne pas utiliser les API Google MAPs, vous trouverez ci dessous la liste des méthodes à appliquer quant à l'utilisation de cette API :

    https://developers.google.com/maps/d...ematrix/?hl=fr

    Un sujet très interessant à d'ailleurs été étudié à ce propos : http://thecodingmachine.developpez.c...i-google-maps/

    Dans notre cas présent voyons comment mettre en place ce fabuleux outil.

    Etape Numéro 1 : Référencer la bilbliothèque MSXML 6.0 (A partie de l'éditeur VBA -> outils -> Références puis chercher la bibliothèque concernée)

    Nom : Capture.JPG
Affichages : 2292
Taille : 45,1 Ko

    Etape N° 2 : Création d'un module (onglets Creer puis Module)

    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
    48
    49
    Option Compare Database
    Function G_DISTANCE(Origin As String, Destination As String) As Double
    ' Nécessite lé référence MsXML 6.0
    Dim myRequest As XMLHTTP60
    Dim myDomDoc As DOMDocument60
    Dim distanceNode As IXMLDOMNode
        G_DISTANCE = 0
        ' Check and clean inputs
        On Error GoTo exitRoute
        Origin = URLEncode(Origin)
        Destination = URLEncode(Destination)
        '
        Set myRequest = New XMLHTTP60
        myRequest.Open "GET", "http://maps.googleapis.com/maps/api/directions/xml?origin=" _
            & Origin & "&destination=" & Destination & "&sensor=false", False
        myRequest.send
        ' Utilisation de xpath
        Set myDomDoc = New DOMDocument60
        myDomDoc.loadXML myRequest.responseText
        '
        ' récupère la valeur dans le noeud
        '
        Set distanceNode = myDomDoc.selectSingleNode("//leg/distance/value")
        If Not distanceNode Is Nothing Then G_DISTANCE = distanceNode.Text / 1000
    exitRoute:
        ' fermeture et libération des objets
        Set distanceNode = Nothing
        Set myDomDoc = Nothing
        Set myRequest = Nothing
    End Function
     
    Function URLEncode(strData)
      Dim I, strTemp, strChar, strOut, intAsc
     
        strTemp = Trim(strData)
     
        For I = 1 To Len(strTemp)
            strChar = Mid(strTemp, I, 1)
            intAsc = Asc(strChar)
            If (intAsc >= 48 And intAsc <= 57) Or (intAsc >= 97 And intAsc <= 122) Or (intAsc >= 65 And intAsc <= 90) Then
                strOut = strOut & strChar
            Else
                strOut = strOut & "%" & Hex(intAsc)
            End If
        Next
     
    URLEncode = strOut
     
    End Function
    La fonction G_Distance utilisera le paramètre d'appel directions afin de communiquer avec l'API Google MAPS, une fonction d'encodage permet de traduire les caractères spécifiques qui ne seraient pas acceptés par les navigateurs. Une petite recherche sur le WEB devrait répondre à vos interrogations éventuelles sur les fonctions d'encodage.

    Etape N° 3 : Création d'un formulaire afin d'appeler la fonction G_DISTANCE et ainsi récupérer le retour de la distance.

    Nom : Capture2.JPG
Affichages : 2282
Taille : 21,4 Ko

    Le code attaché au bouton de calcul (à améliorer avec gestion d'erreurs)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Btn_Calcul_Click()
        Me.T_Distance = G_DISTANCE(Me.T_Adresse1, Me.T_Adresse2)
    End Sub
    A noter que l'API permets également de saisir des adresses espacées par des virgules (ex. 1250 Avenue des Lilas,33000 BORDEAUX). Si l'adresse n'est pas répertoriée la distance renvoyée sera 0.

    La base qui m'a servie d'exemple ici :

    distance.zip (format 2010)
    distance_2000.zip (format 2000)

    Conclusion : Cette fonction pourra être utilisée dans de nombreux cas et permettra éventuellement de calculer les distances à partir d'une table fournissant en entrée les adresses d'origine et de destination. En exécutant une requête, la distance séparant les deux points permettra de mettre à jour toutes les distances contenues dans la dite table.
    Sardaucar, il te restera ensuite à interpréter la valeur (<50 km) afin d'effectuer les traitements nécessaires liés à tes contraintes) .

    D'autres utilisations de cette API ont été évoquées dans ce fil de discussion : http://www.developpez.net/forums/d65...sses-postales/

    En espérant que cela réponde à vos attentes

    Jimbolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  5. #5
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Merci Jean-Marie d'avoir pensé aux Deuxmilliens !
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  6. #6
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Claude,

    sardaucar n'ayant pas spécifié la version utilisée d'Access, j'ai donc fourni les deux versions. Sachant que ce fil de discussion revêt un intérêt particulièrement intéressant, cela me semblait également logique d'en faire bénéficier un grand nombre de nos membres.

    Merci à toi pour la validation du format 2000

    Jean-Marie
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  7. #7
    Membre à l'essai
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Mai 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2012
    Messages : 32
    Points : 16
    Points
    16
    Par défaut Lien ne fonctionne pas
    Bonjour,

    Sauriez vous pourquoi ce lien ne fonctionne pas, dans votre code ou n'importe quel autre d'ailleurs :

    "http://maps.googleapis.com/maps/api/directions/xml?origin=" _
    & Origin & "&destination=" & Destination & "&sensor=false", False[/

    Merci d'avance

    Cordialement

Discussions similaires

  1. [XL-2007] EXCEL Répéter des enregistrements en fonction d'une fréquence
    Par ronankerbi dans le forum Excel
    Réponses: 9
    Dernier message: 01/10/2013, 15h28
  2. Réponses: 2
    Dernier message: 13/06/2013, 09h14
  3. Comment filtrer des doublon en fonction d'une variable
    Par pierrot10 dans le forum Langage
    Réponses: 2
    Dernier message: 20/06/2012, 19h18
  4. Recherche des enregistrements en fonction des paramètres
    Par infoctet dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/01/2007, 09h51
  5. Réponses: 2
    Dernier message: 27/07/2006, 07h46

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