Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/05/2011, 05h05   #1
Invité de passage
 
Inscription : mars 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 4
Points : 0
Points : 0
Par défaut Numéro de facture qui s'incrémente sans être numéroAuto

Bonjour,

Dans ma base de donnée de facturation je ne veux pas utiliser pour le numéro de facture le type de donnée numéroAuto parceque je veux avoir des numéros de facture qui se suivent sans trous dans la séquence. Pour avoir un numéro de facture qui s'incrémente j'ai fait une fonction qui va voir le numéro de facture au dernier enregistrement de la table facture et j'incrémente de 1 le numéro et je retourne cette valeur par cette fonction. Est-ce une bonne façon. Est-ce sécuritaire ..... MERCI
joseedaccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 08h17   #2
Membre Expert
 
Avatar de stigma
 
Homme Alain
Développeur informatique
Inscription : octobre 2003
Messages : 846
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 61
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : octobre 2003
Messages : 846
Points : 1 053
Points : 1 053
Envoyer un message via MSN à stigma
C'est ainsi que je procède et je n'ai jamais eu de problème.
__________________
Je ne suis pas une adresse IP, je suis un homme libre !
stigma est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 11h08   #3
Membre régulier
 
Homme Marcel
Directeur technique
Inscription : avril 2011
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Marcel
Localisation : Belgique

Informations professionnelles :
Activité : Directeur technique
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 100
Points : 97
Points : 97
Par défaut N° de Facture incrémenté (Pas NuméroAuto)

Bonjour Joseedaccess,

Je comprends parfaitement ton souhait.
J'ai récemment ouvert une discussion sous le titre:
Récupérer la valeur d'un champ.

Va peut-être voir la discussion, LedZepp m'avait donné un code et des explications très intéressantes avec la fonction Dmax.
J'utilise ça et c'est impeccable.

Pour mon information, j'aimerais aussi voir la fonction que toi tu as écrite.

Merci

Marcel
Marcello5255 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2011, 03h07   #4
Invité de passage
 
Inscription : mars 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 4
Points : 0
Points : 0
Par défaut Voici la fonction qui incrémente de 1

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Private Sub CtrlListeClient_AfterUpdate()
Dim rep As integer
 
,,,,,,,,
 
rep = ChercherLeNumFactureIncrementer
 
