[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
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
25
si tu donnais un autre nom a ta 2eme requete, tu pourrai faire ca :

Call Connexion(cnx)

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

(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

Je vais essayer cette possibilité. Pour toi c'est laquelle la plus optimisée? Faire 2 requêtes ou passer par une variable?
Messages postés
62
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 décembre 2005

Ca marche plus les messages?
Messages postés
62
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 décembre 2005

J'ai un problème bizarre avec VB.
Tu m'avais donc dit de mettre les fonctions dans un module. Pour l'instant toutes mes fonctions je les avais mise dans les forms, là je veux donc les mettre dans un module.
J'ai donc fait un couper/coller de mes fonctions dans le module et quand j'éxécute mon programme voilà l'erreur que j'obtiens:

"Les arguments sont de type incorrect, en dehors des limites autorisées ou en conflit les uns avec les autres"

Je ne comprends pas! J'ai juste fait un copier/coller!
L'erreur apparait au niveau de la requête (ligne avec un fond jaune).
Voilà mon code:

Public Sub ListService(req_ent)


Set req_ent = New Recordset
req_ent.Open "select distinct LibService from Service order by LibService", cnx, adOpenDynamic, adLockOptimistic
req_ent.MoveFirst
While req_ent.EOF = False
lst_service.AddItem req_ent!LibService
req_ent.MoveNext
Wend


End Sub

T'aurais une idée ?!?
Messages postés
62
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 décembre 2005

Le pire c'est que si ma fonction est dans une form ma requête fonctionne très bien et dès que je la mets dans un module, paf! le message d'erreur...
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
25
est ce que tu as déclaré la connexion?



(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

A priori oui. Voilà ce que je déclare dans le "Général":

Option Explicit
Dim cnx As New ADODB.Connection
Dim req_ent As New ADODB.Recordset

Et j'ai la fonction de connexion qui fonctionne dans mon module (qui ne nécessite pas de requête):

Public Sub Connexion(cnx)


Dim RS As New ADODB.Recordset


Set cnx = New ADODB.Connection 'connection à la base
cnx.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\Gestionnaire_de_licences.mdb"

cnx.Open
Set RS = New Recordset

End Sub
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
25
ouais alors dans ton module ou ya la requete, fais call module1.connnexio(cnx)



(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 fait ce que tu m'as dit, ça m'a permis d'avancer dans mon problème mais j'ai une autre message d'erreur! Voici mon code désormais:

Public Sub ListService(req_ent)


Call Fonctions.Connexion(cnx) (Fonctions est le nom de mon module)


Set req_ent = New Recordset
req_ent.Open "select distinct LibService from Service order by LibService", cnx, adOpenDynamic, adLockOptimistic
req_ent.MoveFirst
While req_ent.EOF = False
lst_serviceA.AddItem req_ent!LibService
req_ent.MoveNext
Wend

Désormais j'ai le message d'erreur "Un objet est requis" au niveau de la ligne lst_serviceA.AddItem req_ent!LibService .

???? Kesako?
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
25
tu as pas un probleme au niveau de l'ecriture ? je sais pas si c'est normal le A à la fin... Ca doit etre un truc comme ca... En general s'il te demande un objet, c'est que tu as mal déclaré ou écris quelque chose...
lst_serviceA

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
62
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 décembre 2005

Nan franchement le nom c'est normal, tout est OK. La preuve est que quand je ne passe pas la fonction dans le module et que je la mets directement dans le programme ça fonctionne. Et je fais que du copier/coller! Je pige pas le délire avec ce module.
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
25
mais au fait, pourquoi tu veux mettre la requete dans un module?



(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

Beh parce que c'est une fonction dans laquelle il y a une requête tout simplement. C'est une requête que je dois faire plusieurs fois donc je la mets dans une fonction pour éviter de la refaire à chaque fois.
T'as jamais fait de fonction avec une requête dedans?
Messages postés
62
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 décembre 2005

Salut!

J'ai un problème dans mon programme. Dans celui-ci, j'ai une partie qui consiste à supprimer des enregistrements d'une table. Le truc c'est que une fois que l'enregistrement qu'on a sélectionné a été supprimé, je dois mettre ma ListBox à jour pour que l'enregistrement que l'on vient de supprimer n'apparaisse plus. Pour cela dans mon code, juste après avoir fait la suppression je refais le code pour consulté ma base de données et reremplir la ListBox en conséquence.
Le problème est que malgré cela, l'enregistrement que l'on vient de supprimer apparait toujours dans la ListBox. Et je crois avoir identifié le problème. En effet, j'ai l'impression que le programme à besoin d'un certain de latence pour effectuer la requête de suppression dans la table Access et comme il effetue le code pour remplir la ListBox tout de suite après, l'enregistrement n'a pas le temps d'être supprimer avant le reremplissage de la ListBox.

Donc j'aimerais savoir si tu sais comment régler ce problème. je pensais notamment à quelquechose qui permetterait de faire attendre le programme pendant 1 seconde par exemple. Genre il arrive à un sorte de timer au niveau du code VB, qu'il obligerait VB à attendre avant d'effectuer les codes qui suivent.

J'espère que j'atais assez clair. En espérant que tu pourras m'aider.

++
Messages postés
49
Date d'inscription
jeudi 26 mai 2005
Statut
Membre
Dernière intervention
13 août 2006

Yop Yop [auteurdetail.aspx?ID=527963 NeT_SlipKnoT]...



Comme tu dois t'en douter, le vb n'est pas ma spécialité. Mais je peux toujours essayer de t'aider.

Dans ton form, vérifie si tes listbox sont en AutoPostBack ou pas.

Je pense que la solution est de mettre la listbox concernée en AutoPostBack = True.

Donne moi-en des nouvelles...



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

AutoPostBack ne doit pas exister sous VB6 ...
Messages postés
695
Date d'inscription
jeudi 5 mai 2005
Statut
Membre
Dernière intervention
5 janvier 2010
25
fais tout simplement :
list1.refresh a la fin de ton remplissage, ou au moment du click sur la lstbox...ou alors tu fais un list1.clear puis le re remplissage...



(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
et ca y est c la folie! Ya Son of the sun aussi! 1TIG1 en force today!!!



(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 déjà essayé Clear et Refresh mais ça ne change absolument rien. D'ailleurs je n'ai jamais compris l'utilité du lisbox.Refresh, ça n'a jamais rien changé au niveau de mon programme.

Mais comme j'ai dit et j'en ai parlé à Micka, le problème est qu'apparement il faut au programme un petit moment de latence pour supprimer l'enregistrement c'est pourquoi le fait de réremplir la ListBox tout de suite après la requête de suppression ça ne marche pas car il "voit" encore l'enregistrement que l'on vient de supprimer.

Ce qu'il faudarait, c'est de pouvoir dire au programme de s'arrêter genre 1 seconde avant de reprendre la suite du code.
C'est pas possible ça?

Merci pour ton aide.
Messages postés
49
Date d'inscription
jeudi 26 mai 2005
Statut
Membre
Dernière intervention
13 août 2006

Dans ton interface y a-t-il un bouton OK qui te permet d'envoyer des informations ou quelque chose du genre?
Si oui tu peux éventuellement le rendre invisible tant que la modification n'est pas confirmée, et de ce fait créer un bouton "Confirmer" qui aurait le même code que ton bouton sélectionner...
C'est vraiment la solution de fortune mais bon... Comme dit je connais RIEN.

Solution plus barbare encore, comme tu avais dit, tu supprimes manuellement les valeurs sélectionnées... L'utilisateur n'y voit que du feu, mais c'est pas très propre.

En attendant, je suis blasé, j'ai un sacré problème en ASP si vous voulez jetter un coup d'oeil, ne serait-ce que pour rire...

TchüB