SnapFAB
Messages postés61Date d'inscriptionsamedi 10 novembre 2007StatutMembreDernière intervention 5 mars 2011
-
16 janv. 2009 à 17:57
skyla
Messages postés60Date d'inscriptionsamedi 17 juin 2006StatutMembreDernière intervention19 octobre 2009
-
18 janv. 2009 à 16:37
Bonjour à tous,
Voilà mon problème, j'ai un flexgrid ("FGlistART")sur un UserForm ("FRMLISTEARTICLE").
J'ai ajouter un boutton supprimer ("CMDSUPPRIMER")
Je souhaiterai que quand je clique sur supprimer il me supprime la ligne sélectionner (mon FlexGrid est en selectionMode par ligne).
Je fais apparaître la désignation de l'article sélectionner dans un label ("Label1").
J'ai fait pas mal de recherche et j'ai trouver un bout de code pour supprimer une ligne mais j'ai du faire une erreur dans le code car ça ne marche pas.
Voici mon bout de code :
<ol><li>Private Sub CMDSUPPRIMER_Click()</li><li>On Error Resume Next</li><li>Connect</li><li>Set rsARTART New ADODB.Recordset</li><li>rsARTART.Open "select * from articles", cn, 1, 2</li><li>If Label1 rsART.Fields(1) Then</li><li>rep = MsgBox("voulez vous vraiment supprimer l'article " & Label1, vbYesNo + vbQuestion, " Supprimer")</li><li>Select Case rep</li><li>Case vbYes</li><li>rsART.Delete</li><li>MsgBox "Article supprimer", vbInformation</li><li>rsART.MoveLast</li><li>Case vbNo</li><li>rsART.Cancel</li><li>MsgBox " Suppression annuler", vbInformation</li><li>End Select</li><li>Else</li><li>MsgBox "L'article n'est pas Enregistrer"</li><li>End If</li><li>End Sub</li></ol><ol><li>Public Sub Connect()</li><li>Set cn New ADODB.Connection</li><li>cn.Provider "Microsoft.jet.oledb.4.0"</li><li>cn.ConnectionString = App.Path & "\base.mdb"</li><li>cn.Open</li><li>End Sub</li></ol>Par avance je vous remercie de votre aide.
Cordialement,
Fabien
skyla
Messages postés60Date d'inscriptionsamedi 17 juin 2006StatutMembreDernière intervention19 octobre 2009 17 janv. 2009 à 13:20
Salut,
Tu as bien compris le principe(Ligne 9) mais il reste encore quelque trucs à regler.
La ligne 5 n'a pas sa place dans ton code,car tu fais une selection globale puis ensuite,au cas ou l'utilisateur repond oui tu selectionne l'article correspondant,donc pas de ligne 5.
Aussi la condition sur ta selection ne devrait pas se faire sur la designation car plusieur articles peuvent avoir la meme designation mais le numero identifiant sera toujours unique.En plus si tu le fais sur la designation tu dois encadrer ta valeur de cote car c'est une chaine de caractere (...
WHERE ARTICLES.Designation='" & Label1 & "'",cn,1,2).Voici une approche qui t'aidera surement:
'=+=+=+=+=+=+=
On Error Resume Next
Connect
rep = MsgBox("voulez vous vraiment supprimer l'article " & Label1, vbYesNo + vbQuestion, " Supprimer")
If rep = vbNo Then MsgBox " Suppression annuler", vbInformation: Exit Sub
Set rsARTART = New ADODB.Recordset
rsARTART.Open "select * from articles WHERE ARTICLES.ChampDuNumDansArticle=" & LabelDeID, cn, 1, 2
'Note qu'ici pas de cote car l'ID est de type numerique.
If Not rsARTART.EOF Then
rsARTART.Delete
MsgBox "Article supprimer", vbInformation
End If
rsARTART.Close
Set rsARTART = nothing
'=+=+=+=+=+=+=
De la meme maniere dont tu recuperer la designation dans label1,tu recuperer aussi l'ID de l'article selectionner et c'est lui que tu passe en condition WHERE de ton sql.
Quant a ta question sur le flexgrid,ceci n'est pas conseiller du tout,car tu ne peut garder un historique de ce que l'utilisateur ferat,le plus simple c'est de supprimer automatiquement comme tu avais debuter.A chaque suppression ta base est mis ajour automatiquement,alor il te faufrat retirer la ligne selectionner dans le flexgrid.La methode la plus simple serait de remplir de nouveau ton flexgrid,le changememnt apparaitront automatiquement.Voila,j'espere que ca va resoudre ton probleme.
a+
skyla
Messages postés60Date d'inscriptionsamedi 17 juin 2006StatutMembreDernière intervention19 octobre 2009 17 janv. 2009 à 02:23
Salut,
Dieu merci que ca ne marche pas sinon ce serait tout tes articles que seront effacer!!
rsARTART.Open "select * from articles", cn, 1, 2
Ici tu selectionne l'ensemble de tes articles dans ta table et tu appelle la methode rsART.Delete
mais sans te positionner avec un rsART.movefirst par exemple.Sans boucle seule le premier enregistrement sera effacer.Maintenant tu souhaite faire quoi concretement car dans ton code aucunne gestion du flexgrid.Meme ta requette devait etre en rapport avec celui ci.A chaque selection du ligne tu recupere le numero de l'article,puis tu en fait une requette du genre
rsARTART.Open "select * from articles WHERE Article.MaRef=" & VariablePourID, cn, 1, 2
Comme ca,tu recupere seulement l'article cliquer et le .Delete devrait l'effacer.C'est effacer oui,mais que dans ta table,donc tu dois gerer ensuite le flexgrid.Soit tu supprimme la ligne concerner,soit tu reutilise ta procedure de remplissage,qui au passage remplira de nouveau ton flexgrid sans bien entendu l'article qui vient d'etre supprimer.Essaie et tiens nous au courant.
Dans l'espoir d'avoir aider!a+
SnapFAB
Messages postés61Date d'inscriptionsamedi 10 novembre 2007StatutMembreDernière intervention 5 mars 2011 17 janv. 2009 à 12:54
Salut et merci pour ta réponse.
J'avoue que je suis perdu dans les différentes sélections dans ma base access, vu que même si on essaye de suivre "pas à pas" avec la touche F8 on voit pas ce que le programme fait dans la sélection.
J'aurais une petite question, serait-il éventuellement plus simple de travailler que sur mon flexgrid de faire mes suppressions, mes ajouts et à la fermeture de l'userform mettre à jour la base ACCESS ?
Sinon j'ai bien continuer en suivant tes conseils mais le résultat c'est qu'il m'efface la première ligne de ma base de données et non la ligne sélectionner :
<ol><li>Private Sub CMDSUPPRIMER_Click()</li><li>On Error Resume Next</li><li>Connect</li><li>Set rsARTART New ADODB.Recordset</li><li>rsARTART.Open "select * from articles", cn, 1, 2</li><li>rep MsgBox("voulez vous vraiment supprimer l'article " & Label1, vbYesNo + vbQuestion, " Supprimer")</li><li>Select Case rep</li><li>Case vbYes</li><li>rsARTART.Open "select * from articles WHERE ARTICLES.Designation=" & Label1, cn, 1, 2</li><li>rsARTART.Delete</li><li>MsgBox "Article supprimer", vbInformation</li><li>AfficherTout</li><li>Case vbNo</li><li>rsARTART.Cancel</li><li>MsgBox " Suppression annuler", vbInformation</li><li>End Select</li><li>End Sub</li></ol>
skyla
Messages postés60Date d'inscriptionsamedi 17 juin 2006StatutMembreDernière intervention19 octobre 2009 17 janv. 2009 à 22:40
Salut,
super que ca puisse t'aider.Je t'explique un peu mieu les methodes
rsARTART.EOF
te ramene vrai si on est en fin de fichier(EOF=End Of File=Fin de Fichier),c'est a dire que la requete SELECT que tu as faite te retourne aucun enregistrement.Donc dans ce cas impossible de supprimer quelque chose qui n'existe pas.Essai de tester avec un ID article que n'existe pas sans le .EOF et tu aura une erreur a la ligne .Delete
Donc on s'assure qu'on n'est pas en fin de fichier,donc qu'on a au moinS un resultat.
if not rsARTART.EOF est équivalent a if rsARTART.EOF=false
then...
Ici on est sur d'obtenir qu'un resultat puisque l'article existe et requette conditionner avec l'ID,mais une requette sql peut te ramener plusieurs enregistrements,alors la il ta faufra utiliser une boucle pour suprimer chaque enregistrement.Petit exemple rapide:
'=+=+=+=
rsARTART.Open "select * from articles WHERE ARTICLES.PRix<=20", cn, 1, 2
If Not rsARTART.EOF Then 'Si on n'est pas en fin de fichier
rsARTART.MoveFirst
'On se positionne sur la premiere ligne
do while not
rsARTART.EOf
'On boucle pour chaque ligne
rsARTART.Delete 'Supprime la ligne en cours
rsARTART.movenext 'Passe a l'enregistrement suivant
loop
MsgBox "Les Article aux prix <=20 ont été supprimé", vbInformation
End If
rsARTART.Close 'On ferme notre recordset
Set rsARTART = nothing 'Ici c'est le contraire de la declaration
'Vu qu'on a declarer
Set rsARTART = New ADODB.Recordset
,il nous faut vider la variable car elle reste en memoire.
D'ou le mot clé nothing
'=+=+=+=
Rien ne vaut un bon cour sur les recordsets et tu decouvrira beaucoup de methode qui t'aideront a mieux programmer les recordsets.
Tu trouvera plein de sources ici,telecharge les et tu verra que ces methodes sont generales,pratiquement utiliser de la meme maniere.
A+
[mailto:Sk@yL S]
SnapFAB
Messages postés61Date d'inscriptionsamedi 10 novembre 2007StatutMembreDernière intervention 5 mars 2011 18 janv. 2009 à 14:34
Merci pour toutes ces explications, c'est vraiment sympa de ta part.
Pour la suite de mon programme je compte rajouter encore plusieurs actions et tes informations vont vraiment être nécessaire à la suite de mon développement. Merci :)
SnapFAB
Messages postés61Date d'inscriptionsamedi 10 novembre 2007StatutMembreDernière intervention 5 mars 2011 18 janv. 2009 à 15:46
J'ai bien compris la boucle pour supprimer les prix inférieur ou égale à 20.
Mais je serais à la recherche de la formule pour modifier la quantité de l'article sélectionner.
Je suppose que c'est la ligne suivante qu'il faut modifier :
rsARTART.Delete
Mais ou peut on trouver toutes les commandes possibles avec les recordset ?
skyla
Messages postés60Date d'inscriptionsamedi 17 juin 2006StatutMembreDernière intervention19 octobre 2009 18 janv. 2009 à 16:14
Salut,
Pour modifier la quantité,c'est comme tu l'as dit,tu utilise le .update,mais après les affectations de chaque champs:
rsARTART
.CursorLocation = adUseClient
rsARTART.Open "select * from articles WHERE ARTICLES.ChampDuNumDansArticle=" & LabelDeID, cn, 1, 2
If Not rsARTART.EOF Then
rsARTART("PrixArticle")=NouveauPrix 'Tu fais les nouvelles affectation
rsARTART("Designation")=NouveauNom
rsARTART. Update
End if
rsARTART.close
=+= +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
Pour l'ajout:
rsARTART
.CursorLocation = adUseClient
rsARTART.Open "select * from articles", cn, 1, 2
rsARTART. AddNew
'Ici pas de IF ni de condition dans SQL
rsARTART("PrixArticle") =NouveauPrix 'On selectionne * dans articles et on precise un ajout
rsARTART("Designation")=NouveauNom
rsARTART.Update
rsARTART.close
Pour les cours de recordset,google est ton ami,mais un tour sur developpez.com t'aiderat surement,même ici tu as de bon tutoriels,mais fais tes recherches pour "recordset ADO" et non DAO,c'est conseillé de nos jours,DAO tend a etre depassé.