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 le contenu d'un champ d'une table vers un champ d'une autre table. [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Vendeur
    Inscrit en
    Juin 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Vendeur

    Informations forums :
    Inscription : Juin 2019
    Messages : 17
    Points : 14
    Points
    14
    Par défaut Copier le contenu d'un champ d'une table vers un champ d'une autre table.
    Bonjour à tous,

    J’ai un formulaire (basé sur une table « tblTaxa ») dont 9 champs (Ordo, Subordo, Superfamilia, Familia, Subfamilia, Tribus, Subtribus, Genus & Subgenus) sont en liste déroulante en cascade.
    Le contenu de chaque liste déroulante (sauf la première) est basé sur le choix qui est fait dans la liste précédente.
    J’ai donc 9 tables annexes (une pour chaque champ) avec :
    - une clé primaire (ex : idGenus)
    - un champ texte (ex : Genus)
    - un champ numérique en liste déroulante basée sur la table précédente (ex : ici tblSubtribus) pour « lier » le nom encodé au nom dont il dépend dans la table précédente.

    Sur chacun des champs du formulaire (sauf le premier) j’utilise ce code pour arriver au résultat voulu:

    (ici sur le champ Genus)

    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 Genus_AfterUpdate()
    Dim lngIDCat   As Long
    Dim SQL        As String
     
      If Not IsNumeric(Me!Genus) Then Exit Sub
      lngIDCat = Me!Genus
      SQL = "SELECT idSubgenus, Subgenus, idGenus FROM tblSubgenus WHERE idGenus =" & lngIDCat & " ORDER BY Subgenus"
      Subgenus.RowSource = SQL
      Subgenus = True
      Subgenus.SetFocus
      Subgenus.Dropdown
     
    End Sub
    Jusque là tout fonctionne à merveille…
    Pour tester, j’ai déjà encodé une centaine d’enregistrements et je les ai liés dans chacune des tables concernées mais, à terme, la bdd devrait comprendre plusieurs milliers d’enregistrements et je me vois mal faire les liens manuellement pour chaque nouvel enregistrement.
    J’ai donc ajouté une procédure événementielle « Sur absence dans liste »:

    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
    Private Sub Genus_NotInList(NewData As String, Response As Integer)
    Dim rst As DAO.Recordset
     
      If MsgBox("The Genus [" & _
        NewData & "] is not currently in the list. Do you want to add it?", _
        vbQuestion + vbYesNo) = vbYes Then
          Set rst = CurrentDb.OpenRecordset("tblGenus")
          rst.AddNew
            rst!Genus = NewData
          rst.Update
          rst.Close
          Set rst = Nothing
    End If
     
    Response = acDataErrAdded
    End Sub
    Cela fonctionne, le nom encodé s’ajoute bien à la liste mais (logique) le lien avec le choix précédent ne se fait pas automatiquement et je dois le faire manuellement (ce qui revient donc au même que sans le NotInList).

    Serait-il donc possible (et si oui comment), une fois que le nouveau nom est ajouté à la liste, de copier automatiquement le contenu du champ précédent (qui s’affiche correctement dans la table de base dans la table source) dans le champ numérique que j’utilise pour faire le lien ?

    Exemple:
    Si j’encode un nouveau nom dans le champ « Genus » de mon formulaire, il s’ajoute automatiquement à la liste (dans ma table « tblGenus ») avec la procédure sur NotInList.
    Ensuite, il copie le contenu du champ « Subtribus » (de la table de base « tblTaxa ») dans le champ numérique « idSubtribus » de la table « tblGenus ».

    Un grand merci d’avance pour votre aide!

  2. #2
    Rédacteur/Modérateur
    Avatar de Jeannot45
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2004
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 871
    Points : 8 489
    Points
    8 489
    Par défaut


    Tu peux ajouter dans procéduer NotInList, une séquence SQL INSERT INTO ... qui procède à l'ajout de l'information souhaitée dans la table cible
    Suivi d'une commande RunSQL
    Jeannot

    Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., Sources VBA

    Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Bonjour,

    Essaie ce 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
    Private Sub Genus_NotInList(NewData As String, Response As Integer)
    Dim rst As DAO.Recordset
     
      If MsgBox("The Genus [" & _
            NewData & "] is not currently in the list. Do you want to add it?", _
            vbQuestion + vbYesNo) = vbYes Then
            Set rst = CurrentDb.OpenRecordset("tblGenus")
            rst.AddNew
            rst!Genus = NewData
            rst.Update
            rst.Close
            Set rst = Nothing
            Response = acDataErrAdded
     Else
            Response = acDataErrContinue
            Genus.Undo
     End If
     
    End Sub
    Cordialement.
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  4. #4
    Membre à l'essai
    Homme Profil pro
    Vendeur
    Inscrit en
    Juin 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Vendeur

    Informations forums :
    Inscription : Juin 2019
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Bonjour et merci à vous deux pour vos réponses !

    J’ai trouvé assez rapidement comment faire une requête d’ajout et j’espère ne pas me tromper avec celle-ci:
    Je dois donc copier le champ « Subtribus » de la table « tblTAXA » dans le champ « idSubtribus » de la table « tblGenus »

    INSERT INTO tblGenus ( idSubtribus )
    SELECT tblTAXA.Subtribus
    FROM tblTAXA

    Par contre, cela fait plusieurs heures que je cherche sans succès comment le mettre en SQL.
    J’ai lu et relu pas mal de discussions et d’aides sur divers forums ou sites mais je trouve tellement de choses différentes que je suis complètement perdu. Aucune des solutions que j’ai testées ne fonctionnaient pour moi ou alors (probablement même, vu mon niveau de connaissance d’Access…) je fais une ou plusieurs erreurs.

    Merci Mandresy pour le code mais cela ne fonctionne pas. En fait je ne trouve nulle part dans ce code quelque chose qui permette de copier le contenu d’un champ vers un autre.

  5. #5
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 670
    Points : 2 489
    Points
    2 489
    Par défaut
    Pour les instructions SQL, voici un 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
    Sub test_Insertion()
        Dim sSql As String
     
        'Insertion sans contrainte
        sSql = "INSERT INTO TableTest1 ( ID, Description ) " & _
            "SELECT InputTable.ID, InputTable.Personne " & _
            "FROM InputTable;"
     
        'Insertion avec contrainte
        sSql = "INSERT INTO TableTest1 ( ID, Description ) " & _
            "SELECT InputTable.ID, InputTable.Personne " & _
            "FROM InputTable WHERE InputTable.ID>10;"
     
        DoCmd.RunSQL sSql
     
    End Sub

  6. #6
    Membre à l'essai
    Homme Profil pro
    Vendeur
    Inscrit en
    Juin 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Vendeur

    Informations forums :
    Inscription : Juin 2019
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Bonjour et merci beaucoup pour ce code! Mais j’ai toujours un souci…

    En fait (mea culpa) lors des tentatives d’hier, à chaque fois que j’avais une erreur->Débogage je ne regardais pas le message d’erreur et je me concentrais sur la ligne surlignée en jaune dans le débogage et c’était toujours la dernière ligne (ici : DoCmd.RunSQL sSql).

    J’imagine que d’autres problèmes que j’ai rencontrés hier étaient également dus à une question de compatibilité du type de données dans les champs à « copier/coller ». Mes 2 champs étaient bien en numérique mais, pour plus de commodité, j’avais utilisé la méthode expliquée ici : (2-2-1. 2ème point) pour avoir le nom qui apparaisse plutôt que le n° d’identification.
    https://argyronet.developpez.com/off...ectitemlistAB/

    Pour le moment, j’ai réglé ce problème (momentanément) en ne prenant que le n° d’identification en compte.

    Donc (maintenant que je pense enfin à regarder le message d’erreur avant de cliquer sur débogage...) j’ai ce message :
    Citation Envoyé par Access
    Erreur d'exécution 3075
    Erreur de syntaxe (opérateur absent) dans l'expression « tblTAXA.SubtribusFROM tblTAXA »
    Est-ce possible que ce soit dû au fait que je vais chercher le champ à copier dans une table (tblTaxa ), et que ce champ est lui-même une liste déroulante basée sur une autre table (dans ce cas ci tblSubtribus)?
    Si c’est le cas, j’imagine qu’il faudrait actualiser ma tblTaxa avant d’y copier le champ?

    Bonne journée et encore merci à ceux qui prennent de leur temps pour m’aider!

  7. #7
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 670
    Points : 2 489
    Points
    2 489
    Par défaut
    Il manque juste un espace entre "tblTAXA.Subtribus" et "FROM tblTAXA" dans l'expression "tblTAXA.SubtribusFROM tblTAXA"

  8. #8
    Membre à l'essai
    Homme Profil pro
    Vendeur
    Inscrit en
    Juin 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Vendeur

    Informations forums :
    Inscription : Juin 2019
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Merci beaucoup!
    J’avais vu qu’il n’y avait pas d’espace dans l’expression indiquée dans le message d’erreur, mais je ne pensais pas que c’était dû à un espace manquant dans les 3 lignes du code (espace pourtant bien présent dans l’exemple que tu m’avais donné).

    Mais, maintenant que ce problème est réglé, j’ai un autre problème, j’ai le message :
    Citation Envoyé par Access
    Volus allez ajouter 142 lignes
    (le nombre total de mes enregistrements actuels) et, si je clique sur « oui » (je voulais tester), j’ai un message me disant
    Citation Envoyé par Access
    Access ne peut pas ajouter tous les enregistrements de la requête ajout…à la suite de violations des règles de validation
    Je suppose que c’est parce que ma requête n’est pas ciblée sur l’enregistrement en cours?

  9. #9
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 670
    Points : 2 489
    Points
    2 489
    Par défaut
    C'est que l'un des enregistrements est mis à jour alors que la clef primaire n'en est pas incrémentée; Access n'accepte pas la valeur "Null" ou une valeur double dans une clef primaire.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Vendeur
    Inscrit en
    Juin 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Vendeur

    Informations forums :
    Inscription : Juin 2019
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Merci! Ne trouvant pas d'où vient le problème, je vais abandonner mon idée de départ et abandonner le "Insert Into" pour ce champ.
    Encore merci à ceux qui m'ont apporté leur aide

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 29/06/2009, 11h46
  2. Réponses: 3
    Dernier message: 26/04/2008, 17h58
  3. Copier le contenu d'un champ dans 2 tables
    Par Bonosvox dans le forum VBA Access
    Réponses: 2
    Dernier message: 19/03/2008, 13h08
  4. Copier le contenu d'un Edit dans une nouvelle Form
    Par breizh44 dans le forum Débuter
    Réponses: 16
    Dernier message: 20/02/2008, 22h54
  5. Réponses: 1
    Dernier message: 12/05/2007, 10h26

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