[ACCESS][VB] Envoyer variable dans champ

Bonjour,

J'ai un petit problème dans access, j'aimerais pouvoir envoyer la valeur d'une variable dans le champ d'une table qui n'est pas liée avec le formulaire!

Je travaille avec VB et je n'ai pas trouvé le moyen de le faire...

Pouvez-vous m'aider!? merci d'avance!

9 réponses

  • Votes
  • Date
  • Date décroissante
  1. Hello,

    Alors merci beaucoup! c'est super il comprend les variables! mais j'ai encore un petit problème, les champ reste vide...

    alors voilà mon code:

      SQL = "UPDATE Daten " & _
                                 "SET Daten." & strFeld & " = " & Modultest.sngErgebnis & " " & _
                                 "WHERE Daten." & strFeld & " = 0;"
    
                DoCmd.RunSQL SQL


    Daten est ma table, strFeld est le nom du champ généré, Modultest... et une var numérique
    et j'aimerais en fait que le champ strFeld de ma table Daten soit rempli avec Modultest.sngergebnis...

    Voilà encore merci beaucoup!!

    SubNoX
    1. Modérateur
      strFeld est un nom ou une variable ? si c'est un nom, pas la peine de le mettre en & "...
      Modultest.sngErgebnis est une variable ou un champ dans le formulaire ? si c'est un champ dans le formulaire, il faut en récupérer la valeur : Modultest.sngErgebnis.value
  2. Alors strFeld est bien une variable, qui contient le nom du champ

    pour modultest.sngErgebnis, c'est une variable aussi qui contient un chiffre

    mais seulement à l'exécution tout se passe bien, en revanche après quand j'ouvre la table pour contrôler les valeur des champs créer sont vide...

                SQL = "UPDATE Daten " & _
                      "SET Daten." & strFeld & " = " & Modultest.sngErgebnis & " " & _
                      "WHERE Daten." & strFeld & " =0"


    Peut-être une question pour être sur d'avoir bien compris:
    set Daten. strFeld = c'est bien pour dire de mettre la valeur de Modultest.sngErgebnis dans le champ strFeld de la table Daten!?
    avec la condition que le champ strFeld = 0

    c'est bien juste!?

    Merci pour tout
    1. Alors tout à l'air nickel!

      sauf que juste avant la msgBox il m'avertit que j'envisage de mettre à jour 0 champ...

      je comprend pas trop parce qu'en fait le champ que je vais mettre à jour à bien la valeur 0 à la base...

      et la msgBox affiche ca: UPDATE Daten SET Daten.AM_0107 = 12 WHERE Daten.AM_0107 = 0

      et au fait quand je supprime la condition WHERE il me met une erreur...

      Merci en tout cas!!
      1. Modérateur
        Ton champ 0107, il est décrit comment dans la table : num, chaine ?

        et au fait quand je supprime la condition WHERE il me met une erreur...

        laquelle ?
      2. Il est en Num mais je l'ai aussi testé en text...

        Non la c'est bon pas prob pour le WHERE, j'avais oublié sur la ligne d'au dessus d'enlever le &_ à la fin...

        Mais j'ai vraiment du mal à comprendre pourquoi il ne veut pas me mettre à jour mes champs...
    2. Alors après tout ce temps je suis quand même arriver à qqch...

      J'ai étudié le code DAO et j'ai opté pour ca plutôt que le SQL du fait que j'ai toute une table à mettre à jour et pas seulement un champ...

      En revanche j'ai aussi eu quelques souci car j'ai fait une fonction publique dans mon code:

      Public Function RenommeChamp(oBaseDeDonnees As DAO.Database, strNomTable As String, strAncienNom As String, strNouveauNom As String) As Boolean
      
      
      Dim Tbl As DAO.TableDef
      'Mettre la table dans Tbl
      Set Tbl = oBaseDeDonnees.TableDefs(strNomTable)
      'Modifier l'ancienne valeur du champ avec la nouvelle
      Tbl.Fields(strAncienNom).DefaultValue = strNouveauNom
      'Mettre RenommeChamp à True
      RenommeChamp = True
      
      Exit Function
      
      End Function
      


      et il se trouve que j'ai du utiliser "DefaultValue" pour modifier la valeur car quand je mettais Value j'obtenais une erreur... je suppose que le tout est lié

      Mais en tout cas je te remercie beaucoup pour ton aide!

      Si ca ne t'ennui pas trop, j'aurais en revanche encore besoin de ton aide! :-)

      Je crée ici un champ dans ma Table "Daten"

      Set oDb = CurrentDb
                      Set oTbl = oDb.TableDefs("Daten")
                      Set fldNeu = oTbl.CreateField(strFeld, dbDouble)
                      
                      oTbl.Fields.Append fldNeu
                      
                      oTbl.Fields.Refresh


      Et en fait mon petit problème est le suivant: j'aimerais faire un test au début de la déclaration pour voir si le champ que je vais créer (ici strFeld(variable text)) existe déjà ou pas
      Peut-être avec Dlookup!?

      Merci d'avance
      1. Modérateur
        Avec ce code-là, tu pourras énumérer les champs de la table daten :
        Dim Tb As TableDef
        Dim Fld
        For Each Tb In CurrentDb.TableDefs
            'MsgBox Tb.Name
            If Tb.Name = "Daten" Then
                For Each Fld In Tb.Fields
                    MsgBox Fld.Name
                Next
            End If
        Next
        Cependant, je voudrais te mettre en garde contre une difficulté qui pourrait t'apparaître plus tard, lors de la gestion de ta base.
        Il me semble que tu veuilles créer des champs nommés par le couple mois/année. Ce n'est pas une très bonne solution, car si tu envisages d'en créer beaucoup, ACCESS ne suivra pas toujours (255 champs maxi pour une table), sans compter la difficulté à créer des formulaires basés sur cette table dont la définition changera souvent...
        Il serait plus judicieux de créer une autre table qui contiendrait les données mois/jour avec une clé primaire qui serait justement ces mois/jour et une relation avec la table principale.
      2. Voilà j'y suis enfin arriver!!!

        C'est vrai que si une table ne peut en contenir que 255 c'est limite, mais j'ai calculé ca devrait allé! ;-)

        Cependant j'ai pas bien compris l'idée de mois/jour!? parce qu'en fait le AM_0107 : AM = nom d'un secteur et 0107 = janvier 2007

        Et sinon puis-je encore te poser une question!?

        J'aurais besoin de parcourir une liste champ et faire passer à chaque enregistrement un test (if ...)
        comment puis-je faire!?

        Merci pour toute ton aide précieuse!
      3. Modérateur
        @SubNoXCependant j'ai pas bien compris l'idée de mois/jour!? parce qu'en fait le AM_0107 : AM = nom d'un secteur et 0107 = janvier 2007
        C'est tellement plus simple de créer une autre table qui va contenir ces données plutôt que de les mettre dans une table dont on va modifier la structure tous les mois... En plus, c'est contraire aux bonnes pratiques des bases de données relationnelles.

        J'aurais besoin de parcourir une liste champ et faire passer à chaque enregistrement un test (if ...)
        comment puis-je faire!?

        Tu veux parcourir des enregistrements et faire des tests sur des champs ?
        Il faut utiliser un recordset.
      4. @SubNoXOui c'est vrai que ca sera certainement plus simple... mais le truc c'est que je crée ces champs et ces tables automatiquement en fontion de 2 dates (date début / date fin) et je ne les connais pas à l'avance, de plus je cherche à faire que les tables et les champs se créent eux-mêmes par le formulaire car le programme ne doit plus être touché ou modifier une fois utiliser et les dates (enfin date de fin peut aller jusqu'à 2020, voir plus...) donc je voulais pas m'amuser à créer toutes les tables en fonction des années
        Voilà pourquoi je les crée automatiquement!

        Alors le truc c'est que j'ai un formulaire dans lequel il y a une liste champ qui contient les données d'une table, j'aimerais pouvoir parcourir cette liste champ depuis un autre formulaire pour pouvoir effectuer un test sur chaque enregistement "ligne" de la liste.

        Voilà, mais le truc c'est que j'ai aucune idée comment m'y prendre...

        avec un recordset!? je vois pas bien comment!?

        Merci
      5. Modérateur
        @SubNoXVoilà pourquoi je les crée automatiquement!
        Ils peuvent être créés tout automatiquement dans une autre table...

        Pour parcourir un recordset :
        Dim rs As DAO.Recordset
        Dim fl
        Set rs = CurrentDb.OpenRecordset("A", dbOpenTable, dbReadOnly)
        rs.MoveFirst
        While Not rs.EOF
            For Each fl In rs.Fields
                MsgBox fl.Name & " " & fl.Value
            Next
            rs.MoveNext
        Wend
        rs.Close
        
        Celui-ci parcours toute la table A, et affiche chaque nom de champ avec sa valeur, libre à toi d'insérer des tests où tu le souhaites... Si toutefois, le source de ton formulaire n'est pas une table mais une requête manuelle, tu modifies par la ligne
        Set rs = CurrentDb.OpenRecordset("select toto from A")
        --
        A+ Blux
         "Les cons, ça ose tout.
        C'est même à ça qu'on les reconnait"
    3. Modérateur
      Salut,

      tu peux passer par une requête UPDATE à lancer via DoCmd.RunSQL...
      1. Ok j'ai essayé de voir ce que je pouvais faire avec cette fonction, mais je débute un access et j'aurais une autre question...

        Alors avant cette commande, il faut que j'implante dans une variable un code en SQL à passé!? c'est bien ca?

        Du style:

        Dim SQL As String

        SQL = "UPDATE Employees " & _
        "SET Employees.Title = 'Regional Sales Manager' " & _
        "WHERE Employees.Title = 'Sales Manager'"

        DoCmd.RunSQL SQL

        Mais ca c'est l'exemple de l'aide et ca m'aide pas beaucoup je dois dire...

        J'espère que tu pourras m'aider merci et désolé pour mon niveau...
      2. Modérateur
        Un truc comme ça devrait aller :
        Dim SQL As String
        SQL = "UPDATE Employees " & _
        "SET Employees.Title = '" & zone_du_formulaire.value & "' " & _
        "WHERE Employees.Title = 'Sales Manager'"
        DoCmd.RunSQL SQL 
        --
        A+ Blux
         "Les cons, ça ose tout.
        C'est même à ça qu'on les reconnait"
      3. @bluxOk je te remercie, je m'en suis sorti, mais maintenant j'ai un autre problème...

        C'est que en fait ici j'ai des variables...

        Dim SQL As String
        SQL = "UPDATE Employees " & _
        "SET Employees.Title = Variable' " & _
        "WHERE Employees.Title = Variable"
        DoCmd.RunSQL SQL


        Je ne sais pas si c'est quand même possible de le faire, mais je l'espère car je suis obligé de travailler avec des variables...

        Merci beaucoup en tout cas!
      4. Modérateur
        @bluxSi mais il faut sortir les variables de la chaine pour indiquer à ACCESS de les interpréter avant d'envoyer la chaine à l'exécution :
        Dim SQL As String
        SQL = "UPDATE Employees " & _
        "SET Employees.Title = '" &Variable & "'" & _
        "WHERE Employees.Title = '" & Variable & "';"
        DoCmd.RunSQL SQL
        Quand on teste une valeur chaine, il faut mettre des quotes ('), par contre, il n'en faut pas pour du numérique :
        "SET Employees.Title = " & Variable & _
        --
        A+ Blux
         "Les cons, ça ose tout.
        C'est même à ça qu'on les reconnait"
    4. Modérateur
      mais seulement à l'exécution tout se passe bien
      S'il y a une erreur de SQL, ACCESS ne dit rien !

      C'est seulement, s'il y a une erreur à l'exécution qu'il plante (ligne en double, clé non renseignée...)

      Fais un affichage de SQL, pour voir... (msgbox SQL)
      1. Modérateur
        sauf que juste avant la msgBox il m'avertit que j'envisage de mettre à jour 0 champ...
        Il ne dit rien d'autre : violation de clé, de contraintes... ?

        Ton champ est lié à un autre par une relation ?
        1. Modérateur
          Si tu crées une requête dans ACCESS avec le contenu de ta msgbox et que tu la lances, il dit quoi ?