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

Requêtes et SQL. Discussion :

Déplacement d'un enregistrement d1 table à une autre


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Déplacement d'un enregistrement d1 table à une autre
    Bonjour,

    Je suis nouveau sur le forum et débutant en ce qui à trait aux langages de programmation (VBA, VB.NET, etc)

    Dans MS Access 2007 (ça doit être la même chose pour Access 2003), j'ai une base de donnée avec 2 tables et 1 formulaire :


    - TblGames
    - TblArchives (aucune donnée dans la table, structure identique à la table "TblGames")
    - FrmGames

    Il y a d'autres tables, mais elles ne sont pas importantes dans ma question. Mon formulaire "frmGames" est lié à la table "TblGames". Autrement dit, quand j'entre/modifie les données des champs d'un enregistrement dans le formulaire, la table se mets à jour automatiquement en passant à un autre enregistrement.


    Ma question est que je ne sais pas(en fait, je ne sais plus) comment déplacer un enregistrement de la table "TblGames" dans la table "TblArchives" à partir d'un bouton(que j'appellerai "move", par exemple) dans mon formulaire.

    Je sais ceci par contre :

    - Les deux tables doivent obligatoirement avoir la même structure.
    - Quand on déplace un enregistrement, c'est tous les champs de cet enregistrement.
    - Je peux le faire en programmant mon bouton avec une requête (Cé beau, mais je ne me rappelle plus comment on fait)
    - Ou en code VBA.(Là encore, j'ai un trou de mémoire)
    - Mon bouton programmé devra dire "Prends tel enregistrement de la table "TblGames" et copie le dans la table "TblArchives", ensuite efface celui de la table "TblGames".


    Supposons que je suis dans mon formulaire à l'enregistrement #1. Je veux déplacer celui-ci dans la table "TblArchives", je clique sur un bouton qui exécute ma requête. L'enregistrement #1 disparaît de la 1ière table pour être dans la 2ième table.

    Hé cé beau et ça semble facile, cependant et malgré un cours en Access(2003) que j'ai suivi ça fait 2 ans de ça, j'ai oublié comment on fait. Ouais tu parles d'une mémoire.

    En cherchant sur Developpez.com, je suis tombé sur ça :

    Comment insérer des enregistrements de la table1 dans la table2, puis effacer ces enregistrements de la table1
    auteur : Maxence HUBICHE
    Testé sous Access 2000 :

    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
    Sub Sauvegarder() 
     
        'Création des 2 recordsets 
        Dim myRS1 As New ADODB.Recordset 
        Dim myRS2 As New ADODB.Recordset 
     
        myRS1.Open "Table1", CurrentProject.Connection, adOpenDynamic, adLockOptimistic 
        myRS2.Open "Table2", CurrentProject.Connection, adOpenDynamic, adLockOptimistic 
     
        'Parcours du RS pour ajouter à table1 tout en supprimant de table2 
        Do Until myRS2.EOF 
            With myRS1 
                .AddNew Array("Champ1", "Champ2", "Champ3"), _
                              Array(myRS2("Alpha"), myRS2("Beta"), myRS2("Gamma")) 
                .Update 
            End With 
     
           myRS2.Delete 
           myRS2.MoveNext 
        Loop 
     
        'Fermeture des recordsets 
        myRS1.Close 
        myRS2.Close 
     
        Set myRS1 = Nothing 
        Set myRS2 = Nothing 
     
    End Sub
    Il mentionne pour Access 2000, alors j'ignore si pour 2007 ça fonctionnera de cette façon et si oui, je ne comprends plus plus trop ce que tout ça veut dire.

    Aussi, dois-je mentionner tous mes champs dans la ligne .AddNew Array et celle du dessous ? Ma table n'a pas seulement 3 champs, mais une 20taine environ.

    Un peu aide serait le bienvenue.

    Merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    Bonjour et bienvenu,
    Le code posté de notre ami Maxence, concerne le transfert de l’ensemble de la table, ce qui, si j’ai bien compris n’est pas ta demande.
    Di tu veux transférer l’enregistrement en cours sélectionné dans ton formulaire :
    En principe on fait
    - Une requête Ajout avec comme critère de sélection un champ de ton formulaire/table en principe l’ID. cle primaire.
    - Une requête suppression avec même critère.
    Puis on exécute ces 2 requêtes en mettant le code suivant sur ton bouton « move » par exemple.
    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
    Private Sub MOVE_Click()
    On Error GoTo Err_MOVE_Click
        DoCmd.SetWarnings False 'suppression des messages ATTENTION !!
       'ajout
        Dim stDocName As String
     
        stDocName = "tblGames_RAjout"
        DoCmd.OpenQuery stDocName, acNormal, acEdit
        'suppression
     
        stDocName = "tblGames_RSupp"
     
        DoCmd.OpenQuery stDocName, acNormal, acEdit
     
    Exit_MOVE_Click:
        Exit Sub
     
    Err_MOVE_Click:
        MsgBox Err.Description
        Resume Exit_MOVE_Click
     
        DoCmd.SetWarnings True   ' on remet en marche les messages
     
    End Sub
    Autre code rien que du VBA. Mais je ne me souviens pas si cela marche sur toutes les versions, sur 2007 oui.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub MOVE_Click()
    DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdCut
    DoCmd.OpenTable "tblArchives"
    DoCmd.GoToRecord , , acNewRec
    DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdPaste
    DoCmd.RunCommand acCmdSaveRecord
    DoCmd.Close
     
     
    End Sub

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour Le Vieux,

    Merci de m'avoir répondu.

    Pour éviter de foirer ma base de donnée, j'en ai créer une pour faire des tests avec les 2 exemples (donc 2 boutons) que tu m'a donné.

    Avec le code VBA(2ième encadré), ça fonctionne bien (quoique j'ai des messages d'avertissement et que l'écran flash en cliquant sur le bouton) sur MS Access 2007.

    Pour celui avec les requêtes, j'ai dû galérer dans Access 2007 pour savoir comment et où aller pour faire des requête de type Ajout et Supp. Je croyais que c'était avec l'assistant des requêtes et ben non. Mais, j'ai fini par trouver et en le faisant comme tu l'écris(avec quelques modifications), c'est tous les enregistrements qui se déplacent dans l'autre table parce que j'avais pas défini de critère spécifique à aucun champs.

    En regardant dans un livre sur Access 2003 que j'utilisais dans mon cours. j'ai trouvé de l'information sur les requêtes Ajout et Suppression, mais dans les exemples, le critère utilisé est connu d'avance et est inscrit comme cela "In(1002;1003)", 1002 et 1003 étant le code d'ID de 2 clients.
    Avec une telle requête, c'est facile de savoir que ça veut dire : " Prends les clients dont l'ID est 1002 et 1003 de la table1 et ajoute-les dans la table2".

    Mais dans mon cas, je ne sais pas d'avance l'ID de l'enregistrement. Le critère utilisé doit représenter l'enregistrement actif dans le formulaire. En utilisant le champ ID(ex : ID_Clients ou ID_Games), je cherches un critère qui veut dire "enregistrement actif". L'aide de Microsoft dans Access est limité.

    Il y a une autre possibilité, celle où j'ajoute un champs de type Yes/NO dans la table (et le formulaire). Si je veux archiver l'enregistrement correspondant à ce jeu(dans ma bdd) , je coche/sélectionne "OUI". Dans ma requête, j'utilise ce champ et je prends comme critère "True" donc, tous les enregistrements dont la valeur de ce champ est "True"(Oui) sont déplacés dans la table 2. Ça fonctionnerait, même si le procédé est légèrement différent (On passe de l'enregistrement actif à tous les enregistrements ayant une valeur spécifique à un champs.)

    En tout cas, je continue de chercher et je te remercie pour ta réponse.

  4. #4
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonsoir,

    Avec le code VBA(2ième encadré), ça fonctionne bien (quoique j'ai des messages d'avertissement)
    Tu encadres ton code avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DoCmd.SetWarnings False
    'Code
    'Code
    '...
    DoCmd.SetWarnings True
    Voir l'aide pour plus d'info sur la méthode "SetWarnings"

    Domi2

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Domi2 Voir le message
    Bonsoir,



    Tu encadres ton code avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DoCmd.SetWarnings False
    'Code
    'Code
    '...
    DoCmd.SetWarnings True
    Voir l'aide pour plus d'info sur la méthode "SetWarnings"

    Domi2

    Oui, j'ai compris par après en testant son code avec les requêtes. J'ai changé le "False" par "True" pour voir ce que ça faisait et c'est là que j'ai compris à quoi servait le "SetWarnings". Même si ses commentaires étaient clairs.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bon voilà ce que j'ai fait,

    En réfléchissant, je me suis rendu compte qu'il valait mieux dans mon cas, de pouvoir déplacer plusieurs enregistrement ou un seul sans se trouver sur l'enregistrement en question.

    Dans une grosse base de donnée, déplacer un à un les enregistrements révèle de la folie pure et beaucoup de perte de temps.

    Tant qu'à utiliser un critère facile d'utilisation, j'ai créer un champs "Échangé" de type Oui/Non dans les 2 tables et le formulaire. Quand j'échange un jeu quelconque, j'ai juste à cocher la case dans le form. Ensuite avec mes requête et avec le critère "Oui" du champ "Échangé", la procédure est plus simple et elle fonctionne bien quand je clique sur le bouton "MOVE".

    Un petit mais, c'est qu'après avoir réaliser les requêtes, la base de donnée ne se réactualise pas automatiquement. C'est tannant de le faire manuellement chaque fois, alors j'ai dû ajouté au code du bouton 2 lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Actualise la base de donnée
     Me.Requery
    J'avais essayé avec la méthode "Refresh", mais ça ne marche pas. Alors en faisant, F1, j'ai vu qu'il fallait utiliser la méthode "Requery" dans mon cas.

    Aussi, j'avais essayé de faire apparaître un message personnalisé en cas d'erreur ou quand il n'y a pas d'enregistrement à déplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Err_cmdArchives_Click:
        MsgBox "Il n'y a aucun enregistrement à archiver." 'Affiche un message en cas d'erreur
        Resume Exit_cmdArchives_Click
    Mais ça ne fonctionne pas, pourtant dans un autre bouton test, le code est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Msgbox_Click()
    MsgBox "Hello"
    End Sub

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    bonjour,
    ci-joint une base test, pour t'y retrouver au niveau requête, en mode création dans access 2007 tout est prévu.
    voir sous l'indice ID le recours au formulaire pour avoir l'indice en cours.

    excuses j'ai zappé ton dernier post, j'étais resté sur le précédent, je laisse celui-là mais dés que je peux je regarde de plus prés celui-ci.

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par LE VIEUX Voir le message
    bonjour,
    ci-joint une base test, pour t'y retrouver au niveau requête, en mode création dans access 2007 tout est prévu.
    voir sous l'indice ID le recours au formulaire pour avoir l'indice en cours.

    excuses j'ai zappé ton dernier post, j'étais resté sur le précédent, je laisse celui-là mais dés que je peux je regarde de plus prés celui-ci.
    Bonjour,

    J'ai vu ton dernier post et je suppose que le critère que tu as mis à l'ID pour les requête signifie "l'enregistrement actif" ?

    Aussi dans mon cas, j'ai ajouté cette ligne de code après l'exécution des 2 requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Réactualise la base de donnée
    Me.Requery
    Car sans ça, à chaque fois que je me trouve sur un enregistrement et que j'exécute les requêtes, les champs de celui-ci indique "#Supprimé" ce qui est tannant car obliger d'actualiser manuellement.

    En tout cas, je te remercie beaucoup de ton aide. Je vais garder ton petit fichier et en cas d'oubli, je l'aurai sous la main.

Discussions similaires

  1. Copier enregistrement d'une table à une autre
    Par Gringo59 dans le forum VBA Access
    Réponses: 5
    Dernier message: 04/06/2008, 16h18
  2. retirer les enregistrements présents dans une autre table
    Par Didine1801 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 16/10/2007, 16h07
  3. Copier un enregistrement d'une table à une autre ?
    Par cadman dans le forum Access
    Réponses: 5
    Dernier message: 21/02/2007, 13h44
  4. [Debutant] Appel d'enregistrement issu d'une autre table
    Par grasduslip dans le forum Access
    Réponses: 15
    Dernier message: 21/07/2006, 16h34
  5. Réponses: 2
    Dernier message: 23/06/2006, 14h36

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