Chercher des trous dans une numérotation ?

Le
gauso
Bonjour,

Quelqu'un aurait-il une "formule magique" pour automatiser la
vérification d'une suite de chiffre (cotation : champ numérique non
auto) dans lequel il peut y avoir des doublons : mon problème étant de
repérer les éventuelles "cotes vacantes" (numéros non attribués) ?
Par avance merci :o)
Gauso
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
P3859
Le #22812791
Le 19/11/2010 10:18, gauso a écrit :
Bonjour,

Quelqu'un aurait-il une "formule magique" pour automatiser la
vérification d'une suite de chiffre (cotation : champ numérique non
auto) dans lequel il peut y avoir des doublons : mon problème étant de
repérer les éventuelles "cotes vacantes" (numéros non attribués) ?
Par avance merci :o)
Gauso



Bonjour,

j'ai pas fait le détail, mais il semble qu'avec un peu de connaissance SQL tu trouveras ici

http://www.developpez.net/forums/d799913/bases-donnees/langage-sql/requete-trouver-trous-suite/
3stone
Le #22812931
Bonjour,

gauso wrote:
Bonjour,

Quelqu'un aurait-il une "formule magique" pour automatiser la
vérification d'une suite de chiffre (cotation : champ numérique non
auto) dans lequel il peut y avoir des doublons : mon problème étant de
repérer les éventuelles "cotes vacantes" (numéros non attribués) ?
Par avance merci :o)
Gauso




Tu as essayé ceci :
http://www.3stone.be/access/articles.php?lng=fr&pg8

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)
gauso
Le #22816961
Merci à vous deux :o)
La discussion indiquée par P3859 paraît la plus proche de ce que je
cherche...

SELECT ID
FROM MaTable a WHERE (a.ID - 1 NOT IN (SELECT ID FROM MaTable)
AND a.ID <> 0)
OR (a.ID + 1 NOT IN (SELECT ID FROM MaTable)
AND a.ID <> (SELECT Max(ID) FROM MaTable))
ORDER BY ID


...sauf que je suis in-foutue de la concevoir vraiment ni de
l'adapter :o[
Dois-je créer une requête, une fonction ? (j'ai essayé sans succès de
le faire... à quoi correspondent "a" et "b" ?),
Et puis comment mettre le résultat (?) en œuvre ?
Quel peut-être le résultat d'une telle requête puisque ce que l'on
cherche ce sont des valeurs absentes ???

Je crois que je vais laisser tomber : trop fort pour moi !
Merci quand même,
Gauso
Gloops
Le #22817091
gauso a écrit, le 20/11/2010 14:24 :
Merci à vous deux :o)
La discussion indiquée par P3859 paraît la plus proche de ce que je
cherche...

SELECT ID
FROM MaTable a WHERE (a.ID - 1 NOT IN (SELECT ID FROM MaTable)
AND a.ID<> 0)
OR (a.ID + 1 NOT IN (SELECT ID FROM MaTable)
AND a.ID<> (SELECT Max(ID) FROM MaTable))
ORDER BY ID


...sauf que je suis in-foutue de la concevoir vraiment ni de
l'adapter :o[
Dois-je créer une requête, une fonction ? (j'ai essayé sans succè s de
le faire... à quoi correspondent "a" et "b" ?),
Et puis comment mettre le résultat (?) en œuvre ?
Quel peut-être le résultat d'une telle requête puisque ce que l'o n
cherche ce sont des valeurs absentes ???

Je crois que je vais laisser tomber : trop fort pour moi !
Merci quand même,
Gauso




Bonjour,

Si ça te décourage, c'est peut-être que tu as brûlé trop d'ét apes.
Attaquer le SQL avec un bouquin dessus, en commençant par une requête
SQL SELECT toute simple en prenant conscience de chacune de ses clauses,
et puis en gravissant chacun des échelons en t'appuyant sur les
précédents, c'est quand même moins "casse-gueule" comme démarche. Il est
vrai que ça prend un peu de temps avant d'arriver à la requête dont tu
parles.

Il y a plein de mots dans une requête SQL, alors si ils ne te parlent
pas, tu as vite fait d'arriver à une indigestion.

Autrement, si le code SQL est bon, dans Access tu crées une requête, tu
fermes la pop-up avec la liste des tables par Annuler, en haut à gauche
tu trouves une liste déroulante en forme de bouton qui permet de
sélectionner le mode d'affichage, alors tu choisis l'affichage SQL, et
puis là tu peux coller le code SQL.
Alors je dis en haut à gauche, mais ça c'est personnalisable ...

Une fois que le code est en place, tu lances l'exécution en cliquant su r
le point d'exclamation rouge (ou en pressant F5).
Gloops
Le #22817191
gauso a écrit, le 19/11/2010 10:18 :
Bonjour,

Quelqu'un aurait-il une "formule magique" pour automatiser la
vérification d'une suite de chiffre (cotation : champ numérique non
auto) dans lequel il peut y avoir des doublons : mon problème étant de
repérer les éventuelles "cotes vacantes" (numéros non attribués ) ?
Par avance merci :o)
Gauso



Bonjour,

Il y a deux approches possibles :
- par SQL (dont on a déjà parlé)
- par code VB, ouvrir un jeu d'enregistrements classé dans l'ordre du
champ à vérifier, et le parcourir. Là aussi deux moyens, soit on
incrémente une variable de la plus petite valeur à la plus grande et
pour chaque valeur on compte le nombre de valeurs présentes. Soit on
progresse dans le jeu d'enregistrements en séquentiel, et puis on
regarde si la clef lue est la même que sur l'enregistrement précéde nt
(ce qui suppose qu'on a stocké celle-ci dans une variable), si elle est
bien supérieure de 1 à la précédente ...
db
Le #22817351
Le 19/11/2010 10:18, gauso a écrit :
Bonjour,

Quelqu'un aurait-il une "formule magique" pour automatiser la
vérification d'une suite de chiffre (cotation : champ numérique non
auto) dans lequel il peut y avoir des doublons : mon problème étant de
repérer les éventuelles "cotes vacantes" (numéros non attribués) ?
Par avance merci :o)
Gauso



On peut peut-être y arriver avec quelque chose comme ça :


Sub AfficheManquants()
Dim N As Integer
For N = DMin("Num", "Test") + 1 To DMax("Num", "Test") - 1
If DCount("Num", "Test", "Num=" & N) = 0 Then
Debug.Print N
End If
Next
End Sub


où Test est le nom de la table, et Num le nom de la colonne numérique.
Question optimisation, c'est pas top, mais si ça ne doit servir qu'une
fois :-)

db
gauso
Le #22818011
Oui Gloops tu as raison, je suis une affreuse bidouilleuse et jamais
eu le temps de me mettre sérieusement aux "bases", même si je commence
à intégrer un certain nombre de principes et fonctionnalités... et,
bon an mal an, je m'en sors quand même (du moment que je ne sois pas
trop ambitieuse ;o)

...En plus la plupart du temps quand j'ai un problème, je trouve
toujours quelqu'un sur ce forum pour me souffler la solution ! à
preuve "db" que je remercie donc ici particulièrement :o)
Donc db ça marche... cela met un peu de temps mais comme l'utilisation
de cette fonction sera très anecdotique cela n'est pas très grave.

Pour améliorer un peu les choses cependant, j'aimerais savoir :
1) comment puis-je exclure de l'analyse certaines cotes qui ne sont
jamais utilisées comme telles dans ma base mais qui correspondent à
des "codes" (8888 et 9999)
2) j'ai fait en sorte de récupérer le résultat de l'analyse dans un
champ texte, mais la liste peut être longue (parfois on a des coupures
importantes dans les "tranches de cotes") : y aurait-il moyen
d'afficher le résultat sous forme de tranches de cotes extrêmes
(54-63; 120-138; etc.)

Sinon tant pis, je me contenterais de ça...;o)
Merci encore,
Gauso.

PS : voici le code que j'ai associé à un bouton de mon formulaire
cotes :
MsgBox "Patientez l'analyse des cotes vacantes prend un peu de
temps !", vbInformation, "DEBUT DE L'ANALYSE"
Dim N As Integer
For N = DMin("cote", "ReqcotDossFds") + 1 To DMax("cote",
"ReqcotDossFds") - 1
If DCount("cote", "ReqcotDossFds", "cote=" & N) = 0 Then
Debug.Print N
Me![TextecotesVac] = Me![TextecotesVac] & " ; " & N
End If
Next
MsgBox "L'analyse des cotes vacantes est terminée !", vbInformation,
"FIN DE L'ANALYSE"
db
Le #22818251
Le 20/11/2010 18:35, gauso a écrit :
Pour améliorer un peu les choses cependant, j'aimerais savoir :
1) comment puis-je exclure de l'analyse certaines cotes qui ne sont
jamais utilisées comme telles dans ma base mais qui correspondent à
des "codes" (8888 et 9999)
2) j'ai fait en sorte de récupérer le résultat de l'analyse dans un
champ texte, mais la liste peut être longue (parfois on a des coupures
importantes dans les "tranches de cotes") : y aurait-il moyen
d'afficher le résultat sous forme de tranches de cotes extrêmes
(54-63; 120-138; etc.)



Voilà une proposition pour les 2 points :

Sub AfficheManquants()
Dim N As Integer, Low As Integer, Top As Integer
MsgBox "Patientez l'analyse des cotes vacantes prend un peu de
temps !", vbInformation, "DEBUT DE L'ANALYSE"
Low = 0
Top = 0
For N = DMin("cote", "ReqcotDossFds") + 1 To DMax("cote",
"ReqcotDossFds") - 1
if N<>8888 and N<>9999 then
If DCount("cote", "ReqcotDossFds", "cote="& N) = 0 Then
If Low = 0 Then
Low = N
Else
If N = Low + 1 Or N = Top + 1 Then
Top = N
Else
If Top <> 0 Then
Me![TextecotesVac] = Me![TextecotesVac]& " ; "& Low & "-" & Top
Top = 0
Else
Me![TextecotesVac] = Me![TextecotesVac]& " ; "& Low
End If
Low = N
End If
End If

End If
End if
Next
If Top <> 0 Then
Me![TextecotesVac] = Me![TextecotesVac]& " ; "& Low & "-" & Top
Else
Me![TextecotesVac] = Me![TextecotesVac]& " ; "& Low
End If

MsgBox "L'analyse des cotes vacantes est terminée !", vbInformation,
"FIN DE L'ANALYSE"

End Sub



db
gauso
Le #22818361
Gé-nial !!
ça marche au petit poil :o)
Merci beaucoup db, et bon dimanche !
Gauso
gauso
Le #22818731
J'ai parlé un peu trop vite !
... ça marche parfaitement si le nombre d'occurrences ne dépasse par
les 200, après ça rame tellement que je suis obligée d'interrompre le
processus via le gestionnaire des tâches (!),
Donc, je crois que je vais me passer de l'action 2),

(ce message : simplement pour information...),
Bonne soirée,
Gauso
Publicité
Poster une réponse
Anonyme