[VB6 + Access] Mettre à jour des champs d'une base de données [Résolu]

Signaler
Messages postés
62
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 décembre 2005
-
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
-
Bonjour,

J'aimerais savoir la synthaxe de programmation pour mettre à jour/modifier un champ d'une table d'une base de données Access 2002 car je ne sais pas du tout comment faire.

¤ Enoncé du projet ¤

J'aimerais donc récupérer une chaine que l'utilisateur entre dans une TextBox (nommé "txt_licence"). J'aimerais ensuite en cliquant sur un bouton mettre la base de donnée à jour en ajoutant le contenu de "txt_licence" dans une table nommé "Poste" pour le champ "Licence". Ce champ doit correspondre à la ligne du "CodePoste" concerné que l'utilisateur a choisi en cliquant sur une ListBox nommé "lst_poste", le champ "CodePoste" étant la clé primaire de la table "Poste".


Pour résumer on choisit donc dans le programme le CodePoste puis on entre une licence dans le txt_licence. A partir ce ces 2 éléments je veux mettre à jour le champ "Licence" de la table "Poste" pour le "CodePoste" concerné dans une base de données Access 2002 nommé "Gestionnaire de licence.mdb".

Quelqu'un pourrait-il me dire comment programmer ça sous VB6?

Message pour tof008: étant donné que tout le monde programme en ADO et me demande pourquoi j'utilise DAO (cf. Monsieur Gross ), je veux bien une réponse en ADO. Si j'ai pas programmé en ADO jusque là c'est parce que je ne sais pas comment ça marche mais bon, je crois que je vais m'y mettre donc commençons dès maintenant.

63 réponses

Messages postés
62
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 décembre 2005

Merci pour ta réponse mais ça je savais déjà. J'aurais voulu savoir si c'était possible de faire un elif (comme en php ou en bash linux, je sais plus) mais apparement c'est pas possible alors en fait j'ai fait tout simplement un Else if à l'ancienne :-) :
If txt_citrix "NON" Or txt_citrix "non" Or txt_citrix = "Non" Then RS.Open "update Poste set Poste.Citrix No where CodePoste '" & lst_poste.Text & "' ; ", cnx, adOpenDynamic, adLockOptimistic
Else If txt_citrix "OUI" Or txt_citrix "oui" Or txt_citrix = "Oui" Then RS.Open "update Poste set Poste.Citrix Yes where CodePoste '" & lst_poste.Text & "' ; ", cnx, adOpenDynamic, adLockOptimistic
Else
MsgBox ("Erreur")
txt_citrix = ""
End If
End If

Pour le "Or" j'avais trouvé que ça marchait avec cette synthaxe.
Par contre j'ai essayé la même chose avec le "Or" pour des "Case" mais ça ne fonctionne pas :-( ...
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
25
d'ailleurs au lieu de faire des or, tu pourrai mettre en majuscule les trois ' oui ' comme ca pas besoin de faire des 'or'. Il doit y avoir une fonction pour ca... Je vais voir ca!



(Si la réponse vous convient, appuyez sur réponse acceptée...)

Il y a plusieurs facon d'être con ,mais un con choisit toujours la pire
Messages postés
62
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 décembre 2005

Nan mais en fait, si je fais trois "Oui" différents c'est parec que c'est l'utilisateur lui-même qui rentre son texte, donc il peut écrire le oui de différentes manières possible d'où mes "Or".

J'ai désormais une autre question. Dans mon programme je dois faire une mise à jour d'un champ d'une table de ma base de données. Or pour que le prog sache quoi mettre dans ce champ je dois faire appel à 2 tables qui sont liés de ma base de données. N'ayant pas trouvé comment faire ça en une seule requête, j'aimerais faire cela en 2 requêtes. J'aimerais donc renvoyé le résultat de la 1ere requête dans une variable appelée "temp" mais je ne sais pas du tout comment faire au niveau de la synthaxe pour mettre le résultat d'une requête dans une variable (en ADO bien sûr). Peux-tu me dire comment faire ça?

Merci d'avance.
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
25
req.open "select * from tatable where tacondition, cnx, adopendynamic, adlockoptimistic
temp = rs![tonchamp]
voila pour la requqte...
Pour tes oui tu peux utiliser ucase & lcase qui te mettront ce que l'utilisateur entre en majuscules ou en minuscules... Au moment de la saisie, tu met ucase(text1.text) et ensuite il suffit que tu fasse un 'OUI' dans ton if... ca fluidifie ton code...



(Si la réponse vous convient, appuyez sur réponse acceptée...)

Il y a plusieurs facon d'être con ,mais un con choisit toujours la pire
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
25
tu peux aussi faire une requete imbriquée....
select * from tatable where tonchamp = (select.....) et ca te donnera ton résultat en une requete....
Voila, j'espere que ca t'aidera...



(Si la réponse vous convient, appuyez sur réponse acceptée...)

Il y a plusieurs facon d'être con ,mais un con choisit toujours la pire
Messages postés
62
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 décembre 2005

