Plus de détails

On souhaite ici une numérotation de la forme 0908001, 0908002 en Août ; puis en Septembre : 0909003, 0909004, etc. En Janvier 2010, on souhaite par contre repartir à 1 : 1001001, 1001002, etc. En d'autres termes, l'année sert bien de base de numérotation, mais pas le mois.

... mais le mois doit quand même être intégré au numéro, et sa valeur est dynamique. Et c'est là le problème !

  • Si vous avez lu l'article précédent, vous pourriez être tenté d'utiliser un format de numérotation du type "[YY][MM]". Le problème est que dans ce cas, la numérotation va être du style 0908001, 0908002, etc. (en Août 2009), puis 0909001, 0909002, etc. (en Septembre 2009). Et ainsi de suite. C'est dans cet objectif qu'a été écrite la fonction AutoNumber() à l'origine.
  • C'est uniquement l'année qui sert de déclencheur pour le changement de numérotation. Mais le format "[YY]" ne convient pas non plus, parce que le mois ne sera pas présent dans le code final !

Solution

On devrait pouvoir s'en sortir sans modifier la fonction AutoNumber(). L'idée repose sur le fait que :

  • la base de calcul se fait sur une partie fixe (l'année). Donc on peut garder le préfixe [YY].
  • la comparaison des préfixes (dans le code VBA) se fait par un LIKE SQL, lequel peut contenir des caractères génériques (jokers). AutoNumber() utilise déjà le caractère *, mais on peut aussi faire appel au caractère ?.
Pour la mise en œuvre, remplacez le code VBA du formulaire de saisie (voir l'article précédent) par celui-ci :
Private Sub Form_BeforeUpdate(Cancel As Integer)
  Dim strCode As String

  If IsNull(Me.Code_Produit) Then   
    strCode = AutoNumber("tblProduits", "Code Produit", "[YY]??", 3)
    strCode = Replace(strCode, "??", Format(Date, "MM"))
    Me.Code_Produit = strCode
  End If
End Sub
  • En pratique, on récupère le numéro de produit avec un préfixe basé sur l'année et sur 2 caractères quelconques (les 2 points d'interrogation). 2 caractères, parce que le mois va être injecté sous la forme 01, 02... 11, 12. Du coup, la fonction AutoNumber() renvoie un numéro de la forme 09??001, 09??002... sans le mois.
  • C'est ensuite qu'on injecte le mois (sur 2 positions précisément) dans le code produit, à l'aide de la fonction Replace().