OVH Cloud OVH Cloud

Chercher des trous dans une numérotation ?

18 réponses
Avatar
gauso
Bonjour,

Quelqu'un aurait-il une "formule magique" pour automatiser la
v=E9rification d'une suite de chiffre (cotation : champ num=E9rique non
auto) dans lequel il peut y avoir des doublons : mon probl=E8me =E9tant de
rep=E9rer les =E9ventuelles "cotes vacantes" (num=E9ros non attribu=E9s) ?
Par avance merci :o)
Gauso

8 réponses

1 2
Avatar
Michel__D
Bonsoir,

gauso a écrit :
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



Essaye avec cette requête :

SELECT B.LeChamp+1 AS MinManquant, B.LeChamp+Min(A.LeChamp-B.LeChamp)-1 AS MaxManquant
FROM LaTable AS A INNER JOIN LaTable AS B ON A.LeChamp-B.LeChamp>1
GROUP BY B.LeChamp;
Avatar
gauso
Bonsoir Michel,

Donc me revoilà quelques messages en arrière ;o)
Comme indiqué précédemment donc, je ne sais trop comment adapter cett e
requête :
A quoi correspondent B et A ? (ce n'est sans doute pas la seule
question que je risque de me poser en passant par une requête, mais en
voilà déjà une !)
Cordialement,
Gauso


Essaye avec cette requ te :

SELECT B.LeChamp+1 AS MinManquant, B.LeChamp+Min(A.LeChamp-B.LeChamp)-1 A S MaxManquant
FROM LaTable AS A INNER JOIN LaTable AS B ON A.LeChamp-B.LeChamp>1
GROUP BY B.LeChamp;
Avatar
P3859
Le 20/11/2010 22:00, gauso a écrit :
Bonsoir Michel,

Donc me revoilà quelques messages en arrière ;o)
Comme indiqué précédemment donc, je ne sais trop comment adapter cette
requête :
A quoi correspondent B et A ? (ce n'est sans doute pas la seule
question que je risque de me poser en passant par une requête, mais en
voilà déjà une !)
Cordialement,
Gauso


Essaye avec cette requ te :

SELECT B.LeChamp+1 AS MinManquant, B.LeChamp+Min(A.LeChamp-B.LeChamp)-1 AS MaxManquant
FROM LaTable AS A INNER JOIN LaTable AS B ON A.LeChamp-B.LeChamp>1
GROUP BY B.LeChamp;






Et avec ça :

Instruction SELECT
Afficher toutMasquer toutDemande au moteur de base de données Microsoft Access de renvoyer des informations depuis la base de
données sous la forme d'un jeu d'enregistrements.

Syntaxe
SELECT [prédicat] { * | table.* | [table.]champ1 [AS alias1] [, [table.]champ2 [AS alias2] [, ...]]}
FROM expressiontable [, ...] [IN basededonnéesexterne]
[WHERE... ]
[GROUP BY... ]
[HAVING... ]
[ORDER BY... ]
[WITH OWNERACCESS OPTION]

L'instruction SELECT se compose des éléments suivants :

Composant Description
prédicat Un des prédicats suivants : ALL, DISTINCT, DISTINCTROW ou TOP. Les prédicats permettent de limiter le nombre
d'enregistrements renvoyés. Si aucun n’est précisé, ALL est choisi par défaut.
* Indique que tous les champs de la ou des tables spécifiées sont sélectionnés.
table Nom de la table contenant les champs dans lesquels les enregistrements sont sélectionnés.
champ1, champ2 Noms des champs contenant les données à extraire. Si vous incluez plusieurs champs, les données seront extraites dans
l'ordre indiqué.
alias1, alias2 Noms à utiliser comme en-têtes de colonne à la place des noms de colonnes originaux dans table.
expressiontable Nom de la ou des tables contenant les données à extraire.
basededonnéesexterne Nom de la base de données contenant les tables de expressiontable si elles ne se trouvent pas dans la base de
données en cours.

Bonne soirée
Avatar
Michel__D
Re,

B et A sont des alias des noms de table utilisées.

Ici B et A remplace LaTable

Tu as juste besoin de remplacer :

LeChamp => par le nom du champ qui va bien
et
LaTable => par le nom de la table/requête qui va bien

Soit si j'ai tout suivi :

SELECT B.cote+1 AS MinManquant, B.cote+Min(A.cote-B.cote)-1 AS MaxManquant
FROM ReqcotDossFds AS A INNER JOIN ReqcotDossFds AS B ON A.cote-B.cote>1
WHERE A.cote<>8888 And A.cote<>9999 And B.cote<>8888 And B.cote<>9999
GROUP BY B.cote;


gauso a écrit :
Bonsoir Michel,

Donc me revoilà quelques messages en arrière ;o)
Comme indiqué précédemment donc, je ne sais trop comment adapter cette
requête :
A quoi correspondent B et A ? (ce n'est sans doute pas la seule
question que je risque de me poser en passant par une requête, mais en
voilà déjà une !)
Cordialement,
Gauso

Essaye avec cette requ te :

SELECT B.LeChamp+1 AS MinManquant, B.LeChamp+Min(A.LeChamp-B.LeChamp)-1 AS MaxManquant
FROM LaTable AS A INNER JOIN LaTable AS B ON A.LeChamp-B.LeChamp>1
GROUP BY B.LeChamp;



Avatar
gauso
Merci Michel,

Hélas cela ne fonctionne pas : j'ai donc écris dans ma requête en
SQL :
SELECT B.cote+1 AS MinManquant, B.cote+Min(A.cote-B.cote)-1 AS
MaxManquant FROM InvDossiers AS A INNER JOIN InvDossiers AS B ON
A.cote-B.cote>1 WHERE A.cote<>5555 And A.cote<>6666 And A.cote<>7777
And A.cote<>7755 And A.cote<>8888 And A.cote<>9999 And B.cote<>5555
And B.cote<>6666 And B.cote<>7777 And B.cote<>7755 And B.cote<>8888
And B.cote<>9999 GROUP BY B.cote;

=> j'ai mis la table source à la place la requête et ajouté d'autre s
"code" à éliminer de l'analyse, mais la requête ne veut même pas
s'afficher en mode création !
Message d'erreur : impossible de représenter l'expression de la
jointure A.cote-B.cote... !

J'ai également essayé de reprendre la formulation indiquée par P3859
sur l'autre forum en créant une requête source ZReqGranet (à la place
de la table) afin de ne sélectionner qu'un seul fonds et supprimer en
amont tous les "codes" à ne pas comprendre dans l'analyse (8888,
9999...), ce qui donne :

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

=> là, le code SQL est accepté et je parviens à l'afficher en mode
création, mais à l'exécution cela ne fonctionne pas non plus : rame
pendant des heures... (obligé d'interrompre !),

Je crois décidément que je vais laisser tomber : merci quand même à
tous :o)
Gauso
Avatar
Michel__D
Bonjour,

gauso a écrit :
Merci Michel,

Hélas cela ne fonctionne pas : j'ai donc écris dans ma requête en
SQL :
SELECT B.cote+1 AS MinManquant, B.cote+Min(A.cote-B.cote)-1 AS
MaxManquant FROM InvDossiers AS A INNER JOIN InvDossiers AS B ON
A.cote-B.cote>1 WHERE A.cote<>5555 And A.cote<>6666 And A.cote<>7777
And A.cote<>7755 And A.cote<>8888 And A.cote<>9999 And B.cote<>5555
And B.cote<>6666 And B.cote<>7777 And B.cote<>7755 And B.cote<>8888
And B.cote<>9999 GROUP BY B.cote;

=> j'ai mis la table source à la place la requête et ajouté d'autres
"code" à éliminer de l'analyse, mais la requête ne veut même pas
s'afficher en mode création !
Message d'erreur : impossible de représenter l'expression de la
jointure A.cote-B.cote... !

J'ai également essayé de reprendre la formulation indiquée par P3859
sur l'autre forum en créant une requête source ZReqGranet (à la place
de la table) afin de ne sélectionner qu'un seul fonds et supprimer en
amont tous les "codes" à ne pas comprendre dans l'analyse (8888,
9999...), ce qui donne :

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

=> là, le code SQL est accepté et je parviens à l'afficher en mode
création, mais à l'exécution cela ne fonctionne pas non plus : rame
pendant des heures... (obligé d'interrompre !),

Je crois décidément que je vais laisser tomber : merci quand même à
tous :o)
Gauso



Essaye plutôt avec cette requête (la 1ère requête était incorrecte) :

SELECT R.MinManquant, R.MinManquant+R.Etendue AS MaxManquant
FROM (SELECT B.cote+1 AS MinManquant, Min(A.cote-B.cote)-2 AS Etendue
FROM InvDossiers AS A INNER JOIN InvDossiers AS B ON A.cote-B.cote>1
WHERE A.cote<>5555 And A.cote<>6666 And A.cote<>7777 And A.cote<>7755
And A.cote<>8888 And A.cote<>9999 And B.cote<>5555 And B.cote<>6666
And B.cote<>7777 And B.cote<>7755 And B.cote<>8888 And B.cote<>9999
GROUP BY B.cote) AS R LEFT JOIN InvDossiers AS T ON R.MinManquant=T.cote
WHERE T.cote Is Null;

PS: Par contre une chose que je ne comprends pas c'est pourquoi tu écarte
certaines valeurs qui existent et ne peuvent donc pas être utilisées.
Car la requête ci-dessus considére ces valeurs comme manquante.
Maintenant si la valeur de ton champ [cote] ne dépasse pas 5555 on pourrait
simplifier la requête.
Avatar
gauso
Ouf, ça marche enfin ! Merci Michel :o)))

Voici ce que j'ai finalement écris en suivant ton conseil de
simplification (les cotes sont toujours inférieures à 5555 en effet :
enfin jusqu'à présent... à surveiller) :

SELECT R.MinManquant, R.MinManquant+R.Etendue AS MaxManquant
FROM [SELECT B.cote+1 AS MinManquant, Min(A.cote-B.cote)-2 AS Etendue
FROM ReqInvVERIFDossCotFdsTous AS A INNER JOIN
ReqInvVERIFDossCotFdsTous AS B ON A.cote-B.cote>1 WHERE A.cote<5555
And B.cote<5555 GROUP BY B.cote]. AS R LEFT JOIN
ReqInvVERIFDossCotFdsTous AS T ON R.MinManquant = T.Cote
WHERE (((T.Cote) Is Null));

(j'utilise en lieu et place de la table, une requête qui est la source
de mon formulaire d'affichage et contrôle des cotes : je lance la
requête depuis ce formulaire après avoir sélectionné un "fonds"...)

Et c'est effectivement beaucoup plus rapide avec ce système !

Merci infiniment à tous pour votre intérêt et votre soutien précieu x,
Bon dimanche,
Gauso
Avatar
Michel__D
Re,

gauso a écrit :
Ouf, ça marche enfin ! Merci Michel :o)))



Ok (j'avais testé de mon coté, donc pas trop de surprise).

Voici ce que j'ai finalement écris en suivant ton conseil de
simplification (les cotes sont toujours inférieures à 5555 en effet :
enfin jusqu'à présent... à surveiller) :

SELECT R.MinManquant, R.MinManquant+R.Etendue AS MaxManquant
FROM [SELECT B.cote+1 AS MinManquant, Min(A.cote-B.cote)-2 AS Etendue
FROM ReqInvVERIFDossCotFdsTous AS A INNER JOIN
ReqInvVERIFDossCotFdsTous AS B ON A.cote-B.cote>1 WHERE A.cote<5555
And B.cote<5555 GROUP BY B.cote]. AS R LEFT JOIN
ReqInvVERIFDossCotFdsTous AS T ON R.MinManquant = T.Cote
WHERE (((T.Cote) Is Null));

(j'utilise en lieu et place de la table, une requête qui est la source
de mon formulaire d'affichage et contrôle des cotes : je lance la
requête depuis ce formulaire après avoir sélectionné un "fonds"...)

Et c'est effectivement beaucoup plus rapide avec ce système !



Avec certain type de requête, c'est effectivement trés rapide.

Merci infiniment à tous pour votre intérêt et votre soutien précieux,
Bon dimanche,
Gauso



Bon dimanche à toi aussi.
1 2