Pb code vba

bonjour a tous,
voila je suis censée ecrire un code vba qui doit me permettre qd je rentre les coordonnée d'un client (nom, prenom, code postal) de me renvoyer automatiquement son numero de client s'il existe dans ma base de donnée ou sinon lui cree un nouveau numero. (base de donnée access 2000 formulaire de saisie access)
voici mon code mais ya un bug ca ne marche pas et comme je suis nulle en vb je capte pas mon erreur

Private Sub num_client_Click()

Dim i As Integer
Dim rst As Recordset
Dim Intx As Integer

Intx = DCount("*", "CLIENT")

If Intx > 0 Then

Set rst = rst.OpenRecordset("SELECT num_client FROM CLIENT WHERE nom = &zonenom.value& And prenom = &zoneprenom.Value&And code_postal = zonecode_postal..Value;")

Else
i = 1 + Intx
rst.Execute "INSERT INTO CLIENT ([num_client])VALUES('i');"

End If
End Sub

ya pas quelqun qui saurai ou ets le proleme????
Merci de votre aide

27 réponses

  • Votes
  • Date
  • Date décroissante
Résumé de la discussion

Question concerne un code VBA visant à interroger une base Access 2000 pour récupérer ou générer automatiquement le numéro client à partir des nom, prénom et code postal saisis. Des réponses suggèrent d'utiliser AddNew pour ajouter un enregistrement, ou d'ajuster OpenRecordset/CurrentDb.OpenRecordset et DCount avec des critères correctement concaténés pour vérifier l'existence du client dans la requête. Certains échanges expliquent la difficulté des chaînes de caractères lors de l'insertion et préconisent des approches comme CurrentDb.OpenRecordset avec des requêtes SQL correctement formulées et DoCmd.RunSQL. En pratique, plusieurs échanges concluent que l'emploi du recordset et AddNew résout le problème, tandis que des constructions avec DoCmd.RunSQL ou des erreurs de citation restent sources d'échecs et de débogage.

