Compteur

cs_jolicoeur79 Messages postés 62 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 1 avril 2018 - 15 janv. 2007 à 02:23
cs_jolicoeur79 Messages postés 62 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 1 avril 2018 - 21 janv. 2007 à 15:05
salut a tous
je suis d'entrain de developper une application vb6 + access j'ai creer un champs qui  s'appelle "n° facture" de type numerique mon probleme je veux une fonction qui permet a ce numero de s'intialiser a "1" chaque mois ou annee
et merci.

10 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
15 janv. 2007 à 08:25
Si tu gères tes rajouts par une application VB ou VBA : une méthode :

Inscrire dans un fichier texte ou dans la base de registre un drapeau "mois en cours/numéro", par exemple et :
- à chaque inscription : lire ce drapeau et :
    - si le mois en cours est celui du drapeau : donner à ton champ la valeur numéro + 1
    - si le mois en cours est différent de celui du drapeau : donner à ton champ la valeur 1
    - mettre systématiquement à jour ton drapeau en y inscrivant "mois en cours/numero attribué"

Celà te permettra d'éviter un champ supplémentaire dans ta base (mois) et d'aller systématiquement voir quel était la dernière facture.

Il y a d'autres méthodes, mais elles seront toutes plus gourmandes en octets inscrits sur ton disque.
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
15 janv. 2007 à 09:50
Salut Jolicoeur79,
J'ai eu la même chose à faire pour une de mes sources(Gestion Expéditions), il me fallait un nouveau numéro de bl à chaque changement d'année ex:
En 2006 mon Bl était N6/001
En 2007 mon BL devenait N7/001
En faite j'ai un champ(année) supplémentaire dans ma table BL, et à chaque fois que je créé un bl, j'inscrit dans ce champ l'année en cours "2007".
quand je change d'année je vais comparer l'année de mon dernier numéro de bl avec l'année en cours. Si cela est pareil je continu en "2007", si cela est différent je prend donc la nouvelle année "2008" pour faire une nouveau BL "N8/001"

Voici un bout de code de ma source pour te montrer comment j'ai procédé..
Bon je suis sûr que ce n'est pas trop optimisé, mais pour te faire une idée de comment procéder. J'espère que cela pourra t'aider.


'On récupère le dernier N° de bl et année pour attribuer un bl par année
  'Positionement sur le dernier enregistrement de la base
   resultatADO.MoveLast
  
  'Déclare variables pour acquisitions info
   Dim Rannée, Rdate
   If Not IsNull(resultatADO!bl) Then rrésulta = (resultatADO!bl)
   If Not IsNull(resultatADO!année) Then Rannée = (resultatADO!année)
   rrésulta = Mid(rrésulta, 4)
   'Rdate = Mid(Date, 7)
   Rdate = Year(Date) 'Récupère la date systeme(année) et la met en long(ex:2006 au lieu de 06)
  
  'Condition pour les années supérieur à 2009
      If Rdate > "2009" Then
         Rdate = Mid(Rdate, 3)
         GoTo suite
      End If
 
  'On compare les dates en vu du nouveau N° de BL
   If Rannée = Rdate Then
      Rdate = Mid(Rdate, 4)
      GoTo suite
    Else
      Rdate = Mid(Rdate, 4)
      GoTo suite
    End If
   
suite:


  'On reconstitut et attribu un nouveau N° de BL
   'Condition pour les chiffres < à 9
       If rrésulta < 9 Then
          rrésulta = rrésulta + 1
          rrésulta = "00" & rrésulta
          rrésulta = "N" & Rdate & "/" & rrésulta
          Text4(0).text = rrésulta
          GoTo suite1
       End If
      
      'Condition pour les chiffres >= 10 et < 100       If rrésulta >9 And rrésulta < 100 Or rrésulta "9" Then
          rrésulta = rrésulta + 1
          rrésulta = "0" & rrésulta
          rrésulta = "N" & Rdate & "/" & rrésulta
          Text4(0).text = rrésulta
          GoTo suite1
       End If
      
      'Condition pour les chiffres >= 100 et < 1000       If rrésulta >99 Or rrésulta "99" Then
          rrésulta = rrésulta + 1
          rrésulta = "N" & Rdate & "/" & rrésulta
          Text4(0).text = rrésulta
          GoTo suite1
       End If
      
suite1:


   'Bl par année
   
    Rannée = Rannée Like année_encours
                'Condition
                 If Rannée = False Then
                 Dim modi
                 modi = Mid(Text4(0).text, 4)
                 modi = "N" & Rdate & "/" & "001"
                 Text4(0).text = modi
                 End If
   
   'Init de mes varaibles
    rrésulta = ""
    Rdate = ""
    Rannée = ""

A+
Exploreur
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
15 janv. 2007 à 11:05
Bonjour Exploreur,

C'est bien, mais ...
- Celà te fait (comme je le disais) un champ supplémentaire qui viendra gonfler ta base de données.
- il te faut (comme je l'ai dit et que tu le dis également) aller à chaque fois à la pêche du dernier enregistrement pour le lire
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
15 janv. 2007 à 11:18
Bonjour Jmfmarques,
Effectivement, disont que j'ai fait cela suivant comment je voyait la chose, ce n'est pas la meilleure solution j'en convient avec toi...Je pensais faire le truc avec un fichier texte (comme tu le dis), c'est vrai que cela soulagerai le code..et serai plus pratique.
Cela m'intérèsserai de connaître les autres méthodes dont tu parles...
A+
Exploreur....au plaisir


 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
15 janv. 2007 à 11:27
Une autre méthode ?
une 2ème table composée uniquement d'un champ mois et d'un champ numéro et qui n'est mise à jour que lorsque nécessaire.
Il suffit alors d'ouvrir cette table systématiquement, tant pour y lire que pour écrire, à chaque nouvel enregistrement.

De cette façon, comme avec un fichier texte, on n'utilise qu'un seul enregistrement de ces 2 champs et pas un nombre multiple de celui des enregistrements, comme ce serait le cas si l'on enregistrait ces deux données dans la table des articles eux-mêmes, d'une part et, d'autre part, il n'est pas besoin de parcourir toute une table (puisqu'il n'y a qu'un seul article dans cette table complémentaire)
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
15 janv. 2007 à 11:35
Ben...voui, je n'avais pas vu la chose de cette façon, plus pratique éffectivement...
Quelque fois on a les choses devant son nez(moi) et on ne voit pas la simplicité même......Merci de l'explication.
A+
Exploreur
0
cs_caramelmou Messages postés 56 Date d'inscription jeudi 25 décembre 2003 Statut Membre Dernière intervention 23 avril 2008 3
15 janv. 2007 à 18:10
Il vaut mieux aller cherche le dernier numero créé pour le mois en cours dans la table même, afin d'éviter des erreurs (si plusieurs tables, ou fichier texte externe : risque de problème en multi utilisateurs)  Ex de code pour Jolicoeur

la table facture contient un champ n_facture (champ type texte clef primaire)
ou les numero de factures sont sous la forme YY/MM/XXXX  (an/mois/numero)
code pour ajouter une facture émise à la date date_fac
   
    Dim monrs As New ADODB.Recordset, cnn As New ADODB.Connection
    Dim date_fac As Date, strCritere As String, strSQL As String
   
    date_fac = Date ' pour l'exemple la date du jour
    strCritere = Format(date_fac, "YY/MM") & "/"
    strSQL = "SELECT * from FACTURE ORDER BY n_facture DESC"
   
    Set cnn = CurrentProject.Connection
    monrs.Open strSQL, cnn, adOpenKeyset, adLockOptimistic
    monrs.Find "n_facture LIKE '" & strCritere & "*'", 0, adSearchForward
    If monrs.EOF Then
        new_facture = strCritere & Format(1, "00000")
    Else
        new_facture = strCritere & Format(Val(Mid(monrs!n_facture, Len(strCritere) + 1)) + 1, "00000")
    End If
    monrs.AddNew
    monrs!n_facture = new_facture
    ' ....'les autres champs de la facture a ajouter
    monrs.Update
    monrs.Close

Dr.T
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
15 janv. 2007 à 21:04
Bonjour caramelmou...

Multi utilisateurs, hein...?
Et en laissant l'ouverture accessible à tous au même moment, hein ?


Dis-voir un peu, toi : tu dois en trouver surement quelques-un beaucoup plus sévères, de problèmes.... en agissant de la sorte !!!
0
cs_caramelmou Messages postés 56 Date d'inscription jeudi 25 décembre 2003 Statut Membre Dernière intervention 23 avril 2008 3
16 janv. 2007 à 14:55
..?
dans le code le champ n_facture est une clef primaire. Il faut en effet écrire une gestion d'erreur lors de l'update au cas ou plusieurs utilisateurs tentent de créer simultanement une facture (si erreur = doublon, on peut recommencer ou abandonner)

Mais toute facon, en réseau il faudra gérer le verrouillage que l'on utilise un fichier externe ou une table supplementaire:  cf  msdn  http://support.microsoft.com/kb/240317/fr  Comment implémenter les compteurs multi-utilisateur personnalisés dans Jet 4.0 et ADO 2.1

Il me semblait que ma solution était plus simple... maintenant si quelqu'un veut mettre un code complet avec verrrouillage et gestion d'erreur... ;-)

Dr.T
0
cs_jolicoeur79 Messages postés 62 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 1 avril 2018 1
21 janv. 2007 à 15:05
salut les mecs et merci pour votre aide je vais essaye d'appliquer votre propsition et merci  b+ 
0
Rejoignez-nous