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

Contribuez Discussion :

Capture et restitution dynamique des enregistrements d'une table [Sources]


Sujet :

Contribuez

  1. #1
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut Capture et restitution dynamique des enregistrements d'une table
    Capture et restitution dynamique des enregistrements d'une table

    Voici deux procédures intéressantes ; elles vous permettent de copier tous les enresgistrements d'une table donnée dans une variable et ce quelque soit le nombre de colonnes.

    Contexte: Vous avez besoin de stocker tous les enregistrements pour une condition donnée d'une table où l'on considère que la clé primaire est formée d'un seul champ (A vous de peaufiner pour des cas de clés multiples).

    Objectif: Capturer l'ensemble de ces enregistrement dans un tableau et être en mesure de restituer tous ces enregistrement au cas où l'utilisateur cliquerait sur Annuler après avoir effectué des modifications sur certains enregistrements.
    On considère que la clé primaire un champ invisible dans votre formulaire.

    Mode opératoire: Deux procédures sont donc mises en place, l'une pour capturer et l'autre pour restituer...
    Ces procédures sont totalement dynamiques et génériques:

    Pour capturer tous les enregistrements :
    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
    27
    28
    29
     
    Private m_strLastTableData() As String
     
    Private Sub GetRecordData(ByVal TableName As String, ByVal Cols As Integer)
    Dim oRS As DAO.Recordset
    Dim intNBRecords As Integer
    Dim R As Integer
    Dim C As Integer
     
      m_intColumns = Cols
     
      Set oRS = CurrentDb.OpenRecordset(TableName, 2)
      With oRS
        .MoveLast
         intNBRecords = .RecordCount
         ReDim m_strLastTableData(1 To intNBRecords, 0 To Cols)
        .MoveFirst
     
        Do While Not .EOF
            R = R + 1
            For C = 0 To Cols
              m_strLastTableData(R, C) = .Fields(C)
            Next
          .MoveNext
        Loop
        .Close
      End With
      Set oRS = Nothing
    End Sub
    Exemple d'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Call GetRecordData ("MaTable", 4)
    'Ici, on prend tous les enregistrements d'une table nommée MaTable et qui comporte
    5 champs distincts (0 à 4)


    Pour restituer tous ces enregistrements :
    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
    27
    28
    29
    30
     
    Private Sub RestoreRecordData(ByVal TableName As String, _
    ByVal Cols As Integer)
    Dim oDB As DAO.Database
    Dim oRS As DAO.Recordset
    Dim R As Integer
    Dim C As Integer
    Dim SQLUpdate As String
    Dim vntValue As Variant
     
      Set oDB = CurrentDb
      Set oRS = oDB.OpenRecordset(TableName, 2)
      With oRS
        Do While Not .EOF
          R = R + 1
          For C = 1 To Cols
             vntValue = m_strLastTableData(R, C)
             SQLUpdate = "UPDATE " & TableName & " SET " & .Fields(C).Name & _
    " = " & Chr(34) & vntValue & Chr(34) & " WHERE " & .Fields(0).Name & _
    " = " & .Fields(0).Value
             oDB.Execute SQLUpdate, dbSeeChanges
          Next
        .MoveNext
        Loop
        .Close
      End With
      oDB.Close
      Set oRS = Nothing
      Set oDB = Nothing
    End Sub
    Exemple d'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Call RestoreRecordData ("MaTable", 4)
    'Ici, on restitue tous les enregistrements de la table nommée MaTable et qui comporte 5 champs distincts
    (0 à 4) où la condition WHERE s'établit avec la valeur de la clé primaire pour chacun des enregistrements...


    Argy

  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
    Hello Argy,

    Pour la capture, on devrait avoir quelque chose de plus rapide avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    With oRs
        .MoveLast
         intNBRecords = .RecordCount
        .MoveFirst
        m_strLastTableData = oRs.GetRows(intNBRecords)
        .Close
    End With

  3. #3
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    Fort possible Tof... Merci pour l'astuce.

    Je n'ai eu l'occasion de tester que sur des tables qui possédaient que quelques dizaines d'enregistrements (limités à un nombre fixe) et cela me convenait parfaitement pour le cas de ce dev en cours... Et je n'ai pas cherché à avoir plus de performance.
    Dans mon cas, elles auraient été difficiles à mesurer.

    Argy

  4. #4
    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
    Sur de petites tables, la différence est quasi nulle, par contre getrows a été pensé justement pour des traitements plus volumineux

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/08/2006, 23h02
  2. Taille des enregistrements d'une table
    Par Stbaurl dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 11/07/2006, 09h19
  3. [WD9] Cliquer sur des enregistrements dans une table
    Par oz80 dans le forum WinDev
    Réponses: 2
    Dernier message: 15/12/2005, 20h11
  4. Parcourir l'ensemble des enregistrements d'une table
    Par Aurèl90 dans le forum Access
    Réponses: 17
    Dernier message: 22/09/2005, 14h51
  5. Ajout/Suppression dynamique des lignes dans une table
    Par codexomega dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/08/2005, 18h50

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