Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Creation d'un n° affaire avec concatennation !!!

11 réponses
Avatar
lorenzo
bonjour


je voudrais creer un numero d'affaire.

ce numero se compose de 3 choses.
AAA (fixe)
annee : 09, 10 ,11 ,12 ,13 ,14 ,15 ,16 .... (1 table)
et un numero auto incremente de 4 caracteres : 1111 ce numero doit etre
unique sans doublon.

donc ce numero aura le format suivant : AAA090001

Nb : a chaque changement d'annee le numero doit pouvoir revenir a 0001 et
s'auto-incremmenter avec un pas de 1

au final je voudrais ces 3 champs concatennés dans un champs "affaire"

pouvez vous m'aider

Merci beaucoup !!!!

Cordialement

10 réponses

1 2
Avatar
Blaise Cacramp
Selon : Bonjour ou bonsoir

Il faut stocker le dernier numéro pour pouvoir l'incrémenter et à côté la
date pour le réinitialiser au changement d'année.

Dans l'exemple, tu crées une table [Tbl_S_Num_Fact] avec deux champs
[Fct_An] de type date, et [Fct_Serie] de type long (9999 factures par an,
cela fait une trentaine par jour. Cela peut être insuffisant. Le type Long
te permet d'aller au delà).
Tu initialise le 1er enregistrement avec une date antérieure du style 8/8/8

Puis dans un module VBA :
<--------------------------------------------------------------------
Option Compare Database
Option Explicit

Function Num_Fact() As String
Dim sSql As String
Dim dtAN As Date
Dim lgNr As Long
Dim Rst As New ADODB.Recordset

sSql = "SELECT Tbl_S_Num_Fact.Fct_An, Tbl_S_Num_Fact.Fct_Serie" _
& " FROM Tbl_S_Num_Fact;"

Rst.Open sSql, CurrentProject.Connection, adOpenDynamic
'ouverture du recordset (table courante)

dtAN = Rst("Fct_An") 'date
If Year(dtAN) <> Year(Date) Then 'changement d'année, compteur à 1
dtAN = Date
lgNr = 1
Else
lgNr = Rst("Fct_Serie") + 1 'série
End If
Rst.Close
sSql = "UPDATE Tbl_S_Num_Fact SET Tbl_S_Num_Fact.Fct_An = " &
Fn_Date_Sql_Mdb(dtAN) & ", Tbl_S_Num_Fact.Fct_Serie = " & lgNr & ";"

DoCmd.SetWarnings False
DoCmd.RunSQL sSql
DoCmd.SetWarnings True

Num_Fact = Format(dtAN, "yy") & Format(lgNr, "0000") 'retour de la
fonction
End Function


Function Fn_Date_Sql_Mdb(d As Date) 'format de date SQL pour ACCESS
Fn_Date_Sql_Mdb = "#" & Format(d, "mm") & "/" & Format(d, "dd") & "/" &
Format(d, "yyyy") & "#"
End Function
-------------------------------------------------------->

Il sera facile de faire « "AAA" & Num_Fact() » pour avoir le numéro de
facture complet



Cdt, Blaise
---- ---- ----


"lorenzo" a écrit dans le message de
news:
bonjour


je voudrais creer un numero d'affaire.

ce numero se compose de 3 choses.
AAA (fixe)
annee : 09, 10 ,11 ,12 ,13 ,14 ,15 ,16 .... (1 table)
et un numero auto incremente de 4 caracteres : 1111 ce numero doit etre
unique sans doublon.

donc ce numero aura le format suivant : AAA090001

Nb : a chaque changement d'annee le numero doit pouvoir revenir a 0001 et
s'auto-incremmenter avec un pas de 1

au final je voudrais ces 3 champs concatennés dans un champs "affaire"

pouvez vous m'aider

Merci beaucoup !!!!

Cordialement


Avatar
db
Blaise Cacramp a écrit :
Selon : Bonjour ou bonsoir

Il faut stocker le dernier numéro pour pouvoir l'incrémenter et à côté la
date pour le réinitialiser au changement d'année.

Dans l'exemple, tu crées une table [Tbl_S_Num_Fact] avec deux champs
[Fct_An] de type date, et [Fct_Serie] de type long (9999 factures par an,
cela fait une trentaine par jour. Cela peut être insuffisant. Le type Long
te permet d'aller au delà).
Tu initialise le 1er enregistrement avec une date antérieure du style 8/8/8

Puis dans un module VBA :
<--------------------------------------------------------------------
Option Compare Database
Option Explicit

Function Num_Fact() As String
Dim sSql As String
Dim dtAN As Date
Dim lgNr As Long
Dim Rst As New ADODB.Recordset

sSql = "SELECT Tbl_S_Num_Fact.Fct_An, Tbl_S_Num_Fact.Fct_Serie" _
& " FROM Tbl_S_Num_Fact;"

Rst.Open sSql, CurrentProject.Connection, adOpenDynamic
'ouverture du recordset (table courante)

dtAN = Rst("Fct_An") 'date
If Year(dtAN) <> Year(Date) Then 'changement d'année, compteur à 1
dtAN = Date
lgNr = 1
Else
lgNr = Rst("Fct_Serie") + 1 'série
End If
Rst.Close
sSql = "UPDATE Tbl_S_Num_Fact SET Tbl_S_Num_Fact.Fct_An = " &
Fn_Date_Sql_Mdb(dtAN) & ", Tbl_S_Num_Fact.Fct_Serie = " & lgNr & ";"

DoCmd.SetWarnings False
DoCmd.RunSQL sSql
DoCmd.SetWarnings True

Num_Fact = Format(dtAN, "yy") & Format(lgNr, "0000") 'retour de la
fonction
End Function


Function Fn_Date_Sql_Mdb(d As Date) 'format de date SQL pour ACCESS
Fn_Date_Sql_Mdb = "#" & Format(d, "mm") & "/" & Format(d, "dd") & "/" &
Format(d, "yyyy") & "#"
End Function
-------------------------------------------------------->

Il sera facile de faire « "AAA" & Num_Fact() » pour avoir le numéro de
facture complet



Cdt, Blaise
---- ---- ----






Bonsoir,

Plus court, mais pas forcément plus lisible :-) :

(on suppose que le numéro se trouve dans la colonne numero de la table
table1)

NouveauNumero = "AAA" & Format(Date, "yy") &
Format(Nz(DMax("right(numero,4)", "table1", "numero like 'AAA" &
Format(Date, "yy") & "*'"), 0) + 1, "0000")

En gros, s'il n'y a pas encore de numéro pour l'année en cours, ça en
crée un avec, par exemple pour 2009, "AAA090001", sinon ça incrémente
le numéro maximum trouvé pour l'année en cours : "AAA090887" -> "AAA090888"


db
Avatar
Blaise Cacramp
Selon : Bonjour ou bonsoir


"db" a écrit dans le message de news:
%
Blaise Cacramp a écrit :
Selon : Bonjour ou bonsoir

Il faut stocker le dernier numéro pour pouvoir l'incrémenter et à côté la
date pour le réinitialiser au changement d'année.

Dans l'exemple, tu crées une table [Tbl_S_Num_Fact] avec deux champs
[Fct_An] de type date, et [Fct_Serie] de type long (9999 factures par an,
cela fait une trentaine par jour. Cela peut être insuffisant. Le type
Long te permet d'aller au delà).
Tu initialise le 1er enregistrement avec une date antérieure du style
8/8/8

Puis dans un module VBA :
<--------------------------------------------------------------------
Option Compare Database
Option Explicit

Function Num_Fact() As String
Dim sSql As String
Dim dtAN As Date
Dim lgNr As Long
Dim Rst As New ADODB.Recordset

sSql = "SELECT Tbl_S_Num_Fact.Fct_An, Tbl_S_Num_Fact.Fct_Serie" _
& " FROM Tbl_S_Num_Fact;"

Rst.Open sSql, CurrentProject.Connection, adOpenDynamic 'ouverture du
recordset (table courante)

dtAN = Rst("Fct_An") 'date
If Year(dtAN) <> Year(Date) Then 'changement d'année, compteur à 1
dtAN = Date
lgNr = 1
Else
lgNr = Rst("Fct_Serie") + 1 'série
End If
Rst.Close
sSql = "UPDATE Tbl_S_Num_Fact SET Tbl_S_Num_Fact.Fct_An = " &
Fn_Date_Sql_Mdb(dtAN) & ", Tbl_S_Num_Fact.Fct_Serie = " & lgNr & ";"

DoCmd.SetWarnings False
DoCmd.RunSQL sSql
DoCmd.SetWarnings True

Num_Fact = Format(dtAN, "yy") & Format(lgNr, "0000") 'retour de la
fonction
End Function


Function Fn_Date_Sql_Mdb(d As Date) 'format de date SQL pour ACCESS
Fn_Date_Sql_Mdb = "#" & Format(d, "mm") & "/" & Format(d, "dd") & "/"
& Format(d, "yyyy") & "#"
End Function
-------------------------------------------------------->

Il sera facile de faire « "AAA" & Num_Fact() » pour avoir le numéro de
facture complet



Cdt, Blaise
---- ---- ----





Bonsoir,

Plus court, mais pas forcément plus lisible :-) :

(on suppose que le numéro se trouve dans la colonne numero de la table
table1)

NouveauNumero = "AAA" & Format(Date, "yy") &
Format(Nz(DMax("right(numero,4)", "table1", "numero like 'AAA" &
Format(Date, "yy") & "*'"), 0) + 1, "0000")

En gros, s'il n'y a pas encore de numéro pour l'année en cours, ça en crée
un avec, par exemple pour 2009, "AAA090001", sinon ça incrémente le
numéro maximum trouvé pour l'année en cours : "AAA090887" -> "AAA090888"
db



Oui, beau code pour créer un nouveau numéro. Bravo !

Note que le mien est détaillé justement pour avoir une certaine lisibilité
(pédagogique) et qu'il va de la création à la sauvegarde.

Cdt, Blaise
---- ---- ----
Avatar
lorenzo
Merci beaucoup pour votre aide c'est super sympa ....
Mais pour la mise en oeuvre je patauge un peu,
pourriez vous m'aider un peu plus ?

Merci par avance

salutations


"db" a écrit :

Blaise Cacramp a écrit :
> Selon : Bonjour ou bonsoir
>
> Il faut stocker le dernier numéro pour pouvoir l'incrémenter et à côté la
> date pour le réinitialiser au changement d'année.
>
> Dans l'exemple, tu crées une table [Tbl_S_Num_Fact] avec deux champs
> [Fct_An] de type date, et [Fct_Serie] de type long (9999 factures par an,
> cela fait une trentaine par jour. Cela peut être insuffisant. Le type Long
> te permet d'aller au delà).
> Tu initialise le 1er enregistrement avec une date antérieure du style 8/8/8
>
> Puis dans un module VBA :
> <--------------------------------------------------------------------
> Option Compare Database
> Option Explicit
>
> Function Num_Fact() As String
> Dim sSql As String
> Dim dtAN As Date
> Dim lgNr As Long
> Dim Rst As New ADODB.Recordset
>
> sSql = "SELECT Tbl_S_Num_Fact.Fct_An, Tbl_S_Num_Fact.Fct_Serie" _
> & " FROM Tbl_S_Num_Fact;"
>
> Rst.Open sSql, CurrentProject.Connection, adOpenDynamic
> 'ouverture du recordset (table courante)
>
> dtAN = Rst("Fct_An") 'date
> If Year(dtAN) <> Year(Date) Then 'changement d'année, compteur à 1
> dtAN = Date
> lgNr = 1
> Else
> lgNr = Rst("Fct_Serie") + 1 'série
> End If
> Rst.Close
> sSql = "UPDATE Tbl_S_Num_Fact SET Tbl_S_Num_Fact.Fct_An = " &
> Fn_Date_Sql_Mdb(dtAN) & ", Tbl_S_Num_Fact.Fct_Serie = " & lgNr & ";"
>
> DoCmd.SetWarnings False
> DoCmd.RunSQL sSql
> DoCmd.SetWarnings True
>
> Num_Fact = Format(dtAN, "yy") & Format(lgNr, "0000") 'retour de la
> fonction
> End Function
>
>
> Function Fn_Date_Sql_Mdb(d As Date) 'format de date SQL pour ACCESS
> Fn_Date_Sql_Mdb = "#" & Format(d, "mm") & "/" & Format(d, "dd") & "/" &
> Format(d, "yyyy") & "#"
> End Function
> -------------------------------------------------------->
>
> Il sera facile de faire « "AAA" & Num_Fact() » pour avoir le numéro de
> facture complet
>
>
>
> Cdt, Blaise
> ---- ---- ----
>
>
>

Bonsoir,

Plus court, mais pas forcément plus lisible :-) :

(on suppose que le numéro se trouve dans la colonne numero de la table
table1)

NouveauNumero = "AAA" & Format(Date, "yy") &
Format(Nz(DMax("right(numero,4)", "table1", "numero like 'AAA" &
Format(Date, "yy") & "*'"), 0) + 1, "0000")

En gros, s'il n'y a pas encore de numéro pour l'année en cours, ça en
crée un avec, par exemple pour 2009, "AAA090001", sinon ça incrémente
le numéro maximum trouvé pour l'année en cours : "AAA090887" -> "AAA090888"


db



Avatar
Blaise Cacramp
Selon : Bonjour ou bonsoir

"db" a écrit dans le message de news:
%

Bonsoir,

Plus court, mais pas forcément plus lisible :-) :

(on suppose que le numéro se trouve dans la colonne numero de la table
table1)

NouveauNumero = "AAA" & Format(Date, "yy") &
Format(Nz(DMax("right(numero,4)", "table1", "numero like 'AAA" &
Format(Date, "yy") & "*'"), 0) + 1, "0000")

En gros, s'il n'y a pas encore de numéro pour l'année en cours, ça en crée
un avec, par exemple pour 2009, "AAA090001", sinon ça incrémente le
numéro maximum trouvé pour l'année en cours : "AAA090887" -> "AAA090888"


db



Comme je le dis par ailleurs, c'est pas mal, mais il y a un point faible de
taille dans une situation multi-utilisateurs : Si on est plusieurs à éditer
des factures en même temps, on peut se retrouver avec le même numéro tant
que l'enregistrement courant n'est pas sauvegardé car il ne sera pas trouvé
par DMax. De plus, il y a un temps de calcul qui ne deviendra pas
négligeable au fil du temps.
Je crois donc ma solution plus viable : un temps d'exécution invariable non
ressenti par l'utilisateur, une sécurité d'unicité nettement plus garantie.

De toutes façons, il faut que le champ de numéro de facture soit indexé sans
doublon, voir tout simplement comme clé primaire.


Cdt, Blaise
---- ---- ----
Avatar
Blaise Cacramp
Selon : Bonjour ou bonsoir

