Bonjour,
Hâtez-vous lentement, et sans perdre courage,
Vingt fois sur le métier remettez votre ouvrage,
Polissez-le sans cesse, et le repolissez,
Ajoutez quelquefois, et souvent effacez.
(Boileau, L’Art Poétique)
Autre citation illustre :
J'ai surtout l'impression que tu sombres dans un piège bien connu : le nez dans le code, on cherche des solutions de plus en plus sophistiquées... et on passe à côté du plus simple. Je te conseillerai simplement de laisser ce sujet de côté pendant une bonne semaine, puis de relire le tout et faire ton choix.
Il y a longtemps, j'ai dû apprendre la première pas coeur . Un demi siècle plus tard, dire que la seconde m’ait fait plaisir serait grandement exagéré.
Mais Papy Turbo avait raison !
Le code de la livraison précédente transpire la douleur. Cela a été enfanté avec peine, et aux forceps !
Je m’étais imposé d’écrire une fonction publique unique plutôt qu’une privée à recopier dans chaque formulaire.
Par principe, pour faciliter la maintenance éventuelle.
J’ai réécrit plus léger :
- au départ des « en 4 lignes » de Papy Turbo
- en ajoutant un peu de code pour libérer la contrainte d’une valeur unique obligatoirement numérique
- et dans une fonction privée.
J’ai actualisé le texte d’un post précédent, pour faciliter la lecture d'une proposition finale.
Le but de l'exercice :
Trouver un moyen « passe-partout » pour numéroter les enregistrements d’un formulaire (souvent en continu),
- quelle que soit la position de ce formulaire dans la hiérarchie ([sous]-[sous]…[formulaire],
- quel soit le nombre de formulaires numérotés ouverts,
- que l’on puisse consulter, mettre à jour, supprimer, ajouter ou modifier les filtres,
- avec un maximum de facilité pour l’implanter dans une DB existante (en tout cas à partir de [Access2000]).
Consignes d’utilisation
Le formulaire doit contenir au moins un contrôle dont la source correspond à une valeur sans doublon.
Quel qu’en soit le type donc pas nécessairement un autonum ni une clé. Indifféremment du numérique, du texte ou une date. Mais UNIQUE.
Le contrôle de numérotation aura comme source :
=NumeroterLignes(NomDuContrôle à ValeurUnique)
Exemple =NumeroterLignes("ztDENOMINATION")
Dans tous les événements susceptibles de modifier l’ordre
Me.Refresh (renuméroter) ou Me.Requery (se repositionner au début) selon l’effet recherché.
Dans le code associé au formulaire, la fonction privée suivante :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Private Function NumeroterLignes(CtlValUnique As String) As Long
Dim TypeDonnee As Integer
'déterminer le type du RecordSource de CtlValUnique
'pour choisir la bonne syntaxe de comparaison
With Me.RecordsetClone
If IsNumeric(Me(CtlValUnique)) Then
.FindFirst "[" & Me(CtlValUnique).ControlSource & "] = " & Me(CtlValUnique)
GoTo Attribuer
ElseIf IsDate(Me(CtlValUnique)) Then
.FindFirst "[" & Me(CtlValUnique).ControlSource & "] = #" & Format(Me(CtlValUnique), "mm/dd/yy") & "#"
GoTo Attribuer
Else 'c'est donc du texte
.FindFirst "[" & Me(CtlValUnique).ControlSource & "] = """ & Me(CtlValUnique) & """"
End If
Attribuer:
NumeroterLignes = .AbsolutePosition + 1
End With
End Function |
L’idée
Le numéro d’ordre de chaque enregistrement correspond à sa position (AbsolutePosition) dans le RecordSet du formulaire.
Le processus consiste à rechercher cette position en localisant la valeur courante du champ à valeur sans doublon.
La syntaxe de cette recherche diffère selon le type de données (numérique, date, texte).
En pièce jointe un exemple d’utilisation en [Access2000].
Les formulaires «ChampUniqueDATE », « ChampUnique NUMERIQUE » et « ChampUniqueTEXTE » montrent que cela fonctionne avec des valeurs uniques de tout type.
Les formulaires «Ex2emeNiveau» et «Ex3emeNiveau» montrent un sous-formulaire qui évolue en fonction d’un champ dans le formulaire principal. (refresh après MàJ)
Merci déjà pour vos remarques et suggestions.
Partager