Bonsoir,( Paris 0h 15)
CITATION(Moi Mich)
J'ai laissé de coté pour l'instant le sujet Alarme. Je voulais faire autre chose de moins compliqué. Cependant je veux continuer pour l'alarme, ces important.
Evidemment qu'on continue. Ceci est l'objet de ce post.
Pour aller jusquà une alarme directe ou indirecte, c'est à dire message directs ou selon volonté de l'utilisateur, il nous faut franchir X étapes dont :
Trier les données selon date d'échéance.
Choisir le mode d'alerte :
Solution 1--->Par un bouton sur un formulaire invitant à l'envoi.
Solution 2--->Automatique sans intervention d'utilisateur.
1--> Va nous permettre de vérifier, modifier l'envoi
2--> A l'avantage de l'envoi automatique ainsi que les inconvénients.
On va être amené à choisir le mode d'envoi de courrier électronique :
-->Send objet
-->Outlook
-->Pièce jointe ou pas
Pièce jointe :
Format HTLM?
fichier.rtf?
Word?
PDF?
Snapshot?
Etc.?
Il nous faut commencer par le commencement-->Trier les données selon les dates. Nous allons nous en cantonner à la date de naissance du client. Il suffira de reproduire, selon besoin pour les autres dates d'échéance.
On commence par voir quelques fonctions. On va se contenter dans un premier temps d'éxécuter toutes les fontions proposées par le truchement d'une requête
La principale problématique rencontrée est ce fameux message disgracieux "erreur" affiché si la date de naissance est vide. Nous allons y parer de diverses façons :
La fonction de base pour calculer une différence entre deux dates est :
Date Diff(). En Français-->DiffDate().
Cette fonction gére le passage d'un mois à l'autre, d'une année à l'autre, ainsi que les années bissextiles(Comme la plupart des fonctions dates..)
Cette fonction comprend cinq arguments
1-->Code entre "" déclinant l'intervalle de temps
---------------------------Intervalle Français/US---------------------------Année : "aaaa" / "yyyy"
---------------------------Mois : "m" / "m"
---------------------------Jour : "j" / "d"
---------------------------Heure : 'h" / "h"
---------------------------Minute : "n" / "n"
---------------------------Seconde : "s" / "s"
---------------------------Trimestre : "t" / "q"
---------------------------Semaine : "ee" / "ww"
---------------------------Jour de la semaine : "e" / "w"
---------------------------Jour de l'année : "a" / "y"
2-->Date de début
3-->Date de fin
4-->Valeur numérique indiquant le premier jour de la semaine (En Fance 2 = Lundi)
5-->Valeur numérique indiquant la première semaine de l'année ( Semaine de 4 jours = 2)
Ce qui va nous donner dans une requête :
CODE
SELECT DateDiff("yyyy",[Dte_Naissance],Date(),2,2) AS AgeDiffDate
FROM tblMich;
Qu'on peut simplifier par :
CODE
SELECT DateDiff("yyyy",[Dte_Naissance],Date()) AS AgeDiffDate
FROM tblMich;
Allez..On complique un peu. Dans note module concernant les dates, qu'on a baptisé bas_Date on colle :
CODE
Function AgeAnnéeMois(DateNaissance As Date, _
Cejour As Date, _
Optional Numérique As Boolean = True) As Variant
'cette fonction calcule l'âge en années et mois
'retourne soit une valeur numérique soit alpha
Dim AnnéeCejour As Integer, AnnéeNaissance As Integer, _
MoisCejour As Integer, MoisNaissance As Integer
Dim strAn As String
MoisCejour = Month(Cejour)
AnnéeCejour = Year(Cejour)
MoisNaissance = Month(DateNaissance)
AnnéeNaissance = Year(DateNaissance)
If Day(DateNaissance) > Day(Cejour) Then
MoisNaissance = MoisNaissance + 1
End If
If MoisNaissance > MoisCejour Then
AnnéeNaissance = AnnéeNaissance + 1
MoisCejour = MoisCejour + 12
End If
If Numérique Then
AgeAnnéeMois = (AnnéeCejour - AnnéeNaissance) _
+ ((MoisCejour - MoisNaissance) / 12)
Else
If (AnnéeCejour - AnnéeNaissance) > 1 Then
AgeAnnéeMois = (AnnéeCejour - AnnéeNaissance) _
& " ans, " & (MoisCejour - MoisNaissance) & " mois"
Else
AgeAnnéeMois = (AnnéeCejour - AnnéeNaissance) _
& " an, " & (MoisCejour - MoisNaissance) & " mois"
End If
End If
End Function
Et dans une requête :
CODE
SELECT IIf([Dte_Naissance]>#1/1/1900#,AgeAnnéeMois([Dte_Naissance],Date())) AS AgeMois
FROM tblMich;
On disséque la requête:
Pour ne pas voir s'afficher #erreur on a opté pour demander une réponse qu'aprés le premier Janvier 1900(Attention avant cette date-->Risque de Bug..)
La Fonction :
Le côté option est l'intérêt de cette dernière. Par défaut, sans précision nous aurons du numérique.
Nous pouvons obtenir du texte en le précisant dans la requête :
CODE
SELECT IIf([Dte_Naissance]>#1/1/1900#,AgeAnnéeMois([Dte_Naissance],Date(),0)) AS AgeMois
FROM tblMich;
Un "Gadget" pour cette fonction est de voir s'afficher an et non ans pour un an et moins.
On va regarder pour arriver à un résultat similaire par une autre fonction :
Dans notre module bas_Dates :
CODE
Function AgePourMich(DateDebut As Date, DateFin As Date) As String
' DateDebut = date de naissance, DateFin = date que l'on veut
Dim A1 As Integer, A0 As Integer, m1 As Integer, m0 As Integer
Dim d1 As Integer, d0 As Integer
d1 = Day(DateFin)
m1 = Month(DateFin)
A1 = Year(DateFin)
d0 = Day(DateDebut)
m0 = Month(DateDebut)
A0 = Year(DateDebut)
If d0 > d1 Then m0 = m0 + 1
If m0 > m1 Then
A0 = A0 + 1
m1 = m1 + 12
End If
AgePourMich = (A1 - A0) & " ans, " & (m1 - m0) & " mois"
End Function
Dans une requête :
CODE
SELECT IIf([Dte_Naissance]>#1/1/1900#,AgePourMich([Dte_Naissance],Date())) AS AgeActuel
FROM tblMich;
Maintenant on va inscrire la date du prochain anniversaire.
Dans notre module :
CODE
Function Anniversaire(dteDate As Date) As Date
' Cette fonction recherche le prochain anniversaire d'une date.
' Si la date est déjà passée pour l'année en cours, elle renvoie
' la date anniversaire de l'année suivante.
Dim DateCetteAnnée As Date
' Recherche la date correspondante dans l'années en cours.
DateCetteAnnée = DateSerial(Year(Date), Month(dteDate), Day(dteDate))
' Détermine si cette date est déjà passée.
If DateCetteAnnée < Date Then
Anniversaire = DateAdd("yyyy", 1, DateCetteAnnée)
Else
Anniversaire = DateCetteAnnée
End If
End Function
Dans une requête :
CODE
SELECT IIf([Dte_Naissance]>#1/1/1900#,Anniversaire([Dte_Naissance])) AS Anniversaire
FROM tblMich;
Et là on commence à voir la possibilité de calculer la prochaine échéance.
C'est exactement à ce moment que je te laisse l'initiative de ce calcul mon Cher
Moi Mich.
Comment? Encore une autre fonction? Bon, d'accord. Je suis bon prince. Je te mâche le travail :
Dans notre module :
CODE
Public Function NbJoursAvantAnniversaire _
(DateNaissancee As Date) As Integer
Dim DateCetteAnnee As Date
DateCetteAnnee = DateSerial(Year(Date), _
Month(DateNaissancee), _
Day(DateNaissancee))
If DateCetteAnnee < Date Then _
DateCetteAnnee = DateAdd("yyyy", 1, DateCetteAnnee)
NbJoursAvantAnniversaire = DateDiff("d", Date, DateCetteAnnee)
End Function
Notre requête :
CODE
SELECT IIf([Dte_Naissance]>1/1/1900,(NbJoursAvantAnniversaire([Dte_Naissance]))) AS AnniversaireProchain
FROM tblMich;
Maintenant,en retour, fais moi voir la requête qui donne le nombre de jours restants avant le prochain anniversaire - 10 jours.
Non!!! On ne souffle pas! C'est à
Moi Mich de répondre.
Cordialement.