table en VBA - VB/VBA/VBS - Programmation
Marsh Posté le 16-04-2003 à 09:31:05
up!
Marsh Posté le 16-04-2003 à 09:48:45
Ben tout simplement:
if me.txt_numsoft = T_XYZ[NoSoft] then
Le then etre sur la meme ligne que le if
Marsh Posté le 16-04-2003 à 10:39:15
ca marche pas vraiment... il me met un mess du genre: variable non définie!
help me!
Marsh Posté le 16-04-2003 à 10:51:13
Donne ton code...
txt_numsoft est bien un textbox ou un truc comme ca?
Marsh Posté le 16-04-2003 à 10:55:05
If Me![txt_numSoft] = [#NoSoft] Then
oui, txt_numSoft est une zone de texte et #NoSoft est un champ appartenant à la table TXYZ. Lorsque je test avec le code ci-dessus, on dirait qu'il ne se refère en rien au champ NoSoft de la table TXYZ mais... car il passe quand mm dans mon if mm si la condition est fausse...
Marsh Posté le 16-04-2003 à 11:09:06
Bon en VBA on n'utilise pas le ! et les []...
Tu fait directement me.txt_numsoft
et il faudrait mettre le nom de ton tableau avant le [#NoSoft]...
Marsh Posté le 16-04-2003 à 11:13:18
c'est zarbe ce que tu me dis... dans tout le reste de mon code, j'utilise tout le temps ! et [] et il ne m'a jamais chier des prunes^^ Mais bon, je sais que je suis obligé de mettre des [] autour de chaque nom de champ commencant par #XXX
... pour ne revenir au code, il ne me reconnais pas ma table, c'est comme avant!
Marsh Posté le 16-04-2003 à 11:18:58
Donne ton bout de code...
Au fait c'est quel version?
Et tu peus essayer me.txt_numsoft.text
Marsh Posté le 16-04-2003 à 11:35:08
txt_NumSoft est de type numérique si jamais. Il s'agit de la clé primaire du soft que j'affiche dans mon formulaire. Si je repère cette clé dans la table T_XYZ alors il ne validera pas l'emprunt.
j'utilise access 97... et voici mon code (intégral):
If Me.txt_numSoft = [#NoSoft] Then
MsgBox " Le soft est déjà emprunté, veuillez en choisir un autre "
Me.Undo
CodeBar.SetFocus
Else
Me![DateEmprunt] = Date
End If
Marsh Posté le 16-04-2003 à 11:41:36
Okay... quand tu aurras tout dit... C'est du Access...
Il faut que tu fasse un recodset de ta table T_XYZ et apres tu boucles sur ce recodset en checkant que la cle n'existe pas... Si elle existe tu met ton message d'erreur et tu arrete la boucle autrement tu fait ton update
Marsh Posté le 16-04-2003 à 11:45:15
K1200 a écrit : Okay... quand tu aurras tout dit... C'est du Access... |
je ne connais pas tout du VBA et les recordset est ce que j'ai le moins rencontré tout au long de ma base... tu pourrais faire un little exemple en code? plizzzeee
au fait, tu croyais que j'étais dans quel prog avant que je te dise que je bossais dans access?
Marsh Posté le 16-04-2003 à 11:54:23
Moi je fait surtout du VBA dans Excel... Mais le VBA il y en a dans tout les produit Office
Je te cherche un exemple cet apres midi...
Marsh Posté le 16-04-2003 à 12:44:29
K1200 a écrit : Moi je fait surtout du VBA dans Excel... Mais le VBA il y en a dans tout les produit Office |
ouais je sais que les paquets offices dégorge de VBA... mais il me semble que le codage est le même pour tous les produits (Access, excel,...). Enfin, bref. Ma syntaxe fonctionne trèa bien tout comme la tienne, alors pas de soucis^^
merci pour le little exemple... ca me sortirait du kaka^^
Marsh Posté le 16-04-2003 à 15:20:45
Voila ca doit ressembler a un truc comme ca... J'ai pas tester mais ca doit pas etre loin
Code :
|
Marsh Posté le 16-04-2003 à 15:34:24
ok... je test et je te redis!
Miracle!!! ca fonctionne!!! ouffff c'était le plus gros bug... et maintenant il n'existe plus!
Merci pour ton aide!
Marsh Posté le 17-04-2003 à 08:14:47
K1200 a écrit : Voila ca doit ressembler a un truc comme ca... J'ai pas tester mais ca doit pas etre loin
|
ya juste un petit détail qui merde... lorsqu'un user vient emprunter un soft et que à ce moment là, la table T_XYZ est totalement vide, l'enregistrement de l'emprunt se fait (pas de prob) mais la date ne se met pas... en gros, il passe pas par le If...
je rectifie.... il ne passe même pas dans le Do while!
Marsh Posté le 17-04-2003 à 09:20:15
C'est normal la condition de la boucle c'est de boucler tans qu'il n'est pas a la derniere ligne... Et si la table est vide il ne va pas boucler...
Donc pour que ca fonctionne tu fait un:
if rs2.eof then ' Test si la table est vide
' Update de la date
else
' La boucle
Do While ...
...
loop
endif
Marsh Posté le 17-04-2003 à 09:41:09
K1200 a écrit : C'est normal la condition de la boucle c'est de boucler tans qu'il n'est pas a la derniere ligne... Et si la table est vide il ne va pas boucler... |
lool ce que tu me dis, c'est tout con et j'avais même pas remarqué.... j'ai un peu honte... va falloir que je remédie à ca!
Merci bcp pour ton aide! Si j'ai d'autre kestion, j'espère que tu pourra de nouveau me filer un coup de pouce!
Marsh Posté le 17-04-2003 à 09:52:58
lool je comprends mieux pourquoi tu domine....
comme tu dis, entre Suisse!
Marsh Posté le 29-04-2003 à 09:50:26
j'ai un nouveau problème... lorsque je veux emprunter un soft, j'ai deux critère à remplir à l'aide d'un pistolet scanner. Le numéro personnel de personne qui emprunte ainsi que le code-barre du soft qu'elle veut emprunter --- Jusque là, pas de prob. Par la suite, j'ai fait un recordset qui scanne la table d'emprunt pour voir si le soft est déjà emprunté. Si oui, il met un mess et la personne doit choisir un autre soft. Sinon, il met la date actuelle dans le champ DateEmprunt... enfin voici le code quoi:
Dim db As Database, rs1 As Recordset
Dim rs2 As Recordset
Dim stDocName As String
' Selection de la base
Set db = CurrentDb
' Selection de la requete pour la booucle
Set rs1 = db.OpenRecordset("Select * from T_Emprunts" )
Set rs2 = db.OpenRecordset("Select * from T_Emprunts" )
If rs1.EOF Then ' Test si la table est vide
Me.DateEmprunt = Date
MsgBox " Vous avez emprunté un soft "
Else
' Boucle sur le nombre d'enregistrements
Do While Not rs1.EOF
If Me.txt_numSoft = rs1.Fields("#NoSoft" ).Value Then
If Forms![F_Personnes --- formulaire principal]![txt_NumPersonne] = rs2.Fields("#NoPersonne" ).Value Then
Me.DateRetour = Date
MsgBox " Vous avez rendu un soft "
Else
MsgBox " Le soft est déjà emprunté, veuillez en choisir un autre "
Me.Undo
CodeBar.SetFocus
End If
ElseIf Not Me.txt_numSoft = rs1.Fields("#NoSoft" ).Value Then
Me.DateEmprunt = Date
MsgBox " Vous avez emprunté un soft2 "
End If
' Prochain enregistrement
rs1.MoveNext
Loop
End If
' Libere les variables
Set rs1 = Nothing
Set db = Nothing
le problème est que si je veux emprunter un soft, il fera la boucle mais dans ce sens:
1ère étape(il ira directement dans la boucle et exécuter cela): ElseIf Not Me.txt_numSoft = rs1.Fields("#NoSoft" ).Value Then
Me.DateEmprunt = Date
MsgBox " Vous avez emprunté un soft2 "
End If
et lors du deuxième passage de la boucle, il fera:
If Me.txt_numSoft = rs1.Fields("#NoSoft" ).Value Then
If Forms![F_Personnes --- formulaire principal]![txt_NumPersonne] = rs2.Fields("#NoPersonne" ).Value Then
Me.DateRetour = Date
MsgBox " Vous avez rendu un soft "
Comment faire pour qu'il ne fasse pas ce deuxième passage?? Je pige pas pourquoi il fait pas un seul passage... help me!
Si vous comprenez pas qqch, n'hésitez pas!
Marsh Posté le 29-04-2003 à 11:09:01
up!
Marsh Posté le 29-04-2003 à 11:25:33
rectification du problème! en réalité, si j'ai déjà 20 enregistrements dans ma table, il me mettra 20 mess quelqueconques (suivant les conditions) et après seulement il m'indiquera que j'ai emprunté un soft.
comment dire à Access de se baser que sur la ligne(le nouvel emprunt) que je rajoute??
Marsh Posté le 29-04-2003 à 14:53:05
Tu n'as pas de sortie de ta boucle a pare les eof.. donc il va faire a chaque fois tout la boucle...
Met un "exit do" la ou tu veux qu'il sorte de la boucle... Par exemple apres tes messages...
Marsh Posté le 29-04-2003 à 15:45:53
K1200 a écrit : Tu n'as pas de sortie de ta boucle a pare les eof.. donc il va faire a chaque fois tout la boucle... |
ce qui provoque un "je m'en fou" de ma première condition if dans la boucle(en d'autre terme, j'ai beau tester si le soft est déjà emprunté ou pas, il répondra "faux" à la condition)... lool (je vais péter une durite )
Marsh Posté le 29-04-2003 à 17:39:33
Tu as essayer en pas a pas pour voir ce qu'il y avait dans tes variables?
Marsh Posté le 30-04-2003 à 08:26:48
K1200 a écrit : Tu as essayer en pas a pas pour voir ce qu'il y avait dans tes variables? |
c'est le chenis... si tu regarde l'immense bout de code que j'ai mis hier, où placerais-tu les "exit Do"??
Marsh Posté le 30-04-2003 à 08:28:50
Alors essaye de les afficher dans un text box avant ta condition... comme ca tu verra se qu'il y a dedans
Marsh Posté le 30-04-2003 à 08:40:06
K1200 a écrit : Alors essaye de les afficher dans un text box avant ta condition... comme ca tu verra se qu'il y a dedans |
je pense que le blème vient de mes "exit do". En gros, il compare ce que je vient d'entrer avec la 1ère ligne de ma tbale et ensuite il quitte le programme (il obéit à mon exit do) -- c'est pour ca qu'il fait une fois le Do While.
Marsh Posté le 30-04-2003 à 09:44:10
Ils sont ou tes exit do dans ton code? Je ne les vois pas dans ton code juste en dessus...
Marsh Posté le 30-04-2003 à 09:44:20
Petite syntèse:
J'ai une table T_Emprunts. Je veux emprunter un soft... pour cela, il faut detecter si le soft est déjà dans la table et si oui, il met un mess sinon, il passe à la suite, etc...
Bon, pour les tests -- tout est ok. Je fais un scan de ma table à l'aide d'un Do While et ensuite le prog teste suivant mes conditions. là le problème: si j'ai 20 enregistrements dans ma table, il testera 20 fois et me mettra 20 mess alors que je veux qu'il affiche un mess uniquement pour l'enregistrement que je complète en voulant emprunter un soft. Si je mets des "exit do", il sortira de ma boucle dès le premier voyage et donc ne prendra pas correctement en compte mon emrpunt...
Marsh Posté le 01-05-2003 à 08:49:37
pour le moment, voici mon code (la partie des tests):[i]
If rs1.EOF Then ' Test si la table est vide
MsgBox " Vous avez emprunté un soft1 "
Me.DateEmprunt = Date
Else
' Boucle sur le nombre d'enregistrements
Do While Not rs1.EOF
TryAgain:
If Me.txt_numSoft = rs1.Fields("#NoSoft" ).Value Then
If Forms![F_Personnes --- formulaire principal]![txt_NumPersonne] = rs1.Fields("#NoPersonne" ).Value Then
MsgBox " Vous venez de rendre un soft, merci "
Me.DateRetour = Date
DoCmd.GoToRecord , , acNewRec
DoCmd.SetWarnings False
stDocName = "R_AjouterAHistorique"
DoCmd.OpenQuery stDocName, acViewNormal, acEdit
stDocName = "R_DeleteEmpruntRendu"
DoCmd.OpenQuery stDocName, acNormal, acEdit
DoCmd.SetWarnings True
Exit Do
Else
MsgBox " Le soft est déjà emprunté, veuillez en choisir un autre "
Me.Undo
CodeBar.SetFocus
GoTo TryAgain
End If
Exit Do
ElseIf Not Me.txt_numSoft = rs1.Fields("#NoSoft" ).Value Then
MsgBox " Vous avez emprunté un soft2 "
Me.DateEmprunt = Date
End If
' Prochain enregistrement
rs1.MoveNext
Loop
End If
En ce qui concerne mon "ElseIf Not bla bla", j'ai également essayé de mettre un "else" tout seul mais à ce moment, ca bug ailleurs^^
Marsh Posté le 01-05-2003 à 11:31:01
Il est un peu bizare ton code... Mais je crois que j'ai trouver le probleme...
ALors
If rs1.EOF Then ' Test si la table est vide
MsgBox " Vous avez emprunté un soft1 "
Me.DateEmprunt = Date
Else ' La table n'est pas vide donc on recherche...
' Boucle sur le nombre d'enregistrements
Do While Not rs1.EOF
' Si le soft choisi exist dans la table
If Me.txt_numSoft = rs1.Fields("#NoSoft" ).Value Then
' Et que c'est la meme personne
If Forms![F_Personnes --- formulaire principal]![txt_NumPersonne] = rs1.Fields("#NoPersonne" ).Value Then
' On rend le soft...
MsgBox " Vous venez de rendre un soft, merci "
Me.DateRetour = Date
DoCmd.GoToRecord , , acNewRec
DoCmd.SetWarnings False
stDocName = "R_AjouterAHistorique"
DoCmd.OpenQuery stDocName, acViewNormal, acEdit
stDocName = "R_DeleteEmpruntRendu"
DoCmd.OpenQuery stDocName, acNormal, acEdit
DoCmd.SetWarnings True
Exit Do
' Fin de la boucle
Else ' Soft trouver mais pas la meme personne
MsgBox " Le soft est déjà emprunté, veuillez en choisir un autre "
Me.Undo
CodeBar.SetFocus
Exit do
' On sort de la boucle... ca ne sert a rien de continuer...
End If
End If
' Prochain enregistrement
rs1.MoveNext
Loop
End If
Donc si on arrive ici c'est que soit on a parcourru tout la table sans le trouver... donc pas emprunter... ou deja emprunter ou rendu...
If (rs1.eof) and (Not Me.txt_numSoft = rs1.Fields("#NoSoft" ).Value) Then
MsgBox " Vous avez emprunté un soft2 "
Me.DateEmprunt = Date
endif
Marsh Posté le 01-05-2003 à 13:52:08
K1200 a écrit : Donc si on arrive ici c'est que soit on a parcourru tout la table sans le trouver... donc pas emprunter... ou deja emprunter ou rendu... |
mais l'erreur subsiste et persiste lool
en essayant d'emprunter un soft qui n'apparaît pas encore dans la table, il me met une erreur comme quoi il n'y a "pas d'enregistrement courant". C'est logique car tout est dans mon formulaire et tant que je ne le quitte pas, rien ne sera enregistré dans ma table...
Marsh Posté le 01-05-2003 à 15:07:41
Regarde dans la doc d'Access il y a une methode pour aller a un nouvel enregistrement depuis la form...
Marsh Posté le 01-05-2003 à 15:11:02
J'ai trouver...
Avant d'ecrire tu fait un:
DoCmd.GoToRecord , , acNewRec
Et apres avoir ecrit tu fais pour sauver le record un:
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
Il y a peut etre d'autre solution mais ca doit fonctionner comme ca...
Marsh Posté le 01-05-2003 à 16:12:35
K1200 a écrit : J'ai trouver... |
je commence à être (sérieusement) largué... (ben ca fait une journée que je m'acharne sur du code alors ca commence à me sortir par tous les trous^^). Donc, c'est lorsqu'il cherche à tester mon dernier IF que ca coince If (rs1.eof) and (Not Me.txt_numSoft = rs1.Fields("#NoSoft" ).Value) Then
Si je pige, tu me dis de créer un nouvel enregistrement avant de tester ce If et après je sauve mon recordset... c'est ça? (je suis désolé si je t'énèreve ou bien si je te fais pitié mais là, je sombre... en plus, ça à l'air tout con alors je sombre encore plus )
Marsh Posté le 01-05-2003 à 17:08:21
Non dans le if...
If (rs1.eof) and (Not Me.txt_numSoft = rs1.Fields("#NoSoft" ).Value) Then
' Cree un nouveau
DoCmd.GoToRecord , , acNewRec
MsgBox " Vous avez emprunté un soft2 "
Me.DateEmprunt = Date
' Sauve le recorde
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
endif
Comme ca tu cree un nouveau que quand tout est ok...
Marsh Posté le 16-04-2003 à 08:42:21
kikooo^^
voici un bout de code tout con: If Me![txt_numSoft] =[#NoSoft] Then
Le champ #NoSoft fait partie de la table T_XYZ. Comment indiquer cela en VBA??
---------------
Le bien ou le mal, l'homme ou l'animal, on ne voit jamais l'un sans l'autre