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 :

Procédure à s'arracher les cheveux


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    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
    Points : 16
    Points
    16
    Par défaut Procédure à s'arracher les cheveux
    Bonjour à tous !

    J’aurais grand besoin de vos génies. Je me creuse la tête depuis plusieurs semaines sur cette procédure et malgré mes efforts, rien ne ressort… Il faut dire que je suis une vraie quiche en VBA et que cette procédure est à s’arracher les cheveux.

    Alors, pour les plus courageux d’entre vous, merci infiniment pour tous les conseils et codes que vous pourriez m’apporter… J’en ai vraiment grand besoin ! Mais accrochez-vous ! Je vais essayer d’être le plus claire possible… Pour les autres, je m’excuse du pâté que je vais pondre… et qui vous semblera bien ennuyeux !

    Contexte :
    Je travaille sur une base de données d’une grosse entreprise qui produit des veaux. Ces veaux font partis de lots et ont un numéro de place dans ces lots (qui sert notamment à les identifier). Chaque lot possède deux groupes où les veaux sont répartis équitablement. Des études sur l’alimentation des veaux sont réalisées.

    Table de données :
    Veau : IDVeau, Place, RefLot, RefGroupe, X
    Lot : IDLot, X
    Groupe : IDGroupe, X
    Refus : IDVeau, NumSemaine, Refus_1M, Refus_1S, …, Refus_7M, Refus_7S
    Concentration : IDConcentration, Concentration, NumSemaine, RefGroupe, RefLot
    Alimentation : IDAlimentation, Periode, QuantiteDistribuee, RefGroupe, RefLot
    DateAnalyses : RefLot, Date1, Date2, …, Date6

    Précisions sur les tables :
    - Le X (dans Lot et Veau) correspond à des champs divers qui n’entrent pas en ligne de compte.
    - La base contient beaucoup plus d’autres tables, j’ai fait ici au plus simple.
    - Chaque ID est un numéro unique.
    - Les tables ne sont malheureusement pas modifiables… notamment au niveau des clés primaires. Je dois faire avec et c’est bien ce qui rend la tâche délicate.
    - Le champ « Periode » de la table Alimentation est une liste déroulante : « D1-D2 », « D2-D3 », …, « D5-D6 ».
    - Dans la table « Refus », dans l’expression « Refus_ 1M », le 1 signifie « premier jour » et le M signifie matin (S = Soir).
    - Les dates de la table DateAnalyses sont sous la forme : jj-mm-aaaa.
    - Le champ « NumSemaine » des tables Concentration et Refus est un chiffre entier qui n’a rien à voir avec la numérotation de 1 à 52 semaines dans une année. Ainsi, si un lot de veaux arrive le lundi 10 juin, cette semaine sera considérée comme semaine 1 pour ce lot.

    Problème :
    Chaque matin et chaque soir, chaque veau d’un lot et d’un groupe précis reçoit une quantité (en kg) de poudre de lait (table Alimentation). Cette quantité est mélangée à de l’eau avec une concentration variant suivant le lot, le groupe et la semaine (table Concentration) puis distribuée aux veaux. Ceux-ci sont susceptibles de faire des refus, c’est-à-dire de ne pas boire toute la quantité qui leur est distribuée et de laisser des quantités de lait. Ces refus sont notés en litres pour chaque repas sur une semaine (table Refus).

    Il faut que je crée une procédure permettant, suite à la sélection d’un lot, d’un groupe et d’une période dans un formulaire, que la liste des veaux correspondants apparaisse avec le calcul suivant :

    Consommation = QuantiteDistribuee – Somme (somme (Refus) * Concentration)

    Ce calcul pourrait paraître simple. Mais haha… Il ne l’est pas du tout.

    La période dans la table Alimentation correspond à des plages de temps déterminées par la table DateAnalyses. Ainsi, si l’opérateur entre « 5 » dans le champ QuantiteDistribuee et « D1-D2 » dans le champ Periode, cela signifiera que pour tous les repas compris entre « Date1 » et « Date2 » de la table DateAnalyses, les veaux recevront 5 kg de poudre de lait par repas. Heureusement, ces dates tombent parfaitement en fin de semaine et non en plein milieu.

    Cela signifie que, par exemple, pour la période « D1-D2 », pour un lot et un groupe donné, il faut qu’Access :
    - calcule le nombre de semaines entre la « Date1 » et « Date2 »
    - sélectionne l’ensemble des refus correspondant à ces semaines
    - fasse la somme de ces refus par semaine pour les multiplier avec la concentration adéquate
    - fasse la somme de ce résultat
    - soustraie cette somme à la quantité distribuée

    Et là, c’est le drame. Comment faire un truc aussi compliqué ????? Normalement, cela est possible mais AOUTCH ! Cela me dépasse totalement… !!

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    Bonjour,
    Il faut que tu procèdes par étapes comme tu le décris dans ton énoncé.

    1) calcul du nombre de semaine entre 2 dates. C'est dans la faq http://access.developpez.com/faq/?page=dates#DateDiff (
    2) Une requête faire un regroupement sur le N° de semaine (fonction Format() aussi dans la Faq) et sélectionner les items qui font un refus : refus>0
    3) Dans la même requête (somme des refus, avec le regroupement ça va tout seul)

    4) créer une nouvelle requête basée sur la requête précédente pour faire les calculs simples qui suivent.

    Allez démarre et puis revient nous voir avec les résultats que tu obtiens. Conseils : vérifie à la calculatrice tes résultats à chaque étapes pour être sur d'être sur le bon chemin.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  3. #3
    Membre à l'essai
    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
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Merci de votre réponse. Vous pensez que je peux m'en sortir avec de simples requêtes ? Sans passer par VBA ?

    De plus, j'ai créé la fonction suivante :
    Function NbSemaines(ByVal Date1 As Date, ByVal Date2 As Date) As Integer

    'Calcul le nombre de semaines entre deux dates
    NbSemaines = DateDiff("ww", Date1, Date2)
    End Function
    J'ai intégré cette fonction à une requête afin de calculer le nombre de semaines. Mais lors de son exécution, Access me dit "NbSemaines non définie dans l'expression". Je suis allée vérifier les références, mais rien ne fonctionne...

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    Bonjour,

    Intègre la fonction datediff() directement dans la requête. Inutile de créer une fonction VBA pour y faire référence.

    A part une instruction pour exécuter la requête 100% du job peut être fait en SQL + fonctions natives.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  5. #5
    Membre à l'essai
    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
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    J'ai pu réussir à calculer le nombre de semaines par des astuces sur Access (simple requête avec une division du nombre de jours entre deux dates par 7).

    Je me heurte maintenant à votre point numéro 2. Je parviens à regrouper, dans une requête à partir de la requête précédente, les refus sur les périodes souhaitées :
    - IDVeau, RefLot, RefGroupe de la table Veau
    - NumSemaine, Refus_1M --> Refus_7S de la table RefusLait

    Cependant, dès que j'intègre la table Concentration à ma requête, impossible de parvenir à multiplier les bons facteurs ensemble. Sur un test de 50 veaux, dès que je l'intègre, mon nombre de résultats dépasse largement les 50 attendus... Je suppose que ceci est dû à un problème de regroupement... Mais j'avoue que tout ceci me sort par les yeux depuis le temps que je travaille dessus ^^.

    Merci pour votre aide en tout cas !!

Discussions similaires

  1. Réponses: 30
    Dernier message: 19/03/2015, 14h12
  2. [WD-2010] Remplacer à s'en arracher les cheveux.
    Par Eratche dans le forum Word
    Réponses: 3
    Dernier message: 08/09/2011, 18h09
  3. S'arrache les cheveux sur son DM :P
    Par Stanyslas dans le forum Requêtes
    Réponses: 0
    Dernier message: 19/04/2011, 19h57
  4. [SSIS] [2K5] Merge Join : Je m'arrache les cheveux
    Par SebastienM dans le forum SSIS
    Réponses: 7
    Dernier message: 18/05/2009, 14h26
  5. Réponses: 3
    Dernier message: 06/09/2008, 01h18

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