Bobot (l’IA à votre service)
  1. oki je les ai ces bibliotheque mais ca ne marche pas qd meme
    1. Bonjour ! as-tu résolu ton probleme d'argument non valide" ?

      car j'ai le même avec vba

      du jour au lendemain, mon programme n'a plus voulu passer sur mon rs.update. ou bien il y passe mais n'enregistre que quelques lignes dans ma table avant de me mettre ce message...
      au secours !!

      merci d'avance !!!
  2. ;-)

    Si mon code ne fonctionne pas, c'est que cela vient d'ailleurs... As-tu bien vérifié si tu as les bibliothèques en ligne ?

    Outils/Références (dans l'éditeur VBA)...

    Tu dois avoir les :

    Visual Basic For Applications
    Microsoft Access 10 Object Libray
    OLE automation

    Minimum....

    Ensuite, si tu a les ADO / DAO, c'est bien aussi...

    ;-)

    ;-)
    1. non en fait je me suis gourée ton code ne marchait pas ca enregidtrait dans la table car j avais rajouté moi meme le champ qui manquai et du coup comme le formulaire etait rempli ca enregistrait dans les table
      la je t avoue que je seche aussi
      1. je suis nulle mais ya des limites, je les ai rajouté les dim....
        1. ;-)

          Bin, si tu as mis les Dim as RecordSet, que les noms des tables sont bons, et qu'il n'y as pas d'erreur de syntaxe, comment tu expliques que mon petit bout de code fonctionne et pas le tien ? Là, je sèche... Les lignes sont identiques, le foncionnement idem... Et VBA ne choisit pas arbitrairement quelles lignes vont être bonnes...

          ;-)
      2. ;-)


        "si si toi tu m a donne

        Set LaTable = CurrentDb.OpenRecordset("NomDeTaTable", dbopentable)"


        => Oui, ça, c'est mon code ;-)

        "mais j en a besoin pour troi table

        Set CLIENT = CurrentDb.OpenRecordset("CLIENT", dbopentable)
        Set PEC = CurrentDb.OpenRecordset("PEC", dbopentable)
        Set DESCRIPTIF = CurrentDb.OpenRecordset("DESCRIPTIF", dbopentable)"


        Donc, ça, c'est TON code ;-) Ne me dis pas qu'il y a un problème avec MON code quand toi tu écris de nouvelles lignes ;-)

        Moi, avant la ligne Set xxx, j'avais mis des Dim, que je ne vois pas ici... Si mon code fonctionne, poses toi la question pourquoi tes lignes à toi ne fonctionnent pas, ce qu'il y a de différent...

        ;-)
        1. si si toi tu m a donne

          Set LaTable = CurrentDb.OpenRecordset("NomDeTaTable", dbopentable)

          mais j en a besoin pour troi table

          Set CLIENT = CurrentDb.OpenRecordset("CLIENT", dbopentable)
          Set PEC = CurrentDb.OpenRecordset("PEC", dbopentable)
          Set DESCRIPTIF = CurrentDb.OpenRecordset("DESCRIPTIF", dbopentable)

          ????
          1. coucou, ya petit probleme dans ton code:

            Set CLIENT = CurrentDb.OpenRecordset("CLIENT", dbopentable)
            Set PEC = CurrentDb.OpenRecordset("PEC", dbopentable)
            Set DESCRIPTIF = CurrentDb.OpenRecordset("DESCRIPTIF", dbopentable)

            ca me dit argument non valide

            et pour mon
            Set rst = CurrentDb.OpenRecordset("SELECT num_client FROM CLIENT WHERE CLIENT!nom = nom And CLIENT!prenom = prenom And CLIENT!code_postal = code_postal")
            ca me dit erreur de type 13, non compatible

            pq? mais pq????
            1. ;-)

              C'est pas mon code, ça... ;-)

              ;-)
          2. a oui je comprend pas pourquoi dans mon formulaire ya un champ:ref qui correspond a une requete sql mais ca ca ne s'enregistre pas dans la table qui est source de ce champs???
            1. couocu White Fang
              en effet et je t en remercie mille fois, ton code marche ca enregistre tout dans les table et ca les met a jour, :-)

              mais la premiere partie de mon code ne marche pas, le DCount... ne veut pas fonctionner les criteres bloque le dcount g essaye differente syntaxe mais ca bug a chaque fois ca me met que c'est =0 alors que dans ma table client g un client qui a les meme coordonnee ?????

              merci encore pour ton aide
              1. ;-)

                Bon, avant d'expliquer pourquoi cela ne fonctionne pas, as-tu essayé avec le code que je t'ai donné ? Juste pour voir si ton problème est résolu ?

                ;-)
                1. ;-)

                  Pour le AddNew, voilà une petite idée de code, à rajouter/adapter à ton code, surtout pour remplacer ton DoCmd :

                  Dim LaTable As Recordset
                  'Ca, c'est la vraie table, que l'on ouvre...
                  Set LaTable = CurrentDb.OpenRecordset("NomDeTaTable", dbopentable)
                  'On passe en mode ajout d'enregistrement (enregistrement vide)
                  LaTable.AddNew
                  'On remplit les champs
                  LaTable!NomDuChamp1 = ContrôleFormulaire1 'les objets de ton formulaire (ex : Nom)
                  LaTable!NomDuChamp2 = ContrôleFormulaire2 '...etc...
                  '... etc....
                  'Et on met la table à jour (si pas update, enregistrement pas écrit...)
                  LaTable.Update
                  'On referme la table et le tour est joué... ;-)
                  LaTable.Close

                  ;-)
                  1. lol, en effet je m enmele les pinceaux mais cela est du au fait que c'est la premiere fois que je fais du vba et que je capte plus parce que ca devient complique pour moi!!! lol
                    alors je vais essyer d expliquer mon probleme car je pense avoir compris ce qui se passe (je pense):

                    Dim rst As Recordset
                    Dim Intx As Integer
                    Dim i As Integer
                    Intx = DCount("*", "CLIENT", [nom] = " & zonenom.value & " And [prenom] = " & zoneprenom.value & " And [code_postal] = " & [zonecode_postal.value] & ")

                    If Intx > 0 Then

                    Set rst = CurrentDb.Openrecordset("SELECT num_client FROM CLIENT WHERE nom = " & zonenom.Value & " And prenom = " & zoneprenom.Value & " And code_postal = " & zonecode_postal.Value & " ")

                    Else
                    Inty = DCount("*", "CLIENT")
                    i = 1 + Inty
                    DoCmd.RunSQL (" INSERT INTO CLIENT ([num_client]) VALUES ('" & i & "');")

                    End If

                    1) en affat mon premier dcount... est=0 alors qu il y ai ou pas dans ma table client des client ou pas qui correspondent aux conditions

                    2) admettons que les coordonnées saisie dans le formulaire ne correspondent a aucun client de la table alors ca me renvoie a la 2eme partie de mon code et la la requete marche mais ca m insert la valeur de 'i' dans la table client mais pas le reste des donnees saisie dans le formulaire/ca ne m affiche pas non plus dans le formulaire au champ num_client la valeur de 'i'

                    Mais pourquoi?????
                    je pete un plomb et par contre je capte pas ton histoire de addnews ce que tu veux dire???
                    merci de ton aide!!!
                    1. ;-)

                      Perso, je pense que tu pars dans tous les sens et que tu te mélanges les crayons... Prends pas mal, c'est gentil ;-)

                      Apparemment, tu as une boîte qui contient des valeurs de Nom, prénom, blablabla... Et que si cela n'existe pas dans la table, tu dois en créer un nouveau...

                      Pour moi, c'est simple !! (pour moi !) : Ton recordset, tu le fais basé sur tes zones de texte (si y'a, y'auras des enregistrements), et donc, ton Dcount, tu le bases sur le recordset, et si c'est = à 0, tu fais un AddNew... Logique... Non ?

                      ;-)
                      1. ;-)

                        Ce qu'il te faut savoir : Quand tu passes en mode "debug", l'interpréteur "évalue" chaque ligne avant de l'exécuter, et te passe la ligne en "inverse vidéo" jaune.. A chaque fois que tu appuie sur la touche F8, la ligne est exécutée, ligne à ligne...

                        Donc, quand tu veux effectuer un "debug" de ton appli, tu appuies à chaque fois sur la touche F8 pour exécuter chaque ligne...

                        Si tu veux repasser en mode normal, d'exécution, de fonctionnement de ton code, tu appuies sur la touche F5 et l'exécution se poursuit...

                        La phase suivante étant d'utiliser les événements...

                        Si une ligne "reste" en jaune et que l'exécutiion du code "bloque" à ce niveau, c'est qu'il y a un problème de "logique" (pas de syntaxe), d'objet, de fonction inconnue...

                        ;-)
                        1. alors oki j ai reecrit la ligne de code

                          Intx = DCount("*", "CLIENT", [nom] = " & zonenom.value & " And [prenom] = " & zoneprenom.value & " And [code_postal] = [nom] = " & zonecode_postal.value & ")

                          cette ligne ne semble plus buger mais maintenant c celle la

                          DoCmd.RunSQL " INSERT INTO CLIENT ([num_client] VALUES ('" & i & "'); "
                          elle est devient surlignee jaune qd je lance le debogage
                          que ce passe t il?????
                          aidez moi svp
                          1. oui, j ai essayé avec DoCmd.RunSQL ce qui me donne comme code :

                            Private Sub num_client_Click()
                            Dim i As Integer
                            Dim rst As Recordset
                            Dim Intx As Integer

                            Intx = DCount("*", "CLIENT", " nom = " & zonenom.Value & " And prenom = " & zoneprenom.Value & " And code_postal = " & zonecode_postal.Value & " ")

                            If Intx > 0 Then

                            Set rst = CurrentDb.Openrecordset("SELECT num_client FROM CLIENT WHERE nom = " & zonenom.Value & " And prenom = " & zoneprenom.Value & " And code_postal = " & zonecode_postal.Value & " ")

                            Else
                            i = 1 + Intx

                            DoCmd.RunSQL "INSERT INTO CLIENT ([num_client])VALUES('" & i & "');"

                            End If
                            End Sub

                            Mais le pb est la ligne:
                            Intx = DCount("*", "CLIENT", " nom = " & zonenom.Value & " And prenom = " & zoneprenom.Value & " And code_postal = " & zonecode_postal.Value & " ")

                            j ai essye avec le where et sans mais elle reste surligné en jaune???
                            1. ;-)

                              Bin, cela veut dire que cela n'existe pas (execute) pour l'objet rst....

                              ;-)

                              Maintenant, si tu veut rajouter un enregistrement à ta table, tu a la méthode AddNew : Rst.Addnew

                              ;-)
                              1. ca me met pour

                                VerifTexte="INSERT INTO CLIENT ([num_client])VALUES('" &i &"');"
                                rst.Execute VerifTexte

                                "membre de methode ou de donnée introuvable"

                                je crois pas que access 2000 ne reconnaisse cette fonction????
                                • 1
                                • 2