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 :

Dupliquer enregistrement sur formulaire avec sous-formulaire


Sujet :

Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 20
    Points : 16
    Points
    16
    Par défaut Dupliquer enregistrement sur formulaire avec sous-formulaire
    Bonjour,

    J'ai lu différents posts sur le forum qui m'ont permis de me débrouiller sur la duplication simple d'un enregistrement sur un formulaire.

    J'ai utilisé l'assistant pour créer un bouton qui me duplique l'enregistrement en cours de mon formulaire. Pour ça, aucun problème. Le problème se situe sur le sous-formulaire.

    Lors de la duplication de l'enregistrement, les données du sous-formulaire sont elles aussi dupliquées mais pas sauvegardées à la fermeture.

    Quand je ferme mon formulaire et le réouvre, je retrouve l'enregistrement dupliqué mais pas les données du sous formulaire.

    A la fermeture, l'enregistrement dupliqué est donc bien sauvegardé mais pas les données du sous-formulaire lié (j'ai regardé dans les tables).

    J'ai essayé de bidouiller le code du bouton en ajoutant le lancement d'une requête de type "INSERT INTO" relative aux données du sous-formulaire mais ça plante pour une raison de duplication de clé.

    Est-ce que j'ai été clair ?

    Je ne vois donc pas comment dupliquer un enregistrement et ses enregistrements connexes !!!

  2. #2
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut Re: Dupliquer enregistrement sur formulaire avec sous-formul
    Citation Envoyé par lbourlet
    Je ne vois donc pas comment dupliquer un enregistrement et ses enregistrements connexes !!!
    Je suis peut-être un peu naïf mais j'imagine que cela n'est pas bien compliqué, tout du moins dans cas un général.

    Qu'est-ce qu'un cas général ?

    Disons un formulaire principal basé sur une table "Eléments", avec un sous formulaire basé sur une table "Détails", affichant donc les détails pour l'élément en cours dans le formulaire principal.
    Par ailleurs les 2 tables ont chacune une clé primaire et entretiennent une relation un à plusieurs (table Eléments du côté "un").
    Enfin la table Détails possède une clé étrangère reprennant la valeur de la clé correspondante dans la table Eléments.

    A partir de là il n'est pas difficile de copier des enregistrements de la table Eléments, puis de la table Détails :

    1) On récupère les clés des "Eléments" que l'ont souhaite copier.

    2) On crée et exécute (par exemple avec Docmd.Runsql) une instruction sql INSERT INTO... basée sur la table Eléments avec une Clause Where utilsant la clé primaire et le/les identifiant(s) récupéré(s) en 1).

    3) On crée et exécute une instruction sql INSERT INTO... basée sur la table Détails avec une Clause Where utilsant la clé étrangère et le/les identifiant(s) récupéré(s) en 1)

    C'est tout ! (plus long à écrire qu'à faire...)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Merci pour la réponse détaillée.

    C'est ce que j'étais en train de mettre en place. Je suis tout de même déçu de ne pas pouvoir utiliser la fonction de copie d'un enregistrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdCopy
    DoCmd.RunCommand acCmdPasteAppend
    qui me paraissait assez simple.

    Avec la méthode dont tu parles et que j'étais en train de coder, je me rajoute un problème qui concerne la clé de la table "Elements". Ma clé est un NuméroAuto et j'ai un peu de mal à récupérer la nouvelle valeur créée lors de la première insertion.

    J'ai pas mal cherché sur le forum comment faire ça et j'ai quelques problèmes.

    J'ai cru comprendre que sur Access 2000, on peut utiliser un "Select @@IDENTITY" mais je n'arrive pas à le mettre en place. Est-ce que tu sais si c'est bien utilisable sur Access 2000 ? Et si oui, t'aurais un exemple ? Parce que moi, je récupère toujours la valeur 0

    Voilà ce que moi j'ai utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Req = "INSERT INTO [Simulation] ( [Description] ) VALUES ('Test Copie')"
    DoCmd.RunSQL Req
    Set RS = Application.CurrentDb.OpenRecordset("SELECT @@IDENTITY AS Code")
    MsgBox RS.Fields("Code")

  4. #4
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    euh... tu veux copier un enregistrement que tu n'as pas encore créé ? Dans ce cas là ce n'est plus vraiment de la copie...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Si, il est déjà créé. Mais il faut bien que je change la valeur de la clé pour pas créer de doublon.

    Et cette clé est un NuméroAuto. Et c'est là que je butte.

  6. #6
    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
    tu peux récupérer le dernier num_auto avec un max sur le champ non ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Ben c'est pas génial si plusieurs utilisateurs font une copie en même temps. On peut se retouver avec un problème de décalage sur la valeur récupérée.

  8. #8
    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
    ben oui mais j'ai pas d'autre solution.

  9. #9
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Dans ce cas il ta fut utiliser des recordset en vba et ajouter tes enregistrements "Elements" un par un.
    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 rs as dao.Recordset
    dim lng as Long
    dim str as string
     
    'On copie l'enregistrement "Element"
    Set rs = currentdb.openrecordset("NomDeTableElémentsCopiés")
    with rs
      .addnew
        'On copie les champ voulu sauf celui de la clé primaire : 
        !NomAutreChampàCopier = Me!NomAutreChampàCopier
        !NomAutreChampàCopier2 = Me!NomAutreChampàCopier2
      .update
      lng = !NomChampCléPrimaire
    end with
     
    'On copie les enregistrements "Détails"
    str = "INSERT INTO NomTableDétailsCopiés (CléPrimaire, Monchamp1, MonChamp2) " & _
    "SELECT " & lng " & ", Détails.Monchamp1, Détails.Monchamp2 " & _
    "FROM tblVéhiCatégories;"
    Docmd.runsql str

  10. #10
    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
    Euh, ça marche ça FRED ?

    J'étais persuadé en tout cas que ça fonctionnait et quand j'ai testé heir pour un autre post, j'arrivais pas à récupéré le num_auto aprés l'update. Comme si le recordset n'étais pas dynamique.

  11. #11
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    C'est vrai, j'ai déjà eu ce problème. Je vais faire un test et je reviens

  12. #12
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    J'ai fait des recherche sur le forum dans mes anciens messages car j'avais déjà propsé une solution comparable et tout s'était bien passé...
    Mais tout ça a disparu depuis... Et peu être que ma mémoire me trahit et que le topic n'était pas si comparable (notamment la première insertion ne se faisait peut-être pas dans une table avec num-auto mais reprennait la valeur initiale (clé issu de la table Eléments).

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Meric pour votre aide.

    J'ai testé la solution de Fred.G et j'ai le problème dont parle Tofalu : je récupère la valeur de la clé de l'élément copié, pas de la copie.

    Je vais continuer à chercher dans cette voie.

    Merci.

  14. #14
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Voici le bon 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
    Dim rs as dao.Recordset 
    dim lng as Long 
    dim str as string 
     
    'On copie l'enregistrement "Element" 
    Set rs = currentdb.openrecordset("NomDeTableElémentsCopiés") 
    with rs 
      .addnew 
        'On copie les champ voulu sauf celui de la clé primaire : 
        !NomAutreChampàCopier = Me!NomAutreChampàCopier 
        !NomAutreChampàCopier2 = Me!NomAutreChampàCopier2 
      .update 
      .Bookmark = .LastModified
      lng = !NomChampCléPrimaire 
    end with 
     
    'On copie les enregistrements "Détails" 
    str = "INSERT INTO NomTableDétailsCopiés (CléPrimaire, Monchamp1, MonChamp2) " & _ 
    "SELECT " & lng " & ", Détails.Monchamp1, Détails.Monchamp2 " & _ 
    "FROM tblVéhiCatégories;" 
    Docmd.runsql str

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    J'ai fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .Update
    .Bookmark = .LastModified
    lng = ![Code Simulation]
    Et là je récupère ma nouvelle clé ! Yes !

    Mais une question me vient !!!

    Pour le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Bookmark = .LastModified
    Si y a 2 copies déclenchées au même moment, on se retrouve avec le même problème que pour le "SELECT MAX..." ?

    Si je mets mon formulaire en "LockEdits = True", je règle le problème ?

    Edit : je suis content j'avais trouvé le coup du .Bookmark = .LastModified !

  16. #16
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    A mon avis (sans certitude absolue), il n'y a 0 problème car le numéroauto reste géré par access et tu travailles sur un seul et même recordset (qui n'est affecté par aucune modification autre que celles effectuées directment sur lui - sauf si tu t'amses à faire un recordset.requey ).

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Nickel alors !!!!!!!!

    à tous !!!

  18. #18
    Débutant
    Inscrit en
    Août 2003
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 82
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par FRED.G
    Voici le bon 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
    Dim rs as dao.Recordset 
    dim lng as Long 
    dim str as string 
     
    'On copie l'enregistrement "Element" 
    Set rs = currentdb.openrecordset("NomDeTableElémentsCopiés") 
    with rs 
      .addnew 
        'On copie les champ voulu sauf celui de la clé primaire : 
        !NomAutreChampàCopier = Me!NomAutreChampàCopier 
        !NomAutreChampàCopier2 = Me!NomAutreChampàCopier2 
      .update 
      .Bookmark = .LastModified
      lng = !NomChampCléPrimaire 
    end with 
     
    'On copie les enregistrements "Détails" 
    str = "INSERT INTO NomTableDétailsCopiés (CléPrimaire, Monchamp1, MonChamp2) " & _ 
    "SELECT " & lng " & ", Détails.Monchamp1, Détails.Monchamp2 " & _ 
    "FROM tblVéhiCatégories;" 
    Docmd.runsql str
    Je cherche moi aussi a dupliquer un enregistrement d'un form ayant 3 subforms.

    Pour le moment je ne cherche qu'a dupliquer qu'un seul subform en utilsant le code cite mais ca ne fonctionne pas...
    La derniere partie du code ne fonctionne pas chez moi : il y a un souci d'erreur de syntaxe dans le ' str= '
    Il me met erreur de comiplation attendu fin d'instruction.
    Pourtant je colle bien au code ci-dessus.

    Autre question dans ce code, la table cite dans le FROM (ici tblVéhiCatégories) a laquelle normalement fait-elle reference ?

    Merci d'avance

  19. #19
    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 suffit de s'inspirer des pages sources :

    http://access.developpez.com/sources...egistrementDAO

    A partir de cet exemple, rien de bien compliqué pour arriver à tes fins

  20. #20
    Débutant
    Inscrit en
    Août 2003
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 82
    Points : 61
    Points
    61
    Par défaut
    Alors finalement j'ai opte pour la solution initiale de ce topic et ca marche presque... je m'explique et re-explique le contexte.

    1 form principal JOBCARD et 4 subforms : OPERATION, MATERIAL_INC-MATERIAL_EQPT et SAFETY.
    Le but de la manoeuvre est que sur un bouton, je veux dupliquer l'enregistrement courant prenant en compte les donnees du form principal JOBCARD ainsi que les enregistrements des 4 formulaires...

    Alors mon code fonctionne, mais au bout de la 2eme duplication : il duplique en double le nombre d'enregsitrements des subforms.


    Voila le 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Dim rs As DAO.Recordset
    Dim lng As Long
    Dim oper As String
    Dim inc As String
    Dim eqpt As String
    Dim safe As String
     
    'On copie l'enregistrement "jobcard"
    Set rs = CurrentDb.OpenRecordset("jobcard")
    With rs
      .AddNew
        'On copie les champ voulu sauf celui de la clé primaire :
        !jc_number = Me!jc_number
        !libelle = Me!libelle
        !rev = Me!rev
        !work_sequence = Me!work_sequence
        !disc_ID = Me!disc_ID
        !syst_ID = Me!syst_ID
        !platform_ID = Me!platform_ID
        !location_ID = Me!location_ID
        !punchlist = Me!punchlist
        !adscope = Me!adscope
        !pid = Me!pid
        !preparator_ID = Me!preparator_ID
        !date_creation = Me!date_creation
        !num_sheet = Me!num_sheet
      .Update
      .Bookmark = .LastModified
      lng = !jobcard_ID
    End With
     
    'On copie les enregistrements "Operations"
    oper = "INSERT INTO operation ( jobcard_ID, pos_in_jc, description, hours, activity_ID, category_operation_ID ) SELECT  " & lng & ", pos_in_jc, description, hours, activity_ID, category_operation_ID FROM operation "
     
    'On copie les enregistrements "Materiels incorpores"
    inc = "INSERT INTO material_inc ( jobcard_ID, description, qty, unit_ID, location, pr_and_item_ID ) SELECT  " & lng & ", description, qty, unit_ID, location, pr_and_item_ID FROM material_inc "
     
    'On copie les enregistrements "Materiels Equipements"
    eqpt = "INSERT INTO material_eqpt ( jobcard_ID, description, qty, unit_ID, location ) SELECT  " & lng & ", description, qty, unit_ID, location FROM material_eqpt "
     
    'On copie les enregistrements "Safety"
    safe = "INSERT INTO safety ( jobcard_ID, safety_recommand ) SELECT  " & lng & ", safety_recommand FROM safety "
    DoCmd.RunSQL safe
    DoCmd.RunSQL oper
    DoCmd.RunSQL inc
    DoCmd.RunSQL eqpt
     
     
    Forms!frm_jobcard.Requery
     
    DoCmd.GoToRecord , , acLast
     
    Me.rev.SetFocus
    Alors ca marche sauf que la duplication des enregistrements des sub-form est doublee...

    Si j'ai 3 enregistrements dans un subform : la duplication va m'en creer 6, et ainsi de suite...

    Merci de votre aide

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/05/2015, 12h24
  2. Réponses: 8
    Dernier message: 04/10/2006, 14h39
  3. Réponses: 10
    Dernier message: 16/08/2006, 11h11
  4. [débutant] Pbl sur Etat avec sous formulaire
    Par william_58 dans le forum Access
    Réponses: 5
    Dernier message: 18/07/2006, 22h41
  5. Réponses: 6
    Dernier message: 19/05/2005, 11h06

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