IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Gestion de stock en VBA


Sujet :

VBA Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut Gestion de stock en VBA
    Bonjour,

    afin d'achever ma base de données, j'aurais encore une petite question. Je voudrais dans un sous formulaire "détails du bordereau", avec un bouton de commande, appliquer a tous mes enregistrements la formule suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Dim strLink As String
        strLink = SauvegarderActualiser
            If NbRestant <= 0 Then
                ACommander = Quantité
                AValidation = 0
                Stockbel = "Indisponible"
            Else
                AValidation = NbRestant - Quantité
                    If AValidation > 0 Then
                        ACommander.Value = 0
                        Stockbel.Value = "Disponible"
                    Else
                        ACommander = Quantité - NbRestant
                        AValidation = 0
                        Stockbel.Value = "Indisponible"
                    End If
            End If
    En fait, cette formule marche nickel, mais que pour un enregistrement à la fois. Je pense qu'il manque pas grand chose !!! Et est-il possible d'utiliser un bouton de commande avec un sous formulaire en feuille de données ??? Je pense pas, mais serait il possible d'appeler mon bouton via le formulaire "principal" ??? Car pour le moment, mon sous formulaire est un formulaire tous simple et pour une raison de faciliter et uniformité avec mes autres formulaires, je le revoudrais en feuille de données.

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 656
    Points : 34 350
    Points
    34 350
    Par défaut
    bonjour,

    tu utilises beaucoup de variables dant on code, peux-tu nous indiquer comment tu les alimentes stp ? Une requête update par le vba est possible, mais encore nous faudrait-il les champs de la table à mettre à jour ^^
    Merci

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    En fait, tous ces variables viennent de mes tables :
    Stockbel, NbRestant => tbl Matériel
    AValidation, ACommander, Quantité => Détails du bordereau
    J'ai voulu essayer avec une requete, mais je ne connais pas assez le SQL pour çà.

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 656
    Points : 34 350
    Points
    34 350
    Par défaut
    alors tu auras plusieurs requêtes de mise à jour des données possibles: un exemple, à adapter selon le nom exact des champs et tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Table_Materiel SET Stockbel='INDISPONIBLE' WHERE NBRestant<0
    tu vois l'idée ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    je vois l'idée , bien vu, je vais essayer d'appliquer cela a mon cas, merci bcp à toi jpcheck

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    Afin de ne pas créer 50milles requetes, est-il possible d'utiliser un case avec un UPDATE et par la meme occasion utilisé mon WHERE pour filtrer mon formulaire ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Matériel SET Stockbel=(CASE WHEN NbRestant>0 THEN "Disponible" ELSE "Indisponible" END);

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Matériel SET Stockbel=(CASE WHEN NbRestant>0 THEN "Disponible" ELSE "Indisponible" END);
    Pourquoi "Opérateur absent" ???
    C'est bizarre, même en SELECT, je n'arrive pas à utilisé le CASE WHEN.

  8. #8
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 929
    Points : 4 847
    Points
    4 847
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE WHEN NbRestant>0 THEN "Disponible" ELSE "Indisponible" END
    les requetes fonctionnent mieux avec des opérateurs existants :

    essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... SET Stockbel=IIF(NbRestant>0 , "Disponible" ,"Indisponible");
    Voir l'aide pour IIF

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    Merci à toi micniv, effectivement çà marche bien mieux comme çà. Par contre, je n'ai toujours rien trouvé sur le IIF contrairement au CASE. Alors voilà, je voulais savoir si on peut mettre des IIF dans des IFF ??? Je vous explique! Je voudrais suivant une quantité donné, mettre mon stock à jour(NbRestant), et suivant le nombre me dire si mon "Stockbel" est disponible ou pas et me dire s'il faut encore commander quelque chose. En visual çà donnerait çà, enfin dans ce genre, je pense :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    IF NbRestant=0 THEN
       Acommander = Quantité
       Stockbel = "Indisponible"
    ELSE
       NbRestant=NbRestant-Quantité
          IF NbRestant>=0 THEN
             Acommander = 0
             Stockbel = "Dispo"
          ELSE
             Acommander = Quantité-NbRestant
             Stockbel = "Indisponible"
             'Pour éviter d'avoir un nombre négatif dans le stock
             NbRestant = 0
          END IF
    END IF
    Petit exemple : je commande 20 pomme,lol, dans mon stock, j'en ai 10
    = Quantité=20; NbRestant=0; Stockbel = "Indisponible" et Acommander=10
    Je sais que j'abuse un peu là, mais je débute seulement en SQL, et puis ce n'ai que ma 2ème question sur ce forum , et l'autre j'ai fini par trouvé la solution . Donc je remercie déjà à l'avance celui qui sera me donner un coup de main soit en SQL, soit en VBA mais qui appliquerais cette formule pour tous mes détails du bordereau et non 1 à la fois. Je pense quand meme que le sql serait plus adapté, non ???

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    Y a personne qui sait, ne fus que me donner un lien pour les IIF, car je n'ai rien trouvé, ni sur l'aide, ni sur le forum. Et puis, pour la première, çà serait sympa de l'appliquer sur ma formule, ou meme sur une partie que je comprenne. Merci

  11. #11
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 929
    Points : 4 847
    Points
    4 847
    Par défaut
    Salut, dans l'aide access :
    Exemple de fonction Ilf (VraiFaux)

    Cet exemple utilise la fonction VraiFaux (IIf) pour évaluer un champ Montant et retourne le mot "Élevé" si la quantité est supérieure à 1 000; dans le cas contraire, elle retourne le mot "Modeste". Vous pouvez taper l'expression suivante dans la propriété SourceContrôle (ControlSource) d'un contrôle calculé :

    = IIf([Montant] > 1000, "Élevé", "Modeste")
    Sinon ne pas trouver d'aide sur IIF quand on dispose de GOOGLE me laisse ... pantois


    Autre suggestion : adapte ton code ci-dessus pour l'appliquer à chaque enregistrement du recordset correspondant à ton sous-form.


  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    Je commence vraiment à désesperer là, j'ai juste encore cette petite chose à appliquer a ma base pour qu'elle soit finie !
    Bon apparement, on ne peut faire un if dans un if en sql, donc je revient au vba
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Private Sub Commande28_Click()
    Dim strLink As String
    Dim XXX as Recordset
    'et là je ne sais pas quoi mettre, j'ai déjà essayer pas mal de chose mais ne fonctionne pas :?
    Set XXX = currentdb.openrecordset (Nom de la requete ???)
    XXX.MoveFirst
        strLink = SauvegarderActualiser
            If NbRestant = 0 Then
                ACommander = Quantité
            Else
                If NbRestant - Quantité >= 0 Then
                    ACommander = 0
                    NbRestant = NbRestant - Quantité
                Else
                    ACommander = Quantité - NbRestant
                    'Pour éviter d'avoir un nombre négatif dans le stock
                    NbRestant = 0
                End If
            End If
    XXX.MoveLast
    XXX.close
    End Sub
    Je veux juste connaitre le code "recordset" que je dois mettre pour que cette formule s'applique à tous mes enregistrements du sous-formulaire. Et si quelqu'un a une astuce pour je place mon bouton de commande dans mon formulaire et comme çà je peux garder mon sous-formulaire en feuille de données. Merci d'avance.

  13. #13
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 656
    Points : 34 350
    Points
    34 350
    Par défaut
    hum, tout ca pour pas faire plusieurs requêtes comme conseillé au début...

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    Non du tout. J'ai maintenant dans ma requete SELECT un if pour Stockblel suivant si mon stock est dispo ou pas, qui fonctionne bien. J'ai juste encore un soucis avec NbRestant et Acommander qui viennent de ma table "détails du bordereau". Je ne sais pas si on peut mettre un if dans un if en dans une requete UPDATE, et si oui comment ??? J'ai testé la formule en vb, elle s'applique bien à mon sous formulaire, mais pour une ligne d'enregistrement à la fois. Je veux quels s applique à tous mes détails. Et avoir le bouton "mise a jour du stock sur mon formulaire.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Private Sub Commande28_Click()
    Dim Enr As Recordset
    Set Enr = CurrentDb.Openrecordset("Détail du bordereau d'execution")
    Enr.MoveFirst
            If NbRestant = 0 Then
                ACommander = Quantité
            Else
                If NbRestant - Quantité >= 0 Then
                    ACommander = 0
                    NbRestant = NbRestant - Quantité
                Else
                    ACommander = Quantité - NbRestant
                    'Pour éviter d'avoir un nombre négatif dans le stock
                    NbRestant = 0
                End If
            End If
    Enr.MoveLast
    Enr.Close
    End Sub
    Cette formule devrait changer les valeurs de NbRestant et Acommander dans ma requete "Détail du bordereau". Pourquoi me vb me dit : Erreur 13: type incompatible ????

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    J'ai trouvé déjà comment faire fonctionner le recordset. Il faut aller cocher dans outils/référence de vb "Microsoft DAO 3.6 ..."

  17. #17
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 656
    Points : 34 350
    Points
    34 350
    Par défaut
    bonjour,
    pense à déclare Enr en tant que DAO.Recordset aussi

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    Merci Jpcheck, j'ai bien déclaré Enr en tant que DAO.Recordset, çà marche nickel.
    Mais je veux juste appliquer cette formule sur mon formulaire sur lequel je suis. J'avais pensé à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Private Sub UpStock_Click()
    Dim Enr As DAO.Recordset
    Dim strLink As String
    Dim Cancel As Integer
        strLink = SauvegarderActualiser
            If Valider = "Non" Then
               If msgbox("Etes-vous sur de votre commande ?", vbQuestion + vbYesNo, "Mise à jour du stock") = vbYes Then
                    Set Enr = CurrentDb.OpenRecordset("Détail du bordereau d'execution")
                        Do Until Enr.EOF = True
                            If Enr("N° Bordereau") = Formulaire ouvert Then
                            Enr.Edit
                                If Enr("NbRestant") = 0 Then
                                    Enr("ACommander") = Enr("Quantité")
                                Else
                                    If Enr("NbRestant") - Enr("Quantité") >= 0 Then
                                        Enr("ACommander") = 0
                                        Enr("NbRestant") = Enr("NbRestant") - Enr("Quantité")
                                    Else
                                        Enr("ACommander") = Enr("Quantité") - Enr("NbRestant")
                                        'Pour éviter d'avoir un nombre négatif dans le stock
                                        Enr("NbRestant") = 0
                                    End If
                                End If
                            Enr.Update
                            Enr.MoveNext
                            End If
                      Loop
                    Enr.Close
                    Valider = "Oui"
                    strLink = SauvegarderActualiser
                Else
                    Me.Undo
                    Cancel = True
                End If
            Else
                msgbox "Vous ne pouvez mettre à jour le stock qu'une seule fois !"
            End If
    End Sub
    Quelqu'un a une idée ???

  19. #19
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 656
    Points : 34 350
    Points
    34 350
    Par défaut
    êuh, ca va être un peu compliqué pour nous de tester ton code, mais si tu nous dit s'il tourne, ca nous aidera un peu

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    Il tourne très bien, juste qu'il s'applique maintenant à tous mes enregistrements de me requete select. Moi, je voudrais qu'il selectionne le N° Bordereau de mon formulaire ou je me trouve et applique cette formule uniquement pour les enregistrements de ce formulaire. J'espère avoir été clair dans mon explication .

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2010] Code VBA - Gestion de Stocks
    Par polysandre dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 27/10/2014, 10h11
  2. Votre avis sur fichier Excel-Vba gestion des stocks
    Par mira3 dans le forum Conception
    Réponses: 5
    Dernier message: 10/04/2012, 10h01
  3. Réponses: 52
    Dernier message: 23/05/2006, 11h08
  4. gestion des stocks
    Par gekondo dans le forum Access
    Réponses: 1
    Dernier message: 30/09/2005, 11h41
  5. Appel a une procedure stockée en vba
    Par The_Nail dans le forum VBA Access
    Réponses: 36
    Dernier message: 01/04/2003, 16h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo