OVH Cloud OVH Cloud

Pb actualisation Table / formulaire

4 réponses
Avatar
Alain Teyssedre
Bonjour

J'utilise un formulaire pour ajouter ou supprimer des enregistrements dans
une table.
Je choisi l'enregitrement à supprimer dans une zone de liste : "Keyword".
et je supprime cet enregistrement avec un Bouton de commande dont le code
associé est le suivant:
Les enregistrements sont dans la table "Keyword Contact" et comprennent 4
champs: Réf Keyword Contact (auto num), RéfContact et Keyword (pour 1 réf
contact donné je ne veux pas avoir de doublons sur le champ Keyword)
Seul le champ Ref keyword Contact est indexé sans doublon.


Set dbs = CurrentDb
Set rst = dbs![Keyword Contact].OpenRecordset(dbOpenTable)
rst.MoveFirst
Do

If ((rst.Fields("Keyword").Value = Me.Keyword.Column(0)) And _
(rst.Fields("RéfContact").Value = Me.RéfContact)) Then
rst.Delete
DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70
rst.Close
Exit Sub
End If
rst.MoveNext
Loop Until rst.EOF = True
rst.Close


le problème c'est que je n'ai plus la main sur mon formulaire ou j'ai des
message du style "modifications
non effectuée risques de doublons ...

Que n'ais je point fait ?

cdlt
Alain

4 réponses

Avatar
Damran
"Alain Teyssedre" a écrit dans le message
de news:
Bonjour

J'utilise un formulaire pour ajouter ou supprimer des enregistrements dans
une table.
Je choisi l'enregitrement à supprimer dans une zone de liste : "Keyword".
et je supprime cet enregistrement avec un Bouton de commande dont le code
associé est le suivant:
Les enregistrements sont dans la table "Keyword Contact" et comprennent 4
champs: Réf Keyword Contact (auto num), RéfContact et Keyword (pour 1 réf
contact donné je ne veux pas avoir de doublons sur le champ Keyword)
Seul le champ Ref keyword Contact est indexé sans doublon.


Set dbs = CurrentDb
Set rst = dbs![Keyword Contact].OpenRecordset(dbOpenTable)
rst.MoveFirst
Do

If ((rst.Fields("Keyword").Value = Me.Keyword.Column(0)) And _
(rst.Fields("RéfContact").Value = Me.RéfContact)) Then
rst.Delete
DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, ,
acMenuVer70

rst.Close
Exit Sub
End If
rst.MoveNext
Loop Until rst.EOF = True
rst.Close


le problème c'est que je n'ai plus la main sur mon formulaire ou j'ai des
message du style "modifications
non effectuée risques de doublons ...
Bonjour

Je voit pas trop l'interet d'ouvrir un recordset et de le parcourrir
entièrement. Si tu a beaucoup d'enregistrement, ça risque de devenir très
long.
Le mieux serait d'éxecuter un requete de suppression :
Docmd.SetWarning False 'Pour éviter d'avoir les messages "Voulez-vous
supprimer x enregistrement"
DoCmd.RunSQL "Delete From MaTableWhere Keyword = '" & Me.Keyword.Column(0) &
"' AND RéfContact = '" & Me.RéfContact & "'"
DoCmd.SetWarnig True 'Quand on enlève quelques chose, on le remet ensuite à
ca place ;-)

Si le formulaire ne voit pas les mises à jours :
Me.Requery ou Me.Refresh selon besoin (si tu a besoin ou non de rester
positionné par exemple).

En ce qui concerne les doublons, c'est que ton formulaire avait des mise à
jour en attente qui n'ont pas été traité.
Donc avant tout ça tu peut ajouter
DoCmd.Save

Voilà

Damran

Avatar
Damran
"Alain Teyssedre" a écrit dans le message
de news:12e1901c38449$3dc0a420$
Bonjour DAMRAN

Un grand merci car j'ai particulièremet apprécié dans ta
réponse les explications qui me permettent de mieux
comprendre les commandes VBA.
C'est pour mieux faire avancer le shmilblik ;-)



Je n'ai plus qu'a résoudre le pb de syntaxe dans ma requete
qui ne passe pas :
erreur 3464 : types de données imcompatibles dans
l'expression du critère.

sur la commande:

DoCmd.RunSQL "DELETE FROM [Keyword Contact] WHERE
((Keyword = '" & Me.Keyword.Column(0) & _
"') AND (RéfContact = '" & Me.RéfContact & "'))"
Ta chaine semble correct.

Vérifie si RéfContact et Keyword sont bien de type string. Si ce sont des
integer, alors il ne faut pas entourer de simple quote.


Damran

Avatar
Alain Teyssedre
Bonjour Damran

Effectivement le champ RéfContact étant de type numérique il fallait en
tenir compte dans la requete
ta requete fonctionne mais j'ai toujours un problème que je n'arrive pas à
résoudre.

Aprés avoir sélectionné un keyword dans ma zone de liste lorsque j'execute
la commande supprimer,
c'est le 1er keyword de ma liste qui est supprimé !
Si je re-sélectionne le même Key word et que j'essaye de le modifier, j'ai
un message d'erreur :" erreur 3167 -
l'enregistrement est supprimé" et si je resélectionne un keyword la j'ai
carrément toute mon appli Access qui se ferme !!!

mon formulaire Keyword Contact comprend:
- une zone de liste pour afficher tous les Keywords affectés à un
contact (qui est sélectionné dans le formulaire Contacts)
- 3 Boutons de commande "Ajouter", "Modifier", "Supprimer".
- Une zone de texte "Expr1" qui affiche le nom complet du contact en
cours de sélection.

Le formulaire Keyword Contact s'ouvre à partir du formulaire Contact (qui
affiche les contacts) les 2 formulaires
étant liés par

La requete source du formulaire keyword est :
SELECT [Keyword Contact].Keyword, [Keyword Contact].RéfContact AS Expr2,
[Contacts].[Salutation] & " " & [Prénom] & " " & [Nom] & " " & [Titre]
AS Expr1, Contacts.RéfContact
FROM Contacts LEFT JOIN [Keyword Contact] ON Contacts.RéfContact = [Keyword
Contact].RéfContact;


La requete source de ma zone de liste Keyword est :
SELECT [Keyword Contact].Keyword, [Keyword Contact].RéfContact
FROM [Keyword Contact]
WHERE ((([Keyword Contact].RéfContact)=[Contacts].[RéfContact]));
(avec colonne liée 1)

Voila j'espère avoir été clair si tu as des questions n'hesites pas

@+
Alain


"Damran" a écrit dans le message de
news:3f77fb18$0$2809$

"Alain Teyssedre" a écrit dans le message
de news:12e1901c38449$3dc0a420$
Bonjour DAMRAN

Un grand merci car j'ai particulièremet apprécié dans ta
réponse les explications qui me permettent de mieux
comprendre les commandes VBA.
C'est pour mieux faire avancer le shmilblik ;-)



Je n'ai plus qu'a résoudre le pb de syntaxe dans ma requete
qui ne passe pas :
erreur 3464 : types de données imcompatibles dans
l'expression du critère.

sur la commande:

DoCmd.RunSQL "DELETE FROM [Keyword Contact] WHERE
((Keyword = '" & Me.Keyword.Column(0) & _
"') AND (RéfContact = '" & Me.RéfContact & "'))"
Ta chaine semble correct.

Vérifie si RéfContact et Keyword sont bien de type string. Si ce sont des
integer, alors il ne faut pas entourer de simple quote.


Damran





Avatar
Damran
"Alain Teyssedre" a écrit dans le message
de news:
Bonjour Damran

Effectivement le champ RéfContact étant de type numérique il fallait en
tenir compte dans la requete
ta requete fonctionne mais j'ai toujours un problème que je n'arrive pas à
résoudre.

Aprés avoir sélectionné un keyword dans ma zone de liste lorsque j'execute
la commande supprimer,
c'est le 1er keyword de ma liste qui est supprimé !
Ca c'est bizzare. Vérifie bien l'index de la colonne pour ta liste

(keyword.Column(0)). Elle doit bien représenter l'élement à supprimer, c'est
a dir le champs que utilise pour ta suppression.
Si ta liste n'a qu'une colonne, ou si la colonne lié est bien le champs qui
te sert de suppression, alors utilise : Me.Keyword.Value

Si je re-sélectionne le même Key word et que j'essaye de le modifier, j'ai
un message d'erreur :" erreur 3167 -
l'enregistrement est supprimé"
Normal, tu l'a supprimé mais ton controle ne l'a pas vue :

Me.Keyword.Refresh ou Me.Keyword.Requery

et si je resélectionne un keyword la j'ai
carrément toute mon appli Access qui se ferme !!!
Là je ne vois pas, mais sera surement résolut si tu supprime le bon et que

tu met à jour ta liste.

Essai déjà de supprimer le bon keyword, on verra après pour les problèmes.
Et n'oublie pas de mettre à jour ta liste une fois la suppression effectué.


Damran