Insertion de ligne

Résolu
Bonjour,
j'ai 1 formulaire qui me permet d'enregistrer les données du personnel d'un département de notre structure ce formulaire est basé sur une table nommé DT_personnel_MAG

un autre formulaire qui me permet d'enregistrer les données du personnel d'un autre département de notre structure ce formulaire est basé sur une table nommé DT_personnel_EL

je pouvais cumuler ces 2 données sur la même table, mais je préfère les gérer séparément pour d'autres raisons. mais il se trouve aussi parfois qu'on affecte un salarié d'un département à l'autre.

sur les formulaires principaux, j'ai mis des filtres pour faciliter les recherches,
sur les sous formulaires j'ai mis des boutons d'actions conditionnées par des codes vba que j'ai trouvé sur ce forum pour permettre de modifier et supprimer un enregistrement.

maintenant, je souhaite ajouter un autre bouton d'action sur les sous formulaire pour pouvoir affecter un salarié de la table DT_personnel_MAG à la table DT_personnel_EL.

la table DT_personnel_MAG et la table DT_personnel_EL ont les même colonnes exemple: id_agent; nom_prenom; matricule.

Configuration: Windows / Chrome 85.0.4183.121

9 réponses

  1. Bonjour,

    tu peux exécuter une requête pour copier du genre :
    dim sql as string
     
    sql = "Insert into DT_personnel_EL (id_agent, nom_prenom, matricule...) Values Select * from DT_personnel_MAG where id_agent = " & valeur & ";"
    


    Et si besoin, ensuite supprimer l'enregistrement dans la table DT_personnel_MAG.

    a+
    0
    1. Merci pour la promptitude de votre intervention, cependant, je souhaite que vous m'expliquez un peu plus en détails comment utiliser ce code. parce-que là je galère.
      0
  2. Bonsoir,

    ça dépend du comment tu souhaites "sélectionner" l'enregistrement à déplacer dans le sous-form...

    Ceci déterminera le "valeur" que j'ai mis en exemple dans le code.

    Ensuite, il suffira de mettre ce code sur le bouton qui permettra de copier :
    dim requetesqlcopie as string
     
    requetesqlcopie = "Insert into DT_personnel_EL (id_agent, nom_prenom, matricule...) Values Select * from DT_personnel_MAG where id_agent = " & valeur & ";"
    
    docmd.runsql requetesqlcopie
    
    


    et celui ci pour supprimer

    dim requetesqlsupp as string
     
    requetesqlsupp = "DELETE FROM DT_personnel_MAG where id_agent = " & valeur & ";"
    
    docmd.runsql requetesqlsupp
    
    
    0
    1. Bonjour RV71
      la sélection de l'enregistrement se fait en fonction du 3ème bouton du sous formulaire. voire architecture
      0
  3. Quel bouton ?

    Et surtout, quel code il y a t'il sur ce bouton ?

    A+
    0
    1. sur l'architecture vous avez peut être remarquez qu'il y'a 3 boutons une corbeille, un bouton modifié et le dernier que j'ai inséré pour coller le code que vous venez de me donner

      Private Sub Commande60_Click()
      Dim requetesqlcopie As String
       
      requetesqlcopie = "Insert into DT_Personnels_MAG (Nom__Prenom, Matricule, ecole, Date_de_Naissance, Sex, Date-Embauche, Fonction_ID_FK, Qualification_ID_FK, Structure_ID_FK, Catégorie_ID_FK, Corps_ID_FK, Cadre_ID_FK, Position_Admin_ID_FK, Section_ID_FK2, Type_Contrat_ID_FK, Durée_Contrat, P_date, F_date) Values Select * from DT_Personnels_EL where Agent_id = " & Valeur & ";"
      End Sub
      
      0
  4. J'ai vu 3 bouton, mais je ne peux pas deviner à quoi ils servaient...

    Là dans le code que tu as mis sur le bouton, il ne se passe rien, tu n'exécutes rien, tu affectes une chaine de caractères à une variable...

    Le id_agent est où ??? Il correspond à quel champ de la table et quel controle du sous-form ??

    A+
    0
    1. Bonjour RV71

      après plusieurs essaies, je reviens encore vers vous.

      je vous envois ci-dessous le code du bouton supprimé, peut être que cela vous permettrez de m'aider

      Private Sub Commande52_Click()
      On Error Resume Next
         Nom__Prenom = Me.Nom__Prenom
         If IsNull(Nom__Prenom) Then Nom__Prenom = ""
         '
         Matricule = Me.Matricule
         If IsNull(Matricule) Then Matricule = ""
         '
         Mat_Id = Me.Agent_ID
         If IsNull(Mat_Id) Then Mat_Id = 0
         '
         Cadre_ID_FK = Me.Cadre_ID_FK
         If IsNull(Cadre_ID_FK) Then Cadre_ID_FK = ""
         '
         Corps_ID_FK = Me.Corps_ID_FK
         If IsNull(Corps_ID_FK) Then Corps_ID_FK = ""
         '
         Catégorie_ID_FK = Me.Catégorie_ID_FK
         If IsNull(Catégorie_ID_FK) Then Catégorie_ID_FK = ""
         '
         Fonction_ID_FK = Me.Fonction_ID_FK
         If IsNull(Fonction_ID_FK) Then Fonction_ID_FK = ""
         '
         Structure_ID_FK = Me.Structure_ID_FK
         If IsNull(Structure_ID_FK) Then Structure_ID_FK = ""
         '
         Section_ID_FK2 = Me.Section_ID_FK2
         If IsNull(Section_ID_FK2) Then Section_ID_FK2 = ""
         '
         Message = "Souhaitez-vous supprimer l'agent " & Nom__Prenom & " (" & Trim(Str(Mat_Id)) & ") ?" & Chr(13) & Chr(10) & Chr(13) & Chr(10) & "Attention, la suppression d'un agent entraîne également" & Chr(13) & Chr(10) & "la supression de tous les mouvements et historiques associés !"
         '
         reponse = MsgBox(Message, vbYesNo + vbQuestion, "Suppression Agent")
         '
      Select Case reponse
         Case 6
             DoCmd.SetWarnings False
             DoCmd.RunSQL "DELETE DT_Personnels.* FROM DT_Personnels WHERE (((DT_Personnels.Agent_Id)= " & Mat_Id & "));"
             DoCmd.RefreshRecord
             DoCmd.Requery Me.Nom__Prenom
             '
             DoCmd.SetWarnings True
         End Select
         '
      End Sub
      0
    2. @begounouvoici celui du bouton modifié

      Private Sub Commande51_Click()
       DoCmd.OpenForm "Agents_Ajout_Modif", acNormal, , "[Agent_id] = " & Me.Agent_ID, acFormEdit, acDialog
      End Sub
      0
    3. @begounoutous les 2 marchent parfaitement
      0
    4. @begounouJe relis, et je vois que le nom de la table n'est plus comme annoncé au départ DT_personnel_MAG mais DT_personnels..

      Pour être certain, peux tu donner le nom exact des tables ainsi que de l'ensemble de leurs champs ?
      0
  5. Bonjour,

    Tu as uniquement à copier le code de ton bouton supprimer et le modifier uniquement au niveau de la requête finale, ce qui donnerait :
    Private Sub Commande60_Click()
    On Error Resume Next
       Nom__Prenom = Me.Nom__Prenom
       If IsNull(Nom__Prenom) Then Nom__Prenom = ""
       '
       Matricule = Me.Matricule
       If IsNull(Matricule) Then Matricule = ""
       '
       Mat_Id = Me.Agent_ID
       If IsNull(Mat_Id) Then Mat_Id = 0
       '
       Cadre_ID_FK = Me.Cadre_ID_FK
       If IsNull(Cadre_ID_FK) Then Cadre_ID_FK = ""
       '
       Corps_ID_FK = Me.Corps_ID_FK
       If IsNull(Corps_ID_FK) Then Corps_ID_FK = ""
       '
       Catégorie_ID_FK = Me.Catégorie_ID_FK
       If IsNull(Catégorie_ID_FK) Then Catégorie_ID_FK = ""
       '
       Fonction_ID_FK = Me.Fonction_ID_FK
       If IsNull(Fonction_ID_FK) Then Fonction_ID_FK = ""
       '
       Structure_ID_FK = Me.Structure_ID_FK
       If IsNull(Structure_ID_FK) Then Structure_ID_FK = ""
       '
       Section_ID_FK2 = Me.Section_ID_FK2
       If IsNull(Section_ID_FK2) Then Section_ID_FK2 = ""
       '
       Message = "Souhaitez-vous Déplacer l'agent " & Nom__Prenom & " (" & Trim(Str(Mat_Id)) & ") ?"
       '
       reponse = MsgBox(Message, vbYesNo + vbQuestion, "Déplacement Agent")
       '
    Select Case reponse
       Case 6
    dim requetesqlcopie as string
    requetesqlcopie = "Insert into DT_Personnels_MAG (Nom__Prenom, Matricule, ecole, Date_de_Naissance, Sex, Date-Embauche, Fonction_ID_FK, Qualification_ID_FK, Structure_ID_FK, Catégorie_ID_FK, Corps_ID_FK, Cadre_ID_FK, Position_Admin_ID_FK, Section_ID_FK2, Type_Contrat_ID_FK, Durée_Contrat, P_date, F_date) Values Select * from DT_Personnels_EL where Agent_id = " & Me.Agent_ID & ";"
           DoCmd.SetWarnings False
           DoCmd.RunSQL requetesqlcopie 'on copie
    
    DoCmd.RunSQL "DELETE DT_Personnels.* FROM DT_Personnels WHERE (((DT_Personnels.Agent_Id)= " & Mat_Id & "));"
    
           DoCmd.RefreshRecord
           DoCmd.Requery Me.Nom__Prenom
           '
           DoCmd.SetWarnings True
       End Select
       '
    End Sub
    
    0
    1. oui effectivement j'ai modifié le nom de la table DT_Personnels_EL c'est donc DT_Personnels au lieu de DT_Personnels_EL.

      DT_Personnels_MAG existe toujours

      https://www.cjoint.com/c/JIDk0NW6n2k

      le bouton déplacer est testé sur le formulaire qui s'ouvre par le premier onglé du formulaire principal ce formulaire est basé sur la table DT_Personnels
      0
    2. @begounoucliquez sur rechercher pour apparaitre les quelques données que j'ai laissé
      0
  6. Je regarde,
    mais tes tables n'ont pas les mêmes champs, il y a un champ tranche_age en plus dans la table dt_personnels
    0
    1. L'autre souci, est que tu as également un champ type 'pièce jointe' dans les tables, il faut donc passer en revue dans la requête l'ensemble des champs...

      Edit : en fait, je crois que sql ne veut pas avec ce type de champ...
      Il va falloir passer par du dao
      0
      1. Donc, as-tu réellement besoin de ce champ type pièce jointe ?
        Ne peux-tu pas le modifier en type texte long de sorte à avoir le chemin complet du fichier ?
        Ca simplifierait grandement, et surtout, éviterait de tout modifier si un jour tu devras insérer un nouveau champ dans les tables concernées...

        A te lire
        0
        1. je peux bien sûr modifier le champs PJ car je n'ai rien enregistré encore dedans. Le Champs tranche d'âge en réalité c'était juste pour enregistré une situation qu'on m'a demandé si non sa peut être supprimer aussi
          0
      2. Donc si tu as exactement les même champs dans les 2 tables et sans champ type pièce jointe, le code suivant fonctionne sans problème
        Private Sub Commande60_Click()
           Nom__Prenom = Me.Nom__Prenom
           If IsNull(Nom__Prenom) Then Nom__Prenom = ""
           '
           Matricule = Me.Matricule
           If IsNull(Matricule) Then Matricule = ""
           '
           Mat_Id = Me.Agent_ID
           If IsNull(Mat_Id) Then Mat_Id = 0
           '
           Cadre_ID_FK = Me.Cadre_ID_FK
           If IsNull(Cadre_ID_FK) Then Cadre_ID_FK = ""
           '
           Corps_ID_FK = Me.Corps_ID_FK
           If IsNull(Corps_ID_FK) Then Corps_ID_FK = ""
           '
           Catégorie_ID_FK = Me.Catégorie_ID_FK
           If IsNull(Catégorie_ID_FK) Then Catégorie_ID_FK = ""
           '
           Fonction_ID_FK = Me.Fonction_ID_FK
           If IsNull(Fonction_ID_FK) Then Fonction_ID_FK = ""
           '
           Structure_ID_FK = Me.Structure_ID_FK
           If IsNull(Structure_ID_FK) Then Structure_ID_FK = ""
           '
           Section_ID_FK2 = Me.Section_ID_FK2
           If IsNull(Section_ID_FK2) Then Section_ID_FK2 = ""
           '
           Message = "Souhaitez-vous Déplacer l'agent " & Nom__Prenom & " (" & Trim(Str(Mat_Id)) & ") ?"
           '
           reponse = MsgBox(Message, vbYesNo + vbQuestion, "Déplacement Agent")
           '
        Select Case reponse
           Case 6
        
        DoCmd.SetWarnings False
        Dim requetesqlcopie As String
        requetesqlcopie = "insert into dt_personnels_mag select * from dt_personnels where Agent_id = " & Me.Agent_ID & ";"
        
        DoCmd.RunSQL requetesqlcopie 'on copie
        
        DoCmd.RunSQL "DELETE DT_Personnels.* FROM DT_Personnels WHERE (((DT_Personnels.Agent_Id)= " & Mat_Id & "));"
        
        
               '
               DoCmd.SetWarnings True
           End Select
           '
        End Sub
        0
        1. excusez moi du retard. je viens de tester et ça marche bien

          merci pour votre aide
          0