Salut,
Je me suis dit que l'approfondissement que j'ai fait sur les règles de fonctionnement de SEEK pourraient en intéresser d'autres.
J'ai fait plusieurs recherches sur les règles pour une lecture avec SEEK dans le cas particulier d'un critère de longueur inférieure à celle du champ utilisé comme index et n'ai rien trouvé pour m'aider à résoudre un problème gênant. Dans une table rsDest d'indicatifs téléphoniques internationaux donnant des valeurs de tarif, je dois trouver l'indicatif exact le plus long pour mes numéros d'appel (alpha) qui sont pour l'exemple "T016987" et "T024567" avec ma table qui contient p.ex. :
0
T0
T01
T016
Je fais un Seek avec le premier caractère "T" et je supposais un succès (comme avec mon vieux système ISAM et le langage DEC DIBOL/DBL ... dans les années '80). Faux ! Donc le code suivant ne fonctionnait pas bien:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
    strLocalNr = rsNEW![DialledNr]
    iPhoNrL = Len(strLocalNr)
    If iPhoNrL < 12 Then iSLmax = iPhoNrL Else iSLmax = 12
    For iSL = 1 To iSLmax   ' search with 1, 2, iSLmax chars until nomatch
        rsDest.Seek "=", Left(strLocalNr, iSL)
        If rsDest.NoMatch Then    'code Not FOUND : search totally useless
            Exit For
        Else	'code FOUND : hold match length until/unless a longer match.
            iMatchL = iSL
        End If
    Next iSL
En pratique, Access fait la comparaison avec la longueur totale du champ d'index et le critère est interprété comme si c'était "T _ _ _ _ _ ". Donc mon "T" échoue, mais pas "T0" et je dois continuer le plus loin possible. Le 1er numéro est OK avec "T016" tandis que le 2ème s'arrête à "T0".
J'ai donc modifié le code de la boucle en ayant d'office un critère complet (sait-on jamais que la logique Access/VBA change avec le temps, non peut-être ?)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
    For iSL = 1 To iSLmax   ' search with 1, 2, iSLmax chars until nomatch
        strDestKey = Left(strLocalNr, iSL) & String(12 - iSL, " ")
        rsDest.Seek "=", strDestKey
        If Not rsDest.NoMatch Then iMatchL = iSL
        ' i.e. code FOUND : then hold match length until/unless a longer match.
    Next iSL
Et j'en suis maintenant satisfait. Vos commentaires ou suggestions sont les bienvenus.