Pour ma solution (VBA)
1/ Tu crées la table et l'enregistrement comme expliqué dans mon 1er message
2/ Tu ouvres l'éditeur VBA (ALT+F11) (Alphonse comme moyen mnémotechnique).
3/ Tu insères un module
4/ Ne pas oublier de référencer ADO via le menu Outils, Références et aller
chercher "Microsoft ActiveX Data Objects ..." comme dans la copie d'écran
http://cjoint.com/?kptx2jHH6n
5/ Tu fais un copier/coller du code ci-dessous (un peu changé par rapport à
le première fois), attention à rétablir les lignes dans leur intégrité (elle
peuvent être coupées après 72 caractères)
6/ Dans la valeur par défaut de ton champ de n° Facture tu mets =
Num_Fact("AAA")
C'est tout !



<code>

Public Function Num_Fact(Prefixe As String) As String
Dim sSql As String
Dim dtAN As Date
Dim lgNr As Long
Dim Rst As New ADODB.Recordset

sSql = "SELECT Tbl_S_Num_Fact.Fct_An, Tbl_S_Num_Fact.Fct_Serie" _
& " FROM Tbl_S_Num_Fact;"

Rst.Open sSql, CurrentProject.Connection, adOpenDynamic
'ouverture du recordset (table courante)

dtAN = Rst("Fct_An") 'date
If Year(dtAN) <> Year(Date) Then 'changement d'année, compteur à 1
dtAN = Date
lgNr = 1
Else
lgNr = Rst("Fct_Serie") + 1 'série
End If
Rst.Close

sSql = "UPDATE Tbl_S_Num_Fact SET Tbl_S_Num_Fact.Fct_An = " &
Fn_Date_Sql_Mdb(dtAN) & ", Tbl_S_Num_Fact.Fct_Serie = " & lgNr & ";"

DoCmd.SetWarnings False
DoCmd.RunSQL sSql
DoCmd.SetWarnings True

Num_Fact = Prefixe & Format(dtAN, "yy") & Format(lgNr, "0000")
'retour de la fonction
End Function


Function Fn_Date_Sql_Mdb(d As Date) 'format de date SQL pour ACCESS
Fn_Date_Sql_Mdb = "#" & Format(d, "mm") & "/" & Format(d, "dd") & "/" &
Format(d, "yyyy") & "#"
End Function

</code>


Cdt, Blaise
---- ---- ----


"lorenzo" a écrit dans le message de
news:
Merci beaucoup pour votre aide c'est super sympa ....
Mais pour la mise en oeuvre je patauge un peu,
pourriez vous m'aider un peu plus ?

Merci par avance

salutations


"db" a écrit :

Blaise Cacramp a écrit :
> Selon : Bonjour ou bonsoir
>
> Il faut stocker le dernier numéro pour pouvoir l'incrémenter et à côté
> la
> date pour le réinitialiser au changement d'année.
>
> Dans l'exemple, tu crées une table [Tbl_S_Num_Fact] avec deux champs
> [Fct_An] de type date, et [Fct_Serie] de type long (9999 factures par
> an,
> cela fait une trentaine par jour. Cela peut être insuffisant. Le type
> Long
> te permet d'aller au delà).
> Tu initialise le 1er enregistrement avec une date antérieure du style
> 8/8/8
>
> Puis dans un module VBA :
> <--------------------------------------------------------------------
> Option Compare Database
> Option Explicit
>
> Function Num_Fact() As String
> Dim sSql As String
> Dim dtAN As Date
> Dim lgNr As Long
> Dim Rst As New ADODB.Recordset
>
> sSql = "SELECT Tbl_S_Num_Fact.Fct_An, Tbl_S_Num_Fact.Fct_Serie" _
> & " FROM Tbl_S_Num_Fact;"
>
> Rst.Open sSql, CurrentProject.Connection, adOpenDynamic
> 'ouverture du recordset (table courante)
>
> dtAN = Rst("Fct_An") 'date
> If Year(dtAN) <> Year(Date) Then 'changement d'année, compteur à 1
> dtAN = Date
> lgNr = 1
> Else
> lgNr = Rst("Fct_Serie") + 1 'série
> End If
> Rst.Close
> sSql = "UPDATE Tbl_S_Num_Fact SET Tbl_S_Num_Fact.Fct_An = " &
> Fn_Date_Sql_Mdb(dtAN) & ", Tbl_S_Num_Fact.Fct_Serie = " & lgNr & ";"
>
> DoCmd.SetWarnings False
> DoCmd.RunSQL sSql
> DoCmd.SetWarnings True
>
> Num_Fact = Format(dtAN, "yy") & Format(lgNr, "0000") 'retour de
> la
> fonction
> End Function
>
>
> Function Fn_Date_Sql_Mdb(d As Date) 'format de date SQL pour ACCESS
> Fn_Date_Sql_Mdb = "#" & Format(d, "mm") & "/" & Format(d, "dd") &
> "/" &
> Format(d, "yyyy") & "#"
> End Function
> -------------------------------------------------------->
>
> Il sera facile de faire « "AAA" & Num_Fact() » pour avoir le numéro de
> facture complet
>
>
>
> Cdt, Blaise
> ---- ---- ----
>
>
>

Bonsoir,

Plus court, mais pas forcément plus lisible :-) :

