Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Contribuez
Contribuez Access : Vos contributions. Postez ici vos codes sources, conseils, astuces et autres propositions. Ce forum n'est pas un forum technique mais destiné aux contributions pour www.developpez.com
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/01/2007, 13h34   #1
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 661
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 661
Points : 6 228
Points : 6 228
Envoyer un message via MSN à argyronet
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 :
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 :
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 :
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 :
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
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2007, 13h51   #2
Rédacteur

 
Avatar de Tofalu
 
Christophe Warin
Inscription : octobre 2004
Messages : 8 635
Détails du profil
Informations personnelles :
Nom : Christophe Warin
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 8 635
Points : 13 718
Points : 13 718
Hello Argy,

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

Code :
1
2
3
4
5
6
7
With oRs
    .MoveLast
     intNBRecords = .RecordCount
    .MoveFirst
    m_strLastTableData = oRs.GetRows(intNBRecords)
    .Close
End With
Tofalu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2007, 14h57   #3
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 661
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 661
Points : 6 228
Points : 6 228
Envoyer un message via MSN à argyronet
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
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2007, 14h58   #4
Rédacteur

 
Avatar de Tofalu
 
Christophe Warin
Inscription : octobre 2004
Messages : 8 635
Détails du profil
Informations personnelles :
Nom : Christophe Warin
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 8 635
Points : 13 718
Points : 13 718
Sur de petites tables, la différence est quasi nulle, par contre getrows a été pensé justement pour des traitements plus volumineux
Tofalu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h57.


 
 
 
 
Partenaires

Hébergement Web