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 :

[Access 03 + VBa] Ajout de nouveaux enregistrements dans une table


Sujet :

Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de 973thom
    Inscrit en
    Juin 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2004
    Messages : 132
    Par défaut [Access 03 + VBa] Ajout de nouveaux enregistrements dans une table
    Bonjour,

    Cela fait plusieurs fois que je me posait une question qui n'est pas fondamentale en soit mais je pense que la réponse que vous m'apporterez pourra qd même amméliorer mon programme.

    Donc voilà : je fait une boucle while not ma_table.eof / wend afin d'insérer les enregistrement de ma table 1 dans ma table 2 selon X critère donc je vous passe les détailles.

    Quelle est la méthode la mieux appropriée afin de créer et de modifier mes nouveaux enregistrement de ma table 2.

    Je vous cole 2 code et dites moi si vous savez ce qui est le mieux :

    1ère solution :


    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
    Private Sub Commande2_Click()
    Dim DBS As Database
    Dim TAB_DOSSIER As DAO.Recordset
    Dim TAB_IMPORT As DAO.Recordset
    Set DBS = CurrentDb()
    Set TAB_DOSSIER = DBS.OpenRecordset("TAB_DOSSIER_PARCELLE_2")
    Set TAB_IMPORT = DBS.OpenRecordset("TAB_IMPORTATION")
    
    TAB_IMPORT.MoveFirst
    While Not TAB_IMPORT.EOF
                TAB_DOSSIER.Edit
                TAB_DOSSIER.AddNew
        If TAB_IMPORT("NUM_PAR") <> "" Then
                TAB_DOSSIER("NUM_PAR") = CLng(TAB_IMPORT("NUM_PAR"))
        End If
        
        If TAB_IMPORT("SURFACE") <> "" Then
                TAB_DOSSIER("SURFACE") = CLng(TAB_IMPORT("SURFACE"))
        End If
        
        If TAB_IMPORT("PROPRIO") <> "" Then
                TAB_DOSSIER("PROPRIO") = TAB_IMPORT("PROPRIO")
        End If
        
        If TAB_IMPORT("TYPE_TERRAIN") <> "" Then
                TAB_DOSSIER("TYPE_TERRAIN") = TAB_IMPORT("TYPE_TERRAIN")
        End If
    
        etc etc etc .....
        
        TAB_DOSSIER.Update
        
    TAB_IMPORT.MoveNext
    Wend
    
    End Sub
    2ème solution

    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
    [...]
    
    TAB_IMPORT.MoveFirst
    While Not TAB_IMPORT.EOF
                
        If TAB_IMPORT("NUM_PAR") <> "" Then
                TAB_DOSSIER.Edit
                TAB_DOSSIER.AddNew
                TAB_DOSSIER("NUM_PAR") = CLng(TAB_IMPORT("NUM_PAR"))
                TAB_DOSSIER.Update
        End If
        
        If TAB_IMPORT("SURFACE") <> "" Then
                TAB_DOSSIER.Edit
                TAB_DOSSIER("SURFACE") = CLng(TAB_IMPORT("SURFACE"))
                TAB_DOSSIER.Update
        End If
        
        If TAB_IMPORT("PROPRIO") <> "" Then
                TAB_DOSSIER.edit
                TAB_DOSSIER("PROPRIO") = TAB_IMPORT("PROPRIO")
                TAB_DOSSIER.Update
        End If
        
        If TAB_IMPORT("TYPE_TERRAIN") <> "" Then
                TAB_DOSSIER.edit
                TAB_DOSSIER("TYPE_TERRAIN") = TAB_IMPORT("TYPE_TERRAIN")
                TAB_DOSSIER.Update
        End If 
    
            etc etc etc .....
    
    TAB_IMPORT.MoveNext
    Wend
    End Sub
    En gros vaut il mieux faire un EDIT / UPDATE à chaque fois que je modifie un champ ou alors une seule fois en début (EDIT) et fin de boucle (UPDATE). En effet étant donné que le champ ne sera pas forcemment mis à jour je ne sais pas quelle est la meilleure solution.

    Aussi, d'un point de vu sécurité... que dois je faire si j'ai oublié de paramétrer une éventuelle erreur et que le programme plante avant d'avoit terminé l'import de ma table 1 vers ma table 2 ?

    Merci pour vos bons conseils.

    Thomas

  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
    Salut,

    1) Le 1er code : 1 addnew + maj + update me parait le meilleur pour les raisons suivante

    a) L'enr n'est visible que losrqu'il est complètement rempli
    b) tu bloque l'enr 1 seul fois et pas à chaque fois que tu le met à jour

    Remarque : le '.edit' avant le '.addnew' ne sert à rien.

    2) Securite : Utilise les transactions c'est un mécanisme intégré à la base qui fait qui permet du tout ou rien c-à-d que soit ta modif est executée complètement soit elle ne l'est pas.

    Donc, tu ouvre une transaction, avec l'objet Workspace (avant le while ), tu fait tes x modifs dans la base et si tout ce passe bien tu fait un commit (apres le wend), sinon tu fais un rollback (dans le traitement d'erreur) et toutes tes modifs sont annulées.

    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 confirmé Avatar de 973thom
    Inscrit en
    Juin 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2004
    Messages : 132
    Par défaut
    Citation Envoyé par marot_r
    Salut,
    1) Le 1er code : 1 addnew + maj + update me parait le meilleur pour les raisons suivante
    a) L'enr n'est visible que losrqu'il est complètement rempli
    b) tu bloque l'enr 1 seul fois et pas à chaque fois que tu le met à jour
    Remarque : le '.edit' avant le '.addnew' ne sert à rien.
    Bonjour marot_r

    et merci pour tes renseignements.

    Je vais donc préférer cette solution à la seconde. Cependant j'aurais pensé que le . Edit serait utile étant donné qu'on modifie la table. Je vais donc le supprimer également.

    Citation Envoyé par marot_r
    2)Securite : Utilise les transactions c'est un mécanisme intégré à la base qui fait qui permet du tout ou rien c-à-d que soit ta modif est executée complètement soit elle ne l'est pas.

    Donc, tu ouvre une transaction, avec l'objet Workspace (avant le while ), tu fait tes x modifs dans la base et si tout ce passe bien tu fait un commit (apres le wend), sinon tu fais un rollback (dans le traitement d'erreur) et toutes tes modifs sont annulées.
    A+
    Oulla !! là je t'avoue que je ne comprends pas du tout.

    Si tu es d'accord, ce serait possible que tu dévellope un peu... une idée du code à appliquer ???

    Encore merci pour ton aide.

    Thomas

  4. #4
    Membre Expert
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Par défaut
    Bonjour,

    Tu peux aussi faire ça avec une requête SQL du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    insert into table2 (select * from table1 where champ1 = 'valeur1' and champ2 = 'valeur2')

  5. #5
    Membre confirmé Avatar de 973thom
    Inscrit en
    Juin 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2004
    Messages : 132
    Par défaut
    Je me permets de faire un p'tit UP pour ce qui est de l'aspect sécurité car j'ai toujours pas compris l'aspect traité par marot_r...

    Merci et bie l'bonjour !

  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
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    Private Sub Commande2_Click()
     
     
    Dim DBS As Database
    Dim TAB_DOSSIER As DAO.Recordset
    Dim TAB_IMPORT As DAO.Recordset
     
    dim w as workspace:set w=DBEngine.Workspaces(0)
     
    Set DBS = CurrentDb()
    Set TAB_DOSSIER = DBS.OpenRecordset("TAB_DOSSIER_PARCELLE_2")
    Set TAB_IMPORT = DBS.OpenRecordset("TAB_IMPORTATION")
     
     
    w.beginTrans: 'Commence une transaction, toutes les modifications faites à 
    partir de ce point ne seront enregistrées que quand l'instruction 'commit' sera executée. Si, au lieu de commit, on utilise 'rollback', aucune modification ne sera faite et ce sera comme si le code n'avait jamais été exécuté.
     
    on error goto Err_Commande2_Click
     
    TAB_IMPORT.MoveFirst
    While Not TAB_IMPORT.EOF
                TAB_DOSSIER.Edit
                TAB_DOSSIER.AddNew
        If TAB_IMPORT("NUM_PAR") <> "" Then
                TAB_DOSSIER("NUM_PAR") = CLng(TAB_IMPORT("NUM_PAR"))
        End If
     
        If TAB_IMPORT("SURFACE") <> "" Then
                TAB_DOSSIER("SURFACE") = CLng(TAB_IMPORT("SURFACE"))
        End If
     
        If TAB_IMPORT("PROPRIO") <> "" Then
                TAB_DOSSIER("PROPRIO") = TAB_IMPORT("PROPRIO")
        End If
     
        If TAB_IMPORT("TYPE_TERRAIN") <> "" Then
                TAB_DOSSIER("TYPE_TERRAIN") = TAB_IMPORT("TYPE_TERRAIN")
        End If
     
        etc etc etc .....
     
        TAB_DOSSIER.Update
     
    TAB_IMPORT.MoveNext
    Wend
     
    w.commitTrans:'Confirme que toutes les modifs doivent être enregistrées dans la base.
     
    set w=nothing
     
    'Code à ajouter pour la propreté :
    TAB_DOSSIER.close:set TAB_DOSSIER=nothing
    TAB_IMPORT.close:set TAB_IMPORT=nothing
    'Normalement Access se charge de cela mais parfois il ne le fait pas proprement et une partie de la mémoire reste utilisée inutilement. Le .close et le set nothing dit explicitement que tu as fini d'utiliser les objets et que Access peut libérer la mémoire.
     
    Exit_Commande2_Click:
        exit sub
     
    Err_Commande2_Click:
        'Traitement d'erreur minimaliste, on peu faire beaucoup mieux.
        w.rollback:'Annule toutes les modifs faites depuis le BeginTrans
        resume Exit_Commande2_Click
     
    End Sub
    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. [WD15] Ajout de plusieurs enregistrements dans une table de liaison
    Par heiti dans le forum WinDev
    Réponses: 5
    Dernier message: 04/06/2010, 21h35
  2. Ajout d'un enregistrement dans une table(SQL Server)
    Par guestCam dans le forum WebDev
    Réponses: 1
    Dernier message: 08/11/2009, 17h07
  3. Ajout automatique d'enregistrement dans une table.
    Par bestofbasile dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 17/01/2008, 14h01
  4. [VBA] Ajout de plusieurs enrgt dans une table
    Par mat67000 dans le forum VBA Access
    Réponses: 4
    Dernier message: 10/05/2007, 14h40
  5. AJOUT d'un ENREGISTREMENT dans UNE TABLE
    Par ramo dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/08/2005, 16h24

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