Me.[#FACTURE] = rep
 
End Sub
 
 
 
 
Public Function ChercherLeNumFactureIncrementer() As Integer
 
Dim dbsDardo As DAO.Database
Dim rstFacture As DAO.Recordset
 
 
Dim rep As Integer
 
 
 Set dbsDardo = CurrentDb
 Set rstFacture = dbsDardo.OpenRecordset("TFACTURE", dbOpenDynaset)
 
 
If (rstFacture.EOF = True And rstFacture.BOF = True) Then
    rstFacture.AddNew
    rep = rstFacture![#FACTURE]
    ChercherLeNumFactureIncrementer = rep + 1
 Else
 rstFacture.MoveLast
 rep = rstFacture![#FACTURE]
 ChercherLeNumFactureIncrementer = rep + 1
 
   End If
   rstFacture.Close
   dbsDardo.Close
 
 
    Set rstFacture = Nothing
   Set dbsDardo = Nothing
 
 
End Function
joseedaccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2011, 13h00   #5
Membre régulier
 
Homme Marcel
Directeur technique
Inscription : avril 2011
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Marcel
Localisation : Belgique

Informations professionnelles :
Activité : Directeur technique
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 100
Points : 97
Points : 97
Par défaut Incrémenter sans N° Auto

Merci pour la fonction Josee,

Bien à toi,

Marcel
Marcello5255 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2011, 15h58   #6
Membre Expert
 
Avatar de nico84
 
Homme Nicolas Guimbal
Consultant/développeur ERP
Inscription : mai 2008
Messages : 1 254
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Guimbal
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant/développeur ERP
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2008
Messages : 1 254
Points : 1 870
Points : 1 870
Bonjour,

En environnement multi-utilisateur il faut très rapidement "bloquer" le n° sinon il peut y avoir des doublons

Pour cela j'ai une petite fonction GetNext(table,champ) que j'appelle directement dans mon INSERT
nico84 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/05/2011, 18h25   #7
Membre régulier
 
Homme Marcel
Directeur technique
Inscription : avril 2011
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Marcel
Localisation : Belgique

Informations professionnelles :
Activité : Directeur technique
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 100
Points : 97
Points : 97
Par défaut Incrémenter un numéro

Bonsoir Nico,

Même si on a réglé la propriété indexée sur "oui sans doublons" ?
Et cette petite fonction GetNext, on aimerait la connaître aussi.

Merci

Marcel
Marcello5255 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2011, 21h27   #8
Membre Expert
 
Avatar de nico84
 
Homme Nicolas Guimbal
Consultant/développeur ERP
Inscription : mai 2008
Messages : 1 254
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Guimbal
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant/développeur ERP
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2008
Messages : 1 254
Points : 1 870
Points : 1 870
La fonction est juste un Dmax+1 :
Code :
1
2
3
4
5
6
7
8
'18/3/09 incrément de 1 sur le champ de la table spécifiée
Public Function Get_next(f As String, c As String, Optional n As Integer = 1) As Long
If Not Mode_debug Then On Error GoTo err:
100 Get_next = Nz(DMax(c, f), 0) + 1
102 If Get_next < n Then Get_next = n
    Exit Function
err: Call message("Erreur " & err.Number & "/" & Erl & " dans fonctions.get_next : " & err.DESCRIPTION)
End Function
Si 2 users demandent un n° en même temps un seul pourra sauver son en-tête, l'autre aura un bug plus ou moins propre et selon comme c'est codé il risque d'avoir déjà marqué le(s) BL correspondant(s) et/ou créé des lignes de facture (qui donc se retrouveront sur la facture du collègue )

Si par exemple le programme prend son n° et ensuite demande une confirmation, le gus va justement faire sa pause
Pendant ce temps un autre gars fait une facture (avec le même n° puisque le 1er n'a encore rien écrit !) et au retour de sa pause le 1er se fait jeter

Inversement si le logiciel bloque le n° et le gus en pause ne finit jamais sa facture à la fin ça laisse un trou

Une solution propre consiste à créer la facture en zone tampon et à la fin si tout ok faire une transaction globale d'écriture mais c'est lourd...
nico84 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/05/2011, 07h35   #9
Rédacteur

 
Avatar de Maxence HUBICHE
 
Homme Maxence HUBICHE
Formateur et Développeur - Conseil en Informatique
Inscription : juin 2002
Messages : 3 687
Détails du profil
Informations personnelles :
Nom : Homme Maxence HUBICHE
Âge : 42
Localisation : France, Val d'Oise (Île de France)

Informations professionnelles :
Activité : Formateur et Développeur - Conseil en Informatique

Informations forums :
Inscription : juin 2002
Messages : 3 687
Points : 6 516
Points : 6 516
Envoyer un message via MSN à Maxence HUBICHE Envoyer un message via Skype™ à Maxence HUBICHE
En fait, la solution "propre" à cette problématique, consiste à mettre en place une clé primaire ET une clé secondaire.
La clé primaire de la facture est un numéro séquentiel de type n° automatique.
Ainsi, aucun souci pour la création de la facture, et idem pour ses lignes.
La clé secondaire, c'est un autre champ, indexé sans doublons, avec NULL (et Chaine Vide) interdits, que vous générez avec vos différentes fonctions, par exemple, sur un évènement ou sur une demande explicite [générer la facture]

Ainsi, vous avez toujours un n° de facture propre [NumAuto], qui peut être masqué à l'utilisateur, et un Numéro de Facture sans risque de se marcher l'un sur l'autre en situation multi-utilisateur

Attention à ne pas confondre
- clé primaire => identifiant (système, pour le fonctionnement de la base)
- clé étrangère => rappel de l'identifiant dans une autre table pur permettre la relation
- clé secondaire => champ indexé sans doublons servant de deuxième identifiant (utilisateur, pour la visualisation, quand porteuse d'information ou de règles particulières, ou pour génération à des moments ne correspondant pas aux clés primaires)
__________________
1formaxion, une formation de qualité, des formateurs compétents
Mes tutoriels et vidéos :
Tableaux croisés dynamiques, Access les Bases, et les autres !
Maxence HUBICHE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 08h08   #10
Membre Expert
 
Avatar de stigma
 
Homme Alain
Développeur informatique
Inscription : octobre 2003
Messages : 846
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 61
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : octobre 2003
Messages : 846
Points : 1 053
Points : 1 053
Envoyer un message via MSN à stigma
Je précise que je garde systématiquement un numéro auto dans mes tables de saisies en plus de mon ID créé par code. Celà me sert lorsque je dois basculer certaines tables sur un serveur SQL. J'utilise donc le NumAuto pour parfaire l'intégrité des données.
__________________
Je ne suis pas une adresse IP, je suis un homme libre !
stigma est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 09h09   #11
Membre Expert
 
Homme Jacques Petiot
Indépendant développeur et formateur
Inscription : octobre 2007
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Jacques Petiot
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Indépendant développeur et formateur
Secteur : Conseil

Informations forums :
Inscription : octobre 2007
Messages : 891
Points : 1 333
Points : 1 333
hello
Voilà le VBA que mon client utilise depuis plusieurs années en multi utilisateurs sans problème:
Code :
1
2
3
4
5
6
Private Sub N°_de_proposition_Enter()
If [N° de proposition] > 0 Then 'on ne fait rien il y a déja un numéro
Else
    [N° de proposition] = DMax("[N° de proposition]", "Devis")+1
End If
End Sub
J'ai depuis longtemps abandonné les numéros auto qui font une clef, c'est sûr, mais ne servent à rien.

de plus, moi qui ai mélangé les clients et les fournisseurs, les factures/client et les factures/fournisseur, je peux attribuer mes numéros intelligement:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub payer_encaisser_Click()
Dim limite As Long
Dim sens As String
limite = DLookup("valeur", "parametres", "variable = 'N°facture'")
sens = DLookup("texte", "parametres", "variable = 'N°facture'")
If N°facture > 0 Then 'on fait rien: il y a déja une valeur
Else
    If Payer_encaisser = 0 Then
        N°facture = DMax("N°facture", "Factures", "Not N°facture" & sens & limite) + 1
        Fournisseur_Étiquette.Caption = "Client"
    Else
        N°facture = DMax("N°facture", "Factures", "N°facture" & sens & limite) + 1
        Fournisseur_Étiquette.Caption = "Fournisseur"
    End If
End If
End Sub
Sécuritaire? de toute façon, c'est pas mon PC qui va subir le contrôle fiscal ! ! !
moi, je veux pouvoir saisir la facture N°3 avant la factue N°, en échange, je dois faire attention!!
__________________
-------------------Simplifi----------comme si tout était simple--------
Simplifi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 10h30   #12
Membre régulier
 
Homme Marcel
Directeur technique
Inscription : avril 2011
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Marcel
Localisation : Belgique

Informations professionnelles :
Activité : Directeur technique
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 100
Points : 97
Points : 97
Par défaut Incrémenter un numéro de facture

Bonjour à tous

Citation:
Envoyé par nico84 Voir le message
Si 2 users demandent un n° en même temps un seul pourra sauver son en-tête, l'autre aura un bug plus ou moins propre et selon comme c'est codé il risque d'avoir déjà marqué le(s) BL correspondant(s) et/ou créé des lignes de facture (qui donc se retrouveront sur la facture du collègue)
Pas habitué de travailler en multi-utilisateurs, je ne vois pas bien comment un utilisateur pourrait écrire des lignes sur la facture du collègue dès lors que celui-ci a sauvé son entête. Si je me trompe, merci de m'éclairer.

Pour obtenir une réponse objective, il est probablement utile de détailler la structures des tables liées.

Il faut d'abord savoir que la législation sur les pièces comptables exige qu'elles soient datées et numérotées, et que la numérotation soit séquentielle. Elle ne peut donc comporter aucun trou.

On a besoin d'une table "Facture" avec la dateFact, le N° de facture, les données du client, en principal.

Une autre table "FactureLignes" avec entre autre: le montant de la ligne,
le montant de la TVA sur la ligne, le code TVA, et bien sûr une clé étrangère (N° de facture) qui servira de lien avec la table "Facture"

Un formulaire "FormFacture" source = Facture
Un sous-formulaire "FormFactureLignes" source = FactureLignes
Champs père et fils "N°de facture".
Ce sont de requêtes et non des tables que j'utilise comme source

Dès que mon entête est sauvegardée, il n'est pas possible que quelqu'un obtienne le numéro de ma facture et y écrive donc des lignes.
Si je n'écris rien dans les lignes, j'aurai une facture numérotée, attribuée à un clients avec des totaux HTVA, TVA et TVAcomprise à 0.

Si je supprime la facture, bien sûr que j'aurai un trou dans ma numérotation.
Pourtant, avec une numérotation basée sur une fonction Dmax, ou autre, je pourrai récupérer ce numéro pour une facture suivante. La numérotation basée sur numéroauto, ne permet pas celà.

Et enfin quelques habitudes que j'ai prises et leurs raisons.
Je me débrouille très bien ainsi, mais si quelqu'un voit mieux, je n'hésiterai pas à considérer.

Je crée mon identifiant qui sera le n° de facture de type Texte.
Dans la fenêtre des relations, on ne peut pas appliquer l'intégrité référencielle, entre un champ numéroauto et numérique.

Un numéro de facture de vente est créé par une concaténation:
FV Année/N° , sur l'événement dateFact, puisque c'est la premier champ obligatoire à la création d'une facture.
Année, récupéré avec DatePart,
N°: premier numéro de l'année à 1000, considérant que je ne ferai jamais plus de 9999 facture dans la même année.

Numéro de facture entrée: FE Année/N°
Numéro d'extrait de compte (Financier) Fin N° du financier/N° de l'extrait.
FV 2011/1612,
FE 2011/1056,
FIN 07/031,
me semblent plus explicite que les 1 , 165 et 1623, lorsque je lis par exemple les lignes de ma déclaration TVA.


J'utilise même cette méthode pour les lignes, mais là je laisse faire le numéroauto.

FVLg/125 , FELg/65, ........

Merci à tous pour cette discussion passionnante et l'utilité de tous les avis.

Marcel.
Marcello5255 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 13h26   #13
Membre Expert
 
Avatar de nico84
 
Homme Nicolas Guimbal
Consultant/développeur ERP
Inscription : mai 2008
Messages : 1 254
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Guimbal
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant/développeur ERP
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2008
Messages : 1 254
Points : 1 870
Points : 1 870
Citation:
Il faut d'abord savoir que la législation sur les pièces comptables exige qu'elles soient datées et numérotées, et que la numérotation soit séquentielle. Elle ne peut donc comporter aucun trou.
J'essaie de respecter cette règle aussi mais je doute que des entreprises comme EDF, SFR ou Ebay la respecte car leurs n° semblent préfixés de mon n° de client et le reste ne se suit pas... Je me demande donc si elle est vraiment "exigée" ?

Citation:
Si je supprime la facture, bien sûr que j'aurai un trou dans ma numérotation.
Pourtant, avec une numérotation basée sur une fonction Dmax, ou autre, je pourrai récupérer ce numéro pour une facture suivante.
Sauf si dans cet intervalle un autre utilisateur a créé une facture

Citation:
je ne vois pas bien comment un utilisateur pourrait écrire des lignes sur la facture du collègue dès lors que celui-ci a sauvé son entête.
Cela peut se produire si les lignes sont écrites avant l'entete ou si le n° est réservé en mémoire mais l'écriture globale seulement en fin de création...

Citation:
J'ai depuis longtemps abandonné les numéros auto qui font une clef, c'est sûr, mais ne servent à rien.
+1

J'utilise la méthode suivante qui ne m'a jamais créé ni trou ni doublon :
- la fenêtre de création de facture ne peut être ouverte que par un utilisateur à la fois
- la création des lignes de facture se fait dans une table intermédiaire liée à la frontale
- quand tout est terminé et ok je crée l'entête puis les lignes
nico84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 14h41   #14
Membre régulier
 
Homme Marcel
Directeur technique
Inscription : avril 2011
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Marcel
Localisation : Belgique

Informations professionnelles :
Activité : Directeur technique
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 100
Points : 97
Points : 97
Citation:
Sauf si dans cet intervalle un autre utilisateur a créé une facture
Mais si, je pourrai récupérer le numéro annulé, même si un autre utilisateur a crée une facture dans cet intervalle.

Voilà comment je procède:
L'identifiant de ma facture est constitué par la concaténation
FV Année/N°Simple

C'est ce numéro simple qui doit être séquentiel
De plus, chaque année, je veux commencer la numérotation à 1000
et FV 2012/1000, sera bien différent de FV 2011/1000, et classé après.

Je demande le N°Simple ainsi:
(Comme je ne suis pas fort en code, c'est LedZepp qui me l'a donné)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub DateFact_Enter()
    Dim lgNumMax As Long
    Dim lgNumEnCours As Long
 
        ' Si l'enregistrement en cours est un nouvel enregistrement
        If Me.NewRecord = True Then
        ' Lit la valeur du champ N°Simple de l'enregistrement en cours
        ' et remplace Null par zéro
            lgNumEnCours = Nz(Me.[N°Simplel], 0)
            ' Si la valeur est zéro
            If lgNumEnCours = 0 Then
            ' Lire la valeur max du champ N°Simple
                lgNumMax = Nz(DMax("[N°Simple]", "Facture", "[NumFact] Like 'FV " & Year(Date) & "/*'"), 1000)
            ' Affecter cette valeur + 1 au champ N°Simple
            Me.[N°Simple] = lgNumMax + 1
            End If
        End If
J'écris aussi (Celle-là, je l'avais trouvée moi-même )

Code :
1
2
3
4
Private Sub DateFact_BeforeUpdate(Cancel As Integer)
    Année = DatePart("yyyy", DateFact)
    NumFact = "FV" & " " & Année & "/" & N°Simple
end sub
Le champ suivant c'est justement N°Simple, et c'est voulu.

J'écris

Code :
1
2
3
4
Private Sub NumSimple_BeforeUpdate(Cancel As Integer)
    NumFact = "FV" & " " & Année & "/" & N°Simple
    NumFact.Enabled = False
End Sub
Qu'est-ce qui m'empêche quand j'arrive sur N°Simple de taper 1255 qui a été supprimé, même si le dernier Numéro de facture est FV 2011/1260
Le NumFact sera concaténé FV 2011/1255, et la prochaine facture continuera à FV 2011/1261, grâce à la fonction Dmax.
Rien ne m'empêche non plus de forcer le N°simple pour commencer l'année à 2000 par exemple

LedZepp m'avait aussi suggéré le code pour obtenir le N°Simple sur l'événement Form_Dirty. Cela marche aussi bien et tellement bien que j'utilise cet événement pour les factures entrées et DateDoc_Enter pour les factures de vente.

Bonne journée à tous

Marcel
Marcello5255 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h01.


 
 
 
 
Partenaires

Hébergement Web