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
| Function NextID(LeChamp As String, LaTable As String, Filtre As String) As Long
'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
'Fonction renvoyant le prochain Identifiant, en fonction des valeurs existantes dans une table.
'Arguments :
' LeChamp => Nom du champ Identifiant numérique Long concerné
' LaTable => Nom de la table contenant cet identifiant
' Filtre => Critère pour WHERE : (Champ = Valeur) pour définir un sous-domaine
'Retour :
' 1 s'il n'y a rien dans la table
' Le Nombre maximum +1 s'il y a une suite ininterrompue de nombres
' La valeur du nombre manquant en cas de trou.
'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Dim sSQL As String
Dim rs As DAO.Recordset
Dim n As Long
'Chaîne SQL en fonction de LeChamp et de LaTable, retournant NULL ou le numéro du trou
sSQL = "Select Min([" & LeChamp & "]-1) As NextID From " & LaTable & " As T1 "
sSQL = sSQL & "Where ((" & Filtre & ") AND (([" & LeChamp & "]-1)>0) And (((Select [" & LeChamp & "] "
sSQL = sSQL & "From " & LaTable & " As T2 "
sSQL = sSQL & "Where (T2." & Filtre & ") AND " & "T2.[" & LeChamp & "]=T1.[" & LeChamp & "]-1)) Is Null));"
Set rs = CurrentDb.OpenRecordset(sSQL, dbOpenSnapshot)
'Nbre d'enregistrements dans laTable
n = DCount("[" & LeChamp & "]", "[" & LaTable & "]", Filtre)
If n = 0 Then 'S'il n'y a pas d'enregistrements, mettre 1
NextID = 1
ElseIf IsNull(rs(0)) Then 'Si la requête ne renvoie rien, incrémenter de 1 le maximum
NextID = DMax("[" & LeChamp & "]", "[" & LaTable & "]", Filtre) + 1
Else
NextID = rs(0) 'Sinon, il y a un trou. Renvoyer la valeur du trou
End If
End Function |