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

VBA Access Discussion :

Déterminer l’ordre de modification d'une table par une procédure [AC-2010]


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 39
    Par défaut Déterminer l’ordre de modification d'une table par une procédure
    Bonjour,

    J’utilise actuellement un code en VBA pour générer des entrées et les modifier selon des critères précis.
    L’ordre dans lequel ma procédure affecte mes entrées est important. Par exemple si j’ai une liste de dates, je veux leurs affecter un chiffre en fonction de leur ordre, la première date ayant le 1 et la dernière le 300.

    J’espérai que ma procédure se contenterait de commencer par la première entrée de la table, et que je n’aurai qu’à faire un « n+1 » à chaque fois.
    Le problème est que ma procédure ne parcoure pas les enregistrements dans l’ordre, elle commence au milieu avant de revenir au début.

    Ma question est la suivante : comment (si c’est possible) contrôler l’ordre dans lequel s’effectue mes opérations sur les enregistrements, ou du moins connaitre à l’avance l’ordre qui sera utilisé ?
    Ou alors suis-je obliger modifier mon code pour qu’il cherche la plus petite date, puis cherche la date supérieur la plus proche et ainsi de suite ?

    Cordialement.

    Ps : j’ai fait un petit test avec Debug.Print pour me sortir l’ordre dans lequel il travaille sur mes entrées, qui vont de 311 à 365 (attribués par un NuméroAuto). Il obtient l’ordre suivant :
    346 à 365 puis 311 à 345

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Bonjour.

    Si tu ne spécifies rien, Access lit les enregistrements dans l'ordre qui lui convient le mieux et pas forcément celui dans lequel il te les affiche.

    La méthode la plus simple pour forcer l'ordre des enregistrements est de faire une requête avec une clause de tri. Un truc du genre :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select [taTable].* form [TaTable] order by [TaTable].[TonChamp]

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 39
    Par défaut
    Merci pour ta réponse,

    J’ai essayé d’implémenter ton code SQL pour effectuer des tests, mais il ne semble pas fonctionner chez moi.

    Dans un premier temps j’ai eu une erreur de compilation « Attendu : Case »
    J’ai cherché mon erreur et j’ai utilisé la mise en forme suivante :

    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
     
    Public Sub test()
     
    Dim db As Database
    Dim rs1 As Recordset
    Dim i As Integer
     
    Set db = CurrentDb
    Set rs1 = db.OpenRecordset("Table3")
     
    Dim strSQL As String
    strSQL = "select [Table3].* form [Table3] order by [Table3].[Date corr]"
     
    For i = 1 To rs1.RecordCount
    Debug.Print rs1.Fields("N° auto")
    rs1.MoveNext
    Next i
     
    rs1.Close
    Set rs1 = Nothing
    db.Close
     
    End Sub

    Mais cette fois ci il ne se passe rien, et les valeurs sorties sont toujours dans le même ordre quel que soit le champ choisi.

    Pourrait on me dire où est mon erreur ?

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Désolé j'aurai du précisé qu'il faut utiliser la requête comme source de données.


    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
    Public Sub test()
     
      Dim db As Database
      Dim strSQL As String
      strSQL = "select [Table3].* form [Table3] order by [Table3].[Date corr]"
     
      Dim rs1 As Recordset
      Dim i As Integer
     
      Set db = CurrentDb
      Set rs1 = db.OpenRecordset(strSQL)
     
      For i = 1 To rs1.RecordCount
        Debug.Print rs1.Fields("N° auto")
        rs1.MoveNext
      Next i
     
      rs1.Close
      Set rs1 = Nothing
      db.Close:set db=nothing
     
    End Sub
    En passant il est recommandé pour les noms d'objets de se limiter aux lettres majuscules ou minuscules non accentuées et non "décorrées" (pas de ç), aux chiffres et au souligné (_). Les autres caractères même si acceptés sont source de bugs vicieux et sournois.

    Attention aussi de ne pas nommer un champ [No] car Access le confond parfois avec un synonyme de "non".

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 39
    Par défaut
    Bonjour,

    Merci pour ta réponse ! Sa correspond bien à mes besoins.

    J’ai toutefois un problème avec certains champs. Si tous se passe bien pour les champs comprenant des dates par exemple, il arrive avec certains champs de textes et de numéro.auto que le recordcount bloque à 1, ne m’affichant que la première valeur (mais dans le bon ordre ^^).

    Sinon merci pour ton avertissement sur les caractères spéciaux : je change mes codes tout de suite (la table où j’effectue mes tests ayant déjà été modifié). Précision supplémentaire : faut-il remplacer les espaces par des underscores « _ » ?

    PS : Attention ce n’est pas FORM mais FROM.

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Bonjour.

    recordcount est trompeur, quand tu ouvres un recordset il vaut 0 si tu n'as pas de données et 1 si tu en as.

    Il ne vaut le nombre d'enregistrements que quand tu as parcouru TOUT le recordset.

    Si tu as besoin de savoir combien tu as d'enregistrements, tu peux faire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if not tonRecordset.eof()
       tonRecordset.movelast 'Force access a parcourrir toutes les données
       tonRecordset.movefirst 'Revient en au début des données pour commencer le traitement
    end if
    Désolé pour l'inversion entre FORM et FROM.

    Précision supplémentaire : faut-il remplacer les espaces par des underscores « _ » ?
    Oui ou tu peux utiliser la notation "chameau" qui consiste à mettre une majuscule au début de chaque mot comme [Ceci Est Un Nom] devient [CeciEstUnNom].

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modification d'une colonne d'une table par une autre
    Par wassimovich dans le forum SQL
    Réponses: 6
    Dernier message: 16/10/2015, 16h19
  2. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  3. Copier les enregistrements d'une table vers une table d'une autre DB
    Par karinette21 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2008, 21h50
  4. Réponses: 4
    Dernier message: 31/10/2007, 20h27
  5. Réponses: 2
    Dernier message: 29/03/2007, 11h47

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