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 :

Duppliquer un enregistrement


Sujet :

Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 36
    Points : 16
    Points
    16
    Par défaut Duppliquer un enregistrement
    salut

    Sur le même formulaire, je veux copier tous l’enregistrement (tous les champs ) courant vers un nouveau enregistrement (sur la même table) pour ne pas remplire le nouveau enregistrement. J’ai essayé le bouton Dupliquer de Access, mais ça ne fonctionne pas.

    merci

  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
    Il y a un exemple de duplication dans les pages sources

    http://access.developpez.com/sources

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par Tofalu
    Il y a un exemple de duplication dans les pages sources

    http://access.developpez.com/sources

    ça fonctionne à 95%, l'enregistrement est dupliqué sur ma table, mais le problème c'est que je ne le vois pas sur mon nouveau enregistrement sur le formulaire ouvert en plus il ne se positionne pas sur l'enregistrement suivant(mise à jour intéractive dans le formulaire) , il faut que je ferme le formulaire, pour qu'il soit enregistré dans la table ??

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 36
    Points : 16
    Points
    16
    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
     
    Private Sub Dupliquer_Click()
    'Dupliquer un enregistrement en cours vers l'enregistrement suivant
     
    Dim rstProtocole As DAO.Recordset, rstProtocole2 As DAO.Recordset
    Dim Db As DAO.Database, fld As DAO.Field
    Dim id As Long
    Set Db = CurrentDb
     
    DoCmd.RunCommand acCmdRecordsGoToNew
    Set rstProtocole = Db.OpenRecordset("T_Référence")
    If rstProtocole.EOF Then Exit Sub
     
    'ouvre le recordset où sera ajouté le protocole
    Set rstProtocole2 = Db.OpenRecordset("T_Référence")
     
    'Duplique le protocole
    With rstProtocole2
    .AddNew
    'duplique les champs
    For Each fld In rstProtocole.Fields
    .Fields(fld.Name) = fld.Value
    Next
    .Update
     
    End With
     
    End Sub

    voici le code que j'ai modifé pour mon application, je suis en mode formulaire ouvert et quand je clique sur "Dupliquer" je veux copier l'enregistrement en cours vers l'enregistrement suivant. je me retrouve avec une page de formulaire vierge et les informations dupliquées n'apparaissent pas, mais quand je ferme le formulaire, elle sont effectivement duppliqués????

  5. #5
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonsoir,

    voila comment je fais, mais je ne sais si c'est 100% correct.
    A-t-on réellement le droit de manipuler le RecordSetClone du formulaire ?
    Je n'ai jamais sû. Tofalu pourra sûrement nous éclairer.
    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
     
    Dim curRec As Long
    Dim r1 As DAO.Recordset, r2 As DAO.Recordset, Fld As DAO.Field
     
    ' enregistrement en cours (1er=1)
    curRec = Me.CurrentRecord
     
    Set r1 = Me.RecordsetClone.OpenRecordset(dbOpenForwardOnly, dbReadOnly)
    Set r2 = Me.RecordsetClone
    ' aller à l'enregistrement en cours dans r1  (-1 car 1er =0)
    r1.Move curRec - 1
     
    r2.AddNew
       For Each Fld In r1.Fields
           r2(Fld.Name) = Fld.Value
       Next
    r2.Update
     
    r1.Close
    Set r2 = Nothing
    A+

  6. #6
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 410
    Points : 19 984
    Points
    19 984
    Billets dans le blog
    66
    Par défaut
    @ lionski:

    tu as essayé après la mise à jour dans la table:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Me.Requery
    Me.RecordsetClone.MoveLast
    Me.Bookmark = Me.RecordsetClone.Bookmark
    @+

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par User
    @ lionski:

    tu as essayé après la mise à jour dans la table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Me.Requery
    Me.RecordsetClone.MoveLast
    Me.Bookmark = Me.RecordsetClone.Bookmark
    ca ne fonctionne pas avec ces commandes dans mon formulaires , ou peut être je les ai mal placées

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par LedZeppII
    Bonsoir,

    voila comment je fais, mais je ne sais si c'est 100% correct.
    A-t-on réellement le droit de manipuler le RecordSetClone du formulaire ?
    Je n'ai jamais sû. Tofalu pourra sûrement nous éclairer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim curRec As Long
    Dim r1 As DAO.Recordset, r2 As DAO.Recordset, Fld As DAO.Field




    merciiiiii LedZeppII, ca fonctionne

  9. #9
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 410
    Points : 19 984
    Points
    19 984
    Billets dans le blog
    66
    Par défaut
    @ lionski:

    copie le code de ledzeppII et à la fin de son code copie mon code.

    @+

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Juin 2006
    Messages : 60
    Points : 34
    Points
    34
    Par défaut
    bonjour
    j'ai une solution vu sur internet a cette adresse http://mypage.bluewin.ch/w.stucki/Fo....htm#CopieForm

    le principe est simple, il permet de faire un copier de tout les champs non vide et de les coller a n'importe quel moment ;
    j'ai testé ca fonctionne correctement, maintenant moi je cherche depuis qq jours a copier les donnée dde divers sous formulaire incorporé a mon formulaire, il y a un exemple pour faire cette copie dans le tuto mais me met une erreur d 'execution
    si qq a une idée merci

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Juin 2006
    Messages : 60
    Points : 34
    Points
    34
    Par défaut
    bonjour, depuis qq jour j essaye d'utiliser cette fonction sans resultat, peut etre ce n'est pas ainsi qu'il faut declarer pour copier les donnée du sous formulaire

    j'ai un bouton copier ( la premiere syntaxe marche parfaitement elle copie tout les donnée remplis du formulaire mais pour la seconde j'ai une erreur d'execution. est ce bien cela : Me!SF.Form pour atteindre les donnée d'un sous formulaire denommé SF???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Private Sub cmdCopie_Click()
     
    gsu_CopieEnrg Me
    gsu_CopieEnrg Me!SF.Form
     
    End Sub
    pour le bouton coller j'ai la meme erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    Private Sub cmdColle_Click()
    If (Me.NewRecord = False) Then Exit Sub
     
    gsu_ColleEnrg Me
     
    'pour un sous formulaire
    Me!SF.SetFocus
    DoCmd.GoToRecord , , acNewRec
    gsu_ColleEnrg Me!SF.Form
     
    End Sub

  12. #12
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Escobar,

    ta syntaxe l'air bonne.
    Que dit le message d'erreur ? Et sur quelle ligne de code ?
    Pour connaîte la ligne, dans le code de gestion d'erreur insère entre MsgBox.... et Resume.....
    Si le code s'arrête sur l'instruction Stop, appuie deux fois sur F8.
    Le débogueur se place sur la ligne suivant la ligne ayant causé l'erreur.

    A+

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Juin 2006
    Messages : 60
    Points : 34
    Points
    34
    Par défaut
    ok j'ai test le stop resume next mais ca me donne rien
    a vrai dire il m'a toujours mis : "erreur d'execution 2465 impossible de trouver le champ SF auquel il est fait reference dans votre e^pression, puis je demande de deboguer et me met " l'expression sur desactivé entrée comme parametre de la propriété de type evenement est a l'origine d'une erreur"

    c'est vraiment etrange car il me semble bien qu'il s'agit de la syntaxe pour un sous formulaire.
    je sais pas si tu a regardé le code du lien donné si dessus, qui copie dans un tableau toute les valeur de controle.

    l'erreur est :
    gsu_CopieEnrg Me!SF.frm

    il ne reconnait donc pas le champs SF mais il s'agit d'un sous formulaire...

    si qq a une idée merci

  14. #14
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonsoir,

    Peut-être que le contrôle du sous-formulaire a un nom différent de celui du formulaire.
    Du genre Fille14.
    Si dans VBA tu écris Me.SF et que l'éditeur ne propose pas de compléter par Me.SF (tu ne vois pas SF dans liste déroulante)
    c'est que le contrôle SF n'existe pas.
    Il porte un autre nom. Voir dans les Propriétés du contrôle, onglet Autres, Nom.

    A+

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Juin 2006
    Messages : 60
    Points : 34
    Points
    34
    Par défaut
    en effet cela peut etre possible.

    cela est vrai l'objet source est :SF mais le nom est ivers outillage donc j'imagine qu'il faudra mettre gsu_CopieEnrg Me!Divers outillage.Form

    apres j'ai une question, les sous formulaire se trouve dans une page d'onglet alors faut il declarer la page d'onglet avant le nom du sous formulaire...

    merci en tout cas je vais voir si ca marche

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Juin 2006
    Messages : 60
    Points : 34
    Points
    34
    Par défaut
    ok c'etait donc bien ca le nom était Divers outillage. maintenant j'ai enlevé l'espace qu'il y avait entre le nom car cela me provoquait une erreur donc le nom désormais est Diversoutillage.

    la commande copie marche niquel puisqu'il me renvoie aucune erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub cmdCopie_Click()
     
    gsu_CopieEnrg Me
    gsu_CopieEnrg Me!Diversoutillage.Form
     
     
    End Sub
    par contre la commande coller me renvoie maintenant 2 erreur:
    Impossible de trouver le champs codeoutillage
    Impossible d'activer le controle Diversoutillage et l'erreur s arrete sur le Me!Diversoutillage.SetFocus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Private Sub cmdColle_Click()
    If (Me.NewRecord = False) Then Exit Sub
    gsu_ColleEnrg Me
    Me!Diversoutillage.SetFocus
    DoCmd.GoToRecord , , acNewRec
    gsu_ColleEnrg Me!Diversoutillage.Form
     
    End Sub
    maintenant je dois expliquer qu'est ce que codeoutillage pour peut etre me renseigner.
    codeoutillage est une zone de liste modifiable ayant pour contenu une requete cherchant un nom.
    le sous formulaire est bien lié avec pere et fils pas de pb a ce sujet.
    le sous formulaire a pour source une requette qui a pour donnée 3 champs , numdevis, codeoutillage, prix

    je ne voit pas trop ce qui pose pb si qq a une idée.

    un grand merci a toi LedZeppII qui prend soins de chercher avec moi une solution

  17. #17
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Salut Escobar,

    Tes questions se compliquent de plus en plus.

    1. Sous-formulaire dans un onglet.
    Voici ce que j'ai testé comme syntaxe :
    Me!NomDuCtlOnglets.Pages("NomDeLonglet").Controls("Diversoutillage").Form

    2. Je pense qu'il faut coller juste après le copier.
    Hors tu fais deux copier successifs avant de coller.
    Donc tu essaie de coller des données du sous-formulaire "Diversoutillage" dans le formulaire principal.
    Il faut vérifier, mais je pense que le deuxième Copier écrase le premier.

    Ce que tu cherches à faire est peut-être un peu compliqué par cette méthode.
    Je verrai plutôt des requêtes Ajout dans plusieurs tables pour faire plus simple.

    A+

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Juin 2006
    Messages : 60
    Points : 34
    Points
    34
    Par défaut
    merci pour la syntaxe je vais test ce matin,

    pour l'histoire du copier consecutif, je ne sais pas si tu a vu la procedure crée auparavant, elle visé a copier tout les controle remplis d'un formulaire.

    lorsque je met gsu_CopieEnrg Me ( cela est pour copier tout les ctl du formulaire), et lorsque je click sur colle avec gsu_ColleEnrg Me ca colle tout nikel meme les ctl de l'onglet, ca me paraisait bizarre de rajouter le nom dde l'onglet pour ces ctl

    maintenant il faut bien differencié les ctl du formulaire et du sous formulaire non? fait par gsu_CopieEnrg Me!Diversoutillage.Form ( c'est pour ca que je met 2 fois un copier, l'un copie les ctl du formulaire , le suivant ceux du sous formulaire) apres ca deconne au coller, ne trouvant pas le champs etc....

    ta proposition sur la requette m'interesse mais si tu pouvait me donner plus de detail.....et la procedure a suivre..
    donc je ne changerai pas le principe du copier / coller
    car c'est vraiment cela que j'ai besoin (pouvoir coller n'importe quand)

  19. #19
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonsoir,

    J'ai étudié le code des fonctions Copier/Coller. Il ne gère qu'un presse-papier.
    Donc le deuxième gsu_CopieEnrg écrase le premier.
    J'ai modifié ce code pour qu'il gère plusieurs presse-papiers (ACC2000 Seult).
    Toutefois, il ne peut copier qu'un enregistrement à la fois.
    Si le sous-formulaire en a plusieurs, il faut boucler dessus.
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    '//----#----#----#---Module header sample-#----#----#----#----#----#----#--\\
    '//
    '//   NOTE Le code est défini pour ACCESS 2000, si vous avez ACCESS 97
    '//   ==== mettre les lignes avec le commentaire #ACC2K# en commentaire
    '//        et décommentez les lignes avec le commentaire #ACC97#
    '//
    '//   La valeur des contrôles est stockée dans un champ Variant, ce n'est
    '//   pas le type de variable le plus performant. Mais dans ce cas de
    '//   figure il permet de s'adapter à tout type de données.
    '//   Ces routines peuvent être utilisées quel que soit la méthode
    '//   de gestion des données utilisée (DAO ou ADO). D'où la méthode un peu
    '//   brusque de 'vérification' des champs en N°Auto. Si je devais faire
    '//   plus proprement cette vérification, cela obligerait à utiliser soit
    '//   ADO, soit DAO. C'est justement ce que je voulais éviter.
    '//
    '//   Le principal intérêt de ces fonctions, est de pouvoir être utilisées
    '//   avec n'importe quel formulaire, quel que soit sa 'composition'.
    '//   Bon je n'ai pas testé toutes les possibilités existantes :o)
    '//   faites moi part des problèmes éventuels.
    '//   De plus lors du 'collage' des données seuls les champs ne contenant
    '//   pas de valeur sont modifiés, ce qui permet par exemple à l'utilisateur
    '//   de saisir les valeurs qui ne sont pas identiques à l'enregistrement
    '//   de copier, puis de faire le 'collage'. Le collage peut-être effectué
    '//   à n'importe quel moment et pas forcement sur l'enregistrement qui
    '//   suit immédiatement l'enregistrement copié.
    '//
    '// Commentaires, bugs ou autres : moilneu@hotmail.com , merci.
    '//
    '//============================
    '// UTILISATION DES ROUTINES :
    '//
    '//      gsu_CopieEnrg
    '//      -------------
    '//         Sur un bouton de commande, un événement, ou toute autre
    '//         posibilité de votre choix. Exemple avec un bouton de commande :
    '//
    '//            Private Sub cmdCopie_Click()
    '//               gsu_EmptyAll()         ' vide tous les presse-papiers
    '//               gsu_CopieEnrg Me, 1    ' copie dans presse-papier 1
    '//            End Sub
    '//
    '//         Exemple de copie des champs d'un sous formulaire :
    '//
    '//            Private Sub cmdCopie_Click()
    '//               gsu_CopieEnrg Me!SF.Form, 2  ' copie dans presse-papier 2
    '//            End Sub
    '//
    '//      gsu_ColleEnrg
    '//      -------------
    '//         Sur un bouton de commande, un événement,... Vérifiez quand
    '//         même que vous êtes bien sur un nouvel enregistrement, à
    '//         moins que vous vouliez écraser les données en cours :
    '//
    '//            Private Sub cmdColle_Click()
    '//               If (Me.NewRecord = FALSE) Then Exit Sub
    '//               gsu_ColleEnrg Me, 1           ' colle depuis presse-papier 1
    '//            End Sub
    '//
    '//         Exemple du collage dans un SF en mode feuille de données :
    '//
    '//            Private Sub cmdColle_Click()
    '//               Me!SF.SetFocus
    '//               DoCmd.GoToRecord , , acNewRec
    '//               gsu_ColleEnrg Me!SF.Form, 2   ' colle depuis presse-papier 2
    '//            End Sub
    '//
    '//============================
    '//----#----#----#----#----#----#----#----#----#----#----#----#----#----#--\\
    
    '//----()---()---()- DECLARATION DES VARIABLES -()---()---()---()---()---()-\\
    '//
    Private Const ERR_MODULE As String = "MD_UTILE" 
     Private Type UnChamp           '// Déclaration du type..
        Nom      As String
        Valeur   As Variant
     End Type
    
    Type UnEnrg
         UnChampCopie() As UnChamp     ' Tableau de UnChamp(s)
    End Type
    
    Private marCopie() As UnEnrg  '// Tableau (stocke le type CopieEnrg).
    Private mflgCopie  As Byte       '// Indique une copie en cours(1=oui).
    
    Public Sub gsu_EmptyAll()
      ReDim marCopie(0)       '// #ACC2K#
    End Sub
    
    Public Sub gsu_CopieEnrg(frm As Form, NumCopie As Integer)
    '//----o----o----o---Procedure header sample---o----o----o----o----o----o--\\
    '//
    '// Procedure gsu_CopieEnrg
    '// Par   : Laurent Moilneu
    '// Date  : 05/06/2001 13:04:39
    '// Modif :
    '//
    '// Objet : Faire une copie des valeurs des contrôles d'un formulaire.
    '//         Cela quel que soit le formulaire, le nombre de contrôles et
    '//         leur type. Cette routine sauvegarde dans un tableau le
    '//         nom et la valeur des contrôles.
    '//
    '// ENTRE <-
    '//      frm : Formulaire à utiliser.
    '//
    '// -----------------------
    '// -----------------------
    '//   NOTES :
    '//
    '//      - mflgCopie : indique qu'une copie a bien été effectuée.
    '//      - La copie est conservée jusqu'à la copie suivante.
    '//      - La copie précédente est détruite.
    '//
    '//----o----o----o----o----o----o----o----o----o----o----o----o----o----o--\\
    On Error GoTo ERR_Copie
    
       Const ERR_ROUTINE As String = "gsu_CopieEnrg"
    
       Dim ctr     As Control  '// Pour la boucle For Each.
       Dim iInd    As Integer  '// Index du tableau.
    
       mflgCopie = 0
       '// Efface le contenu du tableau.
       ReDim Preserve marCopie(NumCopie)       '// #ACC2K#
       ReDim Preserve marCopie(NumCopie).UnChampCopie(0)
    '   ReDim marCopie(1, 0)    '// #ACC97#
    
       '// Parcourir les contrôles du formulaire en cours.
       With frm
          For Each ctr In .Controls
    
             '// Vérifier la validité du contrôle.
             If fn_VerifControl(ctr) Then      '|--->
    
                '// Sauvegarde du contenu du contrôle.
                ReDim Preserve marCopie(NumCopie).UnChampCopie(iInd)          '// #ACC2K#
                marCopie(NumCopie).UnChampCopie(iInd).Nom = ctr.Name          '// #ACC2K#
                marCopie(NumCopie).UnChampCopie(iInd).Valeur = Nz(ctr.Value)  '// #ACC2K#
    
    '            ReDim Preserve marCopie(1, iInd)       '// #ACC97#
    '            marCopie(0, iInd) = ctr.Name           '// #ACC97#
    '            marCopie(1, iInd) = Nz(ctr.Value)      '// #ACC97#
    
                iInd = iInd + 1
             End If
          Next ctr
       End With
    
       '// Indique que le tableau contient une copie.
       mflgCopie = 1
       Set ctr = Nothing
      
    SORTIE_Copie:
       Exit Sub
    ERR_Copie:
       Dim sMsg As String
       sMsg = "Un problème est survenu lors de la copie :" & vbCrLf & _
       "Erreur : " & Err.Number & vbCrLf & Err.Description
       MsgBox sMsg, vbCritical, ERR_MODULE & "-" & ERR_ROUTINE
       Resume SORTIE_Copie
    End Sub
    
    Public Sub gsu_ColleEnrg(frm As Form, NumCopie As Integer)
    '//----o----o----o---Procedure header sample---o----o----o----o----o----o--\\
    '//
    '// Procedure gsu_ColleEnrg
    '// Par   : moilneu
    '// Date  : 05/06/2001 13:04:39
    '//
    '// Objet : Même chose que pour la fonction su_CopieEnrg, mais
    '//         dans le sens inverse bien sûr :o)
    '//
    '// ENTRE <-
    '//      frm : Formulaire à utiliser.
    '//
    '// -----------------------
    '// -----------------------
    '//   NOTES :
    '//
    '//      - Ne vérifie PAS si l'on est sur un nouvel enregistrement, cela
    '//        doit être fait dans le code avant l'appel de cette fonction.
    '//      - Vérifie qu'une copie existe dans le tableau (mflgCopie à 1).
    '//      - Ignore les champs vides.
    '//      - Ignore les TexteBox contenant déjà une valeur.
    '//      - Les champs N°Auto sont ignorés (gestion des erreurs).
    '//
    '//      - IMPORTANT le 'collage' dans un contrôle ne déclenche pas
    '//        d'événement, donc si vous avez un événement quelconque lors
    '//        de la modification du contrôle, n'utilisez pas cette fonction
    '//        ou prévoyez le code approprié pour gérer celui-ci.
    '//
    '//----o----o----o----o----o----o----o----o----o----o----o----o----o----o--\\
    On Error GoTo ERR_Colle
    
       Const ERR_ROUTINE As String = "gsu_CopieEnrg"
    
       If (mflgCopie = 0) Then Exit Sub    '// pas de copie en cours, sortir.
    
       Const ERR_ATIMP As Long = 2448      '// Attribution de valeur impossible.
    
       Dim iCpt    As Integer  '// Compteur de la boucle.
       Dim iNbCtr  As Integer  '// Nombre d'éléments du tableau.
       Dim sNom    As String   '// Nom du champs en cours.
    
       iNbCtr = UBound(marCopie(NumCopie).UnChampCopie())        '// #ACC2K#
    '   iNbCtr = UBound(marCopie, 2)     '// #ACC97#
    
       '// Colle la sauvegarde.
       For iCpt = 0 To iNbCtr
    
          '// Passe les valeurs non définies.
          If (marCopie(NumCopie).UnChampCopie(iCpt).Valeur <> "") Then  '// #ACC2K#
             sNom = marCopie(NumCopie).UnChampCopie(iCpt).Nom           '// #ACC2K#
    '      If (marCopie(1, iCpt) <> "") Then      '// #ACC97#
    '         sNom = marCopie(0, iCpt)            '// #ACC97#
    
             '// Passe les contrôles texte contenant déjà une valeur.
             With frm(sNom)
                If (.ControlType = acTextBox) And (.Value <> "") Then
                Else
                   .Value = marCopie(NumCopie).UnChampCopie(iCpt).Valeur   '// #ACC2K#
    '               .Value = marCopie(1, iCpt)       '// #ACC97#
                End If
             End With
    
          End If
       Next iCpt
    
    SORTIE_Colle:
       Exit Sub
    ERR_Colle:
       '// Champs en N° auto, passer au suivant.(Voir note dans la déclartion)
       If Err.Number = ERR_ATIMP Then
          Resume Next
       End If
    
       Dim sMsg As String
       sMsg = "Un problème est survenu lors du 'collage' :" & vbCrLf & _
       "Erreur : " & Err.Number & vbCrLf & Err.Description
       MsgBox sMsg, vbCritical, ERR_MODULE & "-" & ERR_ROUTINE
       Resume SORTIE_Colle
    End Sub
    
    Private Function fn_VerifControl(ctr As Control) As Boolean
    '//----o----o----o---Procedure header sample---o----o----o----o----o----o--\\
    '//
    '// Procedure fn_RechTableau
    '// Par   : Laurent Moilneu
    '// Date  : 05/06/2001 13:04:39
    '// Modif :
    '//
    '// Objet : Accorder la copie de la valeur du contrôle, si celui-ci
    '//         fait partie des types de contrôles autorisés, s'il est
    '//         actif, visible et non verrouillé.
    '//         On peut rajouter des conditions : vérifier si la propriété
    '//         'Tag' du contrôle, contient une certaine valeur, et accepter
    '//         ou non le collage.
    '//
    '// ENTRE <-
    '//      ctr : Contrôle à vérifier.
    '//
    '// SORT  ->
    '//      TRUE si le contrôle correspond aux types autorisés,
    '//           s'il est actif et visible.
    '//
    '// -----------------------------------
    '// -----------------------------------
    '// Types de contrôles (ils n'y sont peut-être pas tous) :
    '//
    '//      100   acLabel              Étiquette
    '//      101   acRectangle          Rectangle
    '//      102   acLine               Trait
    '//      103   acImage              Image
    '//      104   acCommandButton      Bouton de commande
    '//      105   acOptionButton       Bouton d'options
    '//      106   acCheckBox           Case à cocher
    '//      107   acOptionGroup        Groupe d'options
    '//      108   acBoundObjectFrame   Cadre d'objet dépendant
    '//      109   acTextBox            Zone de texte
    '//      110   acListBox            Zone de liste
    '//      111   acComboBox           Zone de liste modifiable
    '//      112   acSubform            Sous formulaire / Sous état
    '//      114   acObjectFrame        Cadre d'objet indépendant ou graphique
    '//      118   acPageBreak          Saut de page
    '//      119   acCustomControl      Contrôle ActiveX (personnalisé)
    '//      122   acToggleButton       Bouton bascule
    '//      123   acTabCtl             Onglet
    '//      124   acPage               Page
    '//
    '//----o----o----o----o----o----o----o----o----o----o----o----o----o----o--\\
    
       '// Voir si le type du contrôle convient.
       '// NOTE : Pour ignorer un type de contôle, mettre sa ligne :
       '// Case (TypeDeControle) en commentaire.
    
       Select Case ctr.ControlType
    
          Case acOptionButton, acCheckBox, acToggleButton
             Dim iTMP As Integer
             '// Vérifie que la case à cocher/option ou le bouton bascule
             '// ne fait pas partie d'un groupe d'options.
             On Error Resume Next
             iTMP = ctr.Value
             If Err <> 0 Then
                Err.Clear
                Exit Function
             End If
    
          Case acOptionGroup
          Case acTextBox
          Case acListBox, acComboBox
          Case acTabCtl
          Case Else
             Exit Function
       End Select
    
       '// Si le type convient, accepte que les contrôles
       '// actifs(Enabled), visibles et non vérouillés(Locked).
       If (ctr.Enabled And ctr.Visible And (Not (ctr.Locked))) Then
          '// Renvoie la valeur
          fn_VerifControl = True
       End If
    
    End Function
    
    Sub debugPPs()
    Dim pp As Integer, intfnum As Integer
    
    For pp = 1 To UBound(marCopie())
        Debug.Print "presse papier " & pp
        Debug.Print "---------------------------"
        For intfnum = 0 To UBound(marCopie(pp).UnChampCopie())
            Debug.Print marCopie(pp).UnChampCopie(intfnum).Nom; "  "; marCopie(pp).UnChampCopie(intfnum).Valeur
        Next
        Debug.Print
        
    Next
    
    End Sub
    exemple d'utilisation
    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
    Private Sub b_Copier1_Click()
     Module2.gsu_EmptyAll                      ' vide le tableau
    
     Module2.gsu_CopieEnrg Me.Form, 1          ' copie dans presse-papier 1
     Me.Fille0.SetFocus                        ' Copie Enr actif du sous-formulaire fille0
     Module2.gsu_CopieEnrg Me.Fille0.Form, 2   ' Copie dans presse-papier 2
    
    End Sub
    
    Private Sub b_Coller2_Click()
     Me.SetFocus
     DoCmd.GoToRecord acActiveDataObject, , acNewRec
     Module2.gsu_ColleEnrg Me.Form, 1          ' Colle depuis presse-papier 1
     Me.Fille0.SetFocus
     DoCmd.GoToRecord acActiveDataObject, , acNewRec
     Module2.gsu_ColleEnrg Me.Fille0.Form, 2  ' Colle depuis presse-papier 1
    End Sub
    Voila, j'espère que tu vas t'y retrouver.

    A+

  20. #20
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Encore moi.

    Au sujet de la copie par requête.
    Il faut une clé ou un ensemble de champs qui identifient de manière unique l'enregistrement du formulaire principal.
    Prenons un exemple avec clé, un formulaire Clients basé sur une table tblClients et un sous-formulaire basé sur une table tblContacts.
    tblClients : IdClient, Nom, Ville, CodePostal (IdClient est la clée de la table, type AutoNum)
    tblContacts : IdClient, Nom, Prenom, Tel, Mob, Fax, Email

    Pour dupliquer le Client en cours:
    - On mémorise IdClient en cours dans une variable strIdClient (=CStr(Me.IdClient))
    - On crée une requête Ajout en VBA sur la table tblClients
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     strSQL ="INSERT INTO tblClients(Nom, Ville, CodePostal) " & vbcrlf & _
    "SELECT Nom, Ville, CodePostal" & vbcrlf & _
    "FROM tblClients" & vbcrlf & _
    "WHERE (IdClient=" & strIdClient & ")"
    - On l'exécute - On fait un Me.Requery
    - On se déplace vers le dernier enregistrement du formulaire principal (celui qu'on vient d'ajouter)
    - On récupère le nouveau IdClient (strIdNewClient = Cstr(Me.IdClient))
    - Nouvelle requête ajout pour le sous-formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     strSQL="INSERT INTO tblContacts(IdClient, Nom, Prenom, Tel, Mob, Fax, Email)" & vbCrLf & _
    "SELECT " & strIdNewClient & " As NewId, Nom, Prenom, Tel, Mob, Fax, Email" & VbCrLf & _
    "FROM tblContacts" & vbCrLf & _
    "WHERE (IdClient=" & strIdClient & ")"
    - On l'exécute - On fait un requery sur le sous-formulaire

    Je n'ai pas testé, mais voila le principe.

    On peut aussi faire un mélange des deux solutions :
    - Copier/Coller de l'enregistrement du formulaire principal
    - Copie des données sous-formulaire par requête crée en VBA.

    Je te laisse méditer sur tout ça.

    Bonne reflexion.
    A+

Discussions similaires

  1. Duppliquer les enregistrements
    Par majudis dans le forum Modélisation
    Réponses: 1
    Dernier message: 13/11/2009, 18h04
  2. - Duppliquer un enregistrement
    Par mikaelm dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/01/2006, 15h00
  3. [VB6] [Crystal] Selection enregistrement
    Par littlecow dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 11/01/2005, 13h08
  4. [BDD] Enregistrer le résultat d'une requête
    Par Mowgly dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/06/2002, 15h26
  5. enregistrer dans un fichier avec une appli mdi
    Par ferrari dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/05/2002, 15h17

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