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

Access Discussion :

Problème de temps de réponse Dédoublonnage


Sujet :

Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 130
    Points : 55
    Points
    55
    Par défaut Problème de temps de réponse Dédoublonnage
    Bonjour,

    J'ai un superbe code qui rélaise un dédoublonnage fichier adresse très performant sur les critères : Raison Sociale (avec comparaison des mots après split), Une partie de l'adresse, une partie de la ville, et une partie du code postal. Ce module identifie les doublons en affectant un numéro de doublon aux enregistrements doublon et un Flag sur le premier des enregistrements doublons. Cela marche très bien et on peut très facilement régler les critères de doublonnage sur les champs adresse etc...
    Le problème : Chaque enregistrement est confronté à la totalité des enregistrements de la base, donc le temps de réponse......
    Donc on arrive à faire tourner le programme 10 minutes pour 1000 enregistrements sur 5 000 adresses (1 heure),
    Par contre sur 60 000 adresses je n'ai plus de réponse.
    Que faire : Découper manuellement les fichiers en x partie ? Optimiser?
    Je ne sais quoi faire et c'est dommage car le programme est preformant!
    Merci si quelqu'un a une idée.
    CI joint le code






    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    Option Compare Database
    'Fonction qui split mon champ , qui va permettre de comparer mots identiques dans expression
    Function correspondance(strchaine1 As String, strchaine2 As String)
    Dim s1() As String, s2() As String
    Dim i As Integer
    s1 = Split(strchaine1): s2 = Split(strchaine2)
    For i = 0 To UBound(s1)
        For j = 0 To UBound(s2)
        'j'enlève les mots non significatifs "de", "le" etc....
        If Len(s1(i)) > 2 And Len(s2(j)) > 2 And _
            s1(i) = s2(j) Then correspondance = correspondance + 1
        Next j
    Next i
     
     
    End Function
    Public Sub CommandeBV_Click()
     
    Dim MaBd As Database
    Dim MyRst As Recordset
    Dim DptOk As String
    Dim Nb_Enr As Long, x As Long
    Dim Valeur As String, CurEnrg1 As Variant, CurEnrg2 As Variant, LIBAD As String, DP As String, Valvil As String, Str As String, VAL As Integer
    Set MaBd = CurrentDb
    Set tb = MaBd.TableDefs!sd
     
    Set fi = tb.CreateField("Flag1", dbLong)
    Set fi = tb.CreateField("Flag", dbText)
    Set fi = tb.CreateField("Flag3", dbLong)
     
    With tb
    .Fields.Append .CreateField("Flag1", dbLong)
    .Fields.Append .CreateField("Flag", dbText)
    .Fields.Append .CreateField("Flag3", dbLong)
     
     End With
    Set MyRst = MaBd.OpenRecordset("sd", dbOpenDynaset)
     
    If MyRst.Bookmarkable Then
        MyRst.MoveLast
        Nb_Enr = MyRst.RecordCount
        MyRst.MoveFirst
     
        For x = 1 To Nb_Enr - 1
     
            CurEnrg1 = MyRst.Bookmark
            If Not IsNull(MyRst!rs) Then
            Valeur = MyRst!rs
     
            End If
            ' LIBADR : libellé adresse
            If Not IsNull(MyRst!LIBADR) Then
            LIBAD = Right(MyRst!LIBADR, 8)
            End If
            'ACHEM : Localité
            If Not IsNull(MyRst!ACHEM) Then
            Valvil = Left(MyRst!ACHEM, 5)
            End If
           ' CDPO : Codepostal
            If Not IsNull(MyRst!CDPOS) Then
            DP = Left(MyRst!CDPOS, 3)
            End If
            MyRst.MoveNext
      'Je rentre dans la boucle je vérifie si au moins 1 mot commun entre les expression ou raison sociale (rs) identique,une partie de l'adresse identique
      ' les 3 premiers caractères code postal identique
        Do
          If ((correspondance(MyRst!rs, Valeur) >= 1) Or MyRst!rs = Valeur) And DP = Left(MyRst!CDPOS, 3) And LIBAD = Right(MyRst!LIBADR, 8) And Valvil = Left(MyRst!ACHEM, 5) Then
     
                      If IsNull(MyRst!flag1) Then
                        CurEnrg2 = MyRst.Bookmark
                        MyRst.Edit
                        'Je mets un numéro qui identifie le doublon
                        MyRst!flag1 = x
                        'Je flague correspondance Raison sociale
                        MyRst!Flag3 = correspondance(MyRst!rs, Valeur)
                        ' Je flague le premier de groupe
                        MyRst!Flag = "N"
                        MyRst.Update
                        MyRst.Bookmark = CurEnrg1
                        MyRst.Edit
                        'Je remets le numéro qui identifie le doublon
                        MyRst!flag1 = x
                        MyRst.Update
                        MyRst.Bookmark = CurEnrg2
                     End If
           End If
                     MyRst.MoveNext
         Loop Until MyRst.EOF
                    MyRst.MoveFirst
                    MyRst.Move x
                    Next x
           MyRst.Close
      End If
    End Sub

  2. #2
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Points : 230
    Points
    230
    Par défaut
    Mais des valise [code] avant et aprés ton code
    [Android] Shopy liste de course (Java)

    votre fidèl serviteur


  3. #3
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Tu pourrais essayer de remplacer cette partie
    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
    Do
    If ((correspondance(MyRst!rs, Valeur) >= 1) Or MyRst!rs = Valeur) And DP = Left(MyRst!CDPOS, 3) And LIBAD = Right(MyRst!LIBADR, 8) And Valvil = Left(MyRst!ACHEM, 5) Then
     
    If IsNull(MyRst!flag1) Then
    CurEnrg2 = MyRst.Bookmark
    MyRst.Edit
    'Je mets un numéro qui identifie le doublon
    MyRst!flag1 = x
    'Je flague correspondance Raison sociale
    MyRst!Flag3 = correspondance(MyRst!rs, Valeur)
    ' Je flague le premier de groupe
    MyRst!Flag = "N"
    MyRst.Update
    MyRst.Bookmark = CurEnrg1
    MyRst.Edit
    'Je remets le numéro qui identifie le doublon
    MyRst!flag1 = x
    MyRst.Update
    MyRst.Bookmark = CurEnrg2
    End If
    End If
    MyRst.MoveNext
    Loop Until MyRst.EOF
    par l'ouverture d'un nouveau recordset, avec pour clause WHERE les conditions de ton If... Then.

    Bon courage,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 130
    Points : 55
    Points
    55
    Par défaut
    Merci je vais essayer, j'espère que cela fera quelquechose

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 130
    Points : 55
    Points
    55
    Par défaut Toujours mon problème d'optimisation
    Toujours concernant mon problème : Peut on automatiser un découpage de ma table (sur le Départementou une plage de départements) pour lancer la procédure qui va lire les fichiers les uns après les autres.
    Comment faire ?

  6. #6
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Re.

    Tu as essayé la première manip? Ca donne quoi?

    nouvelle question :
    Peut on automatiser un découpage de ma table
    Si je comprens bien la question, tu peux :
    - ouvrir un rst1 sur une requête regroupement sur les départements
    - puis en parcourant ce rst1, pour chaque enregistrement faire ta manip.

    Bon courage,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 130
    Points : 55
    Points
    55
    Par défaut
    Je ne sais comment faire ce recordset :la boucle rélise un comparatif de champ à champ , tu as un petit script ?
    Merci.

  8. #8
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    R.

    Si tu disposes par exemple du code postal dans un champ texte, tu peux faire la liste des départements dans lesquels tu as des objets de ta table ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set oRstDpt= db.OpenRecordeset("SELECT Left(CodePostal,2) As Dept FROM MaTable Group BY Left(CodePostal,2);",dbOpenDynaset)
    Une fois que tu disposes de cette liste des depts, tu la parcours et tu ouvres à chaque fois un rst sur les objets de ce département:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    While Not oRstDpt.EOF
        Set oRstList = db.openRecordset("SELECT * FROM MaTable WHERE Left(CodePostal,2) = """ & oRstDpt("Dept") & """",dbopendynaset)
        'là tu as un rst sur les objets de ce département, tu fais ton traitement
        ...
        oRstList.Close
        orstDpt.MoveNext
    Wend
    C'est juste l'idée. Amettre au point, bien sûr.

    Bon courage,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 130
    Points : 55
    Points
    55
    Par défaut
    Bonjour,

    Malheureusement le temps de traitement augmente avec le SQL.
    Je ne sais que faire. Peut être faire une macro qui découpe la table en X tables en fonction du département et faire tourner la procédure autant de fois qu'il y a de tables et tout reconsolider.
    Cela devient compliqué pour automatiser tout cela.
    Je n'ai jamais réussi à faire tourner ma procédure sur 60 000 lignes même en lancant pour la nuit.

    Merci en tout cas pour tes indiquations !

  10. #10
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Finalement on ne sait pas trop ce que tu as testé puisque nous avons parlé de 2 idées différentes, qui en plus peuvent être combinées.
    J'ai le sentiment qu'il doit y avoir une solution.

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 130
    Points : 55
    Points
    55
    Par défaut
    Re Bonjour,

    J'ai testé la deuxième solution avec le code que vous m'avez envoyé.
    Sur les autres test que j'ai fait : C'est vraiment avec la fonction split qui ralentit énormément la procédure et c'est dommage car elle répond bien à mon besoin.: Mais le parcour dans le tabeau avec comparatif des mots tout cela inséré dans ma procédure ....

    J'essaye d'avancer en testant une solution sans le split ou avec le découpage de la table par département.

    Merci de votre soutien , si vous avez encore des idées cela m'interesse beaucoup.

  12. #12
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut la fonction correspondance
    Bonsoir.

    Je pense que tu peux gagner du temps sur la fonction correspondance revue comme celle-ci:
    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
    'Fonction qui renvoie le nombre de mots de longueur >2 et communs aux deux chaînes
    Function correspondance(strchaine1 As String, strchaine2 As String)
    Dim s1() As String
    Dim i As Integer, j As Integer
     
    s1 = Split(strchaine1)
    j = UBound(s1)
     
    For i = 0 To j
        'j'enlève les mots non significatifs "de", "le" etc....
        If Len(s1(i)) > 2 Then
            If InStr(1, strchaine2, s1(i)) > 0 Then
                correspondance = correspondance + 1
            End If
        End If
    Next i
     
     
    End Function
    Mais il y a sûrement aussi à faire sur la procédure principale...

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 130
    Points : 55
    Points
    55
    Par défaut
    Bonjour,



    J'ai testé ta fonction split : C'est effectivement beaucoup plus rapide !
    Merci beaucoup
    Pour le reste je vais faire des tests d'optimisation.

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

Discussions similaires

  1. [Débutant] Problème de temps de réponse pour une recherche d'articles
    Par Tazze-99 dans le forum VB.NET
    Réponses: 22
    Dernier message: 14/12/2011, 11h50
  2. Problème de temps de réponse ASP.NET
    Par fredlang dans le forum ASP.NET
    Réponses: 0
    Dernier message: 12/07/2011, 11h23
  3. Réponses: 1
    Dernier message: 05/01/2011, 16h23
  4. Problème de performance, temps de réponse
    Par lio33 dans le forum InterBase
    Réponses: 0
    Dernier message: 05/02/2010, 10h35
  5. Problème temps de réponse SQL Server CE
    Par Dark Christou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 31/12/2009, 14h28

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