Requetes sous access

Signaler
Messages postés
104
Date d'inscription
samedi 12 mars 2005
Statut
Membre
Dernière intervention
30 avril 2007
-
 ba3ouda -
Bonjour, j'aimerais savoir, si c'est possible, lorsque l'on a pas trouvé de champs dans une requete select, si c'est possible d'ajouter une valeur dans une table. Plus concrètement, voilà mon code :

          sql = "select trig from utilisateur where nom=" & Var1
          Set rs = db.OpenRecordset(sql)
     'Si on a trouvé on fait un update
          Var1 = rs.Fields("trig")          sql "update fiche set trig_dem '" & Var1 & "' where titre = '" & Replace(Fichier, "'", "''") & "'"
   'Sinon un insert
.....
          db.Execute sql, dbFailOnError
          db.Close

Le problème c'est que lorsque l'on fait un rs.OpenRecordset, cela plante car la requetee ne trouve rien. Merci pour votre aide.

28 réponses

Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
14
Salut,

Déjà ta première requête devrait être comme cela :
sql "select trig from utilisateur where nomW " & Var1 & ";"
A+
Exploreur

 
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
14
Euh...pardon...mauvais copier/coller...c'est where nom et non where nomW

A+
Exploreur

 
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
14
Salut,

Autre chose, je pense que ce lien te sera utile comme il est pour moi...

A+
Exploreur

 
Messages postés
104
Date d'inscription
samedi 12 mars 2005
Statut
Membre
Dernière intervention
30 avril 2007

Je n'ai pas un problème pour créer la requete insert mais pour savoir si l'on peu tester avant de faire un open.recordset si la requete va trouver un champ corrspondant. Et pour le ";" il n'est pas obligatoire sous vba
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
3
En fait, ce que tu cherches a faire, c'est tester la presence d'un champ. Si il est present  -> Update, sinon, requete INSERT.

Et c'est au niveau du test que tu as un pb. Est-bien ca ?

PS: au passage, ca m'interesse egalement de savoir comment on fait (j'ai pas trop essayé), donc si tu trouves postes le résultat. Merci.
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
14
Ok, Mais il n'empêche qu'il faut fermer ta requêtequi encadre ta variable, non ?

Excuse, je n'avais pas vu que tu était en VBA...

Essaye cela, si cela ne fonctionne pas. ... tampis...:

Dim Sql As String


Sql = "select trig from utilisateur where nom=" & var1 & ";"


    ' Execution requête
     db.Execute (Sql)
    
    ' Ferme le recordset
     db.Close
    
       ' Boucle
        While Not rs.EOF
       
          ' Condition si vrai
           If var1 = rs.fielsq("trig") Then
              ' Update table               Sql "update fiche set trig_dem '" & var1 & "' where titre = '" & Replace(Fichier, "'", "''") & "'"
               db.Execute (Sql)
               db.Close
           End If
        Wend 


A+
Exploreur


 
Messages postés
104
Date d'inscription
samedi 12 mars 2005
Statut
Membre
Dernière intervention
30 avril 2007

Voila mon code, mais ça ne marche toujours pas :

          'création de la fiche si non existante          sql "select titre from fiche where titre '" & Var & "'"
          db.Execute (sql)
          db.Close
          k = 0
          While Not db.EOF
             k = k + 1
          Wend
          If db.EOF Then
             sql = "insert into fiche (titre) values (Var)"
             db.Execute (sql)
             db.Close
          End If
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
14
Salut,

C'est quoi k ? As-tu une erreur ? Si oui quel est sa définition, svp...
Et je pense que ta boucle While est mal placée...

A+
Exploreur

 
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
3
Tu ne m'a pas repondu, car si tu veux je viens de faire un code qui affiche tous les champs d'une table si ca t'interesse
Messages postés
104
Date d'inscription
samedi 12 mars 2005
Statut
Membre
Dernière intervention
30 avril 2007

Mon erreur est sur db.execute : "Erreur 3065, impossible d'executer une requete de selection"
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
14
Salut,

Attend...attend....

Var = donc une saisie dans ton aplli...

Avant d'enregistrer donc une nouvelle var dans ta table, tu veux vérifier si elle existe ou pas dans ta table..si elle existe tu n'enregistres pas, et si elle n'existe pas tu enregistres , est-ce bien cela ?

Car update c'est pour mettre à jours un enregistrement, non? (Ton premier post)
Et maintenant tu fais INSERT INTO...

Je pige plus rien, moi...lol...

A+
Exploreur

 
Messages postés
104
Date d'inscription
samedi 12 mars 2005
Statut
Membre
Dernière intervention
30 avril 2007

Oui c'est ça que je veux faire.
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
3
OK, mais ma solution ne passe pas par des requetes. Et te permet une a une de voir les champs de ta table. apres a toi de faire le tests.

pour pouvoir utiliser ADOX, il faut rajouter dans les références (Microsoft ADO Ext. 2.8 for DLL and SECURITY), projet -> référence je croit

Dim bdd As New ADOX.Catalog
Dim champ As ADOX.Column

For Each champ In bdd.Tables("Nom_de_la_table").Columns
    msgbox champ
Next
Messages postés
104
Date d'inscription
samedi 12 mars 2005
Statut
Membre
Dernière intervention
30 avril 2007

Il faut initialiser bdd non? et champ?
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
3
Heu excuse moi,j'ai oublier de mettre un truc:

Dim bdd As New ADOX.Catalog
Dim champ As ADOX.Column

Set bdd.ActiveConnection = Ta_connexion   'currentproject.connection si ton code est dans la meme base que la table

For Each champ In bdd.Tables("Nom_de_la_table").Columns
    msgbox champ
Next

tu remplaces Ta_connexion  et  Nom_de_la_table  par ce qu'il faut et ca devrait fonctionner.

bdd represnent l'ensemble de tes tables et champ te permet de cibler un champ en particulier. Mais remplace et regarde apres comment si ca fonctionne.
Messages postés
104
Date d'inscription
samedi 12 mars 2005
Statut
Membre
Dernière intervention
30 avril 2007

Merci, je n'ai plus d'erreur. Je vais voir si ça marche
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
14
Salut,

En faite en y repenssant un peu plus, il te suffit de dire dans ta table, que tu ne veux pas de doublon...De ce fait quand tu va vouloire enregistrer une donnée qui exite, cela va te retourné un numéro d'erreur comme quoi les doublons ne sont pas accépter et tu n'as plus cas gérer ce numéro d'erreur...Une solution simple...

A+
Exploreur

 
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
3
Je sais pas pourquoi tu parles de doublons (j'ai peut etre louper un truc) mai moi je me fies a cela

"Je n'ai pas un problème pour créer la requete insert mais pour savoir si l'on peu tester avant de faire un open.recordset si la requete va trouver un champ corrspondant"

Cependant ton idee d'erreur est sympa aussi, il y a une solution qui consiste a faire une requete

select champ_problematique from table

et de gerer l'erreur si le champ n'existe pas.

Mais le truc c'est sa phrase "avant de faire un open.recordset" qui m'a conduit a cela. De mon coté je lui propose quelque chose mais s'il y a mieux et plus rapide, allons y.
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
14
Salut Nicko11,

Ce que je veux dire, c'est qu'il vaut mieux créer dans sa table une clé primaire, une fois celle-ci créée, il peut interdire les doublons...De là il n'a plus que la gestion de l'erreur a faire , car quand il va faire un enregistrement access va voir dessuite si "Toto" existe, et il ne pourra pas enregistrer...

A+
Exploreur

 
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
3
A ok, mais en fait, il me semble bien qu'il s'agisse d'un champ et pas d'un enregistrement car sinon, en effet, mon code a rien car il travaille avec les champs