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 :

Décrément automatique d'un stock [AC-2007]


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 45
    Points : 29
    Points
    29
    Par défaut Décrément automatique d'un stock
    Bonjour à tous,


    Je suis apprentie dans une société de jeux vidéos, et on me demande de modifier une base de données Access. Je n'ai jamsi touché au VBA ni à Acess alors je suis complètement paumée ^^


    En gros c'est une petite base de données qui liste :
    des joueurs
    des jeux
    des sessions de test

    J'ai une table 1 où on référence des joueurs ayant participé à une session de test et qui sont repartits avec un jeu. La table est remplie à la main avec des listes déroulantes.

    J'ai une autre table 2 référencant les jeux et leur stock.


    Il faudrait que quand on rentre une nouvelle entrée dans la table 1 et qu'on séléctionne un jeu, le stock dans la table 2 diminue de 1.


    Je n'ai absoluement aucune idée de comment faire ça, même en lisant les cours d'Access que j'ai pu trouver. Je n'ai pourtant pas l'impression que ce soit compliqué à faire. Si quelqu'un pouvait éclairer ma lanterne ce serait chouette !

    Merci d'avance !
    Nelpha

  2. #2
    Membre confirmé Avatar de Tonioyo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 343
    Points : 518
    Points
    518
    Par défaut
    Bonjour et bienvenue Nelpha,

    Pour mettre à jour une table ou bien un ou plusieurs enregistrements d'une table, tu peux utiliser une requête de mise à jour.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE maTable2 
    SET stock = stock - 1
    WHERE jeu = "monJeu";
    et en l'introduisant dans du 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
    Public Sub decrementerStock(Byref nomDuJeu As String)
    On Error Goto Err_decrementerStock
     
      DoCmd.RunSQL getRequeteDecrementerStock(nomDuJeu)
     
    Err_decrementerStock:
      MsgBox Err.description, vbCritical, "Erreur n°" & Err.number
    End Sub
     
    Private Function getRequeteDecrementerStock(Byref nomDuJeu As String) As String
      getRequeteDecrementerStock = "UPDATE maTable2 " & vbCrLf
      getRequeteDecrementerStock = getRequeteDecrementerStock & "SET stock = stock - 1" & vbCrLf
      getRequeteDecrementerStock = getRequeteDecrementerStock & "WHERE jeu = """ & nomDuJeu & """;" & vbCrLf
    End Function
    PS : J'ai fait exprès de séparer la requête SQL de la procédure de départ pour si besoin est, de la ranger dans un ou plusieurs module(s) répertoriant les requêtes SQL, histoire de les ranger (Ne pas oublier de remplacer Private par Public en la rangeant dans un module).

    Cordialement,
    loi de LeBlanc : Plus tard signifie jamais. extrait de Coder proprement Auteur:Robert C. Martin

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 45
    Points : 29
    Points
    29
    Par défaut
    Salut Tonioyo, et merci de ta réponse !!


    Alors j'ai testé le code que tu me propose, cependant j'ai une erreur de compilation sur le premier module (celui dans lequel je mets l'UPDATE), qui me dit "Attendu:fin d'instruction" au niveau du WHERE. Je n'ai jamais travaillé sous Access ni avec VBA du coup pour débugger le code c'est coton .

    Mon code exact qui plante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Update Stock_recompenses
    Set Stock = Stock - 1
    WHERE recompense_jeux = "monJeu";
    EDIT : J'ai supprimé le ";" et l'erreur n'apparait plus, par contre je n'ai pas l'impression que cela fonctionne.
    Une fois les modules codés et débuggés, l'opération est automatique ou faut-il lancer une requête ? Je ne saisis pas bien ce qu'est un module en fait.

  4. #4
    Membre confirmé Avatar de Tonioyo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 343
    Points : 518
    Points
    518
    Par défaut
    Un module est un module de code VBA. Tu peux les voir en allant dans le Visual Basic Editor (avec les touches de raccourcis Alt + F11). Sur la droite du VBE, il y a les objets Access que tu as créés (les formulaires, les reports, etc ...) et à cet endroit en faisant un clic droit tu peux ajouter tes propres modules de code.

    Généralement je m'en sert pour découper et ranger mon code, c'est plus facile pour la maintenance.

    Si tu utilises une requête enregistrée il s'agit bien du code que tu as posté qui est à écrire dans la vue SQL.

    Le point virgule est normalement obligatoire pour une requete SQL (Dans le langage SQL) mais sous Access c'est un peu différent et il est possible de le mettre ou pas.

    Je suppose que ce qui ne correspond pas bien dans la requête que tu as postée c'est la chaine de caractère "monJeu", tu dois la remplacer par une chaine de caractère contenant le nom d'un jeu qui existe dans ta table.

    Le plus simple serrait que tu commence par créer une requête via le menu d'access et de taper la requête pour t'assurer qu'elle fonctionne bien ensuite tu pourras passer au code Visual Basic.
    loi de LeBlanc : Plus tard signifie jamais. extrait de Coder proprement Auteur:Robert C. Martin

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 45
    Points : 29
    Points
    29
    Par défaut
    D'accord, je comprends ce qu'est un module merci !
    J'ai bien compris le bout de code aussi, et a priori il est accepté par le compilateur.

    Je vais tenter de lancer la requête indépendamment du module pour voir si elle marche alors. Mais quand tu suggère de remplacer "monJeu" par un vrai nom de jeu j'ai un petit doute : cette partie de code n'est elle pas sensée agir pour n'importe quelle situation où l'on crée une entrée dans la table 1 et que l'on sélectionne un jeu ? Ou est-ce qu'il faut créer un module par titre de jeu ?
    J'avais compris que "monJeu" avait un rôle de variable en fait.

  6. #6
    Membre confirmé Avatar de Tonioyo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 343
    Points : 518
    Points
    518
    Par défaut
    ce qui est écrit ci dessous est une requête SQL , elle est écrite "en dur". Si tu veux elle ne contient ppas de variable. elle est toujours fixe et je l'ai posté à titre d'exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE maTable2 
    SET stock = stock - 1
    WHERE jeu = "monJeu";
    Par contre ce qui suis est du code VBA qui lui comporte une variable
    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
     
    Public Sub decrementerStock(Byref nomDuJeu As String)
    On Error Goto Err_decrementerStock
     
      DoCmd.RunSQL getRequeteDecrementerStock(nomDuJeu)
     
    Err_decrementerStock:
      MsgBox Err.description, vbCritical, "Erreur n°" & Err.number
    End Sub
     
    Private Function getRequeteDecrementerStock(Byref nomDuJeu As String) As String
      getRequeteDecrementerStock = "UPDATE maTable2 " & vbCrLf
      getRequeteDecrementerStock = getRequeteDecrementerStock & "SET stock = stock - 1" & vbCrLf
      getRequeteDecrementerStock = getRequeteDecrementerStock & "WHERE jeu = """ & nomDuJeu & """;" & vbCrLf
    End Function
    C'est à dire qu'à un endroit donné dans le code par exemple sur l'évènement click d'un bouton de mise à jour, il y a écrit ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    decrementerStock maZoneDeListe
    Cette ligne d'instruction exécute la procédure "decrementerStock" qui à son tour va appeller la fonction "getRequeteDecrementerStock".

    Ensuite maZoneDeListe toujours dans la ligne de code est le nom de la Zone liste qui par défaut va renvoyer sa valeur. Il va s'agir d'une chaine de caractères qui contient le nom du jeu sélectionné. Cette chaine de caractère va etre passé en paramètre à la procédure "decrementerStock".

    Le paramètre est définit grace à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Byref nomDuJeu As String
    dans la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Sub decrementerStock(Byref nomDuJeu As String)
    Donc dans ce code la variable est nomDuJeu.

    Tu peux d'ailleurs faire le test en appelant dans la fenêtre d'exécution la ligne d'instruction suivante (en remplacant la chaine de caractère par un nom de jeu existant)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    decrementerStock "nomDeMonJeu"
    La fenetre d'exécution s'ouvre en allant dans le menu Affichage->Fenetre d'exécution ou en utilisant le raccourci Ctrl + G.
    loi de LeBlanc : Plus tard signifie jamais. extrait de Coder proprement Auteur:Robert C. Martin

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 45
    Points : 29
    Points
    29
    Par défaut
    Hé bien j'ai potassé un peu ça ce weekend et la requête fonctionne pour le décrément. Il faut maintenant que je fasse un formulaire associé et ce sera nikel !

    Merci pour ton aide

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 45
    Points : 29
    Points
    29
    Par défaut
    Une dernière petite question pour mon formulaire :
    Le bouton de validation du formulaire déclenche un ajout dans une table + mon update, mais je ne sais pas comment lancer mon module/ma fonction d'update.

    Actuellement j'ai écris ça comme ceci



    mais rien ne se passe. Cependant lorsque j'exécute le code suivant le décrément se fait bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    decrementerStock "nomDeMonJeu"



    EDIT : RESOLU !! Merki pour l'aide !

  9. #9
    Membre confirmé Avatar de Tonioyo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 343
    Points : 518
    Points
    518
    Par défaut
    Il faut utiliser la propriété évènement click du bouton situé sur le formulaire pour déclencher le code.
    Il existe un bouton dans la barre d'outil pour afficher les propriétés de l'objet (un sorte de main tenant une fiche).

    Pour insérer en enregistrement et bien il faut faire une requête SQL INSERT en complément de la requête UPDATE.

    Ca devrait ressembler à quelque chose comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO maTable (Champ1, Champ2, etc..)
    VALUES (ValeurChamp1, ValeurChamp2, etc...);
    Le nom des champs juste après le nom de la table est optionnel. Si les noms des champs ne sont pas mentionné cela signifie que l'on insère une valeur pour chacun des champs de la table dans l'ordre ou ils ont été créés dans celles-ci.
    loi de LeBlanc : Plus tard signifie jamais. extrait de Coder proprement Auteur:Robert C. Martin

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 45
    Points : 29
    Points
    29
    Par défaut
    C'est exactement ce que j'avais fais :p

    Merci encore pour ton aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. SQL Automatique ou procédures stockées ?
    Par kendras dans le forum Linq
    Réponses: 2
    Dernier message: 08/09/2009, 08h42
  2. [WD14] Affectation automatique d'un stock
    Par Raptor92 dans le forum WinDev
    Réponses: 9
    Dernier message: 20/08/2009, 11h41
  3. Réponses: 2
    Dernier message: 09/09/2008, 07h41
  4. detecter automatiquement les images stockées
    Par younek dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 25/05/2008, 21h17
  5. Compiler automatiquement des proc stockées
    Par pop_up dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 11/05/2007, 12h16

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