|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() Alexandre DAUCHETContrôleur de Gestion Inscription : mars 2011 Messages : 86 ![]() |
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))) 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)) 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)) 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)) 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 |
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Inscription : août 2006 Messages : 1 435 ![]() |
Bonjour,
je pense qu'une requête est plus efficace que du code Les dates extrêmes doivent être enregistrées dans une table (ex La sélection des factures se fera d'après ces critères : Code :
|
||
|
|
10
|
|
|
#3 |
|
Nouveau Membre du Club
![]() Alexandre DAUCHETContrôleur de Gestion Inscription : mars 2011 Messages : 86 ![]() |
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 |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com