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… !!
Partager