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 :

Copier enregistrement : dans une même table [AC-2013]


Sujet :

VBA Access

  1. #1
    Membre régulier
    Homme Profil pro
    AutoEntrepreneur Photo
    Inscrit en
    Avril 2015
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : AutoEntrepreneur Photo
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2015
    Messages : 141
    Points : 86
    Points
    86
    Par défaut Copier enregistrement : dans une même table
    Bonjour,

    Dans formulaire F_Contrat qui contient un sous formulaire F_Lignes_Contrat Je souhaite faire un bouton, qui:
    L
    Copie les enregistrement de T_Lignes_Contrat dont le champs: [T_Lignes_Contrat].[N°Contrat] = Liste_Contrats
    Créer un nouveau enregistrement T_Contrat (depuis le formulaire F_Contrat) avec un nouveau N°Contrat généré automatiquement.
    Colle les enregistrement (T_Lignes_Contrat) précédemment copiés, en remplacement leur [T_Lignes_Contrat].[N°Contrat] par le nouveau N°Contrat du formulaire (Me.N°Contrat)


    Nom : schema contrat.png
Affichages : 439
Taille : 9,9 Ko


    J'ai lu qu'une table de transition pouvait faire l'affaire, mais ça nécessite du SQL.... et, mon autre prob, est que je vais avoir besoin pour d'autres partie de mon application, de copier des enregistrements de diverse tables.....
    Serait il possible de faire une seule grosse table de transition avec Beaucoup de champs pour faire la transition avec quelques tables ou alors une table de transition par table dont les enregistrement doivent être copiés?

    Je suis un peu perdu, si vous pouvez me guider un peu ça m'arrangerait beaucoup?

    MErci

  2. #2
    Membre régulier
    Homme Profil pro
    AutoEntrepreneur Photo
    Inscrit en
    Avril 2015
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : AutoEntrepreneur Photo
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2015
    Messages : 141
    Points : 86
    Points
    86
    Par défaut
    Bonjour,

    Donc pour arriver à mes fins, voilà le code que j'aimerai construire

    1ère étape: Mémoriser le N°Piece selectionné par forms![F_Contrat].[Liste_Contrats]
    2ème étape: Copier les enregistrement T_LignesContrat(dont le N°Contrat= forms![F_Contrat].[Liste_Contrats]) dans une table T_T_LignesContrat (table de transition).
    3ème étape:Créer un nouveau enregistrement
    4ème étape: Dans la table de transition T_T_LignesContrat, changer les N°Contrat par le N°Contrat enregistré en étape 1
    5ème étape: Copier l'ensemble des enregistrement de la table T_T_LignesContrat dans la table T_LignesContrat
    6ème étape: Supprimer l'ensemble des enregistrement de la table T_T_LignesContrat

    1ère étape:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim A As DAO.Recordset
    Set A = Database.OpenRecordset("SELECT [T_Contrat].[N°Contrat],  FROM T_Contrat WHERE [N°Contrat] = forms![F_Contrat].[Liste_Contrats] ", dbOpenSnapshot)
    Ca ne marche pas, si quelqu'un à une idée?

    2ème étape:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     DoCmd.RunSQL "INSERT INTO T_T_LignesContrat SELECT * FROM T_Lignes_Contrat WHERE N°Contrat=" & Me.Liste_Contrats.Column(0)
    3ème étape:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DoCmd.GoToRecord , , acNewRec
    Me.NomC = "Blabla"
    Me.Nature = "Contrat Unique"
    Le fait de remplir les champs NomC et Nature me permet d'obtenir un nouveau N°Contrat auto.

    Je bloque également pour les 3 dernière étapes...

    Je sais qu'à la fin ça doit finir par ça...
    A.Close: Set A = Nothing
    End Sub


    Si vous avez des idées ou des pistes, je suis preneur
    Mercii

  3. #3
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 241
    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 241
    Points : 19 367
    Points
    19 367
    Billets dans le blog
    61
    Par défaut
    Bonsoir,

    Si cela revient à dupliquer la liste pour un nouveau n° de contrat, alors essaie 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
    Dim varContrat as long
     
    DoCmd.SetWarnings false
     
    varContrat=Me.Liste_Contrats.Column(0) ' enregistre le numéro de contrat
     
    DoCmd.RunSQL "INSERT INTO T_T_LignesContrat SELECT * FROM T_Lignes_Contrat WHERE N°Contrat=" & Me.Liste_Contrats.Column(0)
     
    DoCmd.GoToRecord , , acNewRec ' nouvel enregistrement
     
    Me.DateContrat=Date() ' Si N°Contact est de type numéro-auto alors saisie dans un autre champ pour générer le numéro-auto.
     
    'Sinon saisir le n° de contrat, par exemple
    Me.N°Contrat="ABC123"
    ...
    ' Puis mettre à jour le n°Contrat dans la table T_T_LignesContrat avec ce nouveau numéro :
     
    DoCmd.RunSQL "UPDATE T_T_LignesContrat SET [N°Contrat]=" & Me.[N°Contrat] & " WHERE N°Contrat=" & varContrat
     
    '  Insérer dans T_LignesContrat
     
    DoCmd.RunSQL "INSERT INTO T_LignesContrat SELECT * FROM T_T_Lignes_Contrat WHERE N°Contrat=" & Me.[N°Contrat]
     
    ' Enfin, vider la table temporaire.
     
    DoCmd.RunSQL "Delete * from T_T_LignesContrat;"
     
    DoCmd.SetWarnings True

    Tu peux aussi passer par les recordset.

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  4. #4
    Membre régulier
    Homme Profil pro
    AutoEntrepreneur Photo
    Inscrit en
    Avril 2015
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : AutoEntrepreneur Photo
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2015
    Messages : 141
    Points : 86
    Points
    86
    Par défaut
    Bonsoir User,

    Encore une fois Merci, je vais pouvoir me pencher sur ces nouveaux codes.
    Cependant, j'ai test:

    et ça me dit:
    Erreur de compilation: Instruction incorrecte à l'extérieur d'un bloc de type

    Aurais tu une idée?

    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
    Private Sub Commande12_Click()
     
     
     
    varContrat As Long
     
    DoCmd.SetWarnings False
     
    varContart = Me.Liste_Contrats.Column(0) ' enregistre le numéro de contrat
     
    DoCmd.RunSQL "INSERT INTO T_T_LignesContrat SELECT * FROM T_Lignes_Contrat WHERE N°Contrat=" & Me.Liste_Contrats.Column(0)
     
    DoCmd.GoToRecord , , acNewRec ' nouvel enregistrement
     
    Me.NomC = "Date" ' Si N°Contact est de type numéro-auto alors saisie dans un autre champ pour générer le numéro-auto.
     
    'Sinon saisir le n° de contrat, par exemple
     
    ' Puis mettre à jour le n°Contrat dans la table T_T_LignesContrat avec ce nouveau numéro :
     
    DoCmd.RunSQL "UPDATE T_T_LignesContrat SET [N°Contrat]=" & Me.[N°Contrat] & " WHERE N°Contrat=" & varContrat
     
    '  Insérer dans T_LignesContrat
     
    DoCmd.RunSQL "INSERT INTO T_LignesContrat SELECT * FROM T_T_Lignes_Contrat WHERE N°Contrat=" & Me.[N°Contrat]
     
    ' Enfin, vider la table temporaire.
     
    DoCmd.RunSQL "Delete * from T_T_LignesContrat;"
     
    DoCmd.SetWarnings True
     
    End Sub

  5. #5
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 241
    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 241
    Points : 19 367
    Points
    19 367
    Billets dans le blog
    61
    Par défaut
    Peux-tu pointer la ligne concernée ?

    Sinon, j'ai déjà relevé une coquille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    varContrat = Me.Liste_Contrats.Column(0) ' enregistre le numéro de contrat
    à+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  6. #6
    Membre régulier
    Homme Profil pro
    AutoEntrepreneur Photo
    Inscrit en
    Avril 2015
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : AutoEntrepreneur Photo
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2015
    Messages : 141
    Points : 86
    Points
    86
    Par défaut
    ok,

    ça selectionne et ça surligne en jaune :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Commande12_Click()

  7. #7
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 241
    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 241
    Points : 19 367
    Points
    19 367
    Billets dans le blog
    61
    Par défaut
    En effet:



    Bonne nuit il se fait tard, je reprendrai le code demain...
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  8. #8
    Membre régulier
    Homme Profil pro
    AutoEntrepreneur Photo
    Inscrit en
    Avril 2015
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : AutoEntrepreneur Photo
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2015
    Messages : 141
    Points : 86
    Points
    86
    Par défaut
    J'ai changé également les noms des Tables qui était très déstabilisant ^^

    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 Duplique_Click()
    Dim varContrat As Long
     
    DoCmd.SetWarnings False
     
    varContrat = Me.Liste_Contrats.Column(0)
     
    DoCmd.RunSQL "INSERT INTO T_TLContrat SELECT * FROM T_Lignes_Contrat WHERE N°Contrat=" & Me.Liste_Contrats.Column(0)
     
    DoCmd.GoToRecord , , acNewRec ' nouvel enregistrement
     
    Me.NomC = "Date" ' Si N°Contact est de type numéro-auto alors saisie dans un autre champ pour générer le numéro-auto.
     
    'Sinon saisir le n° de contrat, par exemple
     
    ' Puis mettre à jour le n°Contrat dans la table T_T_LignesContrat avec ce nouveau numéro :
     
    DoCmd.RunSQL "UPDATE T_TLContrat SET [N°Contrat]=" & Me.[N°Contrat] & " WHERE N°Contrat=" & varContrat
    '  Insérer dans T_LignesContrat
     
    DoCmd.RunSQL "INSERT INTO T_Lignes_Contrat SELECT * FROM T_TLContrat WHERE N°Contrat=" & Me.[N°Contrat] "
     
     
    DoCmd.RunSQL "Delete * from T_TLContrat;"
     
    DoCmd.SetWarnings True
     
    End Sub
    Et là ça remarche nickel!

    Gros merci à toi, ça fait 3jours que j'avançais plus !


    Bonne nuit



    EDIT:*
    Il y a un problème avec cette action là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    '  Insérer dans T_LignesContrat
     
    DoCmd.RunSQL "INSERT INTO T_Lignes_Contrat SELECT * FROM T_TLContrat WHERE N°Contrat=" & Me.[N°Contrat] "
    Comme si, ça ne voulait pas tout insérer, ou du moins pas le bon N°Contrat... Il n'y aurait pas une histoire de requery ou refresh à inclure dans le code?

    Une autre question: Comment faire pour déclarer le nom des tables au début du code, pour éviter de les réecrire à chaque fois?

    Merci

  9. #9
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 241
    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 241
    Points : 19 367
    Points
    19 367
    Billets dans le blog
    61
    Par défaut
    Bonjour,

    Peut-être comme ceci en mettant des crochets au niveau du champ "N°Contrat" et en actualisant avec un Me.refresh avant et après:

    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
    Private Sub Duplique_Click()
    Dim varContrat As Long
     
    DoCmd.SetWarnings False
     
    varContrat = Me.Liste_Contrats.Column(0)
     
    DoCmd.RunSQL "INSERT INTO T_TLContrat SELECT * FROM T_Lignes_Contrat WHERE [N°Contrat]=" & Me.Liste_Contrats.Column(0)
     
    DoCmd.GoToRecord , , acNewRec ' nouvel enregistrement
     
    Me.NomC = "Date" ' Si N°Contact est de type numéro-auto alors saisie dans un autre champ pour générer le numéro-auto.
     
    Me.Refresh ' pour être sûr.
     
    'Sinon saisir le n° de contrat, par exemple
     
    ' Puis mettre à jour le n°Contrat dans la table T_T_LignesContrat avec ce nouveau numéro :
     
    DoCmd.RunSQL "UPDATE T_TLContrat SET [N°Contrat]=" & Me.[N°Contrat] & " WHERE  [N°Contrat]=" & varContrat
     
    '  Insérer dans T_LignesContrat
     
    DoCmd.RunSQL "INSERT INTO T_Lignes_Contrat SELECT * FROM T_TLContrat WHERE [N°Contrat]=" & Me.[N°Contrat] "
     
     
    DoCmd.RunSQL "Delete * from T_TLContrat;"
     
    DoCmd.SetWarnings True
     
    Me.Refresh '  si tu as besoin de rafraîchir un sous-formulaire dans ton formulaire principal.
     
    End Sub
    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  10. #10
    Membre régulier
    Homme Profil pro
    AutoEntrepreneur Photo
    Inscrit en
    Avril 2015
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : AutoEntrepreneur Photo
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2015
    Messages : 141
    Points : 86
    Points
    86
    Par défaut
    Merci milles fois, ça fonctionne parfaitement !
    pas besoin du dernier Me.refresh.

    Donc now, je vais tenter de faire des déclarations pour le nom des tables histoire de pas avoir à les répéter !

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

Discussions similaires

  1. [2008R2] Calcul de durée entre plusieurs enregistrements dans une même table
    Par mikmik60 dans le forum Développement
    Réponses: 2
    Dernier message: 20/10/2014, 14h28
  2. Réponses: 6
    Dernier message: 10/11/2012, 00h18
  3. Copier un enregistrement dans une même table
    Par slammer dans le forum Langage SQL
    Réponses: 11
    Dernier message: 05/05/2010, 00h17
  4. [MySQL] Plusieurs enregistrements à la fois dans une même table
    Par cysedbs dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/12/2008, 11h37
  5. Réponses: 4
    Dernier message: 21/11/2007, 13h19

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