(on suppose que le numéro se trouve dans la colonne numero de la table
table1)

NouveauNumero = "AAA" & Format(Date, "yy") &
Format(Nz(DMax("right(numero,4)", "table1", "numero like 'AAA" &
Format(Date, "yy") & "*'"), 0) + 1, "0000")

En gros, s'il n'y a pas encore de numéro pour l'année en cours, ça en
crée un avec, par exemple pour 2009, "AAA090001", sinon ça incrémente
le numéro maximum trouvé pour l'année en cours : "AAA090887" ->
"AAA090888"


db





Avatar
db
Blaise Cacramp a écrit :

Je crois donc ma solution plus viable : un temps d'exécution invariable non
ressenti par l'utilisateur, une sécurité d'unicité nettement plus garantie.



Ah je n'aurai pas la prétention de penser que ma solution est la
meilleure. Donc, la vôtre l'est forcément :-)

db
Avatar
Blaise Cacramp
Selon : Bonjour ou bonsoir

Merci, j'adore ma fausse modestie ;-)
Je sais qu'il y a encore mieux que ce que j'ai proposé. Je suis un "vieux"
qui programmais sa gestion de données en QuickBasic et je traîne avec moi de
vielles habitudes.
Mes meilleures salutations,

Blaise
---- ---- ----


"db" a écrit dans le message de news:

Blaise Cacramp a écrit :

Je crois donc ma solution plus viable : un temps d'exécution invariable
non ressenti par l'utilisateur, une sécurité d'unicité nettement plus
garantie.



Ah je n'aurai pas la prétention de penser que ma solution est la
meilleure. Donc, la vôtre l'est forcément :-)

db


Avatar
db
Blaise Cacramp a écrit :
Selon : Bonjour ou bonsoir

Merci, j'adore ma fausse modestie ;-)
Je sais qu'il y a encore mieux que ce que j'ai proposé. Je suis un "vieux"
qui programmais sa gestion de données en QuickBasic et je traîne avec moi de
vielles habitudes.
Mes meilleures salutations,

Blaise
---- ---- ----


"db" a écrit dans le message de news:

Blaise Cacramp a écrit :

Je crois donc ma solution plus viable : un temps d'exécution invariable
non ressenti par l'utilisateur, une sécurité d'unicité nettement plus
garantie.


Ah je n'aurai pas la prétention de penser que ma solution est la
meilleure. Donc, la vôtre l'est forcément :-)

db








Au risque de décevoir votre fausse modestie, je voulais dire que je ne
voulais pas passer du temps à argumenter pour départager les solutions.
Et que votre solution, puisque sans opposition, ne pouvait qu'être
retenue (ou "retenable").

Maintenant, s'il faut argumenter un peu, la sécurité d'unicité ne posera
guère de problème si la génération du nouveau numéro se fait sur
l'évènement "Avant insertion" du formulaire : le pouillème de seconde
entre le calcul du numéro et son insertion effective dans la base
laissera peu de risque. Pas plus que dans votre solution en tous cas.
Et le temps de calcul du Dmax sur une colonne indexée est également
dérisoire. Sans que ce soit une référence, je fais comme ça dans
plusieurs applications multi-utilisateurs et je n'ai jamais eu le
moindre souci.

