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. :
0Je 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:
T0
T01
T016
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".
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
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 ?)
Et j'en suis maintenant satisfait. Vos commentaires ou suggestions sont les bienvenus.
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
Partager