Access 2010 - Requête multitables

Fermé
Lockayron Messages postés 1 Date d'inscription mardi 16 juillet 2013 Statut Membre Dernière intervention 16 juillet 2013 - 16 juil. 2013 à 15:40
blux Messages postés 25978 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 19 avril 2024 - 24 juil. 2013 à 10:26
--------------------------------------------------------------------------------

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... !!

3 réponses

blux Messages postés 25978 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 19 avril 2024 3 287
16 juil. 2013 à 16:28
Salut,

une grosse entreprise qui produit des veaux
Faudra me dire quelle est la matière première ;-)

Plus sérieusement, qu'as-tu déjà fait et où coinces-tu ?
0
Bonjour,

Merci de votre réponse. Je crains que je ne puisse dévoiler le nom de mon entreprise au risque de me faire taper sur les doigts ^^.

Je serais tentée de dire que je coince à peu près partout =). A mon grand désespoir, je suis une quiche en VBA. Ma base de données est pratiquement finie mais je bloque sur ce calcul qui me prend gravement le chou... Je suis bloquée depuis plus de deux semaines là-dessus et je n'aboutis à rien, hormis à m'embrouiller davantage.

Disons tout d'abord que je ne parviens pas à multiplier la bonne concentration avec la bonne somme des refus. Comment parvenir à faire en sorte qu'Access multiplie la concentration X (qui est propre à un groupe et un lot) avec la somme des refus des veaux (qui appartiennent à ce groupe et ce lot précisément)... ?? Il faut faire concorder le NumSemaine de la table Concentration avec le NumSemaine de la table RefusLait. J'y parviens... mais en créant 40000 requêtes de tri, puis de calcul. Et Access ne supporte pas le croisement de toutes ces requêtes dans mes calculs suivants...

Merci beaucoup de votre aide en tout cas !!
0
blux Messages postés 25978 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 19 avril 2024 3 287
16 juil. 2013 à 16:55
Tu fais ça en VBA ou pas ?
Tu peux coller ton code ?
Connais-tu les fonctions de domaine (dlookup, dsum, dmax...) ? Il est possible qu'elles puissent t'aider dans ce cas.
0
J'ai essayé de tout faire pour ne pas passer par VBA car je suis incapable d'aligner 10 lignes de codes sans déclencher une catastrophe sur Access...

J'avais pensé utiliser les fonctions recordset et dlookup mais... vu mes plates connaissances, je n'arrive à rien. Je m'arrête à trois lignes de code, ne sachant pas formuler ce que je souhaite demander à Access...
0
blux Messages postés 25978 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 19 avril 2024 3 287
Modifié par blux le 16/07/2013 à 17:26
On ne déclenche pas plus de catastrophes en VBA qu'avec une requête DELETE ou UPDATE mal écrite !
Si tu poses correctement ton problème, il n'y a pas de raison que tu n'y arrives pas.

Commence par décomposer (en langage 'naturel', mais un peu technique) les opérations nécessaires pour arriver à tes fins et expose-les ci-après. On verra comment les coder pour les résoudre.
0
Pas faux pour les requêtes Delete et Update. En bonne futée, je les évite avec soin et je m'en tire avec des astuces.

Je vais essayer de poser les opérations le plus rapidement possible. Merci beaucoup encore une fois ;) !
0
Re-Bonjour !

Je pense que le code devrait se présenter de la manière suivante... Est-ce cela que vous attendiez ?



Déclaration du lot
Déclaration de la période

Pour chaque veau appartenant au lot X
     Cas 1 : la période est D0-D1
          Si le veau appartient au groupe 1
               Jusqu'à ce que i = j
                   - Sommes des Refus_1M à Refus_7S de la semaine i
                   -  Multiplier ces sommes par la concentration de 
                    la semaine i, du lot X, du groupe 1
                   - Ajouter ces sommes
               Fin jusqu'à
               Soustraire ces sommes de la quantité distribuée au lot X, au
               groupe 1, à la période D0-D1 
          Sinon (le veau appartient au groupe 2)
               Jusqu'à ce que i = j
                    - Sommes des Refus_1M à Refus_7S de la semaine i
                    -  Multiplier ces sommes par la concentration de
                    la semaine i, du lot X, du groupe 2
                    - Ajouter ces sommes
                 Fin jusqu'à
               Soustraire ces sommes de la quantité distribuée au lot X, au
               groupe 2, à la période D0-D1 
          Fin Si
 
Cas 2 : la période est D1-D2
  ...
Cas 3 : la période est D2-D3
  ...
Cas 4 : la période est D3-D4
  ...
Cas 5 : la période est D4-D5
  ...
Cas 6 : la période est D5-D6
  ...

Afficher les résultats obtenus pour l'ensemble des veaux du lot X (groupe 1 et 2) sur la période 
Fin Pour 


Je précise que i et j (dans la boucle "jusqu'à") sont déterminés par une requête. Celle-ci calcule en fait la semaine de début et la semaine de fin des périodes à partir de la table DateAnalyses. Je ne voyais vraiment pas comment l'intégrer à ce code... Même s'il y a sûrement un moyen...

Merci beaucoup pour votre aide ;)
0
blux Messages postés 25978 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 19 avril 2024 3 287
17 juil. 2013 à 10:06
C'est déjà plus clair, ça doit pouvoir se faire en VBA sans trop de problèmes.
Peux-tu donner les relations entre les tables ?
0
La table Veau est reliée : table Groupe, table Lot, table RefusLait
La table Lot est reliée : table Veau, table DateAnalyses, table AlimentationLait, table Concentration
La table Groupe est reliée : table Veau, table AlimentationLait, table Concentration

Je pense qu'avec cela, vous avez toutes les relations entre mes 7 tables.
0
blux Messages postés 25978 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 19 avril 2024 3 287
Modifié par blux le 17/07/2013 à 12:53
La première chose à faire est de créer la requête qui servira de base à la boucle principale, elle doit comporter tous les éléments (ou le plus grand nombre possible) qu'on aura à tester dans la boucle.
Cette requête sera la base d'un recordset que l'on va parcourir en VBA.
Pour chaque ligne, on fera ensuite le traitement approprié.

Tu en profiteras pour expliciter 'j' (qui est la cible de 'i' dans une boucle).
0
J'ai créé une requête (nommée "R22 Transformation dates"), basée sur l'unique table DateAnalyses qui permet de déterminer les semaines à sélectionner pour les différentes périodes.

Elle comporte des calculs réalisés à partir de ces dates nommés D12, D23, D34, D45 et D56.
D12 = (D2-D1)/7
D23 = (D3-D1)/7
D34 = (D4-D1)/7
...

Ainsi, par exemple, pour le lot X, cette requête détermine que :
- la période "D1-D2" débute à la semaine 1 et se termine à la 6 (résultat de D12)
- la période "D2-D3" débute à la semaine 7 (résultat de D12+1) et se termine à la 14 (résultat de D23)
- la période "D3-D4" début à la semaine 15 (résultat de D23+1) et se termine à la semaine 18 (résultat de D34)
-...

C'est ce que j'entendais par "i" et "j".

Dans la requête qui servira à la boucle principale (qui est, j'imagine, le "pour"), je dois mettre pêle-mêle toutes les informations... ?
0
blux Messages postés 25978 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 19 avril 2024 3 287
18 juil. 2013 à 10:11
Tu peux mettre le plus d'informations possibles concernant l'objet principal, c'est-à-dire le veau, ça évitera de les chercher par la suite...
0