OVH Cloud OVH Cloud

Numérotation continue de plusieurs types documents...

19 réponses
Avatar
Sogolon
Bonjour, salut à tous et à toutes.
Merci de votre aide qui me permet d'avancer dans mon Application.
Une nouvelle question:
Mon appli doit gérer plusieurs types de documents(L, BC,F,FC et EM) et ceci
dans deux sens: Arrivé et Départ.
J'aimerai que dans une Table T_Correspondances le champ Réf soit numéroté
automatiquement comme suit:
1-Document Arrivé:
L 1/05-06/ puis L 2/05-06/ ainsi de suite (05-06 c'est le mois et
l'année en cours). Pour les lettres en courrier arrivé
BC 1/05-06/ puis BC 2/05-06/ ainsi de suite pour les bons de commandes
Idem pour les autres types de documents.

2-Document Départ:
L 1/05-06/ puis L 2/05-06/ ainsi de suite (05-06 c'est le mois et
l'année en cours). Pour les lettres en courrier arrivé
BC 1/05-06/ puis BC 2/05-06/ ainsi de suite pour les bons de commandes
Idem pour les autres types de documents.

Salut à tous et à toutes.
Passez une très bonne journée.
A+...

9 réponses

1 2
Avatar
LiR
1.

DMax("[Numero]", "TCorrespondances") +1 :

C'est un bon début.

A noter que si DMax renvoie Null,
DMax("[Numero]", "TCorrespondances") +1 vaut Null, ce n'est pas le but
recherché...

Il manque en outre le 3ème paramètre de la fonction, qui stipule que tu veux
le N° MAX pour les enregistrement vérifiant les conditions :

Year(Courrier_Date) = Year(Now)
TypeCourrier = Me.TypeCourrier
Sens = Me.Sens

Ainsi, tu auras les éventuels courriers de même sens, de même type et de
même année, pour lesquels tu recherches le dernier N° (le plus élevé).

Le mieux est de créer ta propre fonction NouveauNumCourrier :

Public Function NouveauNumCourrier(ByVal NewTypeCourrier as Long, ByVal
NewSensCourrier as Long, ByVal NewDateCourrier as Date) As Long

Dim vOldN As Variant

Dim sCond1 As String
Dim sCond2 As String
Dim sCond3 As String
Dim sCond As String

sCond1 = "TypeCourrier =" & NewTypeCourrier
sCond2 = "Sens=" & NewSensCourrier
sCond3 = "Year(DateCourrier)=" & Year(NewDateCourrier)

sCond = "(" & sCond1 & ") AND (" & sCond2 & ") AND (" & sCond3 & ")"

vOldN = DMax("[Numero]", "TCorrespondances", sCond )

If IsNull(vOldN) Then
NouveauNumCourrier = 1
Else
NouveauNumCourrier = vOldN + 1
End If

End Function

2.

Reste que le choix de l'événement BeforeInsert n'est pas judicieux pour
déterminer le nouveau numéro pour 2 raisons :

- On ne connait pas à ce moment là le type du courrier, ni son sens
- Si tu es en mode multi-utilisateurs et que 2 personnes font un nouvel
enregistrement en même temps, ils auront le même numéro qui apparaîtra mais
le premier à VALIDER l'enregistrement stockera le numéro et le second créera
un doublon lorsqu'il validera.

Le meilleur moment serait sur Form_AfterUpdate.

Je ne connais pas comment et quand sont saisis le Type, Sens, Date du
courrier...
Mais on peut imaginer que lors de la mise à jour de l'enregistrement, ces
informations sont présentes.

Private Sub Form_AfterUpdate(Cancel As Integer)

If IsNull(Me!Numero) Then
Me!Numero = NouveauNumCourrier (Me.TypeCourrier, Me.Sens,
Me.DateCourrier)
End If

End Sub



Bonjour à toutes et à tous.
Salut "LiR".
Oui, j'ai mis vos conseils en application, je me documente et lis beaucoup.
Sur la base templete de MS, je prends des formulaires , je vois les codes et
j'essaie de comprendre leurs objectifs.
A ce propos je me suis exercée avec DMAX comme suis:
----------------------------------------------
Private Sub Form_BeforeInsert(Cancel As Integer)
Me!Numero = DMax("[Numero]", "TCorrespondances") + 1
If IsNull(Me!Numero) Or Me!Numero< Year(Now) * 10000 Then
Me!Numero= 1 + Year(Now) * 10000
End If
End Sub
------------------------------------------------
Avec cette procédure je génére une suite de: 20060001;20060002;2006000...
Mais là il y'a pas plusieurs cas de figures à gérer, pas beaucoup de If ni
Case...
A propos je voulais modifier le code ci-dessus pour avoir" 2006-000n" et
conserver le fait que le Chrono reparte à 1 l'année suivante.

Merci "LiR" et merci à toute la communauté.

A+...

@@@

OK, donc Sens et TypeCourrier sont des champs numériques.
Je crois que nous avons maintenant toutes les informations nécesssaires.

De ton côté, tu as trouvé comment utiliser la fonction DMax?





Avatar
Sogolon
Salut et merci "LiR", je me mes au travail sans tarder.
Je vous reviens bientôt.
Merci.

(<Cependant comment avoir le format: "TypeCourrier Num/mm-yy " par exemple:
L 0001/05-06/ pour les lettres>)
Quoi qu'il en sera je vous remercierai jamais assez. Vraiment bon boulot et
surtout bonne continuation, ayez une très bonne santé
Salut à toutes et à tous.

A+...
Avatar
LiR
OK,

Au fait, pour le moment on n'en est qu'à la détermination du N° de chrono.
Pour le N° Réf (et notamment le format), on verra par la suite...


Salut et merci "LiR", je me mes au travail sans tarder.
Je vous reviens bientôt.
Merci.

(<Cependant comment avoir le format: "TypeCourrier Num/mm-yy " par exemple:
L 0001/05-06/ pour les lettres>)
Quoi qu'il en sera je vous remercierai jamais assez. Vraiment bon boulot et
surtout bonne continuation, ayez une très bonne santé
Salut à toutes et à tous.

A+...




Avatar
Sogolon
Ok, d'accord à tout de suite si vous le voulez bien. Merci
A+...
@@@


OK,

Au fait, pour le moment on n'en est qu'à la détermination du N° de chrono.
Pour le N° Réf (et notamment le format), on verra par la suite...


Salut et merci "LiR", je me mes au travail sans tarder.
Je vous reviens bientôt.
Merci.

(<Cependant comment avoir le format: "TypeCourrier Num/mm-yy " par exemple:
L 0001/05-06/ pour les lettres>)
Quoi qu'il en sera je vous remercierai jamais assez. Vraiment bon boulot et
surtout bonne continuation, ayez une très bonne santé
Salut à toutes et à tous.

A+...






Avatar
Sogolon
Bonjour à nouveau.
J'ai implémenté le code, mais j'ai une erreur
"erreur d'exécution '12':
Incompatibilité de type"
Et dans la sous-procédure
---------------
Private Sub Form_AfterUpdate()
If IsNull(Me!Numero) Then
Me!Numero = NouveauNumCourrier(Me.TypeCourrier, Me.Sens, Me.DateCourrier)
End If
End Sub
------------------
J'ai toute la ligne'
Me!Numero = NouveauNumCourrier(Me.TypeCourrier, Me.Sens, Me.DateCourrier)
qui est sélectionnée ( en jaune)

"Remarque dans la fonction que nous avons mis en place je ne vois pas
comment vous avez fait intervenir le Numero."

A tout de suite si vous le voulez bien. Merci
A+...
@@@
Avatar
Sogolon
Excusez-moi, c'est moi qui avait commis une erreur.
Après correction l'erreur porte sur la fonction.
Toute la ligne:
vOldN = DMax("[Numero]", "Correspondances", sCond)
Est soulignée.
Avec l'aide de VB:
vOldN=Vide
et sCond="(TypeCourrier=1) AND (Sens=1) AND (Year(DateCourrier) 06)" ce
qui est tout à fait correct car:
TypeCourrier=1 correspond à Lettre
Sens=1 correspond à Départ
et Year(DateCourrier)= correspond bien à l'année en cours.

Merci "LiR" de votre aide, je compte sur vous et à toute la communauté.
Merci
A tout de suite si vous le voulez bien. Merci

A+...
@@@

Bonjour à nouveau.
J'ai implémenté le code, mais j'ai une erreur
"erreur d'exécution '12':
Incompatibilité de type"
Et dans la sous-procédure
---------------
Private Sub Form_AfterUpdate()
If IsNull(Me!Numero) Then
Me!Numero = NouveauNumCourrier(Me.TypeCourrier, Me.Sens, Me.DateCourrier)
End If
End Sub
------------------
J'ai toute la ligne'
Me!Numero = NouveauNumCourrier(Me.TypeCourrier, Me.Sens, Me.DateCourrier)
qui est sélectionnée ( en jaune)

"Remarque dans la fonction que nous avons mis en place je ne vois pas
comment vous avez fait intervenir le Numero."

A tout de suite si vous le voulez bien. Merci
A+...
@@@



Avatar
LiR
Quel est le message d'erreur?




Excusez-moi, c'est moi qui avait commis une erreur.
Après correction l'erreur porte sur la fonction.
Toute la ligne:
vOldN = DMax("[Numero]", "Correspondances", sCond)
Est soulignée.
Avec l'aide de VB:
vOldN=Vide
et sCond="(TypeCourrier=1) AND (Sens=1) AND (Year(DateCourrier) 06)" ce
qui est tout à fait correct car:
TypeCourrier=1 correspond à Lettre
Sens=1 correspond à Départ
et Year(DateCourrier)= correspond bien à l'année en cours.

Merci "LiR" de votre aide, je compte sur vous et à toute la communauté.
Merci
A tout de suite si vous le voulez bien. Merci

A+...
@@@

Bonjour à nouveau.
J'ai implémenté le code, mais j'ai une erreur
"erreur d'exécution '12':
Incompatibilité de type"
Et dans la sous-procédure
---------------
Private Sub Form_AfterUpdate()
If IsNull(Me!Numero) Then
Me!Numero = NouveauNumCourrier(Me.TypeCourrier, Me.Sens, Me.DateCourrier)
End If
End Sub
------------------
J'ai toute la ligne'
Me!Numero = NouveauNumCourrier(Me.TypeCourrier, Me.Sens, Me.DateCourrier)
qui est sélectionnée ( en jaune)

"Remarque dans la fonction que nous avons mis en place je ne vois pas
comment vous avez fait intervenir le Numero."

A tout de suite si vous le voulez bien. Merci
A+...
@@@





Avatar
Sogolon
L'erreur c'est:
-----------------------------
'Erreur d'exécution '3464'
Type de données incompatible dans l'expression du critère.'
-----------------------------
A+...
@@@



Quel est le message d'erreur?




Excusez-moi, c'est moi qui avait commis une erreur.
Après correction l'erreur porte sur la fonction.
Toute la ligne:
vOldN = DMax("[Numero]", "Correspondances", sCond)
Est soulignée.
Avec l'aide de VB:
vOldN=Vide
et sCond="(TypeCourrier=1) AND (Sens=1) AND (Year(DateCourrier) 06)" ce
qui est tout à fait correct car:
TypeCourrier=1 correspond à Lettre
Sens=1 correspond à Départ
et Year(DateCourrier)= correspond bien à l'année en cours.

Merci "LiR" de votre aide, je compte sur vous et à toute la communauté.
Merci
A tout de suite si vous le voulez bien. Merci

A+...
@@@

Bonjour à nouveau.
J'ai implémenté le code, mais j'ai une erreur
"erreur d'exécution '12':
Incompatibilité de type"
Et dans la sous-procédure
---------------
Private Sub Form_AfterUpdate()
If IsNull(Me!Numero) Then
Me!Numero = NouveauNumCourrier(Me.TypeCourrier, Me.Sens, Me.DateCourrier)
End If
End Sub
------------------
J'ai toute la ligne'
Me!Numero = NouveauNumCourrier(Me.TypeCourrier, Me.Sens, Me.DateCourrier)
qui est sélectionnée ( en jaune)

"Remarque dans la fonction que nous avons mis en place je ne vois pas
comment vous avez fait intervenir le Numero."

A tout de suite si vous le voulez bien. Merci
A+...
@@@







Avatar
Sogolon
Bonne nouvelle,ça marche.
Bravo "LiR".
je vous exprime toute ma gratitude.
Le problème venait, je pense, du champ Numero.
Le type de données était "Numérique" et je l'ai changé pour mettre du
"texte" au type de données.
Merci beaucoup.
Il me reste la mise au format:
"TypeCourrier Num/mm-yy " par exemple:
L 0001/05-06/ pour les lettres".
Dans mon champ Référence.
Merci "LiR"


A+...
@@@









1 2