IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

vérifier un ordre numérique


Sujet :

Access

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 285
    Points : 99
    Points
    99
    Par défaut vérifier un ordre numérique
    Bonjour

    J’ai dans un form un champ numérique qui me permet de classer manuellement mes enregistrements (donc pas de numauto).
    J’aimerai, lors de la fermeture du form, juste avoir un message si les numéros ne se suivent pas (s’il n’y a pas de trous et sans chercher à les combler).
    Je suis parti de ce code de la FAQ mais je ne vois pas comment faire. Il y a peut être une fonction appropriée ?

    Merci par avance

  2. #2
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Quelque chose comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Sub lance()
    VerifTrou "table4", "mochamp"
    End Sub
     
    Function VerifTrou(strNomTable As String, strNomChamp As String) As Integer
    Dim oRst As DAO.Recordset
    Dim intPrec As Integer
    Dim i As Integer
    Set oRst = CurrentDb.OpenRecordset("SELECT [" & strNomChamp & _
                                        "] FROM [" & strNomTable & "] ORDER BY [" & _
                                        strNomChamp & "]")
    With oRst
        While Not .EOF
            i = 1
            While .Fields(0) > intPrec + i
                MsgBox "La valeur " & intPrec + i & " n'est pas utilisée"
                i = i + 1
            Wend
            VerifTrou = VerifTrou + i - 1
            intPrec = .Fields(0)
        .MoveNext
        Wend
        .Close
    End With
    Set oRst = Nothing
    End Function

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 285
    Points : 99
    Points
    99
    Par défaut
    Re,

    Merci pour la réponse, je teste.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT [champ]+1 AS borne1, DFirst("champ","matable","champ >" & [champ])-1 AS borne2
    FROM matable
    WHERE [champ]+1<>DMax("champ","matable")
     AND DFirst("champ","matable","champ >" & [champ])-1<>[champ];

  5. #5
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Attention, DFirst est vraiment très long. Le nombre d'accès au table est vraiment très important avec cette méthode. Il vaut mieux privilégier du VBA ici

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    qu'à cela ne tienne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select iif(b1=b2-1,b1, b1 & "-" & ( b2-1))  as trou from
    (SELECT [a].[champ]+1 AS b1, Min(b.champ) AS b2
    FROM matable AS a, matable AS b
    WHERE (((b.champ)>[a].[champ]))
    GROUP BY [a].[champ]+1
    HAVING (((Min(b.champ))<>[a].[champ]+1))
    ORDER BY [a].[champ]+1)as temp;

  7. #7
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    C'est encore plus long là.

    Je fais mes tests sur une table de 10000 lignes et Access est carrément planté.

    Non, là je pense qu'on est typiquement, étant donné la demande, dans un cas où l'utilisation d'une boucle sur un recordset est plus performante.

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    je le pense aussi mais pas avec un msgbox

  9. #9
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 285
    Points : 99
    Points
    99
    Par défaut
    Re,

    désolé de vous interrompre mais je me trouve embêté par rapport à ma question initiale. Je ne vois pas où ni comment intégrer le dernier code de random. De plus, la rapidité d'éxécution est aussi un critère de recherche.

    Alors quelle piste exploiter ???

    Merci de votre aide

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    et là ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT  trou
    FROM (SELECT [champ]+1 AS trou  FROM matable)  AS temp LEFT JOIN matable ON temp.trou = matable.champ
    WHERE trou <>(select max(champ) from matable ) + 1  AND  champ  Is Null;

  11. #11
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 285
    Points : 99
    Points
    99
    Par défaut
    Re,

    ben ça ne me dit pas s'il est préférable, avant de me lancer, d'utiliser ta méthode ou celle de Tofalu. Ni où j'intègre ce code (ds une fonction, directement ds la code du bouton ?)

    Merci pour ces précisions

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    je viens de modifier ma méthode elle est aussi performante que celle de tofalu
    maintenant

  13. #13
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 285
    Points : 99
    Points
    99
    Par défaut
    Re,

    bon, je vais tester mais peux tu m'apporter quelques précisions sur le code de ton dernier post. A quoi correspondent trou ds select trou et temp.trou ?

    Je suis un peu largué sur le sql (le qbe, c'est pratique mais on finit par en abuser)

    merci d'avance pour les précisions

  14. #14
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Pour utiliser la solution de tofalu il te suffit de mettre le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Sub lance()
    VerifTrou "table4", "mochamp"
    End Sub
    dans l'événement sur libération ou sur fermeture de ton formulaire.

    Tu remplace "table4" et "mochamp" par leur valeur respective

    Tu copies la fonction dans un module et tu le fais précédé de Public.

    PS : Si tu veux juste savoir s'il ya un trous dans ta table tu remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ....
    While Not .EOF
            i = 1
            While .Fields(0) > intPrec + i
                MsgBox "La valeur " & intPrec + i & " n'est pas utilisée"
                i = i + 1
            Wend
    ....
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ....
    While Not .EOF or trouve
            i = 1
            While .Fields(0) > intPrec + i
                MsgBox "La valeur " & intPrec + i & " n'est pas utilisée"
                trouve=True
                i = i + 1
            Wend
    ....
    N'oublie pas de déclarer trouve comme boolean.

  15. #15
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 285
    Points : 99
    Points
    99
    Par défaut
    Oui, oui,

    pour Tofalu, pas de pb. Mais pour Random ?

    Merci à vous pour votre aide

  16. #16
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    en fait je fais deux requetes

    select champ+1 as trou from ma table
    et select champ from matable

    si on prend toutes les valeurs de la première et seulement celles de la seconde
    on obtient un trou (pas de valeur suivante)

    si on ote la dernière valeur obtenue on a la liste des trous
    tu peux parfaitement le faire en qbe

    tu fais la première requête et tu la sauves sous temp
    tu ouvres une deuxième requête et tu copies
    selECT
    FROM temp LEFT JOIN matable ON temp.trou = matable.champ;

    le reste est un jeu d'enfant

  17. #17
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 285
    Points : 99
    Points
    99
    Par défaut
    Ok, merci.

    je teste

  18. #18
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 285
    Points : 99
    Points
    99
    Par défaut
    Bonsoir,

    J’ai testé le code de Tofalu, il passe bien. Seulement, dites moi si j’abuse, je cherche à ce que, s’il manque une valeur (s’il y a un trou), le formulaire ne puisse pas se fermer tant qu’il n’y a pas de suite ininterrompue. J’ai cherché une bonne partie de la soirée, sans succès.

    Merci d'avance pour votre aide et bonne soirée

  19. #19
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 285
    Points : 99
    Points
    99
    Par défaut
    Bonjour,

    j'essaie en vain de m'inspirer de cette discussion. Je ne vois pas où et comment inclure la condition (si la fonction revoit une valeur vraie (il y a un trou), on ne peut fermer le form, sinon, on peut fermer). Dans le module, dans l'évènement surfermeture du form ?

    Bref, pouvez-vous m'éclairer ?

    Merci par avance pour votre aide

  20. #20
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    mmm, là tu as tous les éléments.

    Donc on modifie la fonction puisque tu souhaites seulement savoir s'il y a un trou ou pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Function VerifTrou(strNomTable As String, strNomChamp As String) As Boolean
    Dim oRst As DAO.Recordset
    Dim intPrec As Integer
    Dim i As Integer
    Set oRst = CurrentDb.OpenRecordset("SELECT [" & strNomChamp & _
                                        "] FROM [" & strNomTable & "] ORDER BY [" & _
                                        strNomChamp & "]")
    With oRst
        While Not .EOF And Not VerifTrou
            i = 1
            VerifTrou = .Fields(0) <> intPrec + i
            intPrec = .Fields(0)
        .MoveNext
        Wend
        .Close
    End With
     
    Set oRst = Nothing
    End Function
    Puis sur libération du formulaire, tu empêches la fermeture s'il y a un trou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_Unload(Cancel As Integer)
    Cancel = VerifTrou("table5", "c")
    End Sub
    Mais bon je trouve le procédé moyen.

    Imagine que l'utilisateur ait saisit 100 valeurs de 1 à 101 en oubliant le 2.

    Il va falloir qu'il renumérote tout !

    Et autre chose, qu'est ce qu'il se passe si dans 10 jours tu supprimes le n° 25, tu le réutilises ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/11/2009, 19h34
  2. Trier un champ VARCHAR par ordre numérique
    Par boteha dans le forum Requêtes
    Réponses: 4
    Dernier message: 25/12/2007, 16h30
  3. [SQL] Problème d'ordre numérique
    Par Seb981 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 24/07/2007, 12h22
  4. Réponses: 2
    Dernier message: 25/08/2006, 20h49
  5. Classer un champ type texte par ordre numérique
    Par Mariboo dans le forum Access
    Réponses: 8
    Dernier message: 15/06/2006, 16h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo