Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Nombre de part cumulé

7 réponses
Avatar
SystemC
Bonjour à tous,

Je dois calculer un nombre de part cumulé.

Voici un exemple de table :

date_price price DIVIDEND
21-Dec-90 10.00 0.000000
31-Dec-90 10.00 0.031750
31-Jan-91 10.00 0.088755

Et voici ce que j'aimerais obtenir

date_price price DIVIDEND NB_PART
21-Dec-90 10.00 0.000000 1
31-Dec-90 10.00 0.031750 1.00317500
31-Jan-91 10.00 0.088755 1.01207868

Pour calculer le nombre de part, je dois faire appel au champ calculé
précédent. Par exemple pour calculé le nombre de part cumulé en date du
31-Jan-91 je dois suivre la formule suivante :

1.00317500+((0.088755*1.00317500)/10)

Je ne sais pas comment aller chercher le nombre de part cumulé précédent.

Merci pour votre aide

7 réponses

Avatar
Eric
Bonsoir,

En supposant que tu n'as pas de doublons sur la date. Crées une requête
sur cette table et tries sur la date en ordre croissant.
Crées ensuite une 2e requête sur cette requête en ajoutant un compteur
défini comme suit:
Cpt: nz(CpteDom("date_price";"SystemC";"[Date_price]<" &
Format([date_price];"#jj/mm/aaaa#"));0)+1
plus tous les autres champs (SystemC est le nom de la 1ere requête)

Soit rsq1 cette requête.

Dans un module global,tu copies la fonction suivante:
Function NbPart(Compteur As Long) As Double
If Compteur = 1 Then
NbPart = 1
Else
NbPart = NbPart(Compteur - 1) + _
NbPart(Compteur - 1) * _
DLookup("dividend/price", "rsq1", "cpt=" & Compteur)
End If
End Function

Tu crées une 3ème requête sur la précédente (rsq1). Tu mets tous les
champs et ajoutes le champ calculé suivant :
Nb_Part: nbpart([cpt])

Cette requête devrait t'afficher les résultats escomptés



Bonjour à tous,

Je dois calculer un nombre de part cumulé.

Voici un exemple de table :

date_price price DIVIDEND
21-Dec-90 10.00 0.000000
31-Dec-90 10.00 0.031750
31-Jan-91 10.00 0.088755

Et voici ce que j'aimerais obtenir

date_price price DIVIDEND NB_PART
21-Dec-90 10.00 0.000000 1
31-Dec-90 10.00 0.031750 1.00317500
31-Jan-91 10.00 0.088755 1.01207868

Pour calculer le nombre de part, je dois faire appel au champ calculé
précédent. Par exemple pour calculé le nombre de part cumulé en date du
31-Jan-91 je dois suivre la formule suivante :

1.00317500+((0.088755*1.00317500)/10)

Je ne sais pas comment aller chercher le nombre de part cumulé précédent.

Merci pour votre aide


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
SystemC
Merci Éric pour l'aide.

Effectivement, cela donne le résultat désiré. Par contre, cette solution
n'est pas applicable puisque le temps que la requête soit complété est tout
simplement trop long.

J'ai pensé de passer la solution en une requête en ajoutant un index à la
table, mais cela n'aide pas vraiment. Je crois que c'est du au fait a
l'appel récursif de la fonction NbPart ET de la fonction DLookup.

J'ai lu que chaque fois que nous faisons appel à la fonction DLookup, cela
équivaut à faire une requête. Cela peut facilement ralentir la requête.

Il est impératif que la méthode de calcul de part cumulé soit rapide car
c'est à partir de cette données que je calculerai des rendements par la suite.

Merci encore


Bonsoir,

En supposant que tu n'as pas de doublons sur la date. Crées une requête
sur cette table et tries sur la date en ordre croissant.
Crées ensuite une 2e requête sur cette requête en ajoutant un compteur
défini comme suit:
Cpt: nz(CpteDom("date_price";"SystemC";"[Date_price]<" &
Format([date_price];"#jj/mm/aaaa#"));0)+1
plus tous les autres champs (SystemC est le nom de la 1ere requête)

Soit rsq1 cette requête.

Dans un module global,tu copies la fonction suivante:
Function NbPart(Compteur As Long) As Double
If Compteur = 1 Then
NbPart = 1
Else
NbPart = NbPart(Compteur - 1) + _
NbPart(Compteur - 1) * _
DLookup("dividend/price", "rsq1", "cpt=" & Compteur)
End If
End Function

Tu crées une 3ème requête sur la précédente (rsq1). Tu mets tous les
champs et ajoutes le champ calculé suivant :
Nb_Part: nbpart([cpt])

Cette requête devrait t'afficher les résultats escomptés



Bonjour à tous,

Je dois calculer un nombre de part cumulé.

Voici un exemple de table :

date_price price DIVIDEND
21-Dec-90 10.00 0.000000
31-Dec-90 10.00 0.031750
31-Jan-91 10.00 0.088755

Et voici ce que j'aimerais obtenir

date_price price DIVIDEND NB_PART
21-Dec-90 10.00 0.000000 1
31-Dec-90 10.00 0.031750 1.00317500
31-Jan-91 10.00 0.088755 1.01207868

Pour calculer le nombre de part, je dois faire appel au champ calculé
précédent. Par exemple pour calculé le nombre de part cumulé en date du
31-Jan-91 je dois suivre la formule suivante :

1.00317500+((0.088755*1.00317500)/10)

Je ne sais pas comment aller chercher le nombre de part cumulé précédent.

Merci pour votre aide


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr




Avatar
Ilan
Bonsoir, j'ai peut-être une requete pour toi

Pour être plus clair il te faut faire une jointure de ta table sur elle-même
Pour que la requete ici soit lisible
je replace (NZ(LAST(B.dividend)/10)) par B.dividend

SELECT A.date_price, A.price, A.dividend,
1+B.dividend +(A.dividend*(1+B.dividend))/10 AS NbPart
FROM Table as A
LEFT JOIN Table as B ON A.date_price>B.date_price
GROUP BY a.date_price, A.price, A.dividend;




Merci Éric pour l'aide.

Effectivement, cela donne le résultat désiré. Par contre, cette solution
n'est pas applicable puisque le temps que la requête soit complété est tout
simplement trop long.

J'ai pensé de passer la solution en une requête en ajoutant un index à la
table, mais cela n'aide pas vraiment. Je crois que c'est du au fait a
l'appel récursif de la fonction NbPart ET de la fonction DLookup.

J'ai lu que chaque fois que nous faisons appel à la fonction DLookup, cela
équivaut à faire une requête. Cela peut facilement ralentir la requête.

Il est impératif que la méthode de calcul de part cumulé soit rapide car
c'est à partir de cette données que je calculerai des rendements par la suite.

Merci encore


Bonsoir,

En supposant que tu n'as pas de doublons sur la date. Crées une requête
sur cette table et tries sur la date en ordre croissant.
Crées ensuite une 2e requête sur cette requête en ajoutant un compteur
défini comme suit:
Cpt: nz(CpteDom("date_price";"SystemC";"[Date_price]<" &
Format([date_price];"#jj/mm/aaaa#"));0)+1
plus tous les autres champs (SystemC est le nom de la 1ere requête)

Soit rsq1 cette requête.

Dans un module global,tu copies la fonction suivante:
Function NbPart(Compteur As Long) As Double
If Compteur = 1 Then
NbPart = 1
Else
NbPart = NbPart(Compteur - 1) + _
NbPart(Compteur - 1) * _
DLookup("dividend/price", "rsq1", "cpt=" & Compteur)
End If
End Function

Tu crées une 3ème requête sur la précédente (rsq1). Tu mets tous les
champs et ajoutes le champ calculé suivant :
Nb_Part: nbpart([cpt])

Cette requête devrait t'afficher les résultats escomptés



Bonjour à tous,

Je dois calculer un nombre de part cumulé.

Voici un exemple de table :

date_price price DIVIDEND
21-Dec-90 10.00 0.000000
31-Dec-90 10.00 0.031750
31-Jan-91 10.00 0.088755

Et voici ce que j'aimerais obtenir

date_price price DIVIDEND NB_PART
21-Dec-90 10.00 0.000000 1
31-Dec-90 10.00 0.031750 1.00317500
31-Jan-91 10.00 0.088755 1.01207868

Pour calculer le nombre de part, je dois faire appel au champ calculé
précédent. Par exemple pour calculé le nombre de part cumulé en date du
31-Jan-91 je dois suivre la formule suivante :

1.00317500+((0.088755*1.00317500)/10)

Je ne sais pas comment aller chercher le nombre de part cumulé précédent.

Merci pour votre aide


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr






Avatar
Ilan
Ou cette requete peut-être :
SELECT A.date_price, A.price,
A.dividend,LAST((1+nz(B.dividend)/10)*(1+(a.dividend)/10)) as nbpart FROM
Table4 as A LEFT JOIN Table4 as B ON A.date_price>b.date_price GROUP BY
A.date_price, a.price, A.dividend

Il faudrait que tu donnes d'autres valeur pour vérifier.


Bonsoir, j'ai peut-être une requete pour toi

Pour être plus clair il te faut faire une jointure de ta table sur elle-même
Pour que la requete ici soit lisible
je replace (NZ(LAST(B.dividend)/10)) par B.dividend

SELECT A.date_price, A.price, A.dividend,
1+B.dividend +(A.dividend*(1+B.dividend))/10 AS NbPart
FROM Table as A
LEFT JOIN Table as B ON A.date_price>B.date_price
GROUP BY a.date_price, A.price, A.dividend;




Merci Éric pour l'aide.

Effectivement, cela donne le résultat désiré. Par contre, cette solution
n'est pas applicable puisque le temps que la requête soit complété est tout
simplement trop long.

J'ai pensé de passer la solution en une requête en ajoutant un index à la
table, mais cela n'aide pas vraiment. Je crois que c'est du au fait a
l'appel récursif de la fonction NbPart ET de la fonction DLookup.

J'ai lu que chaque fois que nous faisons appel à la fonction DLookup, cela
équivaut à faire une requête. Cela peut facilement ralentir la requête.

Il est impératif que la méthode de calcul de part cumulé soit rapide car
c'est à partir de cette données que je calculerai des rendements par la suite.

Merci encore


Bonsoir,

En supposant que tu n'as pas de doublons sur la date. Crées une requête
sur cette table et tries sur la date en ordre croissant.
Crées ensuite une 2e requête sur cette requête en ajoutant un compteur
défini comme suit:
Cpt: nz(CpteDom("date_price";"SystemC";"[Date_price]<" &
Format([date_price];"#jj/mm/aaaa#"));0)+1
plus tous les autres champs (SystemC est le nom de la 1ere requête)

Soit rsq1 cette requête.

Dans un module global,tu copies la fonction suivante:
Function NbPart(Compteur As Long) As Double
If Compteur = 1 Then
NbPart = 1
Else
NbPart = NbPart(Compteur - 1) + _
NbPart(Compteur - 1) * _
DLookup("dividend/price", "rsq1", "cpt=" & Compteur)
End If
End Function

Tu crées une 3ème requête sur la précédente (rsq1). Tu mets tous les
champs et ajoutes le champ calculé suivant :
Nb_Part: nbpart([cpt])

Cette requête devrait t'afficher les résultats escomptés



Bonjour à tous,

Je dois calculer un nombre de part cumulé.

Voici un exemple de table :

date_price price DIVIDEND
21-Dec-90 10.00 0.000000
31-Dec-90 10.00 0.031750
31-Jan-91 10.00 0.088755