J'ai essayé ton idée avec Ucase et Lcase mais ça ne fonctionne pas. J'avais mis UCase(txt_citrix) juste avant le if et j'ai fais un point d'arrêt mais txt_citrix ne se mettait pas en mahuscule...
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
25
UCase("txt_citrix")
Ca devrait mieux marcher comme ca....J'ai fait une petite erreur de frappe...



(Si la réponse vous convient, appuyez sur réponse acceptée...)

Il y a plusieurs facon d'être con ,mais un con choisit toujours la pire
Messages postés
62
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 décembre 2005

Ca ne fonctionne toujours pas, c'est vraiment bizarre. Pour tester directement la fonction, j'ai crée un bouton qui quand je clique dessus à pour code:

UCase("txt_citrix")

Ca ne fonctionne pas du tout!! J'ai essayé avec UCase et LCase ainsi qu'avec des guillemmets et sans et ça ne change rien, le text ne devient pas en majuscule...

Sinon pour ma requête en 2 temps ça fonctionne. Voilà ce que j'ai écrit:

Private Sub cmd_majoff_Click()

Call Connexion(cnx)

Set req_ent = New Recordset
req_ent.Open "select CodeOffice from Office where Office.LibOffice = '" & cbx_office.Text & "'", cnx, adOpenDynamic, adLockOptimistic
temp = req_ent!CodeOffice
req_ent.MoveFirst
While req_ent.EOF = False
temp = req_ent!CodeOffice
req_ent.MoveNext
Wend
req_ent.Close req_ent.Open "update Poste set CodeOffice '" & temp & "' where CodePoste '" & lst_poste.Text & "'", cnx, adOpenDynamic, adLockOptimistic


End Sub

Pour ta suggestion de faire ça en une seule ligne de requête ça serait pas mal mais je vois pas comment faire avec un update... Je vois comment faire avec un select normal mais pas avec un update. Donc si jamais t'as le tps et que tu vois comment faire, peut-être que tu peux m'aider par rapport à ce que j'ai écris.

Merci tof008, le BOSS en VB6.

PS: mon tuteur était parti ce matin chez le médecin parce qu'il était un peu malade et aurait du revenir après mais finalement il est en arrêt pour aujourd'hui donc il n'est pas revenu ^-^. J'suis seul aujourd'hui :-).
Messages postés
62
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 décembre 2005

Ca ne fonctionne toujours pas, c'est vraiment bizarre. Pour tester directement la fonction, j'ai crée un bouton qui quand je clique dessus à pour code:

UCase("txt_citrix")

Ca ne fonctionne pas du tout!! J'ai essayé avec UCase et LCase ainsi qu'avec des guillemmets et sans et ça ne change rien, le text ne devient pas en majuscule...

Sinon pour ma requête en 2 temps ça fonctionne. Voilà ce que j'ai écrit:

Private Sub cmd_majoff_Click()

Call Connexion(cnx)

Set req_ent = New Recordset
req_ent.Open "select CodeOffice from Office where Office.LibOffice = '" & cbx_office.Text & "'", cnx, adOpenDynamic, adLockOptimistic
temp = req_ent!CodeOffice
req_ent.MoveFirst
While req_ent.EOF = False
temp = req_ent!CodeOffice
req_ent.MoveNext
Wend
req_ent.Close req_ent.Open "update Poste set CodeOffice '" & temp & "' where CodePoste '" & lst_poste.Text & "'", cnx, adOpenDynamic, adLockOptimistic


End Sub

Pour ta suggestion de faire ça en une seule ligne de requête ça serait pas mal mais je vois pas comment faire avec un update... Je vois comment faire avec un select normal mais pas avec un update. Donc si jamais t'as le tps et que tu vois comment faire, peut-être que tu peux m'aider par rapport à ce que j'ai écris.

Merci tof008, le BOSS en VB6.

PS: mon tuteur était parti ce matin chez le médecin parce qu'il était un peu malade et aurait du revenir après mais finalement il est en arrêt pour aujourd'hui donc il n'est pas revenu ^-^. J'suis seul aujourd'hui :-).
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
25
Pour la requete en une partie... Peut etre que dans la requete imbriquée il faudra mettre con, adopen.... mais je suis pas sur
req_ent.Open "update Poste set CodeOffice (select CodeOffice from Office where Office.LibOffice '" & cbx_office.Text & "'") where CodePoste = '" & lst_poste.Text & "'", cnx, adOpenDynamic, adLockOptimistic

Peut etre que dans la requete imbriquée il faudra mettre con, adopen.... mais je suis pas sur.
je sais pas si ca peut marcher comme ca... Sinon tu peux la laisser en deux parties... Pour le Ucase, affecte le à une variable...
t = UCase("txt_citrix")
ca devrait le faire comme ca...
(Si la réponse vous convient, appuyez sur réponse acceptée...)

Il y a plusieurs facon d'être con ,mais un con choisit toujours la pire
Messages postés
62
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 décembre 2005

¤ UCase ¤

En passant par une variable ça fonctionne, il faut donc écrire ça:

temp = UCase(txt_citrix)
Messages postés
62
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 décembre 2005

Pour la requête en une seule ligne j'ai ce message d'erreur: "L'opération doit utiliser une requête qui peut être mise à jour".

J'ai tapé cette ligne de code:
req_ent.Open "update Poste set CodeOffice (select CodeOffice from Office where Office.LibOffice '" & cbx_office.Text & "') where CodePoste = '" & lst_poste.Text & "'", cnx, adOpenDynamic, adLockOptimistic

Peut-être que tu vois de quoi il s'agit? De toute façon si ça marche en une ligne, je fais en deux en passant par une variable mais c'est juste histoire de voir si ça marche avec une seule ligne.


C'est sans doute mon dernier message aujourd'hui car je termine à 14h.


++
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
25
non, la je ne vois pas du tout ce que ca peut etre...Fais la en deux parties, je vais me pencher sur ton problême! je vais voir si ca peut s'arranger ton problême....Passe un bon week end!



(Si la réponse vous convient, appuyez sur réponse acceptée...)

Il y a plusieurs facon d'être con ,mais un con choisit toujours la pire
Messages postés
62
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 décembre 2005

Yo!

Je pense continuer aujourd'hui mon programme VB si j'en ai l'occasion. Et comme tu bosses pas beaucoup, tu vas pouvoir m'aider ;-).
Sinon tu fais quoi en ce moment comme boulot?

Tu te souviens de ma question qui était de savoir comment faire pour garder les références cochées à l'ouverture d'un projet? Et bien maintenant apparement mes références sont cochées au démarrage... J'ai dû faire quelquechose sans savoir quoi exactement.

++
Messages postés
62
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 décembre 2005

Continuons dans mes requêtes pour mon projet... J'aimerais savoir comment faire en ADO pour créer un nouvel enregistrement, une nouvelle ligne dans une table de ma base de données Access quoi. Pourrais-tu me donner un exemple pour les lignes de codes à utiliser?
Je l'ai encore jamais fait ça.

Merci.
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
25
Là je suis en train de créer un programme à peu prés similaire, avec des droits différents qui va permettre de faire passer les informations dans les différents services....
Bon pour ta requête, voilà qui pourra t'aider je pense... :

Set rs2 = new Recordset

rs2.Open "insert into [tatable] ([tonchamp]) values ( '" & tavaleur & "') ", con, adOpenDynamic, adLockOptimistic


Good luck
(Si la réponse vous convient, appuyez sur réponse acceptée...)

Il y a plusieurs facon d'être con ,mais un con choisit toujours la pire
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
25
bien entendu, tu peux mettre plusieurs champs dans [tonchamp] et met les entre crochets...



(Si la réponse vous convient, appuyez sur réponse acceptée...)

Il y a plusieurs facon d'être con ,mais un con choisit toujours la pire
Messages postés
62
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 décembre 2005

Comment ça entre crochet? Peux-tu me dire plus clairement la synthaxe à utiliser, pour values aussi?

En tout cas voilà ma ligne de code pour ma requête d'ajout qui fonctionne:

req_ent.Open "insert into Poste([CodePoste]) values ( '" & txt_poste & "') ", cnx, adOpenDynamic, adLockOptimistic
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
25
en fait, ce que je voulais dire, c'est ca : si tu as plusieurs valeurs,

req_ent.Open "insert into Poste([CodePoste], [rue],[nimp]) values ( '" & txt_poste & "', '" & txtrue & "', '" & txtnimp & "') ", cnx, adOpenDynamic, adLockOptimistic

C'etait juste pour dire de mettre des [ ] autour de tes champs...



(Si la réponse vous convient, appuyez sur réponse acceptée...)

Il y a plusieurs facon d'être con ,mais un con choisit toujours la pire
Messages postés
62
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 décembre 2005

Merci pour cette info, j'ai du coup utilisé l'insertion de 2 champs, voilà mon code:

req_ent.Open "insert into Poste([CodePoste],[CodeService]) values ('" & txt_poste & "','" & temp & "') ", cnx, adOpenDynamic, adLockOptimistic

Ca fonctionne, c'est cool.

Sinon voici mon bloc de code, où je suis obligé de passer par une variable:

Call Connexion(cnx)

Set req_ent = New Recordset
req_ent.Open "select CodeService from Service where Service.LibService = '" & lst_service & "'", cnx, adOpenDynamic, adLockOptimistic
temp = req_ent!CodeService
req_ent.Close
req_ent.Open "insert into Poste([CodePoste],[CodeService]) values ('" & txt_poste & "','" & temp & "') ", cnx, adOpenDynamic, adLockOptimistic

J'ai essayé de mettre ma requête pour la variable temp directement dans la requête d'ajout, c'est-à-dire à la place de "temp" dans values mais je n'ai pas réussi à faire fonctionner. C'est pas grave, c'était juste histoire d'économiser des lignes et d'optimiser au max mais je pense que là c'est pas possible sans passer par une variable, à moins que t'ai une idée?