Access - cle primaire qui evolué avec l'année

salut,
j'ai fait une base de donnée pour des stock de pièce qui marche
quand je saisie mes n° de commande (clé primaire), je les rentre manuellement
donc maintenant je voudrais

1 - que les n° de commande s'incrémentent automatiquement

2 - si possible que le début du n° de commande corresponde a l'année en cours
exemple : 08001 - 08002 et ensuite 09001 - 09002 quand on sera en 2009

si vous avez une idée , je suis preneur
Merci
--

« Je suis capable du meilleur et du pire.
Mais, dans le pire, c’est moi le meilleur. »
Configuration: Windows XP-SP2
Firefox 2.0.0.14

5 réponses

  1. Tu devrais mettre dans la valeur par défaut
    =VraiFaux((Format(Date();"aa")*1000)+1>MaxDom("[N°Commande]";"[Commandes]")+1;(Format(Date();"aa")*1000)+1;MaxDom("[N°Commande]";"[Commandes]")+1)

    En supposant que ta table s'appelle Commandes.

    J'explique le principe

    Format(Date();"aa")*1000)+1 va donner 8001 pendant toute l'année 2008, puis 9001 toute l'année 2009.
    Je fais abstraction du 0 qui précède, si ton champ est numérique ça n'est qu'une question de format.

    MaxDom("[N°Commande]";"[Commandes]")+1 va donner le prochain numéro de commande, soit mettons 08256 si la dernière était 08255.

    08256 est supérieur à 08001, donc pendant toute l'année 2008, c'est le dernier plus 1 qui va être choisi.

    le premier janvier 2009, il faudra trouver la plus grande valeur entre 9001 et 08756 par exemple.
    Ca sera donc 9001 qui sera retenu.

    Pour l'histoire des zéros devant, deux possibilités.
    Soit tu fais un champ numérique et le format en sera "00000", soit c'est un champ de type texte, et il faudra
    transformer un peu la formule:

    =VraiFaux((Format(Date();"aa")*1000)+1>MaxDom("[N°Commande])";"[Commandes]")+1;"0"&(Format(Date();"aa")*1000)+1;MaxDom("[N°Commande]";"[Commandes]")+1)

    0
    1. salut
      merci pour la réponse rapide

      donc comme ma table s'appelle "Commande" et mon champ "N° de commande"(type texte), j'ai reformulé en

      =VraiFaux((Format(Date();"aa")*1000)+1>MaxDom("[N° de Commande])";"[Commande]")+1;"0" & (Format(Date();"aa")*1000)+1;MaxDom("[N° de Commande]";"[Commande]")+1)

      mais quand je veux fermé et sauvegardé , j'ai un message d'erreur :
      fonction 'Dmax' inconnue dans l'expression de validation ou dans la valeur par défaut de 'commande.N° de commande'

      modif impossible pour le moment .... SNIIIF

      --------------------

      « Je suis capable du meilleur et du pire.
      Mais, dans le pire, c’est moi le meilleur. »
      0
  2. Très bizarre... mais où as tu mis ça? Si tu l'as mis dans la table c'est PEUT-ETRE à cause de ça. Essaye dans le formulaire. Sinon je vois d'autant moins d'explication qu'il a reconnu la fonction puisqu'il l'appelle avec son nom anglais de DMax...
    0
    1. bon alors effectivement j'avais mis la fonction dans la table
      donc je viens de la mettre dans le champ du formulaire

      et du coup quand je veut créer un nouvel enregistrement j'ai un "#erreur" dans le champ du n° de commande qui apparait

      cela vient peut etre du faite que pour le moment ma clé primaire n'est pas automatique , quand j'avais fait la table je voulais saisir le n° de commande a la main
      0
    2. heu d'ailleurs je fais comment si je veux mettre ma clé primaire automatique , maintenant ?
      0
    3. bon alors je suis revenu en arrière
      j'ai remis une numérotation auto a mes n° de commande

      j'ai essayer les 2 fonctions que tu m'a donné dans le champs au niveau du formulaire , la fonction est acceptée (pas de message d'erreur) .
      mais mes numéros de commande sont toujours 1 - 2 - 3 etc

      a défaut je voudrais bien affiché 0001 a la place de 1

      merci
      0
  3. Evidemment! Le numéro automatique est justement automatique (1 - 2 - 3)
    Tu dois mettre un champ de type numérique.

    Et s'il existe dejà des enregistrements, attention: Ce que je t'ai dit ne fonctionnera que pour les prochains numéros. C'est une valeur par défaut pour les nouveaux enregistrements.

    Si tu veux modifier les anciens, il faut faire une requête mise à jour.
    0
    1. donc je viens de revenir en arriere pendant ta reponse
      bon alors effectivement j'avais mis la fonction dans la table
      donc je viens de la mettre dans le champ du formulaire

      et du coup quand je veut créer un nouvel enregistrement j'ai un "#erreur" dans le champ du n° de commande qui apparait

      0
    2. @Mtygolubon je viens de faire un essai rapide sur une base vide
      la fonction marche , je pense que cela viens du fairte que dans ma base de stock , j'ai une relation liée avec un sous formulaire par le n° de commande

      je vais faire des essais pour trouver le bug

      merci a toi
      0
  4. Non, je ne vois pas le rapport avec les liaisons. Je pencherais plutôt pour des valeurs non numériques dans ta table Commandes.

    Pour trouver la réponse, les tests que tu peux faire sont, dans une requête, faire un Max sur le champ NCommande, puis essayer d'ajouter 1 à ce max.
    Tu verras quand ça coince. Au passage, donner moi la valeur du Max, ça me permettra de réfléchir aussi...

    0
    1. bon alors j'ai vidé ma base , juste entre une reference d'aticle et un fournisseur pour pouvoir saisir ma commande

      j'ai vérifié le champ de la table commande , il est bien au format numérique
      j'ai entré la fonction correspondant au format numérique que tu m'a donné en adaptant avec le nom de la table (commande) et du champ (n° de commande)
      =VraiFaux((Format(Date();"aa")*1000)+1>MaxDom("[N° de Commande]";"[Commande]")+1;(Format(Date();"aa")*1000)+1;MaxDom("[N° de Commande]";"[Commande]")+1)

      la fonction est acceptée mais j'ai toujours le "#erreur" qui apparait dans le champ "n° de commande" et je ne peux donc pas saisir une nouvelle commande car ma clé primaire est invalide
      0
    2. @MtygoluTape manuellement le premier numéro de commande. Ca évitera un test qui ne servirait que pour cette première commande justement. Tape 08001 et regarde si la deucième s'appelle 08002, ensuite change la date système, mets toi en 2009 et regarde si la troisième commande porte le numéro 09001
      0
    3. @LatelyGeekpareil
      j'ai enlevé la fonction
      fait une 1ere commande avec 8001

      remis la fonction dans le champ du formulaire et là ... vlan pareil #erreur
      0
  5. Désolée, j'ma gourée avec Excel (Qu'est ce qu'ils sont pénibles, chez GrosBill, ils pourraient faire un effort...)

    C'est =VraiFaux((Format(Date();"yy")*1000)+1>MaxDom(...
    0