|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : mars 2011 Messages : 4 ![]() |
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
|
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() |
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 ! |
|
|
00
|
|
|
#3 |
|
Membre régulier
![]() Marcel Directeur technique Inscription : avril 2011 Messages : 100 ![]() |
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 |
|
|
00
|
|
|
#4 | ||
|
Invité de passage
![]() Inscription : mars 2011 Messages : 4 ![]() |
Code :
|
||
|
|
00
|
|
|
#5 |
|
Membre régulier
![]() Marcel Directeur technique Inscription : avril 2011 Messages : 100 ![]() |
Merci pour la fonction Josee,
Bien à toi, Marcel |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Nicolas GuimbalConsultant/développeur ERP Inscription : mai 2008 Messages : 1 254 ![]() |
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 |
|
|
10
|
|
|
#7 |
|
Membre régulier
![]() Marcel Directeur technique Inscription : avril 2011 Messages : 100 ![]() |
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 |
|
|
00
|
|
|
#8 | ||
|
Membre Expert
![]() Nicolas GuimbalConsultant/développeur ERP Inscription : mai 2008 Messages : 1 254 ![]() |
La fonction est juste un Dmax+1 :
Code :
)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... |
||
|
|
10
|
|
|
#9 |
![]() ![]() ![]() |
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 ! |
|
00
|
|
|
#10 |
|
Membre Expert
![]() |
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 ! |
|
|
00
|
|
|
#11 | ||||
|
Membre Expert
![]() Jacques PetiotIndépendant développeur et formateur Inscription : octobre 2007 Messages : 891 ![]() |
hello
Voilà le VBA que mon client utilise depuis plusieurs années en multi utilisateurs sans problème: Code :
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 :
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-------- |
||||
|
|
00
|
|
|
#12 | |
|
Membre régulier
![]() Marcel Directeur technique Inscription : avril 2011 Messages : 100 ![]() |
Bonjour à tous
Citation:
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. |
|
|
|
00
|
|
|
#13 | ||||
|
Membre Expert
![]() Nicolas GuimbalConsultant/développeur ERP Inscription : mai 2008 Messages : 1 254 ![]() |
Citation:
Citation:
![]() Citation:
Citation:
![]() 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 |
||||
|
|
00
|
|
|
#14 | |||||||
|
Membre régulier
![]() Marcel Directeur technique Inscription : avril 2011 Messages : 100 ![]() |
Citation:
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 :
)Code :
J'écris Code :
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 |
|||||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com