[Résolu] PB pour enregistrer des données dans la BSD ACCESS avec VBA

PB pour enregistrer des données dans la BSD ACCESS avec VBA [Résolu] - VB/VBA/VBS - Programmation

Marsh Posté le 15-01-2008 à 11:42:07    

Bonjour,
 
Alors voilà, je vous explique mon problème.
 
En fait les données que je veux enregistrer sont stocké dans une FlexGrid.
Chaque ligne de la FlexGrid correspond à un champ de la table.
La 1ère colonne c'est le nom du champ, la 2nd est la valeur de celui-ci.
 
Voici comment est initialisé la FlexGrid à l'ouverture du formulaire :
 
 

Code :
  1. For Each champ In req.Fields
  2.     If champ.Name <> "Code Article" And champ.Name <> "code ancien" And champ.Name <> "Désignation" And champ.Name <> "ancienne désignation" And champ.Name <> "n°Plan" And champ.Name <> "Img Plan" Then
  3.         i = i + 1
  4.         FlexInfo.Rows = i + 1
  5.         FlexInfo.TextMatrix(i, 0) = champ.Name
  6.     End If
  7. Next


 
Bon, pour ça, y'a aucun soucis ça marche !
 
Ensuite, une fois que j'ai renseigné les valeurs que je veux, ça bloque à l'enregistrement.
 
Voici mon code :
 

Code :
  1. pieces.Open "pieces", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
  2. pieces.AddNew
  3. pieces![Code Article] = [txtCodeArt]
  4. pieces![code ancien] = [txtOldArt]
  5. pieces![Désignation] = [txtDesign]
  6. pieces![ancienne désignation] = [txtOldDesign]
  7. pieces![n°Plan] = [txtNumPlan]
  8. pieces![Img Plan] = [txtImgPlan]
  9. For i = 0 To FlexInfo.Rows - 1
  10.     texte = FlexInfo.TextMatrix(i, 0)
  11.     pieces![texte] = FlexInfo.TextMatrix(i, 1)
  12. Next i
  13. pieces.Update
  14. pieces.Close


 
Ca bloque sur le "pieces![texte]" ligne 11...
J'ai le droit au message : "Impossible de trouver l'objet dans la collection correspondant au nom ou à la référence ordinale demandé... Et je ne vois pas trop comment résoudre le problème...
Donc si il y en a un qui est voit mieux que moi, qu'il n'hésite pas à se faire remarquer :D
 
Merci d'avance de votre aide précieuse.


Message édité par SkamakS le 17-01-2008 à 15:55:17
Reply

Marsh Posté le 15-01-2008 à 11:42:07   

Reply

Marsh Posté le 15-01-2008 à 12:42:06    

pieces![texte] = FlexInfo.TextMatrix(i, 1)
 
1. S'assurer que le problème vient bien de cette ligne en essayant une compilation sans cette ligne ou avec cette ligne mise en commentaire.
 
2. Voir ce que rapporte FlexInfo.TextMatrix(i, 1), par exemple avec MsgBox(FlexInfo.TextMatrix(i, 1))
sans s'occuper de pieces![texte] pour voir si le problème vient de la partie droite ou de la partie gauche du signe égal.
 
3. S'assurer que le champ "texte" existe bien et avec exactement cette orthographe (pas "text" ou "Texte" ).
 
4. S'assurer que les types de données sont compatibles, qu'il ne manquerait pas une converstion à faire par exemple par un CStr().

Reply

Marsh Posté le 16-01-2008 à 12:22:41    

Merci de ta réponse,
 
A moi de répondre :)
 
1. le problème vien bien de cette ligne, le débogueur s'arrête sur cette ligne.
 
2. FlexInfo.TextMatrix(i,1) apporte bien la valeur voulu.
 
3. texte est une variable de type STRING alimenté à chaque bouclage par un des champs de la table. Si tu regardes bien le code, tu comprendras pourquoi j'ai fait ça. Je pense que le soucis vien de là.
En fait il ne prend pas la valeur de la variable "texte" comme nom de champ, mais il prend "texte" comme champ, qui effectivement n'existe pas dans la table. Alors comment faire pour que je puisse utiliser la valeur de texte ?
 
4. Aucun soucis à ce niveau là non plus à se faire.

Reply

Marsh Posté le 17-01-2008 à 14:49:48    

Personne n'a une idée ? :/

Reply

Marsh Posté le 17-01-2008 à 14:55:37    

pieces!["texte"] non ?
 
et pourquoi y'a aucun "" dans tout ton code ? je comprends même pas pourquoi ça t'explose pas à la gueule dès la première ligne...

Reply

Marsh Posté le 17-01-2008 à 15:50:34    

Ca ne marche pas en mettant "pieces!["texte"].
 
Ben y'a pas besoin de ""... Justement si je mets pieces!["Code Article"] à la place de pieces![Code Article] ça ne marche pas... Car il recherche dans la table le champ avec les ""... en fait le délimiteur ce sont les [] à la place des ""
 
Enfin bref, je sais pas comment je pourrais me débrouiller pour qu'il prenne en compte la valeur de la variable "texte" :/

Reply

Marsh Posté le 17-01-2008 à 15:51:45    

ben alors utilise la vraie syntaxe :
 
pieces("texte" )

Reply

Marsh Posté le 17-01-2008 à 15:54:44    

Yeah je connaissais pas cette syntaxe !
 
Ca marche en mettant pieces(texte)
 
Merci bcp :D

Reply

Marsh Posté le 17-01-2008 à 15:56:31    

(ok, tu voulais l'inverse de ce que j'avais compris :D m'enfin bon, oui effectivement, avec cette syntaxe ça débloque la situation :D)
 
PS : j'ai jamais pigé d'où venait l'ignominie "pieces![champ]". pour moi, c'est à bannir absolument de tout code en tout cas.

Reply

Marsh Posté le 17-01-2008 à 15:58:22    

ps : pieces() prend en paramètre soit le nom du champ, soit le numéro de la colonne.
 
et plus marrant :
 
dim field
set field = pieces("texte" )
 
do while not pieces.eof
  msgbox(field)
  pieces.movenext
loop
 
=> Tu récupère ligne par ligne la valeur du champ "texte". ce qui est bien pratique dans certains cas, ça évite de surcharger le code pour rien.


Message édité par MagicBuzz le 17-01-2008 à 15:58:35
Reply

Marsh Posté le 17-01-2008 à 15:58:22   

Reply

Marsh Posté le 17-01-2008 à 17:26:14    

La syntaxe « pieces![champ] » est la syntaxe historique héritée d'Access (v1), inspirée d'Excel, pour accéder aux champs d'une table, d'une requête, d'un formulaire (compatibilité ascendante, tout ça...).


Message édité par tegu le 17-01-2008 à 17:26:48
Reply

Marsh Posté le 17-01-2008 à 17:40:28    

ouais ben le gars qui a décidé d'intégrer cette syntaxe dans VBA, il aurait du mourrir le jour où il est né :o

Reply

Marsh Posté le 18-01-2008 à 12:29:25    

MagicBuzz > oui sympas ça de pouvoir récupérer uniquement la valeur du champ texte...
 
Enfin merci en tout cas :p Là j'ai fini le formulaire, marche bien niquel :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed