Chercher des trous dans une numérotation ?

Le
gauso
Bonjour,

Quelqu'un aurait-il une "formule magique" pour automatiser la
vrification d'une suite de chiffre (cotation : champ numrique non
auto) dans lequel il peut y avoir des doublons : mon problme tant de
reprer les ventuelles "cotes vacantes" (numros non attribus) ?
Par avance merci :o)
Gauso
Vos réponses Page 2 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Michel__D
Le #22819061
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;
gauso
Le #22819161
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;
P3859
Le #22819311
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
Michel__D
Le #22819871
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 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;



gauso
Le #22820671
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 And A.cote And B.cote 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
Michel__D
Le #22821671
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 And A.cote And B.cote 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 And A.cote And B.cote 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.
gauso
Le #22823011
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
Michel__D
Le #22824551
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.
Publicité
Poster une réponse
Anonyme