Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/01/2012, 19h51   #1
Nouveau Membre du Club
 
Homme Alexandre DAUCHET
Contrôleur de Gestion
Inscription : mars 2011
Messages : 86
Détails du profil
Informations personnelles :
Nom : Homme Alexandre DAUCHET
Localisation : France

Informations professionnelles :
Activité : Contrôleur de Gestion
Secteur : Enseignement

Informations forums :
Inscription : mars 2011
Messages : 86
Points : 27
Points : 27
Par défaut Formule de calcul très longue

Bonjour,

J'ai établie une requête qui permet mensualiser une facture en fonction d'une date début et d'une date fin.

Le problème c'est que ma table contient + de 350000 lignes et que access sature sur mes requêtes en temps de remontée.

Je me posais la question de savoir que si j'établissais un procédure function, est ce que cela permettrait d'alléger la mémoire et le temps de traitement.

Je vous décompose ci dessus et uniquement pour le mois de janvier, la formule de calcul qui se déroule en plusieurs étapes (bien entendu cela s'effectue sur les autres mois) :

3 variables à prendre en compte :

Date début
DAte fin
et Débit

6 sommes sont à effectuer pour ces 6 catégories

1° : Début mois-Fin mois

Code :
((VraiFaux(((SérieDate(Année([date fin]);Mois([date fin]);1)<>SérieDate(Année([date debut]);Mois([date debut]);1)) Et (#31/01/2011#>=SérieDate(Année([date debut]);Mois([date debut])+1;0)) Et (#31/01/2011#<=SérieDate(Année([date fin]);Mois([date fin])+1;0)))=-1;1;0))*(VraiFaux(((SérieDate(Année([date fin]);Mois([date fin]);1)<>SérieDate(Année([date debut]);Mois([date debut]);1)) Et (SérieDate(Année([date debut]);Mois([date debut]);1)=[date debut]) Et (SérieDate(Année([date fin]);Mois([date fin])+1;0)=[date fin]))=-1;([debit]/(DiffDate("m";[date debut];[date fin])+1));0)))
2° : Extremité début

Code :
 (VraiFaux((Mois([date debut])=1 Et Année([date debut])=2011)=-1;((DiffDate("j";[date debut];(SérieDate(Année([date debut]);Mois([date debut])+1;0))))/((DiffDate("j";[date debut];SérieDate(Année([date debut]);Mois([date debut])+1;0)))+(DiffDate("j";SérieDate(Année([date fin]);Mois([date fin]);1);[date fin]))));0,5))*(VraiFaux(((SérieDate(Année([date fin]);Mois([date fin]);1)<>SérieDate(Année([date debut]);Mois([date debut]);1)) Et (#31/01/2011#>=SérieDate(Année([date debut]);Mois([date debut])+1;0)) Et (#31/01/2011#<=SérieDate(Année([date fin]);Mois([date fin])+1;0)))=-1;1;0))*(VraiFaux((Mois([date fin])=1 Et Année([date fin])=2011)=-1;0;1)*(VraiFaux((Jour([date fin])<Jour([date debut]))=-1;1;0))*VraiFaux(((SérieDate(Année([date fin]);Mois([date fin]);1)<>SérieDate(Année([date debut]);Mois([date debut]);1)) Et ((Jour([date debut])=(Jour([date fin])+1)) Ou (Jour([date fin])<Jour([date debut]))))=-1;([debit]/(DiffDate("m";[date debut];[date fin])));0))

3° Extremité fin

Code :
(VraiFaux((Mois([date fin])=1 Et Année([date fin])=2011)=-1;((DiffDate("j";(SérieDate(Année([date fin]);Mois([date fin]);1));[date fin])))/((DiffDate("j";[date debut];(SérieDate(Année([date debut]);Mois([date debut])+1;0))))+(DiffDate("j";(SérieDate(Année([date fin]);Mois([date fin]);1));[date fin])));0,5))*(VraiFaux(((SérieDate(Année([date fin]);Mois([date fin]);1)<>SérieDate(Année([date debut]);Mois([date debut]);1)) Et (#31/01/2011#>=SérieDate(Année([date debut]);Mois([date debut])+1;0)) Et (#31/01/2011#<=SérieDate(Année([date fin]);Mois([date fin])+1;0)))=-1;1;0))*(VraiFaux((Mois([date debut])=1 Et Année([date debut])=2011)=-1;0;1)*(VraiFaux((Jour([date fin])<Jour([date debut]))=-1;1;0))*VraiFaux(((SérieDate(Année([date fin]);Mois([date fin]);1)<>SérieDate(Année([date debut]);Mois([date debut]);1)) Et ((Jour([date debut])=(Jour([date fin])+1)) Ou (Jour([date fin])<Jour([date debut]))))=-1;([debit]/(DiffDate("m";[date debut];[date fin])));0))
4° Extremité début jour

Code :
 (VraiFaux(((SérieDate(Année([date fin]);Mois([date fin]);1)<>SérieDate(Année([date debut]);Mois([date debut]);1)) Et (#31/01/2011#>=SérieDate(Année([date debut]);Mois([date debut])+1;0)) Et (#31/01/2011#<=SérieDate(Année([date fin]);Mois([date fin])+1;0)))=-1;1;0))*(VraiFaux((Mois([date debut])=1 Et Année([date debut])=2011)=-1;[debit]*((DiffDate("j";[date debut];(SérieDate(Année([date debut]);Mois([date debut])+1;0)+1)))/(DiffDate("j";[date debut];([date fin])+1)));([debit]*((31/((DiffDate("j";[date debut];([date fin])+1))))*0,5))))*(VraiFaux((Mois([date fin])=1 Et Année([date fin])=2011)=-1;0;1))*(VraiFaux((Jour([date fin])>=Jour([date debut])) Et ((SérieDate(Année([date fin]);Mois([date fin])+1;0))<>[date fin])=-1;1;0))
5° Extrémité fin jour

Code :
 (VraiFaux(((SérieDate(Année([date fin]);Mois([date fin]);1)<>SérieDate(Année([date debut]);Mois([date debut]);1)) Et (#31/01/2011#>=SérieDate(Année([date debut]);Mois([date debut])+1;0)) Et (#31/01/2011#<=SérieDate(Année([date fin]);Mois([date fin])+1;0)))=-1;1;0))*(VraiFaux((Mois([date fin])=1 Et Année([date fin])=2011)=-1;[debit]*(Jour([date fin])/(DiffDate("j";[date debut];([date fin])+1)));[debit]*((31/((DiffDate("j";[date debut];([date fin])+1))))*0,5)))*(VraiFaux((Mois([date debut])=1 Et Année([date debut])=2011)=-1;0;1))*(VraiFaux((Jour([date fin])>=Jour([date debut])) Et ((SérieDate(Année([date fin]);Mois([date fin])+1;0))<>[date fin])=-1;1;0))
6° Mois concerné

Code :
((VraiFaux(((SérieDate(Année([date fin]);Mois([date fin]);1)=SérieDate(Année([date debut]);Mois([date debut]);1)) Et (#31/01/2011#>=SérieDate(Année([date debut]);Mois([date debut])+1;0)) Et (#31/01/2011#<=SérieDate(Année([date fin]);Mois([date fin])+1;0)))=-1;1;0))*(VraiFaux(SérieDate(Année([date fin]);Mois([date fin]);1)=(SérieDate(Année([date debut]);Mois([date debut]);1))=-1;[debit];0)))

Merci de me donner votre avis et les pistespour effectuer voir raccoucir ce code
ALEX80800 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2012, 08h10   #2
Membre Expert
 
Inscription : août 2006
Messages : 1 435
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 435
Points : 1 756
Points : 1 756
Bonjour,
je pense qu'une requête est plus efficace que du code
Les dates extrêmes doivent être enregistrées dans une table (exeriode)
La sélection des factures se fera d'après ces critères :
Code :
1
2
 
WHERE (((TableFactures.jour) Between [Periode]![Date debut] And [Periode]![Date Fin]));
Effectivement plus le nombre de calculs par enregistrement sera important, plus long sera le temps de réponse, il y a une cinquantaine de calculs pour chaque enregistrement dans tes exemples, c'est trop.
helas est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/01/2012, 10h54   #3
Nouveau Membre du Club
 
Homme Alexandre DAUCHET
Contrôleur de Gestion
Inscription : mars 2011
Messages : 86
Détails du profil
Informations personnelles :
Nom : Homme Alexandre DAUCHET
Localisation : France

Informations professionnelles :
Activité : Contrôleur de Gestion
Secteur : Enseignement

Informations forums :
Inscription : mars 2011
Messages : 86
Points : 27
Points : 27
tu as raison Helas

Dans les 350 000 lignes, il y a 70% qui concerne le mois concerné.

Donc il faut que je fasse une requête qui est filtré sur le critère suivant (les 70%) :

mois et année date comptable = mois et année date début = mois et année date fin que je postionne sur lemois concerné

Une deuxième requête (30%) qui est <> du critère ci-dessous et je reprends mes formules de calcul 1° à 5° et qui du coup vônt être un peu plus raccourci

Une 3° requête qui "unionise all" les 2 requêtes ci dessus avec ORDER BY de l'ID

Je teste mercredi

Merci encore
ALEX80800 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h31.


 
 
 
 
Partenaires

Hébergement Web