Mais bon, à l'inverse d'hier, je dis ça juste parce que j'ai un peu de
temps : ne le prenez pas contre vous :-)

Juste une chose quand même : pourquoi votre fonction Fn_Date_Sql _Mdb
n'est-elle pas plus simplement écrite comme ça :
Fn_Date_Sql_Mdb = "#" & Format(d, "mm/dd/yyyy") & "#"
?


db
Avatar
Blaise Cacramp
Selon : Bonjour ou bonsoir

Je ne voudrais pas passer pour un "ergoteur" et faisons fi de ma fausse
modestie :-)
Dans mon entreprise, malgré les gardes-fous mis en oeuvre à tout niveau, il
peut y avoir des erreurs d'encodage et le dernier garde-fou pour la
facturation est un humain devant un formulaire qui vérifie les quantités
produites et donc facturées. En cas de problème, la facture en cours
d'édition peut rester ouverte plusieurs minutes. Pendant ce temps là, un
autre humain peut faire la même manipulation et recevoir un numéro de
facture identique à celui qui, ailleurs, est en attente de validation.
L'événement BeforeInsert se produit lorsque l'utilisateur tape le premier
caractère dans un nouvel enregistrement, *avant la création effective de
l'enregistrement*.
Enregistrement non créé = le même n°

Quand à la fonction Fn_Date_Sql_Mdb , c'est vrai que ...
Mais elle date de 95/97 et qu'il devait y avoir une raison du style passage
au format américain. J'ai encore remarqué ce problème ce matin lors d'un
transfert vers Excel

Voilà. Clôturons ce fil ergot et attendons le suivi de Lorenzo !

Cdt, Blaise
---- ---- ----


"db" a écrit dans le message de news:
%
Blaise Cacramp a écrit :
Selon : Bonjour ou bonsoir

Merci, j'adore ma fausse modestie ;-)
Je sais qu'il y a encore mieux que ce que j'ai proposé. Je suis un
"vieux" qui programmais sa gestion de données en QuickBasic et je traîne
avec moi de vielles habitudes.
Mes meilleures salutations,

Blaise
---- ---- ----


"db" a écrit dans le message de news:

Blaise Cacramp a écrit :

Je crois donc ma solution plus viable : un temps d'exécution invariable
non ressenti par l'utilisateur, une sécurité d'unicité nettement plus
garantie.


Ah je n'aurai pas la prétention de penser que ma solution est la
meilleure. Donc, la vôtre l'est forcément :-)

db








Au risque de décevoir votre fausse modestie, je voulais dire que je ne
voulais pas passer du temps à argumenter pour départager les solutions. Et
que votre solution, puisque sans opposition, ne pouvait qu'être retenue
(ou "retenable").

Maintenant, s'il faut argumenter un peu, la sécurité d'unicité ne posera
guère de problème si la génération du nouveau numéro se fait sur
l'évènement "Avant insertion" du formulaire : le pouillème de seconde
entre le calcul du numéro et son insertion effective dans la base laissera
peu de risque. Pas plus que dans votre solution en tous cas.
Et le temps de calcul du Dmax sur une colonne indexée est également
dérisoire. Sans que ce soit une référence, je fais comme ça dans plusieurs
applications multi-utilisateurs et je n'ai jamais eu le moindre souci.

Mais bon, à l'inverse d'hier, je dis ça juste parce que j'ai un peu de
temps : ne le prenez pas contre vous :-)

Juste une chose quand même : pourquoi votre fonction Fn_Date_Sql _Mdb
n'est-elle pas plus simplement écrite comme ça :
Fn_Date_Sql_Mdb = "#" & Format(d, "mm/dd/yyyy") & "#"
?


db


1 2