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

  1. #1
    Membre à l'essai
    Femme Profil pro
    Responsable de service informatique
    Inscrit en
    juillet 2018
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : juillet 2018
    Messages : 39
    Points : 17
    Points
    17

    Par défaut Dissociation d'un champ en deux.

    Bonjour,

    Voilà, on m'a demandé de dissocier un champ en deux champs distinct : l'un qui enregistre lors de la création de l'enregistrement, et l'un qui enregistre les modifications qui lui sont apportées.
    Le problème c'est que le bouton "enregistrer" renvoi à ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub Enregistrer_Click()
     
    [Date mise à jour] = Now()
    DoCmd.RunCommand acCmdSaveRecord
    DoCmd.RefreshRecord
     
    End Sub
    J'ai tenté d'ajouter dans ce code ces quelques lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If ([Propositions].[Validation1] = "") Then
    [Propositions].[Validation1] = [Ménages].[Validation]
    End If
    Sachant que Ménages.Validation est la donnée qui existait de base, qui s'enregistre à la création par le biais d'un menu déroulant que l'on sauvegarde avec le bouton "Enregistrer", et que Proposition.Validation1 est le champ dans lequel je veux enregistrer UNIQUEMENT la première valeur sauvegardée (j'ai créé le champ dans la table Propositions car il n'existait pas).

    Par le biais de if, j'avais dans l'idée de faire que si le champ de propositions est vide, ça enregistre celui de la table ménage. Ainsi, seul le premier enregistrement sera conservé, puisque les fois suivantes où l'on effectuera la mise à jour, il ne sera pas vide. Mais peut être que je me complique la tête pour rien.

    Peut être qu'une requête SQL peut permettre celà ?

    Merci d'avance pour votre aide,

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    12 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 12 483
    Points : 19 037
    Points
    19 037

    Par défaut

    Bonjour.

    Et qu'est-ce qui ne fonctionne pas avec ton code ?

    1. Tu as une erreur ? Laquelle ? Ou ?
    2. Pas la donnees attendue ? Tu attendais quoi ? Tu as eu quoi ?


    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Responsable de service informatique
    Inscrit en
    juillet 2018
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : juillet 2018
    Messages : 39
    Points : 17
    Points
    17

    Par défaut

    Bonjour,

    alors, j'ai un message d'erreur (438) lorsque je clique sur enregistrer :

    Nom : erreur 438.jpg
Affichages : 50
Taille : 14,7 Ko

    et le mode débogage me surligne la première ligne de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If ([Propositions].[Validation1] = "") Then
    Je vais essayer ce matin de passer par une requête.. Mais si vous avez une idée de ce qui cloche, je veux bien votre aide

  4. #4
    Membre à l'essai
    Femme Profil pro
    Responsable de service informatique
    Inscrit en
    juillet 2018
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : juillet 2018
    Messages : 39
    Points : 17
    Points
    17

    Par défaut

    Je rencontre le même problème d'erreur 438 lorsque j'ai essayé ce code ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     If IsEmpty([Propositions].[Validation1]) = True Then
          [Propositions].[Validation1] = [Ménages].[Validation]
    End If
    Via requête, je n'arrive pas plus à aboutir à des résultats.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Responsable de service informatique
    Inscrit en
    juillet 2018
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : juillet 2018
    Messages : 39
    Points : 17
    Points
    17

    Par défaut

    Je continue de chercher, j'ai essayé de créer une requête, mais mon code n'est pas bon :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO [Propositions] ( Validation1 ) AS Ménages.[Validation] 
    WHERE  [Propositions] ( Validation1 ) IS NULL
    SELECT Ménages.ID_ménage, [Propositions].[Validation], Ménages.[Validation] 
    FROM Ménages INNER JOIN [Propositions] ON Ménages.ID_ménage = [Propositions].ID_ménage;

    Vraiment personne pour aider ?

  6. #6
    Expert confirmé
    Avatar de tee_grandbois
    Homme Profil pro
    retraité mais encore activé
    Inscrit en
    novembre 2004
    Messages
    3 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité mais encore activé

    Informations forums :
    Inscription : novembre 2004
    Messages : 3 215
    Points : 5 518
    Points
    5 518

    Par défaut

    bonsoir,
    si personne ne t'aide c'est probablement parce que personne n'a compris l'énoncé de ton problème (j'en fait partie).
    Si c'était un problème de syntaxe dans le code, je pense que quelqu'un t'aurait donné une solution depuis longtemps car il ne semble vraiment pas compliqué. Le souci est qu'on ne peut pas corriger un code si on ne comprend pas ce qu'il fait.

    Essaie de réexpliquer en donnant un exemple concret, en postant la structure des tables, quelles relations entre les 2, que contient le formulaire, quel est la source de données ...

  7. #7
    Membre à l'essai
    Femme Profil pro
    Responsable de service informatique
    Inscrit en
    juillet 2018
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : juillet 2018
    Messages : 39
    Points : 17
    Points
    17

    Par défaut

    Citation Envoyé par tee_grandbois Voir le message
    bonsoir,
    si personne ne t'aide c'est probablement parce que personne n'a compris l'énoncé de ton problème (j'en fait partie).
    Si c'était un problème de syntaxe dans le code, je pense que quelqu'un t'aurait donné une solution depuis longtemps car il ne semble vraiment pas compliqué. Le souci est qu'on ne peut pas corriger un code si on ne comprend pas ce qu'il fait.

    Essaie de réexpliquer en donnant un exemple concret, en postant la structure des tables, quelles relations entre les 2, que contient le formulaire, quel est la source de données ...
    Bonjour,
    Oui je vais essayer de réexpliquer.
    J'ai un formulaire dont une des données est une liste déroulante qui s'enregistre avec un bouton "enregistrer" du formulaire. Mais chaque fois que l'on change la donnée de cette liste déroulante puis qu'on enregistre, celle ci est écrasée. Je voudrais garder en mémoire uniquement le premier choix enregistré de ce champ, dans une autre table et un autre champ que celui de base.

    exemple : Champ 1 Table 1 -> donnée Valeur4.
    (après modification : ) Champ 1 Table 1 -> Valeur2.

    Ce que j'aimerai, c'est avoir Champ 1 Table 2 -> Valeur4
    et qu'après modification, la valeur 4 ne soit pas modifiée elle.

    C'est pourquoi j'ai essayé de faire des requêtes ou rajouter un code VBA en relation avec le bouton enregistrer, dont l'idée était que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF (Table2.Champ1 = Null (ou isEmpty)) THEN (Table2.Champ1 = Table1.Champ1) ELSE 'ne rien faire'
    Mais comme j'ai énormément de mal avec Access, à comprendre la base créée par une autre personne, je n'arrive pas à comprendre comment faire. :/

    Merci en tout cas, j'espère avoir été plus compréhensible

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    12 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 12 483
    Points : 19 037
    Points
    19 037

    Par défaut

    Bonjour.

    Voici une procedure qui fait ce que tu décris et j'ai supposé que ce 1er choix n'est pas unique mais dépend de l'enregistrement courant.

    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
    public sub EnregistrerPremierChoix(prmClefEnr as long, prmChoix as string)
       dim db as dao.database:set db=currentdb
       dim r as dao.recordset: set r=db.openrecordset("Table 2", dbOpenDynaset)
       call r.findfirst("[ClefEnr]=" &  prmClefEnr) 'Trouve l'enregistrement de mémorisation
     
       if r.nomatch then
             r.addnew
             r![TonChamp]=Null
          else
             r.edit
       end if
     
       if isnull(r![TonChamp]) then
          'Ne met à jour que si il n'est pas renseigné (= Null)
          r![TomChamp]=prmChoix
       end if
     
       r.update
       r.close: set r=nothing
       db.close: set db=nothing
    end sub
    Tu peux appeller cette procédure sur l'evenement d'enregistrement du formulaire.

    Mais personnellement, plutôt que de mettre le champ dans une autre table, je créerai un champ dans la table 1 et j'y copierai la valeur.
    Ca simplifie grandement le problème.

    Dans le code associé à l'événement sur MAJ du champ de choix.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if isnull(me.memChoix) then
       me.MemChoix=me.Choix
    end if
    Et ce sera plus facile a récupérer aussi.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  9. #9
    Membre à l'essai
    Femme Profil pro
    Responsable de service informatique
    Inscrit en
    juillet 2018
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : juillet 2018
    Messages : 39
    Points : 17
    Points
    17

    Par défaut

    Merci marot_r pour ta réponse !!
    Je ne comprends pas bien ton code, je n'arrive pas à voir quand celui ci prend la valeur du champ de la table 1 (Ménages.Validation) pour le mettre dans la table 2 (Propositions.Validation1).
    J'ai modifié les choses suivantes :

    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
    public sub EnregistrerPremierChoix(prmClefEnr as long, prmChoix as string)
       dim db as dao.database:set db=currentdb
       dim r as dao.recordset: set r=db.openrecordset("Propositions", dbOpenDynaset)
       call r.findfirst("[ClefEnr]=" &  prmClefEnr) 'Trouve l'enregistrement de mémorisation, je dois mettre l'ID de la table Ménages ? qui est repris dans la Table Propositions ?
     
       if r.nomatch then
             r.addnew
             r![Validation1]=Null
          else
             r.edit
       end if
     
       if isnull(r![Validation1]) then
          'Ne met à jour que si il n'est pas renseigné (= Null)
          r![Validation1]=prmChoix
       end if
     
       r.update
       r.close: set r=nothing
       db.close: set db=nothing
    end sub
    Pour la clé, je mets la clé qui est la même sur les deux tables je suppose ?
    Pour prmChoix, à quoi correspond il ? A mon champ Validation de la table Ménage ? (celui qui se modifie en écrasant l'enregistrement premier)

    Merci de ton aide !

  10. #10
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    12 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 12 483
    Points : 19 037
    Points
    19 037

    Par défaut

    Bonjour.

    • set r=db.openrecordset("Propositions", dbOpenDynaset), ce connecte à ta table de mémorisation.
    • prmChoix est bien la valeur que tu veux mémoriser de ta table [Ménage].
    • prmClefEnr devrait en effet être la même valeur que celle dans ta table principale.


    Mais comme je l'ai dit, puisque tu as, selon ce que j'ai compris, une relation 1 à 1, il serait beaucoup plus simple de mettre cette valeur dans la table [Ménage]. À priori, aJouter une table, juste pour mémoriser cette valeur n'a pas grand intérêt.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  11. #11
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    octobre 2012
    Messages
    1 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : octobre 2012
    Messages : 1 449
    Points : 2 635
    Points
    2 635

    Par défaut

    Bonjour Stigger, René, tee_grandbois,

    Si ton champ Table1.Champ1 est toujours renseigné, c'est à dire "Null interdit" tu peux passer par les "Data macros". Sur l'événement après insertion de la table 1 tu inscrits le résultat dans la table 2. Voici un exemple:Nom : DataMacro.PNG
Affichages : 3
Taille : 40,8 Ko

    Bonne journée
    si tout est OK, n'oubliez pas de cliquer sur

Discussions similaires

  1. Lier deux champs dans deux tables ?
    Par Olivierc dans le forum Access
    Réponses: 3
    Dernier message: 29/04/2006, 00h13
  2. Probleme de liaison de champs entre deux tables
    Par ept35 dans le forum PHP & MySQL
    Réponses: 23
    Dernier message: 16/12/2005, 17h34
  3. Sum de deux champs sur deux tables différentes
    Par kluh dans le forum Oracle
    Réponses: 11
    Dernier message: 29/09/2005, 19h21
  4. Comparaison entre deux champs de deux tables différentes
    Par liam81150 dans le forum Requêtes
    Réponses: 1
    Dernier message: 26/09/2005, 21h53
  5. [sql] afficher deux champs de deux tables sans jointure
    Par Hell dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/06/2005, 13h38

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