Se connecter avec
S'enregistrer | Connectez-vous

[RESOLU]suppression occurence dans une zone de liste (ACCESS)

Dernière réponse : dans Programmation

salut !

je suis actuellement en stage et on me demande de reprendre un programme déjà existant sur ACCESS concernant une gestion de stock
l'utilisateur peut faire une entrée en stock, une entrée peut avoir plusieurs produit (ex: entrée 01 => 5 pain, 10 farine etc)
si l'utilisateur se trompe il peut modifier une entrée mais il doit pouvoir aussi supprimer l'entrée (le code est déjà fait pour la suppression de l'entrée entiére)
le probleme est que je n'arrive pas à faire en sorte de supprimer un produit supprimer dans une entrée (ex: entrée01: sélectionner uniquement les '5 pains' et les supprimer )

pour l'instant mon code ressemble à cela :

Private Sub Cmdsupsup01_Click()

Dim base As Database
Dim tentree As Recordset
Set base = CurrentDb()
Set tentree = base.OpenRecordset("DÉTAIL_ENTREE", DB_OPEN_DYNASET)
Dim critere As String



critere = "N°ENTREE='" + Lstpdtsup.Column(0) + "'" + "N°DETAIL='" + Lstpdtsup.Column(14) + "'"

tentree.FindFirst (critere)
tentree.Delete
Lstpdtsup.Requery

donc voila lorsque j'essaye de supprimer le produit selectionné (cliqué avec la souris) un message d'erreur apparait sur "tentree.FindFirst (critere)" => erreur de syntaxe opérateur absent de l'expression
pourtant mon critere récupere bien le N°ENTREE et le N°DETAIL
enfin bref, je commence à avoir access en horreur et je dois encore y passer un mois :pt1cable:  donc si quelqu'un pouvait apaiser ma peine cela serait fort sympathique :D 
voila merci d'avance
byebye :hello: 
Lassé par la pub ? Créez un compte

Salut, Lazy87

Pour une recherche multi-critère, il faut séparer les critères avec les opérateurs booléens habituels. Ici, cela devrait donner:

critere = "N°ENTREE='" + Lstpdtsup.Column(0) + "' AND N°DETAIL='" + Lstpdtsup.Column(14) + "'"

Par ailleurs, après lancement de la recherche (FindFirst), il serait souhaitable de vérifier qu'elle a bien abouti. Pour cela, tu peux utiliser la propriété "NoMatch" (regarde dans l'aide en ligne d'Access pour plus d'infos). A ta place, j'écrirais quelque chose comme:

If tentree.NoMatch = False Then
tentree.Delete
End If

Dis-nous si cela te convient.

Au passage, les spécialistes Microsoft Access doivent se compter sur les doigts de la main de Mickey, sur ce forum. A l'avenir, si tu as besoin d'une réponse rapide, passe par un forum un peu plus spécialisé comme CELUI-CI.

Bonne continuation

salut merci de ta réponse gillou_gre !!
mais il y a toujours un message d'erreur sur le "tentree.findfirst critere"
=> type de données imcompatible dans l'expressoin du critére
donc je suppose que c'est ce qui est récupérée qui est problématique puisque c'est "type de données imcompatible" ... donc voilà je suis pas bien sur mais bon ... je vais creuser de ce coté et si je trouve pas j'irai sur la forum que tu m'as laissé
donc voila merci beaucoup quand même pour avoir pris du temps
byebye :D 
PS: je laisse le message actif jusqu'à ce que je trouve la solution, on sait jamais si une bonne âme doué en ACCESS passe par là :p 

Salut, Lazy87

De la façon dont il est fait, le critère suppose que les champs "N°ENTREE" et "N°DETAIL" sont des chaînes de caractères. Est-ce bien le cas ?
Si non et que ce sont des numériques, il faut enlever les quotes simples ('), ce qui donne ceci:

critere = "N°ENTREE=" & Lstpdtsup.Column(0) & " AND N°DETAIL=" & Lstpdtsup.Column(14)

C'est mieux ?

salut !
en fait n°entrée est un numéro auto et n°détail c'est du texte ... du coup si j'enléve les quotes cas me mets une erreur de syntaxe sur critere ... j'y ai pensé moi aussi hier soir :lol:  et je me suis fait eu :whistle: 
enfin bref merci encore
byebye

Salut, Lazy87

Bon, on y arrive !
N°ENTREE => numéro auto => numérique => pas de quote
N°DETAIL => texte => entouré par des quotes
Tu devrais donc essayer ceci:

critere = "N°ENTREE=" & Lstpdtsup.Column(0) & " AND N°DETAIL='" & Lstpdtsup.Column(14) & "'"

C'est mieux ?

oui j'ai tenté du coup, ca me fait plus rien ... mais quand je dis rien ... c'est rien ^^' ... bon point : y'a plus d'erreur :p  mais aprés ... ca supprime toujours pas : /
mais du coup j'avais pensé (logique bizarre je vous préviens ^^)
access ca ressemble (oui je sais ... pas du tout) a excel
et sous excel on peut faire un truc genre :

pour i = 1 à list.listcount
list.listindex = i-1
si list.listindex=list.value
j = list.listindex
j.delete
fsi
fp

non ?! parcque du coup les qualificateurs sont pas bons mais pour le reste du code je me dis que ca pourrait marcher non ?

Je ne comprends pas bien ce que tu veux faire avec .listindex mais je doute que ce soit plus efficace...

Tu as vérifié dans la table que l'enregistrement est toujours présent ? Il se peut que la suppression se fasse mais qu'elle ne soit pas visible immédiatement sur le formulaire qu'il faudrait "rafraîchir" avec un "Me.Requery".

Il y a bien une autre solution qui est sûrement plus simple vu que tu n'as qu'un seul enregistrement à supprimer. Il s'agit d'exécuter une requête SQL de suppression. Voila à quoi cela pourrait ressembler :

CurrentDb.Execute "DELETE * FROM DÉTAIL_ENTREE WHERE N°ENTREE=" & Lstpdtsup.Column(0) & " AND N°DETAIL='" & Lstpdtsup.Column(14) & "'"

Une seule ligne et le tour est joué ;) 
L'inconvénient, c'est que, si les noms de tes tables ou de tes champs sont modifiés, il faut penser à modifier tous les bouts de code qui les utilisent.

Je te souhaite un bon week-end et te donne rendez-vous à lundi si tu as encore des soucis.
A+

salut !
donc pour la premiére méthode j'étais allé vérifier dans la table mais aucune suppression et maintenant pour la suppression grâce au SQL ... et bien toujours aucun résultat, vraiment aucun, pas de suppression dans la table mais pas de message d'erreur non plus donc voilà ... tout cela me laisse relativement pantoi ... juste pour savoir si je suis pas complétement stupide ... le SQL fallait bien que je le mette sur le bouton de commande, dans propriété et "sur clic" ?!!
enfin bref voilà merci c'était une super bonn eidée pourtant

bon donc grande nouvelle ... en fait je m'étais trompé de version et ... enfin bref, avec le SQL et le code qui était déjà là avant ça supprime la premiére occurence du tableau et donc pas l'occurence sur laquelle on a cliqué ... donc voilà je pense qu'on devrait bientôt atteindre la solution ; )

Salut, Lazy87

Youpi, on progresse :wahoo:  !
Si la suppression ne se fait pas sur le bon élément, c'est peut-être qu'il y a une instruction qui modifie l'élément courant entre le moment où tu sélectionnes la ligne dans le tableau et l'instruction delete. Vérifie les choses du style ".Requery" qui, en plus de raffraîchir le contenu d'un formulaire ou d'une liste (entre autres) ont aussi pour effet de modifier l'élément courant pour se replacer sur le premier.

Allez, courage, tu y es presque ;)  !

Bon, comme dirait l'autre, je fais un pas en avant et deux pas en arrière :(  . Après avoir était malade hier, je me dis, c'est bon aujourd'hui c'est le grand jour, et bien non, car ce matin j'arrive de "bonne humeur" pour travailler et je me rend compte que rien ne se supprime ... La seule modification que j'ai effectué c'est de mettre la requête dans le code VB au lieu de le mettre dans la propriété du bouton de commande. D'après le peu d'expérience que j'ai d'access, cela ne devrait absolument rien changer ... mais apparement si ... Donc j'avais mis ce code (car il y a aussi de fortes chances pour que se soit de ma faute ^^'):

Dim r2 as recordset
Set base = currentDb()
Dim req as string

req = "SELECT * FROM DÉTAIL_ENTREE WHERE N°ENTREE = " etc ...
Set r2 = base.OpenRecordset (req, DB_OPEN_DYNASET)
Do cmd.requery "Lstpdtsup"

Donc cela tout seul ne fonctionne pas ... avec le code qu'il y avait avant ... ça marche pas non plus ... donc pour l'instant la seule méthode valable que j'ai pour supprimer une occurence c'est :

1°) mettre cette requête dans la propriété de mon bouton de commande :
-"DELETE * FROM DÉTAIL_ENTREE WHERE N°ENTREE=" & Lstpdtsup.Column(0) & " AND N°DETAIL='" & Lstpdtsup.Column(14) & "'"
2°) mettre ce code (dans VB) sur le bouton de commande :
-Dim base As Database
Dim tentree As Recordset
Set base = CurrentDb()
Set tentree = base.OpenRecordset("DÉTAIL_ENTREE", DB_OPEN_DYNASET)
Dim critere As String

critere = "N°ENTREE=" & Lstpdtsup.Column(0) & " AND N°DETAIL='" & Lstpdtsup.Column(14) & "'"

tentree.FindFirst (critere)
tentree.Delete
Lstpdtsup.Requery

Donc voilà après comme tu m'as dit que le problème de la suppression (étant donné que dans l'état cela me supprime toujours la première occurence de la table) j'ai essayé de chaner les ".requery" par un "do Cmd.requery", méthode qu'un de mes profs m'a donné ... mais cela ne change rien ... donc je vais me petit suicider avec du flamby :cry: 

byebye :hello: 

Ah ... autant pour moi ... plus rien ne marche ... quoi ça supprime plus rien ... même quand je remets comme c'était lundi ... incompréhensible .
Et puis maintenant j'ai une nouvelle erreur ... quoi deux en faite ...
un coup ça me dit que " Gestion de stock ne peut pas trouver la macro "CurrentDb.Execute "DELETE * FROM DÉTAIL_ENTREE WHERE N°ENTREE=" & Lstpdtsup.Column(0) & " AND N°DETAIL='" & Lstpdtsup.Column(14) & "'" "
ou sinon ça me dit que la macro currentDb n'est pas trouvable ... Enfin bref ... je comprend plus rien ça me gonfle

Oula ! Je reprends du début.

Tout ce que je t'ai donné jusqu'à présent, c'est du code VBA. Pour qu'il fonctionne (par exemple) sur clic d'un bouton, il faut:

1) dans la propiété "Sur clic" du bouton, choisir "[Procédure événementielle]"

2) cliquer sur le bouton contenant "..." à droite de cette même propriété

3) copier le code sous la ligne:
"Sub NomDeTonBouton_Click()"
et au dessus de la ligne:
"End Sub"

Si tu mets autre chose que "[Procédure événementielle]", ce doit être le nom d'une macro. Les macros sont des objets Access tombés en désuétude, vestiges des premières tentatives d'automatisation d'Access. Les deux seuls rescapés sont la macro "AutoExec" qui permet de lancer un code au démarrage de la base et la macro "AutoKeys" qui permet d'intercepter des raccourcis clavier.

Etant en stage, je suppose que ton temps est limité et que tu n'as peut-être pas envie de t'investir plus que nécessaire dans l'apprentissage d'Access mais cela ne peut pas te faire de mal. Tu trouveras ICI quelques sites qui peuvent t'aider à mieux appréhender Access... et les bases de données en général.

Continue comme ça, tu vas y arriver !

Oui je sais que le code que tu me donné c'est sous VB puisque y'a currentDB.execute ... c'est juste que quand j'ai réussi à supprimer la premiére occurence c'était en mettant la requête sur procédure evennementielle tout en laissant le code en VB derrière (bizarre hein !!) ... Bon bin du coup je pense que je vais tenter jusqu'à la fin de la semaine d'aller faire un tour sur les sites que tu me proposes tout en cherchant la solution à mon problème ... et puis si je trouve toujours pas la réponse j'ai un prof qui vient me voir mardi prochain donc dans tout les cas j'aurais la réponse ... mais je pourrais pas l'impressionner ^^"
Enfin bref encore un grand merci à toi et si tu trouve la réponse d'ici mardi te gêne pas pour m'aider à impressionner mon profs xD
ByeBye

petite question qui a un rapport avec le début tu as dis que c'était sur excess mais pourquoi ne pas le faire sur MySql ? c'est plus simple et beaucoup mieux ...
sinon pour ce qui est de ton problème désolé mais ca fais longtemps que j'ai laché excess ^^ je ne saurais te répondre mais écoute grillou apparement il connais :p 