Et voici ce que j'aimerais obtenir

date_price price DIVIDEND NB_PART
21-Dec-90 10.00 0.000000 1
31-Dec-90 10.00 0.031750 1.00317500
31-Jan-91 10.00 0.088755 1.01207868

Pour calculer le nombre de part, je dois faire appel au champ calculé
précédent. Par exemple pour calculé le nombre de part cumulé en date du
31-Jan-91 je dois suivre la formule suivante :

1.00317500+((0.088755*1.00317500)/10)

Je ne sais pas comment aller chercher le nombre de part cumulé précédent.

Merci pour votre aide


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr








Avatar
SystemC
Bonjour Ilan

Merci pour la piste,

Je fait des test de mon coté, mais disons que je suis encore débutant
concernant l'édition de requête par l'éditeur SQL et non par le mode création.

Cela ne donne pas le résultat voulu malheureusement et ce pour deux raison.
Premièrement, il y a le fait que le prix peut différer de 10 et deuxièmement,
je crois que le nombre de part cumulé se cumule seulement avec 2
enregistrement. Voici le résultat voulu avec un plus grand historique.

DATE_PRICE PRICE DIVIDEND NB_PART
31-Dec-90 10.00 0.031750 1.00317500
31-Jan-91 10.00 0.088755 1.01207868
28-Feb-91 10.00 0.075881 1.01975841
28-Mar-91 10.00 0.071326 1.02703193
30-Apr-91 10.00 0.085756 1.03583937
31-May-91 10.00 0.075292 1.04363843
28-Jun-91 10.00 0.062671 1.05017896
31-Jul-91 10.00 0.072981 1.05784331
30-Aug-91 10.00 0.065050 1.06472456
30-Sep-91 10.00 0.067074 1.07186613
31-Oct-91 10.00 0.066203 1.07896223
29-Nov-91 10.00 0.060595 1.08550015
31-Dec-91 10.00 0.063479 1.09239078
31-Jan-92 10.00 0.059005 1.09883643
28-Feb-92 10.00 0.051000 1.10444054
31-Mar-92 10.00 0.056125 1.11063917
30-Apr-92 10.00 0.052401 1.11645904
29-May-92 10.00 0.057717 1.12290292



Ou cette requete peut-être :
SELECT A.date_price, A.price,
A.dividend,LAST((1+nz(B.dividend)/10)*(1+(a.dividend)/10)) as nbpart FROM
Table4 as A LEFT JOIN Table4 as B ON A.date_price>b.date_price GROUP BY
A.date_price, a.price, A.dividend

Il faudrait que tu donnes d'autres valeur pour vérifier.


Bonsoir, j'ai peut-être une requete pour toi

Pour être plus clair il te faut faire une jointure de ta table sur elle-même
Pour que la requete ici soit lisible
je replace (NZ(LAST(B.dividend)/10)) par B.dividend

SELECT A.date_price, A.price, A.dividend,
1+B.dividend +(A.dividend*(1+B.dividend))/10 AS NbPart
FROM Table as A
LEFT JOIN Table as B ON A.date_price>B.date_price
GROUP BY a.date_price, A.price, A.dividend;




Merci Éric pour l'aide.

Effectivement, cela donne le résultat désiré. Par contre, cette solution
n'est pas applicable puisque le temps que la requête soit complété est tout
simplement trop long.

J'ai pensé de passer la solution en une requête en ajoutant un index à la
table, mais cela n'aide pas vraiment. Je crois que c'est du au fait a
l'appel récursif de la fonction NbPart ET de la fonction DLookup.

J'ai lu que chaque fois que nous faisons appel à la fonction DLookup, cela
équivaut à faire une requête. Cela peut facilement ralentir la requête.

Il est impératif que la méthode de calcul de part cumulé soit rapide car
c'est à partir de cette données que je calculerai des rendements par la suite.

Merci encore


Bonsoir,

En supposant que tu n'as pas de doublons sur la date. Crées une requête
sur cette table et tries sur la date en ordre croissant.
Crées ensuite une 2e requête sur cette requête en ajoutant un compteur
défini comme suit:
Cpt: nz(CpteDom("date_price";"SystemC";"[Date_price]<" &
Format([date_price];"#jj/mm/aaaa#"));0)+1
plus tous les autres champs (SystemC est le nom de la 1ere requête)

Soit rsq1 cette requête.

Dans un module global,tu copies la fonction suivante:
Function NbPart(Compteur As Long) As Double
If Compteur = 1 Then
NbPart = 1
Else
NbPart = NbPart(Compteur - 1) + _
NbPart(Compteur - 1) * _
DLookup("dividend/price", "rsq1", "cpt=" & Compteur)
End If
End Function

Tu crées une 3ème requête sur la précédente (rsq1). Tu mets tous les
champs et ajoutes le champ calculé suivant :
Nb_Part: nbpart([cpt])

Cette requête devrait t'afficher les résultats escomptés



Bonjour à tous,

Je dois calculer un nombre de part cumulé.

Voici un exemple de table :

date_price price DIVIDEND
21-Dec-90 10.00 0.000000
31-Dec-90 10.00 0.031750
31-Jan-91 10.00 0.088755

Et voici ce que j'aimerais obtenir

date_price price DIVIDEND NB_PART
21-Dec-90 10.00 0.000000 1
31-Dec-90 10.00 0.031750 1.00317500
31-Jan-91 10.00 0.088755 1.01207868

Pour calculer le nombre de part, je dois faire appel au champ calculé
précédent. Par exemple pour calculé le nombre de part cumulé en date du
31-Jan-91 je dois suivre la formule suivante :

1.00317500+((0.088755*1.00317500)/10)

Je ne sais pas comment aller chercher le nombre de part cumulé précédent.

Merci pour votre aide


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr










Avatar
Ilan
Bonjour, effectivement la requete ne prend en compte qu'une date et la date
précédente.
D'après ce que je comprends il faut factoriser les termes.
Un truc du genre
nbpart(n)=
(1+dividend(0)/price(0))*(1+dividend(1)/price(1))*.....*(1+dividend(n)/price(n)

Ce que je propose est de créer une fonction qui fait le calcul et une
requete qui l'affiche.

Requete : SELECT date_price, price, dividend, FACTORIEL(date_price) FROM
Table

Fonction :
Function FACTORIEL(DatePriceMax as date) as double
Dim Terme as double
dim Tbl as DAO.recordset
set Tbl=currentdb.openrecordset("SELECT date_price,dividend,price FROM
Table")

Terme=1
While not Tbl.EOF
IF Tbl!date_price<ÚtePriceMax then
Terme=Terme*(1+(tbl!dividend)/tbl!price)
else
Tbl.movelast
end if
tbl.movenext
Wend
Tbl.close
Factoriel=Terme
End Function

Tu écris la fonction dans un module, puis tu crées ta requete qui appelle
la fonction
je vais tester avec les chiffres que tu m'as donné.

Bonjour Ilan

Merci pour la piste,

Je fait des test de mon coté, mais disons que je suis encore débutant
concernant l'édition de requête par l'éditeur SQL et non par le mode création.

Cela ne donne pas le résultat voulu malheureusement et ce pour deux raison.
Premièrement, il y a le fait que le prix peut différer de 10 et deuxièmement,
je crois que le nombre de part cumulé se cumule seulement avec 2
enregistrement. Voici le résultat voulu avec un plus grand historique.

DATE_PRICE PRICE DIVIDEND NB_PART
31-Dec-90 10.00 0.031750 1.00317500
31-Jan-91 10.00 0.088755 1.01207868
28-Feb-91 10.00 0.075881 1.01975841
28-Mar-91 10.00 0.071326 1.02703193
30-Apr-91 10.00 0.085756 1.03583937
31-May-91 10.00 0.075292 1.04363843
28-Jun-91 10.00 0.062671 1.05017896
31-Jul-91 10.00 0.072981 1.05784331
30-Aug-91 10.00 0.065050 1.06472456
30-Sep-91 10.00 0.067074 1.07186613
31-Oct-91 10.00 0.066203 1.07896223
29-Nov-91 10.00 0.060595 1.08550015
31-Dec-91 10.00 0.063479 1.09239078
31-Jan-92 10.00 0.059005 1.09883643
28-Feb-92 10.00 0.051000 1.10444054
31-Mar-92 10.00 0.056125 1.11063917
30-Apr-92 10.00 0.052401 1.11645904
29-May-92 10.00 0.057717 1.12290292



Ou cette requete peut-être :
SELECT A.date_price, A.price,
A.dividend,LAST((1+nz(B.dividend)/10)*(1+(a.dividend)/10)) as nbpart FROM
Table4 as A LEFT JOIN Table4 as B ON A.date_price>b.date_price GROUP BY
A.date_price, a.price, A.dividend

Il faudrait que tu donnes d'autres valeur pour vérifier.


Bonsoir, j'ai peut-être une requete pour toi

Pour être plus clair il te faut faire une jointure de ta table sur elle-même
Pour que la requete ici soit lisible
je replace (NZ(LAST(B.dividend)/10)) par B.dividend

SELECT A.date_price, A.price, A.dividend,
1+B.dividend +(A.dividend*(1+B.dividend))/10 AS NbPart
FROM Table as A
LEFT JOIN Table as B ON A.date_price>B.date_price
GROUP BY a.date_price, A.price, A.dividend;




Merci Éric pour l'aide.

Effectivement, cela donne le résultat désiré. Par contre, cette solution
n'est pas applicable puisque le temps que la requête soit complété est tout
simplement trop long.

J'ai pensé de passer la solution en une requête en ajoutant un index à la
table, mais cela n'aide pas vraiment. Je crois que c'est du au fait a
l'appel récursif de la fonction NbPart ET de la fonction DLookup.

J'ai lu que chaque fois que nous faisons appel à la fonction DLookup, cela
équivaut à faire une requête. Cela peut facilement ralentir la requête.

Il est impératif que la méthode de calcul de part cumulé soit rapide car
c'est à partir de cette données que je calculerai des rendements par la suite.

Merci encore


Bonsoir,

En supposant que tu n'as pas de doublons sur la date. Crées une requête
sur cette table et tries sur la date en ordre croissant.
Crées ensuite une 2e requête sur cette requête en ajoutant un compteur
défini comme suit:
Cpt: nz(CpteDom("date_price";"SystemC";"[Date_price]<" &
Format([date_price];"#jj/mm/aaaa#"));0)+1
plus tous les autres champs (SystemC est le nom de la 1ere requête)

Soit rsq1 cette requête.

Dans un module global,tu copies la fonction suivante:
Function NbPart(Compteur As Long) As Double
If Compteur = 1 Then
NbPart = 1
Else
NbPart = NbPart(Compteur - 1) + _
NbPart(Compteur - 1) * _
DLookup("dividend/price", "rsq1", "cpt=" & Compteur)
End If
End Function

Tu crées une 3ème requête sur la précédente (rsq1). Tu mets tous les
champs et ajoutes le champ calculé suivant :
Nb_Part: nbpart([cpt])

Cette requête devrait t'afficher les résultats escomptés



Bonjour à tous,

Je dois calculer un nombre de part cumulé.

Voici un exemple de table :

date_price price DIVIDEND
21-Dec-90 10.00 0.000000
31-Dec-90 10.00 0.031750
31-Jan-91 10.00 0.088755

Et voici ce que j'aimerais obtenir

date_price price DIVIDEND NB_PART
21-Dec-90 10.00 0.000000 1
31-Dec-90 10.00 0.031750 1.00317500
31-Jan-91 10.00 0.088755 1.01207868

Pour calculer le nombre de part, je dois faire appel au champ calculé
précédent. Par exemple pour calculé le nombre de part cumulé en date du
31-Jan-91 je dois suivre la formule suivante :

1.00317500+((0.088755*1.00317500)/10)

Je ne sais pas comment aller chercher le nombre de part cumulé précédent.

Merci pour votre aide


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr












Avatar
Ilan
Voilà ce que j'obtiens : certaine valuers ne sont pas identiques à ce que tu
obtiens

date_price price dividend nbpart
21/01/1990 10 0 1,00000000
31/12/1990 10 0,03175 1,00317500
31/01/1991 10 0,088755 1,01207868
28/02/1991 10 0,075881 1,01975843
28/03/1991 10 0,071326 1,02703196
30/04/1991 10 0,085756 1,03583938
31/05/1991 10 0,075292 1,04363842
28/06/1991 10 0,062671 1,05017901
31/07/1991 10 0,072981 1,05784332
30/08/1991 10 0,06505 1,06472459
30/09/1991 10 0,067074 1,07186612
31/10/1991 10 0,066203 1,07896220
29/11/1991 10 0,060595 1,08550017
31/12/1991 10 0,063479 1,09239082
31/01/1992 10 0,059005 1,09883647
28/02/1992 10 0,051 1,10444053
31/03/1992 10 0,056125 1,11063921
30/04/1992 10 0,052401 1,11645907
29/05/1992 10 0,057717 1,12290293


Bonjour, effectivement la requete ne prend en compte qu'une date et la date
précédente.
D'après ce que je comprends il faut factoriser les termes.
Un truc du genre
nbpart(n)=
(1+dividend(0)/price(0))*(1+dividend(1)/price(1))*.....*(1+dividend(n)/price(n)

Ce que je propose est de créer une fonction qui fait le calcul et une
requete qui l'affiche.

Requete : SELECT date_price, price, dividend, FACTORIEL(date_price) FROM
Table

Fonction :
Function FACTORIEL(DatePriceMax as date) as double
Dim Terme as double
dim Tbl as DAO.recordset
set Tbl=currentdb.openrecordset("SELECT date_price,dividend,price FROM
Table")

Terme=1
While not Tbl.EOF
IF Tbl!date_price<ÚtePriceMax then
Terme=Terme*(1+(tbl!dividend)/tbl!price)
else
Tbl.movelast
end if
tbl.movenext
Wend
Tbl.close
Factoriel=Terme
End Function

Tu écris la fonction dans un module, puis tu crées ta requete qui appelle
la fonction
je vais tester avec les chiffres que tu m'as donné.

Bonjour Ilan

Merci pour la piste,

Je fait des test de mon coté, mais disons que je suis encore débutant
concernant l'édition de requête par l'éditeur SQL et non par le mode création.

Cela ne donne pas le résultat voulu malheureusement et ce pour deux raison.
Premièrement, il y a le fait que le prix peut différer de 10 et deuxièmement,
je crois que le nombre de part cumulé se cumule seulement avec 2
enregistrement. Voici le résultat voulu avec un plus grand historique.

DATE_PRICE PRICE DIVIDEND NB_PART
31-Dec-90 10.00 0.031750 1.00317500
31-Jan-91 10.00 0.088755 1.01207868
28-Feb-91 10.00 0.075881 1.01975841
28-Mar-91 10.00 0.071326 1.02703193
30-Apr-91 10.00 0.085756 1.03583937
31-May-91 10.00 0.075292 1.04363843
28-Jun-91 10.00 0.062671 1.05017896
31-Jul-91 10.00 0.072981 1.05784331
30-Aug-91 10.00 0.065050 1.06472456
30-Sep-91 10.00 0.067074 1.07186613
31-Oct-91 10.00 0.066203 1.07896223
29-Nov-91 10.00 0.060595 1.08550015
31-Dec-91 10.00 0.063479 1.09239078
31-Jan-92 10.00 0.059005 1.09883643
28-Feb-92 10.00 0.051000 1.10444054
31-Mar-92 10.00 0.056125 1.11063917
30-Apr-92 10.00 0.052401 1.11645904
29-May-92 10.00 0.057717 1.12290292



Ou cette requete peut-être :
SELECT A.date_price, A.price,
A.dividend,LAST((1+nz(B.dividend)/10)*(1+(a.dividend)/10)) as nbpart FROM
Table4 as A LEFT JOIN Table4 as B ON A.date_price>b.date_price GROUP BY
A.date_price, a.price, A.dividend

Il faudrait que tu donnes d'autres valeur pour vérifier.


Bonsoir, j'ai peut-être une requete pour toi

Pour être plus clair il te faut faire une jointure de ta table sur elle-même
Pour que la requete ici soit lisible
je replace (NZ(LAST(B.dividend)/10)) par B.dividend

SELECT A.date_price, A.price, A.dividend,
1+B.dividend +(A.dividend*(1+B.dividend))/10 AS NbPart
FROM Table as A
LEFT JOIN Table as B ON A.date_price>B.date_price
GROUP BY a.date_price, A.price, A.dividend;




Merci Éric pour l'aide.

Effectivement, cela donne le résultat désiré. Par contre, cette solution
n'est pas applicable puisque le temps que la requête soit complété est tout
simplement trop long.

J'ai pensé de passer la solution en une requête en ajoutant un index à la
table, mais cela n'aide pas vraiment. Je crois que c'est du au fait a
l'appel récursif de la fonction NbPart ET de la fonction DLookup.

J'ai lu que chaque fois que nous faisons appel à la fonction DLookup, cela
équivaut à faire une requête. Cela peut facilement ralentir la requête.

Il est impératif que la méthode de calcul de part cumulé soit rapide car
c'est à partir de cette données que je calculerai des rendements par la suite.

Merci encore


Bonsoir,

En supposant que tu n'as pas de doublons sur la date. Crées une requête
sur cette table et tries sur la date en ordre croissant.
Crées ensuite une 2e requête sur cette requête en ajoutant un compteur
défini comme suit:
Cpt: nz(CpteDom("date_price";"SystemC";"[Date_price]<" &
Format([date_price];"#jj/mm/aaaa#"));0)+1
plus tous les autres champs (SystemC est le nom de la 1ere requête)

Soit rsq1 cette requête.

Dans un module global,tu copies la fonction suivante:
Function NbPart(Compteur As Long) As Double
If Compteur = 1 Then
NbPart = 1
Else
NbPart = NbPart(Compteur - 1) + _
NbPart(Compteur - 1) * _
DLookup("dividend/price", "rsq1", "cpt=" & Compteur)
End If
End Function

Tu crées une 3ème requête sur la précédente (rsq1). Tu mets tous les
champs et ajoutes le champ calculé suivant :
Nb_Part: nbpart([cpt])

Cette requête devrait t'afficher les résultats escomptés



Bonjour à tous,

Je dois calculer un nombre de part cumulé.

Voici un exemple de table :

date_price price DIVIDEND
21-Dec-90 10.00 0.000000
31-Dec-90 10.00 0.031750
31-Jan-91 10.00 0.088755

Et voici ce que j'aimerais obtenir

date_price price DIVIDEND NB_PART
21-Dec-90 10.00 0.000000 1
31-Dec-90 10.00 0.031750 1.00317500
31-Jan-91 10.00 0.088755 1.01207868

Pour calculer le nombre de part, je dois faire appel au champ calculé
précédent. Par exemple pour calculé le nombre de part cumulé en date du
31-Jan-91 je dois suivre la formule suivante :

1.00317500+((0.088755*1.00317500)/10)

Je ne sais pas comment aller chercher le nombre de part cumulé précédent.

Merci pour votre aide


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr