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 :

Création procédure d'ajout de données [AC-2010]


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2013
    Messages : 40
    Par défaut Création procédure d'ajout de données
    Bonjour à tous !

    Je vous remercie grandement par avance pour votre aide. Etant une vraie quiche en VBA, je m'en sors plutôt bien sur Access 2010 par des astuces. Malheureusement, je me trouve actuellement dans une impasse qui m'oblige à passer par la création d'une procédure et autant dire que je suis perdue... Voilà mon problème :

    Je possède une liste de clients qui appartiennent à des groupes, chaque groupe ayant 50 clients. Pour des études internes, mon entreprise réalise des études sur un nombre X de semaines sur les quantités Z achetées par client par semaine.
    (elle note donc pour chaque client de chaque groupe la quantité achetée par semaine et aimerait faire le bilan à la fin des X semaines).

    J'ai donc créée deux tables (pour simplifier) :
    - CLIENT : Nom (clé primaire), Prénom, Groupe
    - ACHAT : Nom (clé primaire), Prénom, Groupe, NumSemaine, Quantité

    Mon problème réside dans l'ajout de données de la table CLIENT vers la table ACHAT. Au départ, j'ai créée une requête basique de type "ajout" qui permettait dans un formulaire de pouvoir rentrer, à la suite du choix du groupe et du numéro de semaine (nom de la case saisie : SEMAINESAISIE), toutes les quantités achetées par les clients du groupe sélectionné.

    Cependant, cette requête ne convient pas vraiment car je suis contrainte d'enregistrer toutes les quantités de mes clients sur la semaine 1, puis sur la semaine 2, puis ... puis sur la semaine X. Or j'aimerais pouvoir rentrer toutes les quantités sur les X semaines pour le client 1, puis toutes les quantités pour le client 2, puis... puis toutes les quantités pour le client 50.

    Je suppose donc qu'il faut passer par une procédure en vba pour créer d'un seul coup, à la suite de la saisie du nombre de semaine (X), l'ensemble des champs [Nom, Prénom, Groupe, NumSemaine] de ma table ACHAT à partir de ma table CLIENT.

    Or je ne vois absolument pas comment faire... Avez-vous des idées ? Merci beaucoup par avance !!

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 134
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Déjà, première boulette : la clé primaire doit être numérique et ne doit jamais transporter de l'information ; pire encore, choisir nom de famille est risqué par la présence de doublons...

    Ton schéma doit être :
    - GROUPES: IDGroupe (clé primaire), NomGroupe
    - CLIENTS : IDClient(clé primaire), Nom , Prénom, IDGroupe
    - PRODUITS : [IDProduit] (clé primaire), NomProduit, PrixHT
    - ACHATS : [IDClient, IDProduit] (clés primaires), NumSemaine, Quantité


    Ensuite, si tu ajoutes un achat, tu choisis le client, puis les produits achetés ;
    Dans la structure, tu dois avoir en tant que formulaire parent, le client et en sous formulaire les produits possibles.

    Pour les Stats, un client appartenant à un groupe, tu pourras aisément faire une requête qui regroupe les clients par groupe et faire la somme de leur achats...

    Pas besoin de VBA pour ça, enfin, pas pour l'instant.

    Fair une bonne structure et ensuite on verra pour les automatismes...

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2013
    Messages : 40
    Par défaut
    Bonjour,

    Merci beaucoup pour votre réponse ! Je vous apporte ici quelques précisions sur ma demande.

    La clé primaire de ma table « CLIENT » est en réalité numérique. Elle résulte de la concaténation d’une dizaine de chiffres et assure donc pleinement son rôle de clé primaire en évitant les doublons. J’aurais en effet dû le préciser. Il m’est également impossible de modifier cette table (ordre venu d’en haut, je ne peux pas y déroger) et donc impossible d’y ajouter un numéro automatique en guise de clé primaire…

    Comme je l’ai précisé, je vous ai donné une version très simplifiée de ma base de données qui comporte beaucoup plus que deux tables. Ainsi, la table « groupe » existe déjà. A l’inverse cependant, la table « produit » n’existe pas car elle n’est pas nécessaire. Dans le concept de cette base, peu importe le produit ou son prix, seules les quantités achetées comptent.

    Vous avez raison sur un point, la table « achat » peut se passer des champs « prénom » et « place » puisque c’est déjà la table « client » qui porte ces informations. Cela simplifie déjà cette table dont la clé primaire serait alors "Nom, NumSemaine"

    Les quantités achetées par client ne sont saisies qu’à la fin des X semaines. Il est trop risqué que l’opérateur saisisse lui-même le « nom » dans la table « achat » car cette suite de 10 chiffres est trop facilement source d’une erreur. C’est pourquoi il m’est absolument nécessaire de créer une procédure (ou une requête si vous pensez que le vba est superflu) pour transférer la donnée « Nom » de la table « client » vers la table « achat » et pour agrémenter ce transfert d’un numéro de semaine. Ainsi, l’opérateur pourra, à la suite de cette création de données, saisir par client et sur l’ensemble des X semaines, les quantités achetées par semaine. Pensez-vous que cela soit réalisable ? Ou est-ce utopique ? Ci-dessous un exemple de la procédure (requête) afin d’être plus claire…

    L’opérateur choisit « 3 » pour le nombre de semaine pour le groupe A, composé de 50 clients. La procédure (requête) s’enclenche et ajoute 3*50 données à la table « achat ». Ces données sont composées de :
    - « Nom » transféré de la table « client » vers la table « achat »
    - « NumSemaine »
    Le résultat est donc le suivant dans la table « achat » :
    Nom NumSemaine Quantité
    Client1 1
    Client1 2
    Client1 3
    Client2 1
    Client2 2
    Client2 3

    Client50 3

  4. #4
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 134
    Billets dans le blog
    5
    Par défaut
    Mmm, ce qui ce conçoit bien s'ennonce clairement...

    Donc je ne sais pas comment est structuré la saisie mais en tout état de cause, et je reviens sur ma position, l'usage de VBA peut apporter du confort sur la procédure...

    On suppose que le formulaire permette la saisie du N° de semaine et que le choix du groupe depuis une liste soit possible...

    Donc ça donnerait un truc du style :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    Sub TesterPourVoir()
    Dim strSemNo                                           As String
    Dim lngSemNo                                           As Long
    Dim vntGroupID                                         As Variant
    Dim lngAjouts                                          As Long
     
        strSemNo = InputBox("Quel numéro de semaine ?", "Semaine N°", DatePart("ww", Now))
        vntGroupID = InputBox("Quel numéro de groupe ?", "Identifiant groupe")
        If IsNumeric(strSemNo) Then
            lngSemNo = CLng(strSemNo)
            If Len(vntGroupID) Then
                If AjouterAchats(lngSemNo, vntGroupID, lngAjouts) Then
                    MsgBox lngAjouts & " ligne(s) d'achat ont été intégrée(s) pour le groupe " & vntGroupID, vbInformation
                End If
            End If
        End If
        End Sub
     
    Private Function AjouterAchats(ByVal SemNo As Long, ByVal GroupID As Variant, ByRef NombreAjouts As Long) As Boolean
    Dim oDB                                                As DAO.Database
    Dim oRS                                                As DAO.Recordset
    Dim strNomCli                                          As String
     
    Dim SQLClient                                          As String
    Dim SQLAchat                                           As String
     
        On Error GoTo L_ErrAjouterAchats
        Set oDB = CurrentDb
        SQLClient = "SELECT Nom, Prénom, Groupe FROM CLIENT WHERE Groupe = " & GroupID & ";"
        Set oRS = oDB.OpenRecordset(SQLClient, 2)
        With oRS
            Do While Not .EOF
                strNomCli = .Fields(0).Value
                'La quantité reste null
                SQLAchat = "INSERT INTO ACHAT (Nom, Groupe, NumSemaine, Quantité) "
                SQLAchat = SQLAchat & "VALUES ('" & strNomCli & "'," & GroupID & ", " & SemNo & ", NULL)"
                oDB.Execute SQLAchat, dbConsistent
                NombreAjouts = NombreAjouts + 1
                .MoveNext
            Loop
            .Close
        End With
        AjouterAchats = True
        On Error GoTo 0
    L_ExAjouterAchats:
        Set oRS = Nothing
        Set oDB = Nothing
        Exit Function
     
    L_ErrAjouterAchats:
        AjouterAchats = False
        MsgBox Err.Description, 48, Err.Source
        Resume L_ExAjouterAchats
    End Function
    Colle cela dans un module de test dans un premier temps pour en comprendre le fonctionnement... Lance alors la procédure de test en adaptant les nom des champs selon tes propres tables.

    A plus tard.

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2013
    Messages : 40
    Par défaut
    Bonjour,

    Encore une fois, merci pour votre réponse et votre aide précieuse !

    En adaptant votre code à mes tables, il fonctionne très bien . Toutes mes félicitations, je n'aurais jamais réussi à le créer seule... !!

    Cependant, serait-il possible de l'améliorer ? En effet, ce code permet, à la suite de la saisie d'un numéro de semaine, de transférer le "nom" de la table "client" vers la table "achat".

    Exple : Saisie du chiffre "3" pour le numéro de semaine. Le code s'enclenche. Le résultat dans ta table "achat" est donc :
    Nom NumSemaine Achat
    client1 3
    client2 3
    client3 3
    ...
    client50 3


    Serait-il possible de faire tourner la procédure de manière à ce que le numéro de semaine soit en réalité un nombre de semaine ? (à moins que le code que vous avez créé ne le fasse normalement déjà et plante sur mon ordi ^^)

    Dans l'exple précédent, à la suite de la saisie du chiffre "3" pour le numéro de semaine, le résultat dans la table "achat" sera :
    Nom NumSemaine Achat
    client1 1
    client1 2
    client1 3
    client2 1
    client2 2
    client2 3
    client3 1
    ...
    client50 3

  6. #6
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 134
    Billets dans le blog
    5
    Par défaut
    Bien, je suis parti du principe qu'il s'agissait d'un N° de semaine donc il suffit de supprimer le message et la valeur par défaut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strSemNo = InputBox("Quel numéro de semaine ?", "Semaine N°", DatePart("ww", Now))
    devient alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strSemNo = InputBox("Quel est le nombre de semaines ?", "Nombre")
    Mais il faut considérer que la procédure de test est très basique et de ce fait, ce point est à transposer dans un formulaire digne de ce nom.

    Sur le principe, l'ajout tel défini dans le code reste identique... Là, en fait, pour chaque client appartenant au groupe G, une ligne sera créée dans la table ACHAT où le nom de chacun des clients de ce groupe avec comme nombre de semaine, le nombre passé en paramètre.

    A moins que quelque chose m'échappe...

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0

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

Discussions similaires

  1. [RS232] Procédure d'acquisition de données sur port serie
    Par kazaboua dans le forum Composants
    Réponses: 6
    Dernier message: 12/05/2007, 11h55
  2. Réponses: 22
    Dernier message: 07/12/2005, 13h51
  3. création d'une base de données
    Par cyrilng dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 18/05/2005, 14h38
  4. Réponses: 4
    Dernier message: 22/09/2004, 09h17
  5. Création d'une base de données contenant des images
    Par gandalf_le_blanc dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 16/06/2004, 15h29

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