cs_popo51
Messages postés38Date d'inscriptionlundi 14 février 2005StatutMembreDernière intervention 6 juin 2006
-
1 juin 2006 à 16:21
erefdatacomputing
Messages postés165Date d'inscriptionmardi 7 mars 2006StatutMembreDernière intervention24 avril 2018
-
6 juin 2006 à 15:23
Bonjour j'auris voulu savoir comment faire pour afficher les champs de ma base de donnée dans différents TextBox et donc ce qui me pose problème le changement de ligne !!
J'ais le code suivant pour afficher mes champ mais je ne trouve pas le moyen de changer de ligne !!
Merci d'avance.
Command1 est un bouton qui ferrra défiller les différentes valeurs de chaque ligne
dans les TextBox correspondant :
Private Sub Command1_Click()
Dim last As Integer
tb.Open "SELECT * FROM CompteurRebuts ", bd, adOpenDynamic, adLockOptimistic
If Not tb.EOF Then
Text4.Text = tb.Fields!Date
Text5.Text = tb.Fields!NumOf
Text6.Text = Format((tb.Fields!Compteur), "# ##0")
Text7.Text = tb.Fields!Format
End If
tb.Close
End Sub
erefdatacomputing
Messages postés165Date d'inscriptionmardi 7 mars 2006StatutMembreDernière intervention24 avril 2018 2 juin 2006 à 14:25
Oui parce que ni dans le Form_Laod et la Fonction 'Charger' tu as déclaré tb (tb.Open "SELECT ............)
Evite d'ouvrir différentes tables (en alternance) avec le même nom de variable (risque de se tromper !!!)
Il y a deux écoles:
1) Soit on met tout dans une seule et même table.
Avantage: moins contraignant d'accès aux données
Inconvénient: si erreur dans BDD => Plantage Total
2) Soit on réparti de manière logique les informations dans plusieurs tables.
Avantage: Plantage Patiel en cas d'erreur dans la BDD
Inconvénient: Il faut tout déclarer (les tables) auparavant afin de réduire les temps d'accès aux données, et on doit 'jongler' avec les RecordSet.
Personnellement, j'utilise les deux méthodes en fonction du logiciel qu'on me demande de réaliser. (avec une préférence pour la 2ème)
Exemple (partiel et minimaliste) d'un de mes codes :
Logiciel de gestion d'entreprise (articles, fournisseurs, clients, rayons, taxes, commandes, devis, facturations, inventaires, caisse comptoir, caisse clients en compte, etc... etc... etc ...
Option Explicit
Dim DB As Database
Dim ra As Recordset
Dim ra2 As Recordset
Dim ra3 As Recordset
Dim ra4 As Recordset
Dim rartfou As Recordset
Dim rarech As Recordset
Dim rmsf2artd1fou As Recordset
Dim re As Recordset
Dim rf As Recordset
Dim rfactif As Recordset
Dim rgcd As Recordset
Dim rpc As Recordset
Dim rt As Recordset
Dim rr As Recordset
-----------------------
Private Sub Form_Load()
'déclaration de la BDD et des Tables'
Set DB = OpenDatabase("C:\Program Files\Rfdc\Logémag2006\Logémag2006.mdb")
Set ra = DB.OpenRecordset("Articles", dbOpenDynaset)
Set ra2 = DB.OpenRecordset("Articles", dbOpenDynaset)
Set ra3 = DB.OpenRecordset("Articles", dbOpenDynaset)
Set ra4 = DB.OpenRecordset("Articles", dbOpenDynaset)
Set rmsf2artd1fou = DB.OpenRecordset("msf2artd1fou", dbOpenDynaset)
Set re = DB.OpenRecordset("Etiquettes", dbOpenDynaset)
Set rf = DB.OpenRecordset("Fournisseurs", dbOpenDynaset)
Set rfactif = DB.OpenRecordset( _
"SELECT code, nom " & _
"FROM Fournisseurs where st='ACTIF' order by code ", _
dbOpenDynaset)
Set rgcd = DB.OpenRecordset("Gencod", dbOpenDynaset)
Set rpc = DB.OpenRecordset("plancompta", dbOpenDynaset)
Set rr = DB.OpenRecordset("Rayons", dbOpenDynaset)
Set rt = DB.OpenRecordset("Taxes", dbOpenDynaset)
'affichage à l'ouverture du 1er enregistrement au statut "ACTIF"'
C'est sûr !! C'est beaucoup plus contraignant qu'avec la méthode de déclaration de dépendance des objets via un controle data ou un ADO data control, mais c'est Béton !!! et c'est comme tout,
"la méthode la meilleur, c'est celle qui te plait le mieux !!!"
Parfois il faut se forcer à faire une refonte complète d'un programme, pour avancer d'un grand pas vers l'efficacité !!
Je comprends vite mais il faut m'expliquer longtemps et tout en détails !!!
erefdatacomputing
Messages postés165Date d'inscriptionmardi 7 mars 2006StatutMembreDernière intervention24 avril 2018 1 juin 2006 à 16:52
Ok !!
Il te faut d'abord organiser tout cela de manière correcte:
si tu écris çà comme il est actuellement, cela revient à ouvrir de manière ponctuelle, une Table de ta Base de Données, afficher le 1er enregistrement, puis la fermer (ce qui revient à la décharger), donc tu ne peux pas aller à d'autres enregistrements comme çà !!!
Donc pas de 'tb.Close' sauf si tu veux la recharger de nouveau après de multiples modifications !!!
je te conseille d'écrire ton code de cette manière:
tout en haut de ta page de code:
Option Explicit
Dim last As Integer
ensuite dans le Form Load:
Private Sub Form_Load()
tb.Open "SELECT * FROM CompteurRebuts ", bd, adOpenDynamic, adLockOptimistic
If Not tb.EOF Then
Text4.Text = tb.Fields!Date
Text5.Text = tb.Fields!NumOf
Text6.Text = Format((tb.Fields!Compteur), "# ##0")
Text7.Text = tb.Fields!Format
End If
End Sub
puis sur un CommandButton appelé 'Suivant'
Private Sub Suivant_Click()
tb.MoveNext
If Not tb.EOF Then
Text4.Text = tb.Fields!Date
Text5.Text = tb.Fields!NumOf
Text6.Text = Format((tb.Fields!Compteur), "# ##0")
Text7.Text = tb.Fields!Format
End If
End Sub
et enfin sur unCommandButton appelé 'Précédent'
Private Sub Précédent_Click()
tb.MovePrevious
If Not tb.EOF Then
Text4.Text = tb.Fields!Date
Text5.Text = tb.Fields!NumOf
Text6.Text = Format((tb.Fields!Compteur), "# ##0")
Text7.Text = tb.Fields!Format
End If
End Sub
Perso je ne l'ai pas essayé, mais normalement, çà marche !!!
à toi de tester ce code, et à mettre les 'barrières' au cas où il n'y aurait pas d'enregistrement précédent (avant le 1er Error), et au cas où il n'y aurait pas de suivant non plus (après le dernier Error).
Voilà !!! En cas de soucis n'hésite pas !! Si je sais, je t'aiderai !!!
Je comprends vite mais il faut m'expliquer longtemps et tout en détails !!!
thkiller
Messages postés168Date d'inscriptionmercredi 24 mai 2006StatutMembreDernière intervention11 septembre 2007 1 juin 2006 à 20:45
Merci beaucoup je regarderai ca demain matin au taff mais ca m'a pas l'ai faux donc je te remierci et te recontact surement demain dans la matin et l'aprèm !!
++
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_popo51
Messages postés38Date d'inscriptionlundi 14 février 2005StatutMembreDernière intervention 6 juin 2006 2 juin 2006 à 08:15
bon si je mets le code tel qu'elle je me retrouve avec une erreur qui me dis que :
"Cette opération n'est pas autorisée si l'objet est fermet"
Je pense que cela vient du fait que dans le code d'un autre boutton j'utilise un tb.close mais bon.......ceal voudrai dire qu'il faud que je vire dans cet autre boutton
cs_popo51
Messages postés38Date d'inscriptionlundi 14 février 2005StatutMembreDernière intervention 6 juin 2006 2 juin 2006 à 09:07
le truck c'est que dans mon Form_Load() j'ais une fonction charger qui elle a un close à chaque foix qu'elle se termine, ce qui m'oblige à réouvrir lorsque je fait suivant ou précédant !!
Du coup lorsque j'écrir le code suivant :
Private Sub Command1_Click()
tb.Open "SELECT * FROM CompteurRebuts ORDER BY Date ASC", bd, adOpenDynamic, adLockOptimistic
tb.MovePrevious
If tb.BOF = True Then
tb.MoveLast
End If
Text4.Text = tb.Fields!Date
Text5.Text = tb.Fields!NumOf
Text6.Text = Format((tb.Fields!Compteur), "# ##0")
Text7.Text = tb.Fields!Format
tb.Close
End Sub
ca marche bien pour le dernier mais lorsque je reclique dessus forcément il répète les même aciton vue que j'ais fait un tb.Close, si je l'enlève au second click il me dis qu'il ne pe pas l'ouvrir si l'objet et déjà ouver comment je pe faire pour réglè ce pb !! MERCI
cs_popo51
Messages postés38Date d'inscriptionlundi 14 février 2005StatutMembreDernière intervention 6 juin 2006 2 juin 2006 à 09:13
bon et bien apparament j'ais trouvé, j'ai utilisé "tb.State" pour l'ouverture et ca marche !!
Private Sub Command1_Click()
If Not tb.State = 1 Then
tb.Open "SELECT * FROM CompteurRebuts ORDER BY Date ASC", bd, adOpenDynamic, adLockOptimistic
End If
tb.MovePrevious
If tb.BOF = True Then
tb.MoveLast
End If
Text4.Text = tb.Fields!Date
Text5.Text = tb.Fields!NumOf
Text6.Text = Format((tb.Fields!Compteur), "# ##0")
Text7.Text = tb.Fields!Format
End Sub
Dans l'état actuel je parcour ma base de bas en haut et effectuant un rebouclage !!
et c'est le rebouclage que je ne ve pas !!
cs_popo51
Messages postés38Date d'inscriptionlundi 14 février 2005StatutMembreDernière intervention 6 juin 2006 2 juin 2006 à 09:25
Voila comme ca ca marche nikel !!
Private Sub Command1_Click()
If Not tb.State = 1 Then
tb.Open "SELECT * FROM CompteurRebuts ORDER BY Date ASC", bd, adOpenDynamic, adLockOptimistic
If tb.BOF = False Then
tb.MoveLast
End If
End If
tb.MovePrevious
If tb.BOF = True Then
MsgBox "Plus d'enregistrement précédant"
Exit Sub
End If
Text4.Text = tb.Fields!Date
Text5.Text = tb.Fields!NumOf
Text6.Text = Format((tb.Fields!Compteur), "# ##0")
Text7.Text = tb.Fields!Format
End Sub
erefdatacomputing
Messages postés165Date d'inscriptionmardi 7 mars 2006StatutMembreDernière intervention24 avril 2018 2 juin 2006 à 09:36
C'est simple, si tu ouvre une table (sans la refermer tout se suite après !!!) elle reste ouverte tant que tu n'ordonne pas de la fermer.
Donc un conseil, enlève tous les 'tb.Open "SELECT * FROM CompteurRebuts ORDER BY Date ASC", bd, adOpenDynamic, adLockOptimistic'et les'tb.Close' qui sont en dehors du Form_Load, en les recherchant grace à la paire de jumelle (Rechercher) qui se trouve dans la barre d'outils du haut de VB, et en tapant dans le Combo l'expression à rechercher.
Je l'accorde, c'est un peu pénible, mais bien plus pratique, car supposons qu'un jour tu crées une BDD avec une Table contenant 'moulte et moulte' enregistrements, il te faudra plusieurs secondes (voir minutes !!!) pour la charger à chaque fois !!!
Tu imagines l'utilisateur final du logiciel en train d'attendre à chaque fois qu'il appuye sur une touche ???? (Pétage de Plombs !!! Non ?)
De plus la navigation et la modification en est plus que simplifiée !!
Je suis sûr à 99.99999999999 % que ton problème ne vient que de là !! (c'est toujours du 0.00000000001 % qu'il faut ce méfier !!!)
Fais une copie de ton projet initial (par sécurité), et commence par ce que je viens de t'expliquer.
Rappel moi !!
Je comprends vite mais il faut m'expliquer longtemps et tout en détails !!!
cs_popo51
Messages postés38Date d'inscriptionlundi 14 février 2005StatutMembreDernière intervention 6 juin 2006 2 juin 2006 à 09:41
bon voila donc mon code pour les deux bouttons sont les suivant :
Pour le boutton précédant :
Private Sub Command1_Click()
If Not tb.State = 1 Then
tb.Open "SELECT * FROM CompteurRebuts ORDER BY Date ASC", bd, adOpenDynamic, adLockOptimistic
If tb.BOF = False Then
tb.MoveLast
End If
End If
If tb.BOF = True Then
MsgBox "Plus d'enregistrement précédant"
tb.Close
Exit Sub
End If
Text4.Text = tb.Fields!Date
Text5.Text = tb.Fields!NumOf
Text6.Text = Format((tb.Fields!Compteur), "# ##0")
Text7.Text = tb.Fields!Format
tb.MovePrevious
End Sub
et pour le boutton suivant :
Private Sub Command3_Click()
If Not tb.State = 1 Then
tb.Open "SELECT * FROM CompteurRebuts ORDER BY Date ASC", bd, adOpenDynamic, adLockOptimistic
If tb.EOF = True Then
tb.MoveFirst
End If
End If
If tb.EOF = True Then
MsgBox "Plus d'enregistrement précédant"
tb.Close
Exit Sub
End If
Text4.Text = tb.Fields!Date
Text5.Text = tb.Fields!NumOf
Text6.Text = Format((tb.Fields!Compteur), "# ##0")
Text7.Text = tb.Fields!Format
tb.MoveNext
End Sub
j'ais juste un piti sousis lorsque je passe d'un boutton a l'autre il faud que je click deux foix pour qu'une action soit visible !!
je sais aps si c'est claire dis comme ca !!
Enfin si ca intéresse quelq'un qui pe m'aider !! merci
cs_popo51
Messages postés38Date d'inscriptionlundi 14 février 2005StatutMembreDernière intervention 6 juin 2006 2 juin 2006 à 10:10
Bon alors voila si ca ne te dérange pas je te donne le source de ma version en complet et celui aprés modif (saus les tb.colse et tb.Open ".....") ca ne marche pas pour si je le modifie comme tu me l'a dis et il me met une erreur dés l'appel de la fonction charger() : "Cette opération n'est pas autorisée si l'objet est fermet"
Sans Modif
Option Explicit
Dim bd As New ADODB.Connection
Dim tb As New ADODB.Recordset
Dim dateOLD As String
'Attente réponce pour changement de ligne
Private Sub Command1_Click()
If Not tb.State = 1 Then
tb.Open "SELECT * FROM CompteurRebuts ORDER BY Date ASC", bd, adOpenDynamic, adLockOptimistic
If tb.BOF = False Then
tb.MoveLast
End If
End If
If tb.BOF = True Then
MsgBox "Plus d'enregistrement précédant"
tb.Close
Exit Sub
End If
Text4.Text = tb.Fields!Date
Text5.Text = tb.Fields!NumOf
Text6.Text = Format((tb.Fields!Compteur), "# ##0")
Text7.Text = tb.Fields!Format
tb.MovePrevious
End Sub
Private Sub Command2_Click()
tb.Open "SELECT Date FROM CompteurRebuts", bd, adOpenDynamic, adLockOptimistic
If Not tb.EOF Then
If Text1.Text = tb!Date Then
MsgBox "La date que vous avez saisi existe déjà"
tb.Cancel
Exit Sub
End If
tb.Close
End If
tb.Open "SELECT * FROM CompteurRebuts", bd, adOpenDynamic, adLockOptimistic
tb.AddNew
If Text1.Text = "" Then '# si non saisie
MsgBox "Date incorrect"
Exit Sub
End If
If Text2.Text = "" Then '# si non saisie
MsgBox "Numéro OF invalide"
tb.Cancel
Exit Sub
End If
If Text3.Text = "" Then '# si non saisie
MsgBox "Valeur incorrect"
tb.Cancel
Exit Sub
End If
If Combo1.Text = "" Then
MsgBox "Format incorrect"
tb.Cancel
Exit Sub
End If
tb!Date = Text1.Text '#écrire date
tb!NumOf = Text2.Text '#écrire Of
tb!Compteur = Text3.Text '# écrire valeur compteur
tb!Format = Combo1.Text
tb.Update
tb.Close
Set tb = Nothing
End Sub
Private Sub Command3_Click()
If Not tb.State = 1 Then
tb.Open "SELECT * FROM CompteurRebuts ORDER BY Date ASC", bd, adOpenDynamic, adLockOptimistic
If tb.EOF = True Then
tb.MoveFirst
End If
End If
If tb.EOF = True Then
MsgBox "Plus d'enregistrement précédant"
tb.Close
Exit Sub
End If
Text4.Text = tb.Fields!Date
Text5.Text = tb.Fields!NumOf
Text6.Text = Format((tb.Fields!Compteur), "# ##0")
Text7.Text = tb.Fields!Format
tb.MoveNext
End Sub
Private Sub Command4_Click()
bd.Close
Set bd = Nothing
End
End Sub
Private Sub Form_Load()
Dim retCharger As String
'Connection Base de donnée
bd.Provider = "microsoft.jet.oledb.4.0"
bd.ConnectionString = "C:\Documents and Settings\CalderonN\Base de donnée\bdCompteurRebut1.mdb"
bd.Open
Call Charger
'Selection de la combobox1
Combo1.AddItem "Format 1", 0
Combo1.AddItem "Format 2", 1
Combo1.AddItem "Format 3", 2
Combo1.AddItem "Format 4", 3
Combo1.AddItem "Format 5", 4
End Sub
Private Sub Charger()
'Affichage des auciennes valeurs (les plus récentes)
'La date
tb.Open "SELECT Max(Date) FROM CompteurRebuts", bd, adOpenDynamic, adLockOptimistic
If Not tb.EOF Then
Text4.Text = tb.Fields(0)
dateOLD = Text4.Text
End If
tb.Close
'Le numéro OF
tb.Open "SELECT NumOf FROM CompteurRebuts WHERE Date = " & Format$(dateOLD, "\#MM\/DD\/YYYY\#")
If Not tb.EOF Then
Text5.Text = tb.Fields!NumOf
End If
tb.Close
'La valeur du compteur
tb.Open "SELECT Compteur FROM CompteurRebuts WHERE Date=" & Format$(dateOLD, "\#MM\/DD\/YYYY\#")
If Not tb.EOF Then
Text6.Text = Format((tb.Fields!Compteur), "# ##0")
End If
tb.Close
'Le format de boite
tb.Open "SELECT Format FROM CompteurRebuts WHERE Date=" & Format$(dateOLD, "\#MM\/DD\/YYYY\#")
If Not tb.EOF Then
Text7.Text = tb.Fields!Format
End If
tb.Close
End Sub
Avec modif et erreur
Option Explicit
Dim bd As New ADODB.Connection
Dim tb As New ADODB.Recordset
Dim dateOLD As String
'Attente réponce pour changement de ligne
Private Sub Command1_Click()
If tb.BOF = False Then
tb.MoveLast
End If
If tb.BOF = True Then
MsgBox "Plus d'enregistrement précédant"
Exit Sub
End If
Text4.Text = tb.Fields!Date
Text5.Text = tb.Fields!NumOf
Text6.Text = Format((tb.Fields!Compteur), "# ##0")
Text7.Text = tb.Fields!Format
tb.MovePrevious
End Sub
Private Sub Command2_Click()
If Not tb.EOF Then
If Text1.Text = tb!Date Then
MsgBox "La date que vous avez saisi existe déjà"
tb.Cancel
Exit Sub
End If
End If
tb.AddNew
If Text1.Text = "" Then '# si non saisie
MsgBox "Date incorrect"
Exit Sub
End If
If Text2.Text = "" Then '# si non saisie
MsgBox "Numéro OF invalide"
tb.Cancel
Exit Sub
End If
If Text3.Text = "" Then '# si non saisie
MsgBox "Valeur incorrect"
tb.Cancel
Exit Sub
End If
If Combo1.Text = "" Then
MsgBox "Format incorrect"
tb.Cancel
Exit Sub
End If
tb!Date = Text1.Text '#écrire date
tb!NumOf = Text2.Text '#écrire Of
tb!Compteur = Text3.Text '# écrire valeur compteur
tb!Format = Combo1.Text
tb.Update
Set tb = Nothing
End Sub
Private Sub Command3_Click()
If tb.EOF = True Then
tb.MoveFirst
End If
If tb.EOF = True Then
MsgBox "Plus d'enregistrement précédant"
Exit Sub
End If
Text4.Text = tb.Fields!Date
Text5.Text = tb.Fields!NumOf
Text6.Text = Format((tb.Fields!Compteur), "# ##0")
Text7.Text = tb.Fields!Format
tb.MoveNext
End Sub
Private Sub Command4_Click()
bd.Close
Set bd = Nothing
End
End Sub
Private Sub Form_Load()
Dim retCharger As String
'Connection Base de donnée
bd.Provider = "microsoft.jet.oledb.4.0"
bd.ConnectionString = "C:\Documents and Settings\CalderonN\Base de donnée\bdCompteurRebut1.mdb"
bd.Open
Call Charger
'Selection de la combobox1
Combo1.AddItem "Format 1", 0
Combo1.AddItem "Format 2", 1
Combo1.AddItem "Format 3", 2
Combo1.AddItem "Format 4", 3
Combo1.AddItem "Format 5", 4
End Sub
Private Sub Charger()
'Affichage des auciennes valeurs (les plus récentes)
'La date
If Not tb.EOF Then
Text4.Text = tb.Fields(0)
dateOLD = Text4.Text
End If
'Le numéro OF
If Not tb.EOF Then
Text5.Text = tb.Fields!NumOf
End If
'La valeur du compteur
If Not tb.EOF Then
Text6.Text = Format((tb.Fields!Compteur), "# ##0")
End If
'Le format de boite
If Not tb.EOF Then
Text7.Text = tb.Fields!Format
End If
End Sub
J'espère seulement que ca ne te prend pas trops la tête sinon je laisse tombé et je garde le prog tel quel !!
cs_popo51
Messages postés38Date d'inscriptionlundi 14 février 2005StatutMembreDernière intervention 6 juin 2006 2 juin 2006 à 10:30
si je met le tb.Move avant il me saute a chaque foix une ligne lorsqu'il est a la fin et que je re-click dessus:
par exemple mes valeurs sont 1,2,3,4
début à 1
je fait le next
-->2
next
-->3
next
-->4
next
et la il passe a 2 au lieu de reprendre à 1, tu comprend ?
cs_popo51
Messages postés38Date d'inscriptionlundi 14 février 2005StatutMembreDernière intervention 6 juin 2006 6 juin 2006 à 08:16
Ok merci pour ton aide !!!
Donc si je comprend bien je doit revoir mon programme dans sa totalité pour une optimisation mais je n'ais pas très bien comprit ce que tu a fait en faisant toutes ces affectations.
cs_popo51
Messages postés38Date d'inscriptionlundi 14 février 2005StatutMembreDernière intervention 6 juin 2006 6 juin 2006 à 08:24
Enfin de tt ce n'est qu'un appercu de ton prog lol !!!
bon je vais maintenant passé avec la VRAI bdd de mon entreprise dasn un premier temps en local mais en suite via le réseau, ca me semble sacrèment compliquer mais bon pas insurmontable ^^.
Je suis vraiment un noob en vb bououououou.....
erefdatacomputing
Messages postés165Date d'inscriptionmardi 7 mars 2006StatutMembreDernière intervention24 avril 2018 6 juin 2006 à 15:23
1°) C'est comme le vélo..plus tu pratique, moins tu te casse la g....!!
2°) Ce que je t'ai expédié, n'est qu'un "petit" morceau de mon code !!!
PS: choisis des noms de recordsets simples et explicites
ex: ra pour recorset article, rf pour recordset fournisseur, etc...
Cela est plus rapide à écrire que rec_fournisseur par exemple...
Et çà evite les problème de 'dyslexie', ex: rec_fournissuer donc encore perte de temps.
Je comprends vite mais il faut m'expliquer longtemps et tout en détails !!!