OVH Cloud OVH Cloud

Comment utiliser une fonction "perso" dans une requête

4 réponses
Avatar
TEV
Bonjour,

Je cherche à ajouter à chaque anniversaire +1 à l'âge de la personne
enregistrée dans la base de données. Pour ce faire je pensais fire une
requête mise à jour avec une fonction de mon cru pour trouver les fiches
candidates. J'ai testé la fonction proprement dite dans Access (en créant la
requête en mode graphique). Tout fonctionne.

Par contre en la refaisant dans VB, je m'aperçois que la fonction est
comprise comme étant du texte. Comment puis je faire pour que la fonction
soit reconnue au même titre que toutes les autres fonctions d'Access ou VB ?

Christian.

4 réponses

Avatar
Zoury
Salut Christian!

Je cherche à ajouter à chaque anniversaire +1 à l'âge de la personne
enregistrée dans la base de données.



Je n'ai pas très bien compris.. peux-tu nous expliquer un peu plus?

Comment puis je faire pour que la fonction
soit reconnue au même titre que toutes les autres fonctions d'Access ou VB


?

Peux-tu nous montrer nous ton code actuel..?


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
Jessy Sempere [MVP]
Bonjour

Pourquoi tu veux stocker la valeur "Age", c'est une donnée calculé, ce
n'est pas utile de stocker cette valeur, tu dois déjà avoir un champ
contenant la date d'anniversaire ???

Perso j'utiliserais une fonction perso pour déterminer l'age de la personne
et ensuite je passerais par une requête pour afficher l'age

Exemple pour la fonction de calcul de l'age :

Function Age(dtBirthDay As Date) As Integer
Age = DateDiff("yyyy", dtBirthDay, Date)
Select Case Month(dtBirthDay)
Case Is > Month(Date)
Age = Age - 1
Case Month(Date)
If Day(dtBirthDay) > Day(Date) Then Age = Age - 1
End Select
End Function

Ensuite tu fais une requête du style :
Select Personne, Age([ChampDateAnniversaire])
From TaTable;

Mais ce n'est qu'une façon de faire parmi tant d'autres... ;-)

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"TEV" a écrit dans le message news:
40ce247d$0$1827$
Bonjour,

Je cherche à ajouter à chaque anniversaire +1 à l'âge de la personne
enregistrée dans la base de données. Pour ce faire je pensais fire une
requête mise à jour avec une fonction de mon cru pour trouver les fiches
candidates. J'ai testé la fonction proprement dite dans Access (en créant


la
requête en mode graphique). Tout fonctionne.

Par contre en la refaisant dans VB, je m'aperçois que la fonction est
comprise comme étant du texte. Comment puis je faire pour que la fonction
soit reconnue au même titre que toutes les autres fonctions d'Access ou VB


?

Christian.




Avatar
TEV
Merci beaucoup pour la réponse.

> Je cherche à ajouter à chaque anniversaire +1 à l'âge de la personne
> enregistrée dans la base de données.


> Je n'ai pas très bien compris.. peux-tu nous expliquer un peu plus?
Lorsque les personnes s'inscrivent dans la base de données, on prend sa date
de naissance et à partir de ça le programme d'inscription calcul et
enregistre son âge.
Comme, ce critère est important, il faut que cet âge ne reste pas figé à
celui inscrit lors de son inscription. D'où la raison qu' a chaque date
anniversaire (basée sur sa date de naissance) on doit lui ajouter un an (à
elle et à ses enfants).

> Comment puis je faire pour que la fonction
> soit reconnue au même titre que toutes les autres fonctions d'Access ou


VB
> ?
Je voulais seulement dire que lorsque l'on fait une requête que ce soit dans
Access ou dans VB en utilisant les fonctions (comme dateDiff, Asc etc.)
types de ces programmes celle-ci sont reconnues. Comment faire lorsque la
fonction est créée par soi même, afin que VB puisse l'exécuter dans une
requête.

J'ai obtenu une réponse me disant que cela ne pouvait se faire, puisque VB +
Jet n'ont pas les mêmes affinités de fonctionnement que Access + Jet.

Par contre je ne vois pas trop comment faire pour contourner ce problème.
Cela m'oblige à ouvrir un
recordset, de le parcourir en fournissant les valeurs [dtNaissance] et [Age]
permettant d'appeler la fonction, de vérifier la réponse de la fonction pour
le cas échéant ou stocker l'id dans un tableau puis de faire en boucle une
requête UPDATE avec pour critères les ID contenus dans le tableau ou
exécuter cette requête UPDATE mais uniquement avec l'ID remplissant la
condition.

Seulement je crains que cela prenne énormément de temps d'exécution. Y
aurait - il d'autres façon de faire ?


Le code en fait ne se résume pour le moment quà la déclaration de la
requête. La fonction CalculDtAnniversaire(DtAnniversaire, AgeFiche) as
boolean, me renvoi Vrai si il faut ajouter 1 an à l'âge qui est lu et Faux
dans le cas contraire.

RQAjoutAn = "UPDATE renseignement LEFT JOIN enfant ON Renseignement.ID Enfant.IDR " & _
"SET Renseignement.age=[Renseignement.age]+1,
Enfant.AgeEnfant=[Enfant.AgeEnfant]+1 " & _
"WHERE (((CalculDtAnniversaire([dtNaissance],[age]))=-1)) ;"

Au moment de son exécution VB ne comprend pas ce qu'est
CalculDtAnniversaire.

Voila, j'espère que cette fois -ci je serais plus clair ;)

Christian.

"Zoury" a écrit dans le message de news:

Salut Christian!

> Je cherche à ajouter à chaque anniversaire +1 à l'âge de la personne
> enregistrée dans la base de données.

Je n'ai pas très bien compris.. peux-tu nous expliquer un peu plus?

> Comment puis je faire pour que la fonction
> soit reconnue au même titre que toutes les autres fonctions d'Access ou


VB
?

Peux-tu nous montrer nous ton code actuel..?


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/




Avatar
TEV
Je ne me suis pas encore fait comprendre.
Bien sûr, l'âge de la personne figure dans le champ approprié dès son
inscription.
Ma fonction ressemble à la tienne mais pour déterminer si il faut ou non
ajouter 1 an à l'âge figurant déjà dans la base je compare l'age trouvé par
le recalcule de l'âge et celui qui se trouve dans la base. Car il me faut,
dans le cas d'un ajout à l'âge de la personne, il me faut également dans ce
cas ajouter un an à ses enfants éventuels.

soit :
Function CalculDtAnniversaire(DtNaissance As Variant, AgeFiche As Integer)
As Boolean
' Calcul l'âge de la personne à partir de sa date de naissance, puis vérifie
si le nombre calculé est
' différent de celui qui a été trouvé.
' La fonction retourne Vrai si cela a changé faux dans le contraire
'
Dim TAge, Resultat As Integer
'
' Calcul l'âge de la fiche à partir de sa date de naissance
If Month(Date) < Month(DtNaissance) Or (Month(Date) Month(DtNaissance) And Day(Date) < Day(DtNaissance)) Then
TAge = Year(Date) - Year(DtNaissance) - 1
Else
TAge = Year(Date) - Year(DtNaissance)
End If
' Comparre le résultat avec l'âge figurant dans la base de données
If TAge > AgeFiche Then CalculDtAnniversaire = True Else
CalculDtAnniversaire = False
End Function

Comme ça je ne garde que ceux qui intéresse.

Christian.

"Jessy Sempere [MVP]" a écrit dans le message de
news: camut2$t12$
Bonjour

Pourquoi tu veux stocker la valeur "Age", c'est une donnée calculé, ce
n'est pas utile de stocker cette valeur, tu dois déjà avoir un champ
contenant la date d'anniversaire ???

Perso j'utiliserais une fonction perso pour déterminer l'age de la


personne
et ensuite je passerais par une requête pour afficher l'age

Exemple pour la fonction de calcul de l'age :

Function Age(dtBirthDay As Date) As Integer
Age = DateDiff("yyyy", dtBirthDay, Date)
Select Case Month(dtBirthDay)
Case Is > Month(Date)
Age = Age - 1
Case Month(Date)
If Day(dtBirthDay) > Day(Date) Then Age = Age - 1
End Select
End Function

Ensuite tu fais une requête du style :
Select Personne, Age([ChampDateAnniversaire])
From TaTable;

Mais ce n'est qu'une façon de faire parmi tant d'autres... ;-)

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"TEV" a écrit dans le message news:
40ce247d$0$1827$
> Bonjour,
>
> Je cherche à ajouter à chaque anniversaire +1 à l'âge de la personne
> enregistrée dans la base de données. Pour ce faire je pensais fire une
> requête mise à jour avec une fonction de mon cru pour trouver les fiches
> candidates. J'ai testé la fonction proprement dite dans Access (en


créant
la
> requête en mode graphique). Tout fonctionne.
>
> Par contre en la refaisant dans VB, je m'aperçois que la fonction est
> comprise comme étant du texte. Comment puis je faire pour que la


fonction
> soit reconnue au même titre que toutes les autres fonctions d'Access ou


VB
?
>
> Christian.
>
>