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

Recherche des n° manquant dans série de nombre

18 réponses
Avatar
Francis
Bonjour,

Comme l'indique le titre de ce fil, je voudrais trouver, dans une
table, les numéros qui manquent dans une série de nombres qui doivent
en principe se suivre (comme des n° de chèques dans un même carnet, par
ex.).
J'imagine que ce problème a déjà été traité maintes fois, aussi ça me
rendrait service si qqun pouvait me dire où je peux trouver qquechose
dont je puisse m'inspirer.
Merci, et bonne journée,

Francis

--
Francis
fhgc@wanadoudou.fr
CINQUIÈME LOI DE YOUNG
Se tromper est humain, mais pour vraiment mettre le bordel, il faut y
ajouter un ordinateur.

8 réponses

1 2
Avatar
Michel_D
Michel_D avait écrit le 07/06/2008 :
Bonjour,

Essaye avec le SQL suivant :

Plus simple et plus compréhensible :


SELECT TOP 1 T.ID+1 AS Libre
FROM LaTable AS T
WHERE T.ID+1 Not In (SELECT ID FROM LaTABLE)
ORDER BY T.ID;


Bonsoir Michel,
Je n'ai testé que ta dernière requête SQL, qui marche au poil, tout
comme celle de Pierre.
Pour aller au bout de la résolution de mon pb, il ne me resterait plus
qu'à récupérer le résultat de cette requête dans mon formulaire de
création d'un adhérent de façon élégante et "pro", mais là je cale un peu.
Si tu as (ou Pierre ou x) un tuyau pour moi en la matière, je suis preneur
@+


Voici sommairement une possibilitée :

http://cjoint.com/?gipWjV7lCs



Avatar
Francis
Bonjour Michel,

Merci pour ton envoi... pas très digeste, à première vue, en ce
dimanche après-midi.
Je verrai ce soir ou demain ce que je peux en tirer, et je te tiens au
courant.
@+
Francis

Michel_D a pensé très fort :
Michel_D avait écrit le 07/06/2008 :
Bonjour,

Essaye avec le SQL suivant :

Plus simple et plus compréhensible :


SELECT TOP 1 T.ID+1 AS Libre
FROM LaTable AS T
WHERE T.ID+1 Not In (SELECT ID FROM LaTABLE)
ORDER BY T.ID;


Bonsoir Michel,
Je n'ai testé que ta dernière requête SQL, qui marche au poil, tout comme
celle de Pierre.
Pour aller au bout de la résolution de mon pb, il ne me resterait plus qu'à
récupérer le résultat de cette requête dans mon formulaire de création d'un
adhérent de façon élégante et "pro", mais là je cale un peu.
Si tu as (ou Pierre ou x) un tuyau pour moi en la matière, je suis preneur
@+


Voici sommairement une possibilitée :

http://cjoint.com/?gipWjV7lCs


--
Francis

LOI DE LA GRAVITE SÉLECTIVE
En tout point de la surface du globe, toute biscotte tombera côté
beurre.




Avatar
Francis
Re,

Désolé, mais j'ai un problème avec ce que tu m'as envoyé. En effet,
quand j'ouvre le formulaire, ça sélectionne systématiquement le premier
enregistrement.
J'ai remplacé ta tblAdherents par ma table, dont le premier n° libre
est le 76. Si je transpose ta ligne de code sSQL = etc ... dans une
requête, ça ne donne bien le n° 76. Donc, ça c'est bon.
Mais avec le formulaire, je ne vois le 76 ni de loin ni de près.
Ce qu'il me faudrait, dans ton formulaire, c'est que le n° 76
apparaisse dans une zone de texte, et que les champs Nom et Prenom
soient vides.
Esr-ce possible?
@ plus pour un épisode suivant,

Francis


Il se trouve que Michel_D a formulé :
Michel_D avait écrit le 07/06/2008 :
Bonjour,

Essaye avec le SQL suivant :

Plus simple et plus compréhensible :


SELECT TOP 1 T.ID+1 AS Libre
FROM LaTable AS T
WHERE T.ID+1 Not In (SELECT ID FROM LaTABLE)
ORDER BY T.ID;


Bonsoir Michel,
Je n'ai testé que ta dernière requête SQL, qui marche au poil, tout comme
celle de Pierre.
Pour aller au bout de la résolution de mon pb, il ne me resterait plus qu'à
récupérer le résultat de cette requête dans mon formulaire de création d'un
adhérent de façon élégante et "pro", mais là je cale un peu.
Si tu as (ou Pierre ou x) un tuyau pour moi en la matière, je suis preneur
@+


Voici sommairement une possibilitée :

http://cjoint.com/?gipWjV7lCs


--
Francis

RÈGLE DE FLUGG
Plus est urgent le motif pour lequel tu es dans la file d'attente,
plus sera lent l'employé du guichet.




Avatar
Michel_D
re,

Donc avec une zone de texte "IDadherent" et la requête nommé "rAdherent"

SELECT TOP 1 T.IDadherent+1 AS IDadherent
FROM tblAdherents AS T
WHERE T.IDadherent+1 Not In (SELECT IDadherent FROM tblAdherents)
ORDER BY T.IDadherent;

Essaye avec ce code :

Option Compare Database
Dim iNbEnr as long

Private Sub Form_Open(Cancel As Integer)
DoCmd.GoToRecord acDataForm, "frmAdherents", acNewRec
Me.IDadherent.SetFocus
TraiteCH "Open"
End Sub

Private Sub IDadherent_AfterUpdate()
Me.IDadherent.locked = False
If iNbEnr > 0 Then
TraiteCH "MaJ"
End If
End Sub

Private Sub IDadherent_GotFocus()
Me.IDadherent.locked = False
TraiteCH "Focus"
End Sub

Sub TraiteCH(sOpe As String)
If iNbEnr < 1 Then iNbEnr = DCount("IDadherent", "tblAdherents")
If IsNull(Me.IDadherent) Then
Me.IDadherent = Nz(Dlookup("IDadherent", "rAdherent"), 1)
Me.IDadherent.locked = True
End If
' MsgBox sOpe
End Sub

Re,

Désolé, mais j'ai un problème avec ce que tu m'as envoyé. En effet,
quand j'ouvre le formulaire, ça sélectionne systématiquement le premier
enregistrement.
J'ai remplacé ta tblAdherents par ma table, dont le premier n° libre est
le 76. Si je transpose ta ligne de code sSQL = etc ... dans une requête,
ça ne donne bien le n° 76. Donc, ça c'est bon.
Mais avec le formulaire, je ne vois le 76 ni de loin ni de près.
Ce qu'il me faudrait, dans ton formulaire, c'est que le n° 76 apparaisse
dans une zone de texte, et que les champs Nom et Prenom soient vides.
Esr-ce possible?
@ plus pour un épisode suivant,

Francis


Il se trouve que Michel_D a formulé :
Michel_D avait écrit le 07/06/2008 :
Bonjour,

Essaye avec le SQL suivant :

Plus simple et plus compréhensible :


SELECT TOP 1 T.ID+1 AS Libre
FROM LaTable AS T
WHERE T.ID+1 Not In (SELECT ID FROM LaTABLE)
ORDER BY T.ID;


Bonsoir Michel,
Je n'ai testé que ta dernière requête SQL, qui marche au poil, tout
comme celle de Pierre.
Pour aller au bout de la résolution de mon pb, il ne me resterait
plus qu'à récupérer le résultat de cette requête dans mon formulaire
de création d'un adhérent de façon élégante et "pro", mais là je cale
un peu.
Si tu as (ou Pierre ou x) un tuyau pour moi en la matière, je suis
preneur
@+


Voici sommairement une possibilitée :

http://cjoint.com/?gipWjV7lCs








Avatar
Francis
Re,
J'ai scrupuleusement fait comme indiqué, mais c'est pas encore au point
:-(
Les cases nom et prénom sont bien vierges, mais le IDadherent est = 0,
alors que la requête "rAdherent" seule donne bien 76.
Et comme pour moi, ton code c'est un peu de l'hébreu, je n'ai aucune
idée sur le pourquoi de la chose.
@+



Michel_D avait soumis l'idée :
re,

Donc avec une zone de texte "IDadherent" et la requête nommé "rAdherent"

SELECT TOP 1 T.IDadherent+1 AS IDadherent
FROM tblAdherents AS T
WHERE T.IDadherent+1 Not In (SELECT IDadherent FROM tblAdherents)
ORDER BY T.IDadherent;

Essaye avec ce code :

Option Compare Database
Dim iNbEnr as long

Private Sub Form_Open(Cancel As Integer)
DoCmd.GoToRecord acDataForm, "frmAdherents", acNewRec
Me.IDadherent.SetFocus
TraiteCH "Open"
End Sub

Private Sub IDadherent_AfterUpdate()
Me.IDadherent.locked = False
If iNbEnr > 0 Then
TraiteCH "MaJ"
End If
End Sub

Private Sub IDadherent_GotFocus()
Me.IDadherent.locked = False
TraiteCH "Focus"
End Sub

Sub TraiteCH(sOpe As String)
If iNbEnr < 1 Then iNbEnr = DCount("IDadherent", "tblAdherents")
If IsNull(Me.IDadherent) Then
Me.IDadherent = Nz(Dlookup("IDadherent", "rAdherent"), 1)
Me.IDadherent.locked = True
End If
' MsgBox sOpe
End Sub

Re,

Désolé, mais j'ai un problème avec ce que tu m'as envoyé. En effet, quand
j'ouvre le formulaire, ça sélectionne systématiquement le premier
enregistrement.
J'ai remplacé ta tblAdherents par ma table, dont le premier n° libre est le
76. Si je transpose ta ligne de code sSQL = etc ... dans une requête, ça ne
donne bien le n° 76. Donc, ça c'est bon.
Mais avec le formulaire, je ne vois le 76 ni de loin ni de près.
Ce qu'il me faudrait, dans ton formulaire, c'est que le n° 76 apparaisse
dans une zone de texte, et que les champs Nom et Prenom soient vides.
Esr-ce possible?
@ plus pour un épisode suivant,

Francis


Il se trouve que Michel_D a formulé :
Michel_D avait écrit le 07/06/2008 :
Bonjour,

Essaye avec le SQL suivant :

Plus simple et plus compréhensible :


SELECT TOP 1 T.ID+1 AS Libre
FROM LaTable AS T
WHERE T.ID+1 Not In (SELECT ID FROM LaTABLE)
ORDER BY T.ID;


Bonsoir Michel,
Je n'ai testé que ta dernière requête SQL, qui marche au poil, tout comme
celle de Pierre.
Pour aller au bout de la résolution de mon pb, il ne me resterait plus
qu'à récupérer le résultat de cette requête dans mon formulaire de
création d'un adhérent de façon élégante et "pro", mais là je cale un
peu.
Si tu as (ou Pierre ou x) un tuyau pour moi en la matière, je suis
preneur
@+


Voici sommairement une possibilitée :

http://cjoint.com/?gipWjV7lCs





--
Francis

LOI DE TATA JACQUELINE
C'est celui qui ronfle qui s'endort toujours le premier.






Avatar
Francis
Bonjour Michel et TLM,

La nuit portant conseil, ce matin j'ai trouvé une solution.
En rendant la zone de texte "IDadherent" indépendante, on récupère bien
la première valeur libre de ma dase tblAdherents. J'ai créé une autre
zone de texte "Adherent" ayant pour source de contrôle "IDadherent"
dans laquelle je mets la valeur de "IDadherent", et tout marche au
poil. Suffit de rendre "IDadherent" non visible, et j'ai ce que je
t'avais demandé.

Voici ton code adapté par mes soins:

Option Compare Database
Dim iNbEnr As Long

Private Sub Form_Open(Cancel As Integer)
DoCmd.GoToRecord acDataForm, "frmAdherents", acNewRec
' Me.IDadherent.SetFocus (à neutraliser du fait que j'ai rendu la
zone non visible)
TraiteCH "Open"
Forms![frmAdherents].Adherent = Forms![frmAdherents].IDadherent
End Sub

Private Sub IDadherent_AfterUpdate()
' Me.IDadherent.Locked = False
' If iNbEnr > 0 Then
' TraiteCH "MaJ"
' End If
End Sub

Private Sub IDadherent_GotFocus()
' Me.IDadherent.Locked = False
' TraiteCH "Focus"
End Sub

Sub TraiteCH(sOpe As String)
If iNbEnr < 1 Then iNbEnr = DCount("IDadherent", "tblAdherents")
If IsNull(Me.IDadherent) Then
Me.IDadherent = Nz(DLookup("IDadherent", "rAdherent"), 1)
Me.IDadherent.Locked = True
End If
' MsgBox sOpe
End Sub

Si ça t'inspire des améliorations supplémentaires, tant mieux mais,
pour ce qui me concerne, je considère mon problème comme résolu, et je
te remercie pour ton précieux coup de main.
Bonne journée, et @+

Francis

Michel_D a pensé très fort :
re,

Donc avec une zone de texte "IDadherent" et la requête nommé "rAdherent"

SELECT TOP 1 T.IDadherent+1 AS IDadherent
FROM tblAdherents AS T
WHERE T.IDadherent+1 Not In (SELECT IDadherent FROM tblAdherents)
ORDER BY T.IDadherent;

Essaye avec ce code :

Option Compare Database
Dim iNbEnr as long

Private Sub Form_Open(Cancel As Integer)
DoCmd.GoToRecord acDataForm, "frmAdherents", acNewRec
Me.IDadherent.SetFocus
TraiteCH "Open"
End Sub

Private Sub IDadherent_AfterUpdate()
Me.IDadherent.locked = False
If iNbEnr > 0 Then
TraiteCH "MaJ"
End If
End Sub

Private Sub IDadherent_GotFocus()
Me.IDadherent.locked = False
TraiteCH "Focus"
End Sub

Sub TraiteCH(sOpe As String)
If iNbEnr < 1 Then iNbEnr = DCount("IDadherent", "tblAdherents")
If IsNull(Me.IDadherent) Then
Me.IDadherent = Nz(Dlookup("IDadherent", "rAdherent"), 1)
Me.IDadherent.locked = True
End If
' MsgBox sOpe
End Sub

Re,

Désolé, mais j'ai un problème avec ce que tu m'as envoyé. En effet, quand
j'ouvre le formulaire, ça sélectionne systématiquement le premier
enregistrement.
J'ai remplacé ta tblAdherents par ma table, dont le premier n° libre est le
76. Si je transpose ta ligne de code sSQL = etc ... dans une requête, ça ne
donne bien le n° 76. Donc, ça c'est bon.
Mais avec le formulaire, je ne vois le 76 ni de loin ni de près.
Ce qu'il me faudrait, dans ton formulaire, c'est que le n° 76 apparaisse
dans une zone de texte, et que les champs Nom et Prenom soient vides.
Esr-ce possible?
@ plus pour un épisode suivant,

Francis


Il se trouve que Michel_D a formulé :
Michel_D avait écrit le 07/06/2008 :
Bonjour,

Essaye avec le SQL suivant :

Plus simple et plus compréhensible :


SELECT TOP 1 T.ID+1 AS Libre
FROM LaTable AS T
WHERE T.ID+1 Not In (SELECT ID FROM LaTABLE)
ORDER BY T.ID;


Bonsoir Michel,
Je n'ai testé que ta dernière requête SQL, qui marche au poil, tout comme
celle de Pierre.
Pour aller au bout de la résolution de mon pb, il ne me resterait plus
qu'à récupérer le résultat de cette requête dans mon formulaire de
création d'un adhérent de façon élégante et "pro", mais là je cale un
peu.
Si tu as (ou Pierre ou x) un tuyau pour moi en la matière, je suis
preneur
@+


Voici sommairement une possibilitée :

http://cjoint.com/?gipWjV7lCs





--
Francis

THEOREME de la loi de MURPHY
Tout corps plongé dans une baignoire...déclenche systématiquement la
sonnerie du téléphone !






Avatar
Michel_D
Bonjour,

Bon à priori encore plus simple, mettre la formule suivante au niveau de
la "Valeur par défaut" de ton contrôle zone de texte [IDadherent] :

=Nz(RechDom("IDadherent";"rAdherent");1)

Ensuite le code pour ajouter un enregistrement à l'ouverture du formulaire :

Private Sub Form_Open(Cancel As Integer)
DoCmd.GoToRecord acDataForm, "frmAdherents", acNewRec
End Sub

PS1:"rAdherent" est le nom de la requête

SELECT TOP 1 T.IDadherent+1 AS IDadherent
FROM tblAdherents AS T
WHERE T.IDadherent+1 Not In (SELECT IDadherent FROM tblAdherents)
ORDER BY T.IDadherent;

PS2:A adapter bien sur.

Bonjour Michel et TLM,

La nuit portant conseil, ce matin j'ai trouvé une solution.
En rendant la zone de texte "IDadherent" indépendante, on récupère bien
la première valeur libre de ma dase tblAdherents. J'ai créé une autre
zone de texte "Adherent" ayant pour source de contrôle "IDadherent" dans
laquelle je mets la valeur de "IDadherent", et tout marche au poil.
Suffit de rendre "IDadherent" non visible, et j'ai ce que je t'avais
demandé.

Voici ton code adapté par mes soins:

Option Compare Database
Dim iNbEnr As Long

Private Sub Form_Open(Cancel As Integer)
DoCmd.GoToRecord acDataForm, "frmAdherents", acNewRec
' Me.IDadherent.SetFocus (à neutraliser du fait que j'ai rendu la zone
non visible)
TraiteCH "Open"
Forms![frmAdherents].Adherent = Forms![frmAdherents].IDadherent
End Sub

Private Sub IDadherent_AfterUpdate()
' Me.IDadherent.Locked = False
' If iNbEnr > 0 Then
' TraiteCH "MaJ"
' End If
End Sub

Private Sub IDadherent_GotFocus()
' Me.IDadherent.Locked = False
' TraiteCH "Focus"
End Sub

Sub TraiteCH(sOpe As String)
If iNbEnr < 1 Then iNbEnr = DCount("IDadherent", "tblAdherents")
If IsNull(Me.IDadherent) Then
Me.IDadherent = Nz(DLookup("IDadherent", "rAdherent"), 1)
Me.IDadherent.Locked = True
End If
' MsgBox sOpe
End Sub

Si ça t'inspire des améliorations supplémentaires, tant mieux mais, pour
ce qui me concerne, je considère mon problème comme résolu, et je te
remercie pour ton précieux coup de main.
Bonne journée, et @+

Francis

Michel_D a pensé très fort :
re,

Donc avec une zone de texte "IDadherent" et la requête nommé "rAdherent"

SELECT TOP 1 T.IDadherent+1 AS IDadherent
FROM tblAdherents AS T
WHERE T.IDadherent+1 Not In (SELECT IDadherent FROM tblAdherents)
ORDER BY T.IDadherent;

Essaye avec ce code :

Option Compare Database
Dim iNbEnr as long

Private Sub Form_Open(Cancel As Integer)
DoCmd.GoToRecord acDataForm, "frmAdherents", acNewRec
Me.IDadherent.SetFocus
TraiteCH "Open"
End Sub

Private Sub IDadherent_AfterUpdate()
Me.IDadherent.locked = False
If iNbEnr > 0 Then
TraiteCH "MaJ"
End If
End Sub

Private Sub IDadherent_GotFocus()
Me.IDadherent.locked = False
TraiteCH "Focus"
End Sub

Sub TraiteCH(sOpe As String)
If iNbEnr < 1 Then iNbEnr = DCount("IDadherent", "tblAdherents")
If IsNull(Me.IDadherent) Then
Me.IDadherent = Nz(Dlookup("IDadherent", "rAdherent"), 1)
Me.IDadherent.locked = True
End If
' MsgBox sOpe
End Sub

Re,

Désolé, mais j'ai un problème avec ce que tu m'as envoyé. En effet,
quand j'ouvre le formulaire, ça sélectionne systématiquement le
premier enregistrement.
J'ai remplacé ta tblAdherents par ma table, dont le premier n° libre
est le 76. Si je transpose ta ligne de code sSQL = etc ... dans une
requête, ça ne donne bien le n° 76. Donc, ça c'est bon.
Mais avec le formulaire, je ne vois le 76 ni de loin ni de près.
Ce qu'il me faudrait, dans ton formulaire, c'est que le n° 76
apparaisse dans une zone de texte, et que les champs Nom et Prenom
soient vides.
Esr-ce possible?
@ plus pour un épisode suivant,

Francis


Il se trouve que Michel_D a formulé :
Michel_D avait écrit le 07/06/2008 :
Bonjour,

Essaye avec le SQL suivant :

Plus simple et plus compréhensible :


SELECT TOP 1 T.ID+1 AS Libre
FROM LaTable AS T
WHERE T.ID+1 Not In (SELECT ID FROM LaTABLE)
ORDER BY T.ID;


Bonsoir Michel,
Je n'ai testé que ta dernière requête SQL, qui marche au poil, tout
comme celle de Pierre.
Pour aller au bout de la résolution de mon pb, il ne me resterait
plus qu'à récupérer le résultat de cette requête dans mon
formulaire de création d'un adhérent de façon élégante et "pro",
mais là je cale un peu.
Si tu as (ou Pierre ou x) un tuyau pour moi en la matière, je suis
preneur
@+


Voici sommairement une possibilitée :

http://cjoint.com/?gipWjV7lCs













Avatar
Francis
Bonjour Michel,

Eh bien, voilà, ça marche 10/10, et c'est d'une simplicité qui convient
tout à fait à mon niveau de connaissances.
Merci encore pour ton coup de main, et à une autre occasion qui ne
saurait manquer,

Francis

Bonjour,

Bon à priori encore plus simple, mettre la formule suivante au niveau de
la "Valeur par défaut" de ton contrôle zone de texte [IDadherent] :

=Nz(RechDom("IDadherent";"rAdherent");1)

Ensuite le code pour ajouter un enregistrement à l'ouverture du formulaire :

Private Sub Form_Open(Cancel As Integer)
DoCmd.GoToRecord acDataForm, "frmAdherents", acNewRec
End Sub

PS1:"rAdherent" est le nom de la requête

SELECT TOP 1 T.IDadherent+1 AS IDadherent
FROM tblAdherents AS T
WHERE T.IDadherent+1 Not In (SELECT IDadherent FROM tblAdherents)
ORDER BY T.IDadherent;

PS2:A adapter bien sur.



--
Francis

LOI DE MOSES
C'est quand on ne regarde pas que le but est marqué.

1 2