Probème avec FlexGrid et base de données ACESS

Résolu
SnapFAB Messages postés 61 Date d'inscription samedi 10 novembre 2007 Statut Membre Dernière intervention 5 mars 2011 - 16 janv. 2009 à 17:57
skyla Messages postés 60 Date d'inscription samedi 17 juin 2006 Statut Membre Dernière intervention 19 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

10 réponses

skyla Messages postés 60 Date d'inscription samedi 17 juin 2006 Statut Membre Dernière intervention 19 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+




<sup>
[mailto:Sk@yL


S


]
</sup>



<sub>


</sub>
3
skyla Messages postés 60 Date d'inscription samedi 17 juin 2006 Statut Membre Dernière intervention 19 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+

[mailto:Sk@yL S]
0
SnapFAB Messages postés 61 Date d'inscription samedi 10 novembre 2007 Statut Membre Derniè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>
0
SnapFAB Messages postés 61 Date d'inscription samedi 10 novembre 2007 Statut Membre Dernière intervention 5 mars 2011
17 janv. 2009 à 15:05
C'est génial ça marche, je te remercie !

Malgré tout je n'arrive pas à comprendre les lignes de commandes suivantes :

If Not rsARTART.EOF Then

et

Set rsARTART = nothing

Merci pour ton aide :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
skyla Messages postés 60 Date d'inscription samedi 17 juin 2006 Statut Membre Dernière intervention 19 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]
0
SnapFAB Messages postés 61 Date d'inscription samedi 10 novembre 2007 Statut Membre Derniè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 :)

@+
Fabien
0
SnapFAB Messages postés 61 Date d'inscription samedi 10 novembre 2007 Statut Membre Derniè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 ?

En tout cas merci.
0
skyla Messages postés 60 Date d'inscription samedi 17 juin 2006 Statut Membre Dernière intervention 19 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é.

[mailto:Sk@yL S]
0
SnapFAB Messages postés 61 Date d'inscription samedi 10 novembre 2007 Statut Membre Dernière intervention 5 mars 2011
18 janv. 2009 à 16:29
Merci pour tout, je vais aller potasser tout ça :)
0
skyla Messages postés 60 Date d'inscription samedi 17 juin 2006 Statut Membre Dernière intervention 19 octobre 2009
18 janv. 2009 à 16:37
Ok, au boulot


alors!!!
a+




<sup>
[mailto:Sk@yL


S


]
</sup>



<sub>


</sub>
0
Rejoignez-nous