[Access] VBA et Enregistrements

Fermé
Paul Gasser - 14 mars 2007 à 08:29
zenon Messages postés 726 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 13 février 2010 - 15 mars 2007 à 16:07
Je vous sollicite à nouveau.... Merci d'avance....

J'ai un soucis, je possède un formulaire qui renvoit les formulaires d'un champs du style là :

Num Nom Stock Différence

2 Chaussures 80 3
4 Bottes 54 6
56 Tee-shirts 90
54 Blouson 23 -13
64 etc.... 92 72

Ce que j'aimerai c'est que quand la différence est positive cela ajoute autant de vêtements (Par exemple : pour les chaussures, en ajouter 3 etc...), que quand la différence est négative, cela supprime autant de message et que quand la différence est vide (Nothing) rien ne se passe... De plus, quand je clique sur mon bouton valider je voudrais que cela parcoure toutes les lignes et que tout fonctionne... Voila mon code mais cela ne marche pour l'enregistrement où la souris pointe mais pas pour tous :

Merci d'avance : Jespere avoir été assez clair : N'hésitez pas pour les questions je ss connecté toute la journée :

Dim SQL As String
Dim Cpt As Integer

Cpt = 0

SQL = "INSERT INTO VETEMENT(Num_Typ, Num_Pers, Num_Etat, Date_Pris, Date_Rendu) " _
& "VALUES (" & Form_Difference.ID_Vetement.Value & ", NULL, 5, NULL, NULL)"

Dim MSG As String
If IsNull(Form_Difference!Difference) Then
MSG = MsgBox("null")

Else
MSG = MsgBox("not null")
End If

If IsNull(Form_Difference!Difference) Then
Else
If CInt(Form_Difference.Difference.Value) > -1 Then
For Cpt = 1 To CInt(Form_Difference.Difference.Value)
DoCmd.RunSQL SQL
Next
MsgBox ("Mise à jour effectuée")
Me.Refresh
Else
If CInt(Form_Difference.Difference.Value) < 0 Then
SQL = "SELECT Num_Vet FROM VETEMENT " _
& "WHERE Num_Pers Is Null AND Num_Etat=5 AND Num_Typ= " & Form_Difference.ID_Vetement.Value & ";"
Set bds = CurrentDb
Set rst = bds.OpenRecordset(SQL)

If Not rst.EOF() Then

rst.MoveFirst

For Cpt = 1 To -CInt(Form_Difference.Difference.Value)

If Not rst.EOF() Then
SQL = "DELETE FROM VETEMENT " _
& "WHERE Num_Vet=" & rst(0) & ";"
DoCmd.RunSQL SQL
rst.MoveNext

Else
MsgBox ("Il n'y a plus de vêtements de ce type.")
End If

Next
MsgBox ("Mise à jour effectuée")
Me.Refresh
Else
MsgBox ("Il n'y a plus de vêtements à supprimer.")

End If
Me.Refresh

Else
MsgBox ("Mise à jour impossible.")
Me.Refresh

End If
End If
Me.Refresh
End If

14 réponses

Paul Gasser
14 mars 2007 à 09:36
Je remonte le sujet....
Si ce n'est pas assez clair, en gros, il me faudrait une boucle pour parcourir tous les enregistrements. Dès que le premier est mis à jour faire le deuxieme etc...
0
zenon Messages postés 726 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 13 février 2010 180
14 mars 2007 à 10:15
Peux-tu donner plus de détails sur la structure des données et ce que tu souhaites faire.

Ca semble être une gestion de stock mais pourquoi les données ne correspondent-elles pas?
0
Paul Gasser
14 mars 2007 à 10:40
Il s'agit bien d'une gestion de stock
Toute mon application fonctionne bien (8 onglets). Cependant l'utilisateur voudrait pouvoir mettre à jour son stock lors de l'arrivée d'un chargement.

Il remplit donc sur un formulaire où apparait toutes les désignations les nouveaux nombres ds le stock. Une macro calculle la différence avec l'ancien stock et le code ci-dessus permet d'insérer ou de supprimer dans la table autant de vêtement qu'il le faut. Tout marche bien mais le problème c'est quand je clique sur mon bouton tout mon code s'applique que au premier enregistrement et pas à tous
0
zenon Messages postés 726 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 13 février 2010 180
14 mars 2007 à 11:12
Je crains de ne toujours pas bien comprendre...

Enfin, si ça marche comme tu le souhaites enregistrement par enregistrement, c'est que ta boucle ne fonctionne pas.

Je pense que tu as au moins un problème avec ton compteur:

For Cpt=1 To...
...
Next Cpt

Je vois aussi des blocs If un peu bizarres mais tu aurais des messages d'erreur
0

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

Posez votre question
Paul Gasser
14 mars 2007 à 11:50
Je pense aussi qu'il me faut une boucle for mais je ne sais pas comment la faire

Une boucle pour parcourir tous les enregistrements (ex avec un MoveNext par exemple)
0
zenon Messages postés 726 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 13 février 2010 180
14 mars 2007 à 13:20
Je ne suis pas sûr qu'il faille une boucle, une simple requête mise à jour suffirait probablement mais je ne vois pas suffisemment clair dans ta structure pour l'en proposer une...

Quant à la boucle, je l'ai reprise de ton code où il me semble manquer un argument: next Cpt.

Peut-être pourrais-tu expliquer la structure des tables et le flux des données...
0
Paul Gasser
14 mars 2007 à 14:00
As-tu peut etre MSN pour discuter plus simplement ou pour que je t'envoie des captures d'écran...

Le problème de la requete de mise à jour c'est que cela met à jour des champs mais moi je veux par exemple ajouter des chaussures ou en supprimer d'où la requête :

SQL = "INSERT INTO VETEMENT(Num_Typ, Num_Pers, Num_Etat, Date_Pris, Date_Rendu) " _
& "VALUES (" & Form_Difference.ID_Vetement.Value & ", NULL, 5, NULL, NULL)"
0
zenon Messages postés 726 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 13 février 2010 180
14 mars 2007 à 15:11
Mais je ne vois toujours pas ta structure.

Tu as une table où on trouve seulement le nombre de pièces de chaque type de produit ou tu encodes, par exemple par code-barre, chague objet individuellement en suivant les mouvements individuellement?
Tu vérifie le stock visuellement ou tu suis les sorties dans la base?

D'après ta requête, j'ai l'impression que tu veux supprimer ou ajouter plusieurs lignes dans une seule table mais peut-être est-elle liée à d'autres tables. Pourtant, tu ne cherches pas à identifier individuellement les enregistrements mais simplement à en supprimer tant que la valeur réelle est inférieure à la valeur stockée et en supprimant donc éventuellement des produits "individuellement" encore présents physiquement, à moins que tu ne t'intéresse qu'à la valeur globale, mais dans ce cas, inutile d'ajouter un enregistrement par produit...

De plus, les champs que tu nommes dans ton exemple ne se retrouvent pas dans la requête. D'où viennent les valeurs et à quoi correspondnent-elles (les noms ne sont pas très explicites et la valeur Null leur est attribuée...)

Bref, pour moi, c'est de la panade...
0
Paul Gasser
14 mars 2007 à 16:20
As-tu peut etre MSN pour discuter plus simplement ou pour que je t'envoie des captures d'écran...
0
zenon Messages postés 726 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 13 février 2010 180
14 mars 2007 à 17:36
Bin malheureusement, je suis en consultations et je jette un coup d'oeil entre deux...
j'affiche mon adresse mail dans mon profil pendant 1 heure ou deux mais je ne rentre chez moi que ce soir.
0
Paul Gasser
15 mars 2007 à 09:55
Pour faire plus simple,

J'ai un formulaire comme cela avec un bouton "Mise à jour"