Si tu avais tout bien compris dès le début, le code suivant devrait fonctionner:

Private Sub Cmdsupsup01_Click()
CurrentDb.Execute "DELETE * FROM DÉTAIL_ENTREE WHERE N°ENTREE=" & Lstpdtsup.Column(0) & " AND N°DETAIL='" & Lstpdtsup.Column(14) & "'"
End Sub

Si ce n'est pas le cas, c'est que ce ne sont pas les bonnes données qui sont passées en paramètre. Essaie avec ceci:

Private Sub Cmdsupsup01_Click()
'CurrentDb.Execute "DELETE * FROM DÉTAIL_ENTREE WHERE N°ENTREE=" & Lstpdtsup.Column(0) & " AND N°DETAIL='" & Lstpdtsup.Column(14) & "'"
MsgBox "ENTREE=" & Lstpdtsup.Column(0) & " AND N°DETAIL=" & Lstpdtsup.Column(14), , "Test"
End Sub

et voit quelles sont les données qui s'affichent.

Si ce ne sont pas les bonnes données, je ne sais pas trop comment t'aider plus... Désolé :( 

Stagiaire01 => il s'agit d'un programme existant qu'il s'agit de modifier, je doute qu'on a laissé à Lazy87 le choix du programme... De plus, il n'est que stagiaire... comme toi ;) 

Bonne continuation

Donc je viens de faire ta première solution :
=>Erreur d'execution'3464': type de donnée imcompatible dans l'expression du critére
puis :

Donc maintenant j'essaye la deuxième solution :
=>Erreur d'execution'3464': type de donnée imcompatible dans l'expression du critére

Et j'ai fais que du copier/coller ... plus copier/coller que ça je pense que ça existe pas ... quoi j'ai vérifier qu'il n'y ai pas d'erreur d'orthographe ... c'est tout.
Donc voilà, je vais me lancer dans la lecture passionnante des guides d'utilisation ACCESS xD.
Allez souhaitez moi bonne chance :p 

Il est temps d'utiliser les fonctions de débogage d'Access.

Place toi dans l'éditeur VBA sur la ligne qui exécute la commande SQL (CurrentDB.Execute ...) et presse la touche F9. La ligne sera surligné d'une jolie couleur marron :) . Ouvre ton formulaire et clique sur le bouton qui lance la commande. L'éditeur VBA va revenir au premier plan sur la ligne précédente. Sélectionne alors le premier paramètre ( Lstpdtsup.Column(0) ) et presse alors sur Shift+F9. Une fenêtre va alors t'indiquer la valeur de ce paramètre. Vérifie qu'elle est correcte puis ferme la fenêtre avec la touche Echap. Procède de même avec le second paramètre. L'erreur peut venir du fait que l'un des paramètres soit égal à Null ou à une chaîne vide ou encore que ce paramètre n'existe pas (attention: Lstpdtsup.Column(14) correspond à la 15ème colonne de la liste Lstpdtsup, la numérotation commençant à 0).

Vois un peu tout cela et dis-nous ! A+

Ah il semblerait qu'il y ai un problème puisque Lstpdtsup.Column(0) récupère 005-2008 (qui est bien le n°d'entrée) mais le problème c'est qu'en faisant la méthode que tu m'a montré Lstpdtsup.column(14) récupére la même valeur ... Alors qu'en passant juste la souris dessus il récupére '1176' qui est bien le n° de détail ... Donc je suis légérement perplexe.

Alors, c'est le n° d'entrée qui est de type chaîne et n° de détail qui est numérique, c'est ça ? Dans ce cas, les quotes doivent être déplacées sur le premier paramètre comme ceci:

CurrentDb.Execute "DELETE * FROM DÉTAIL_ENTREE WHERE N°ENTREE='" & Lstpdtsup.Column(0) & "' AND N°DETAIL=" & Lstpdtsup.Column(14)

Est-ce que c'est mieux ?

OHLALALALALALA que je suis stupide ... -_-' j'ai honte mais j'ai honte ... oui donc là pour le coup ca marche très bien (>- -"<)
Je suis vraiment désolé de t'avoir fait perdre ton temps et ton énergie à rechercher un problème dont tu avait trouvé la solution en quelques posts.
Bon bin du coup je passe au problème suivant :p  je sens que je vais très rapidement revenir sur le forum xD.
Mais encore une fois MERCI BEAUCOUP gillou_gre.
Lassé par la pub ? Créez un compte
Tom's guide dans le monde