cs_dan24
Messages postés39Date d'inscriptionlundi 9 février 2004StatutMembreDernière intervention15 avril 2005
-
8 juil. 2004 à 17:40
cs_dan24
Messages postés39Date d'inscriptionlundi 9 février 2004StatutMembreDernière intervention15 avril 2005
-
17 juil. 2004 à 12:48
Bonjour à tous,
J'ai un petit problème que j'ai du mal à comprendre.
Voilà le code (je n'ai pas mis les déclarations de variable, le problème ne venant pas de là)
Public Sub SelectionnerMedicament()
ReDim tblSelec(1) As String
With frmMedicament
r = 0
For i = 0 To .lbMedicament.ListCount - 1
If .lbMedicament.Selected(i) Then
tblSelec(r) = .lbMedicament.List(i)
r = r + 1
ReDim Preserve tblSelec(r) As String
End If
Next
Set rsSelectionnerMedicament = New ADODB.Recordset
rsSelectionnerMedicament.CursorType = adOpenDynamic
rsSelectionnerMedicament.LockType = adLockPessimistic
For r = 0 To UBound(tblSelec) - 1 rsSelectionnerMedicament.Open "select M.*, EUP.* from MEDICAMENT M, EST_UTILISE_POUR EUP where EUP.EUP_MEDIC_NO M.MEDIC_NO and EUP.EUP_SYMP_NO " & frmSymptome.efSympNo, mdlLogin.bdd
rsSelectionnerMedicament.AddNew
rsSelectionnerMedicament.Fields("MEDIC_NOM") = tblSelec(r)
rsSelectionnerMedicament.Update
rsSelectionnerMedicament.Close
Next
End With
End Sub
En fait, c'est assez simple.
Dans un premier temps, je passe en revue les éléments sélectionnés de la liste lbMedicament et les insère dans un tableau dynamique tblSelec().
Ensuite, je paramètre mon recordset rsSelectionnerMedicament afin de pouvoir effectuer des mises à jour dans la bdd.
Enfin, une boucle passe en revue les éléments de mon tableau dynamique tblSelec() et les insère un par un dans la bdd.
Le problème c'est qu'une erreur apparait au niveau de "rsSelectionnerMedicament.Update":
Erreur -2147467259 "Mise à jour impossible. La base de données ou l'objet est en lecture seule."
asecher
Messages postés262Date d'inscriptionlundi 20 octobre 2003StatutMembreDernière intervention27 avril 20071 17 juil. 2004 à 11:51
Je pense que le fait de faire un select * sur les 2 tables M et E crée un jeu d'enregistrement non modifiable.
Il vaut mieux effectuer une jointure du genre :
select M.* from MEDICAMENT M INNER JOIN EST_UTILISE_POUR EUP ON M.MEDIC_NO=EUP.EUP_MEDIC_NO WHERE EUP.EUP_SYMP_NO = " & frmSymptome.efSympNo, mdlLogin.bdd
cs_dan24
Messages postés39Date d'inscriptionlundi 9 février 2004StatutMembreDernière intervention15 avril 2005 17 juil. 2004 à 12:48
En fait j'ai trouvé le problème. Il venait bien de la requête.
Je sélectionnais tout de MEDICAMENT et tout de EST_UTILISE_POUR alors qu'en fait l'enregistrement que je voulait supprimer ne concernait que les champs de EST_UTILISE_POUR qui est par ailleurs une table d'association (avec deux clés à la fois primaires et étrangères : EUP_MEDIC_NO et EUP_SYMP_NO).
En effet, par la suite, il m'affichait le message d'erreur suivant : "Emplacement du curseur non valide; pas de jeu de clés défini".
Ce qui se passe, c'est que quand on fait une requête qui précède un delete, elle doit contenir uniquement les champs de la table concernée et doit pointer uniquement sur l'enregistrement qu'on veut supprimer.
Voilà ce qu'est devenue ma requête finalement:"select * from EST_UTILISE_POUR where EUP_MEDIC_NO " & frmSymptome.efMedicNo & " and EUP_SYMP_NO " & frmSymptome.efSympNo"