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 :

[VBA] copier un enregistrement d'une table dans cette dernière


Sujet :

VBA Access

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    235
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations forums :
    Inscription : Juillet 2006
    Messages : 235
    Points : 176
    Points
    176
    Par défaut [VBA] copier un enregistrement d'une table dans cette dernière
    Bonjour,

    Je dois recopier certaines données d'une table dans cette dernière.

    Pour cela je crée une requete sur cette table afin de recuperer juste l'enregistrement à copier. Mon soucis est que l'enregistrement comporte une trentaine de colonnes et lors du recopiage de donnees je n'arrive pas à utiliser une boucle sur .Field

    Voici mon code

    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
    31
    32
     
    Private Sub CopyRisk2_Click()
     
    'permet de créer une nouvelle risk matrix a partir de l'ancienne
    Dim ID_3, boucleRisk As Integer
    Dim risk3_1, risk3_2 As DAO.Recordset
    Dim Rep3, SQL As String
    Dim NewDate3
     
    'Récupération du dernier ID.
    Set risk3_1 = CurrentDb.OpenRecordset("SELECT MAX([Id_Risk])AS Maximum FROM Risks")
    ID_3 = risk3_1!Maximum + 1
    risk3_1.Close
     
    'copie l'ancienne risk matrix dans la nouvelle
    SQL = "SELECT Risks.* FROM Risks WHERE ID_Risk=" & Me.lstResults16_2
     
    Set risk3_2 = CurrentDb.OpenRecordset(SQL)
    While Not risk3_2.EOF
        With Application.CurrentDb.OpenRecordset("Risks")
        .AddNew
        .Fields("ID_Risk").Value = ID_3
            For boucleRisk = 1 To 35
            .Fields(boucleRisk + 1).Value = risk3_2(boucleRisk)
            Next boucleRisk
        .Update
        End With
     risk3_2.MoveNext
    Wend
    Set risk3_2 = Nothing
     
    End Sub
    Si quelqu'un a une petite idée.

  2. #2
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    j'ai regardé rapidement et j'ai trouvé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Fields(boucleRisk + 1).Value = risk3_2(boucleRisk)
    Il vaudrait mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Fields(boucleRisk + 1).Value = risk3_2.Fields(boucleRisk).Value
    C'est l'absence du Fields à droite qui doit poser pb.
    Il y aurait d'autres remarques, mais pas forcément des erreurs.

    Bon courage,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  3. #3
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    et pourquoi ne pas utiliser une requete?
    par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO Table4
    SELECT *
    FROM Table4
    WHERE Table4.ID='1';
    duplique l'enregistrement qui a id='1' dans la même table.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    235
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations forums :
    Inscription : Juillet 2006
    Messages : 235
    Points : 176
    Points
    176
    Par défaut
    ->vodiem
    Bonjour,
    J'utilise pas de requete etant donné que je veux copier certaines données et en remplacer d'autres.

    Donc c'est pour eviter de faire un insert, puis un update.

    ->pgz

    Bonjour,
    Je teste de suite, sinon quelles sont les autres remarques afin que j'améliore mon code.
    Merci

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    235
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations forums :
    Inscription : Juillet 2006
    Messages : 235
    Points : 176
    Points
    176
    Par défaut
    Encore merci pgz.

    Voici le code final

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    Private Sub CopyRisk2_Click()
     
    If (IsNull(Me.lstResults16_2)) Then
        MsgBox "Veuillez sélectionner une Risk Matrix"
    Else
     
    'permet de créer une nouvelle risk matrix a partir de l'ancienne
    Dim ID_3, boucleRisk As Integer
    Dim risk3_1, risk3_2 As Dao.Recordset
    Dim Rep3, SQL As String
    Dim NewDate3
     
    'variable contenant la nouvelle date
        Do
            Rep3 = InputBox("Quelle est la nouvelle date?")
        Loop While (Not IsDate(Rep3))
     
        NewDate3 = CDate(Rep3)
     
    'Récupération du dernier ID.
    Set risk3_1 = CurrentDb.OpenRecordset("SELECT MAX([Id_Risk])AS Maximum FROM Risks")
    ID_3 = risk3_1!Maximum + 1
    risk3_1.Close
     
    'copie l'ancienne risk matrix dans la nouvelle
    SQL = "SELECT Risks.* FROM Risks WHERE ID_Risk=" & Me.lstResults16_2
     
    Set risk3_2 = CurrentDb.OpenRecordset(SQL)
    While Not risk3_2.EOF
        With Application.CurrentDb.OpenRecordset("Risks")
        .AddNew
            For boucleRisk = 1 To 35
            .Fields(boucleRisk).Value = risk3_2.Fields(boucleRisk).Value
            Next boucleRisk
        .Fields("ID_Risk").Value = ID_3
        .Fields("Date").Value = NewDate3
        .Update
        End With
     risk3_2.MoveNext
    Wend
    Set risk3_2 = Nothing
     
    End If
    End Sub

  6. #6
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Pour les autres remarques, en voici une importante. Il faut éviter d'appeler en boucle Il est préférable d'instancier une fois, d'utiliser n fois, puis de libérer, comme ceci :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Private Sub CopyRisk2_Click()
     
    If (IsNull(Me.lstResults16_2)) Then
        MsgBox "Veuillez sélectionner une Risk Matrix"
    Else
     
    'permet de créer une nouvelle risk matrix a partir de l'ancienne
    Dim ID_3, boucleRisk As Integer
    Dim db as DAO.Databse, risk3_1 as DAO.Recordset, risk3_2 As Dao.Recordset, risk3 as DAO.recordset
    Dim Rep3, SQL As String
    Dim NewDate3
     
    'variable contenant la nouvelle date
        Do
            Rep3 = InputBox("Quelle est la nouvelle date?")
        Loop While (Not IsDate(Rep3))
     
        NewDate3 = CDate(Rep3)
     
    'instanciation db
    set db = Application.CurrentDb
     
    'Récupération du dernier ID.
    Set risk3_1 = db.OpenRecordset("SELECT MAX([Id_Risk])AS Maximum FROM Risks")
    ID_3 = risk3_1!Maximum + 1
    risk3_1.Close
     
    'copie l'ancienne risk matrix dans la nouvelle
    SQL = "SELECT Risks.* FROM Risks WHERE ID_Risk=" & Me.lstResults16_2
     
    Set risk3_2 = db.OpenRecordset(SQL)
    Set risk3 = db.OpenRecordset("Risks")
    While Not risk3_2.EOF
        With risk3
        .AddNew
            For boucleRisk = 1 To 35
            .Fields(boucleRisk).Value = risk3_2.Fields(boucleRisk).Value
            Next boucleRisk
        .Fields("ID_Risk").Value = ID_3
        .Fields("Date").Value = NewDate3
        .Update
        End With
     risk3_2.MoveNext
    Wend
        risk3.Close
        risk3_2 .close
     
    'libérer les variables
    set risk3 = Nothing
    Set risk3_1=Nothing
    Set risk3_2 = Nothing
    Set db = Nothing
     
    End If
    End Sub
    Il faut penser :
    - a instancier CurrentDb pour éviter la création involontaire de n instances
    - fermer les rst
    - libérer les variables.

    Bon courage,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    235
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations forums :
    Inscription : Juillet 2006
    Messages : 235
    Points : 176
    Points
    176
    Par défaut
    Merki

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/10/2010, 13h09
  2. Copier les enregistrements d'une table dans une autre
    Par doolar dans le forum Bases de données
    Réponses: 10
    Dernier message: 21/04/2008, 21h36
  3. Réponses: 2
    Dernier message: 02/06/2006, 11h26
  4. [VBA-A]Recuperation champ d'une table dans une collection
    Par Nizarazu dans le forum VBA Access
    Réponses: 14
    Dernier message: 06/04/2006, 11h24
  5. Copier un enregistrement d'une table vers une autre
    Par le lynx dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 04/01/2006, 09h56

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