Num1 Désignation1 Taille1 Stock1
Num2 Désignation2 Taille2 Stock2
Num3 Désignation3 Taille3 Stock3
Num4 Désignation4 Taille4 Stock4
Num5 Désignation5 Taille5 Stock5
Num6 Désignation6 Taille6 Stock6
.....

Je cherche une boucle qui me ferait parcourir tous les enregistrements. Mon code marche pour un. Par exemple, je sélectionne la première ligne ou la seconde.... J'aimerai que quand je clique sur le bouton, mon code s'applique à la premiere ligne, puis à la deuxieme, puis à la troisieme, etc...

EN GROS : Une BOUCLE pour parcourir tous les enregistrements :

Merci d'avance de ta patiente
0
zenon Messages postés 726 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 13 février 2010 180
15 mars 2007 à 10:27
Oui, c'est l'exemple que tu donnes au début, mais ça ne me donne pas d'idée de la structure de la base; or c'est impossible de t'aider sans cela.
Sur quelles données est fondé le formulaire que tu cites?
Quel(les) tables dois-tu mettre à jour et selon quels critères?

Si le code que tu donnes (que je ne comprends pas) fonctionne enregistrement par enregistrement, il suffit de revoir le fonctionnement de la boucle.
Le problème peut se situer dans un des blocs If (qui me semblent "bizarres") ou dans la boucle elle même.

Pour commencer, il me semble que ta boucle n'est pas correcte: tu devrais ajouter "next quoi": Next Cpt

Commence peut-être comme ça et on verra si ça change qqch.

Sinon, peux-tu expliquer comment fonctionne ta base?

Ton formulaire semble lister tous les produits entrants et mettre à jour le stock dans une même opération.

Une requête mise à jour est à mon avis susceptible de faire cela en tenant compte de tous les enregistrements et en un seul passage en fonction des valeurs encodées dans le formulaire. Je pourrais peut-être te faire une proposition mais je devrais connaître la structure de tes tables et leurs relations ainsi que la source du formulaire.
0
Paul Gasser
15 mars 2007 à 10:55
Mon formulaire renvoit les données d'une TABLE "TYPE"

Cette table est relié à une table "VETEMENT" où sont listés tous les vêtements, c'est à dire les 240 chaussures, 283 polo, etc...

Quand dans Différence (qui appartient à la table TYPE) met 10 par exemple, je veux que cela ajoute 10 chaussures
0
zenon Messages postés 726 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 13 février 2010 180
15 mars 2007 à 16:07
Je pense que tu ne vois pas où je veux en venir...

Pour prendre un exemple.
Les chaussures, tu as plusieurs modèles et pour chaque modèle un ou plusieurs exemplaires dans chaque pointure dans une ou plusieurs couleurs.

Comment as-tu stratifié ces données dans ta base?

Parce que si tu te contentes d'ajouter un nombre global de chaussures lors d'une livraison, ça va être le foutoir...
J'imagine que tu n'as pas un enregistrement dans une seule table qui reprend tous ces renseignements à chaque ligne?

Je ne vois pas concrètement ce que tu veux faire (tu me diras que ce n'est pas mon problème...).
Lors de la livraison, toujours à propos des chaussures, tu auras besoin d'un formulaire d'encodage qui mettra toutes les données "en place": autant de paires de tel modèle, pointure, couleur sont entrées le. (Voire telle pièce de tel N° (code barre) est entrée et correspond à...)

Dans le code que tu fournis au départ, on trouve juste la trace d' l'ajout d'un enregistrement avec un seul champ: ID_Vetement

Tant que je vois pas comment tu procèdes il me sera impossible de t'aider...

Pour revenir à la solution d'une requête mise à jour, et si on postule que tu as défini marque, modèle, pointure, couleur... , il te suffirait d'ajouter le nombre et paires qui entrent; Ca peut être fait en un passage, sans boucle et sans VBA.
0