cs_jolicoeur79
Messages postés62Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 1 avril 2018
-
15 janv. 2007 à 02:23
cs_jolicoeur79
Messages postés62Date d'inscriptionsamedi 2 octobre 2004StatutMembreDerniè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.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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.
cs_Exploreur
Messages postés4821Date d'inscriptionlundi 11 novembre 2002StatutMembreDernière intervention15 novembre 201615 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 = ""
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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
cs_Exploreur
Messages postés4821Date d'inscriptionlundi 11 novembre 2002StatutMembreDernière intervention15 novembre 201615 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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)
cs_Exploreur
Messages postés4821Date d'inscriptionlundi 11 novembre 2002StatutMembreDernière intervention15 novembre 201615 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
cs_caramelmou
Messages postés56Date d'inscriptionjeudi 25 décembre 2003StatutMembreDernière intervention23 avril 20083 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
cs_caramelmou
Messages postés56Date d'inscriptionjeudi 25 décembre 2003StatutMembreDernière intervention23 avril 20083 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... ;-)