PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → encore de l'algorithme de fou....
encore de l'algorithme de fou....
Débuté par agidrol, 27 fév. 2006 17:48 - 14 réponses
Posté le 27 février 2006 - 17:48
bonjour à tous,

petit programme à se casser la tête dessus.

J'ai dans une base de donnée, des personnes avec date de naissance.
je dois à un moment de l'année, retrouver toutes les personnes nées
entre 2 dates, mais sans les années.

par exemple, je voudrais les personnes nées entre le 12 décembre (12/12)
et le 15 fevrier (15/02) ou alors entre le 02 mars (02/03) et le 14 aout
(14/08)

J'ai beau chercher, j'arrive à rien.........
surtout quand mes date sont inversées. 12 décembre (12/12) et le 15 fevrier

J'ai besoin de ceci afin d'ajouter à une carte de fidélité, des euros lors
de leur anniversaire.

Merci de votre aide.

Antoine GIDROL
Posté le 27 février 2006 - 18:49
Bonjour,

tu peut faire cela :

SELECT RIGHT(date_naissance,4)
from enfants
where RIGHT(date_naissance,4) between '0901' and '0931'

en gros, tu selectionne le jour et le mois de naissance de toutes les personnes
de ta base et ensuite tu met une condition de selection sur la période que tu as besoins

ici je selectionne tous les "enfants" qui on une date de naissance entre le 01 septembre et le 31.

bon dev

jeanlin
Posté le 27 février 2006 - 18:49
Antoine GIDROL a utilisé son clavier pour écrire :
bonjour à tous,

petit programme à se casser la tête dessus.

J'ai dans une base de donnée, des personnes avec date de naissance.
je dois à un moment de l'année, retrouver toutes les personnes nées
entre 2 dates, mais sans les années.

par exemple, je voudrais les personnes nées entre le 12 décembre (12/12)
et le 15 fevrier (15/02) ou alors entre le 02 mars (02/03) et le 14 aout
(14/08)

J'ai beau chercher, j'arrive à rien.........
surtout quand mes date sont inversées. 12 décembre (12/12) et le 15 fevrier

J'ai besoin de ceci afin d'ajouter à une carte de fidélité, des euros lors
de leur anniversaire.

Merci de votre aide.

Antoine GIDROL


Tu as tout ce que tu demandes dans l'aide ( F1, Rechercher Date, Type
Date)

--
Eric Laurent
nospam.laurent.systel@wanadoo.fr
(enlever nospam.)
Posté le 28 février 2006 - 07:00
Bonjour

"Antoine GIDROL" <agidrol@free.fr> a écrit dans le message de news:
44031e09$1@news.pcsoft.fr...

bonjour à tous,

petit programme à se casser la tête dessus.

J'ai dans une base de donnée, des personnes avec date de naissance.
je dois à un moment de l'année, retrouver toutes les personnes nées
entre 2 dates, mais sans les années.

par exemple, je voudrais les personnes nées entre le 12 décembre (12/12)
et le 15 fevrier (15/02) ou alors entre le 02 mars (02/03) et le 14 aout
(14/08)

J'ai beau chercher, j'arrive à rien.........
surtout quand mes date sont inversées. 12 décembre (12/12) et le 15
fevrier

J'ai besoin de ceci afin d'ajouter à une carte de fidélité, des euros lors
de leur anniversaire.

Merci de votre aide.

Antoine GIDROL



Tu devrais arriver à faire cela en 5 ou 10 lignes de code Wlangage.

D'abord, tu fixes la période que tu veux explorer (du 12/04 au 26/08 par
exemple).
Tu as donc:
- un jour mini: le 12/04
- un jour maxi: le 26/08

Tu définis ensuite une date à partir du jour mini et du jour maxi, en te
basant sur l'année en cours.
Tu as donc
- une date mini: le 12/04/2006
- une date maxi: le 26/08/2006

Ensuite, et bien il y a plein de solutions.
Par exemple:
1) tu lis la date de naissance des personnes dans le fichier HF (exemple
"19881225" pour le 25/12/1988")
2) après lecture, tu crées une variable qui sera égale à la date de
naissance lue dans le fichier HF
3) tu remplaces, dans la variable créée précédemment, l'année de naissance
par l'année en cours (dans l'exemple précisé en 1, tu remplaces "1988" par
"2006" et tu obtiens le 25/12/2006")
4) pour terminer, tu vérifies si la date ainsi obtenue (25/12/2006) est
comprise entre les dates mini (12/04/2006) et maxi (26/08/2006)

Et voilà.
Ce qu'il faut, bien sur, c'est prendre également en compte la spécificité du
29/02.
Donc, dans le traitement, il faut que tu testes la validité de la date via
DateValide.

A+

Val
Posté le 28 février 2006 - 07:00
Cela veux dire que je dois travailler sur chaque mois entre mon intervalle
de date ?
C'est une solution, mais il n'y aurai pas plus rapide ?

Eric laurent : je suis pas certain que ce que je cherche est dans l'aide,
je ne cherche pas de date à date, puisque je ne m'occupe pas des année.
Mais si tu as la solution, je suis prenneur.

exemple :

dernier lancement du programme : 15/12/2005
Lancement ce jour : 27/02/2006

je veux retrouver dans ma base de donnée toutes les personnes
nées entre le 15/12 et le 27/02 mais pas pour l'année 2005 et 2006
mais pour toutes les années.
par exemple, je voudrai retrouver PAUL dont la date de naissance est
26/12/1970
puisque 26/12 est bien compris entre le 15/12 et le 27/02

Par avance merci

Antoine



"jeanlin" <guest@newsgroup.fr> a écrit dans le message de news:
44032aec$1@news.pcsoft.fr...

Bonjour,

tu peut faire cela :

SELECT RIGHT(date_naissance,4)
from enfants
where RIGHT(date_naissance,4) between '0901' and '0931'

en gros, tu selectionne le jour et le mois de naissance de toutes les
personnes
de ta base et ensuite tu met une condition de selection sur la période que
tu as besoins

ici je selectionne tous les "enfants" qui on une date de naissance entre
le 01 septembre et le 31.

bon dev

jeanlin

Posté le 28 février 2006 - 09:21
Bonjour,

Il suffit de créer une requete, tu as un bouton Année,Département
Sélectionne mois
Formule : Right( champDate, 4)

Ensuite, sur ce champs, il faut 2 paramètres
1 - Mois >= Parametre1
2 - Mois <= Parametre2


Sur ta requete,
Requete.Param1 = DateDebut[[5 A 8]] ou right( DateDebut,4)
Requete.Param2 = DateFin[[5 A 8]] ou right( DateFin,4)
hExecuteRequete( taRequete, ....)

Cordialement,

C.AUBRY
Posté le 28 février 2006 - 09:23
bonjour à tous,

petit programme à se casser la tête dessus.

J'ai dans une base de donnée, des personnes avec date de naissance.
je dois à un moment de l'année, retrouver toutes les personnes nées
entre 2 dates, mais sans les années.

par exemple, je voudrais les personnes nées entre le 12 décembre (12/12)
et le 15 fevrier (15/02) ou alors entre le 02 mars (02/03) et le 14 aout
(14/08)


Pour ce genre de traitement, c'eut été plus simple de disposer dans la
base de données de la date sous forme d'entier.
Si tu as moyen de rajouter cette colonne (et de l'alimenter avec une
petite moulinette).

C'est bcp plus facile pour les intervalles.

Gilles.
Posté le 28 février 2006 - 09:23
Bonjour VAl,

j'ai pensé aussi faire cette solution, mais cela ne fonctionne pas si j'ai
des tranches
de date sur 2 années.(2005 et 2006) qui se chevauche

- une date mini: le 12/12/2005
- une date maxi: le 26/04/2006


si j'ai 25/12/1988 et 02/04/1998 je vais donc avoir

25/12/2006 que je ne vais pas prendre dans ta solution ? erreur
et si je mets 2005 à la place, ok pour 25/12/2005, mais erreur
pour 02/04/2005 .....

Mais il faut peut etre ppour que cela fonctionne que je rajoute
une condition : si < devembre alors année avant, sinon, anné apres ?

je vais chercher encore si il n'y a pas une autre solution.

Merci

Antoine





"Val" <Valsofts@free.fr> a écrit dans le message de news:
44033758@news.pcsoft.fr...
Bonjour

"Antoine GIDROL" <agidrol@free.fr> a écrit dans le message de news:
44031e09$1@news.pcsoft.fr...

bonjour à tous,

petit programme à se casser la tête dessus.

J'ai dans une base de donnée, des personnes avec date de naissance.
je dois à un moment de l'année, retrouver toutes les personnes nées
entre 2 dates, mais sans les années.

par exemple, je voudrais les personnes nées entre le 12 décembre (12/12)
et le 15 fevrier (15/02) ou alors entre le 02 mars (02/03) et le 14
aout
(14/08)

J'ai beau chercher, j'arrive à rien.........
surtout quand mes date sont inversées. 12 décembre (12/12) et le 15
fevrier

J'ai besoin de ceci afin d'ajouter à une carte de fidélité, des euros
lors
de leur anniversaire.

Merci de votre aide.

Antoine GIDROL



Tu devrais arriver à faire cela en 5 ou 10 lignes de code Wlangage.

D'abord, tu fixes la période que tu veux explorer (du 12/04 au 26/08 par
exemple).
Tu as donc:
- un jour mini: le 12/04
- un jour maxi: le 26/08

Tu définis ensuite une date à partir du jour mini et du jour maxi, en te
basant sur l'année en cours.
Tu as donc
- une date mini: le 12/04/2006
- une date maxi: le 26/08/2006

Ensuite, et bien il y a plein de solutions.
Par exemple:
1) tu lis la date de naissance des personnes dans le fichier HF (exemple
"19881225" pour le 25/12/1988")
2) après lecture, tu crées une variable qui sera égale à la date de
naissance lue dans le fichier HF
3) tu remplaces, dans la variable créée précédemment, l'année de naissance
par l'année en cours (dans l'exemple précisé en 1, tu remplaces "1988" par
"2006" et tu obtiens le 25/12/2006")
4) pour terminer, tu vérifies si la date ainsi obtenue (25/12/2006) est
comprise entre les dates mini (12/04/2006) et maxi (26/08/2006)

Et voilà.
Ce qu'il faut, bien sur, c'est prendre également en compte la spécificité
du
29/02.
Donc, dans le traitement, il faut que tu testes la validité de la date via
DateValide.

A+

Val

Posté le 28 février 2006 - 10:21
Bonjour

"Antoine GIDROL" <agidrol@free.fr> a écrit dans le message de news:
44031e09$1@news.pcsoft.fr...
par exemple, je voudrais les personnes nées entre le 12 décembre (12/12)
et le 15 fevrier (15/02) ou alors entre le 02 mars (02/03) et le 14 aout
(14/08)


Clairement, tu ne peux pas travailler avec la date ou une partie de la date,
à cause des chevauchements d'années.

J'utiliserai la fonction DateVersEntier avec le paramètre DepuisDébutAnnée à
Vrai.
Cela te donne un nombre de jour depuis le début de l'année. Tu peux donc
convertir toutes les dates dont tu te sers en un numéro indépendant de
l'année.
Après c'est une affaire de tests, pas bien compliquée...

Jean-Louis MOREL
Posté le 28 février 2006 - 10:24
A mon avis le plus simple est quand meme d inclure l année :


tu cherches bien sur une tranche d année quand meme ??
Sinon ce n est pas grave, il fo juste fixer une année de début,
on la nommera AA1!

Dans ce cas tu peux faire une boucle qui parcours les années :
Par exemple tu veux les personnes entre J1/M1 et J2/M2.
Pour gerer l ordre des dates (si elles sont inversées), on utilise AA2 :

Si "J1/M1/"+AA1>"J2/M2/"+AA1 alors
AA2ª1+1
Sinon
AA2ª1
Fin


Ensuite tu fais ta boucle, soit en lancant plusieurs select, soit en construisant
le code de la requete (et donc un seul hexecuterequetesql !). Dans l'exemple
on fait ca sur 10 ans ....

i est entier
NbAnnée est entier
sSql est chaine
sSql="Select * From Personnes Where "
For i=1 to NbAnnée
sSql+="Date Between J1/M1/" + AA1 + " AND J2/M2/" + AA2
IF i<NbAnnée then sSql+=" AND "
AA1++
AA2++
END


Il ne reste plus qu a lancer la requete avec le texte sSql ...

Voila ca devrait te donner des idées (c est du pseudo langage, a adapter avec
les formats de date !!!!)
J espere que ca t aidera,
Damien.
Posté le 28 février 2006 - 11:01
Merci à tous pour votre aide, je vais utiliser la solution de jean louis,
avec quelques "si" imbriqué pour gerer le reste.

merci beaucoup

Antoine GIDROL


"Jean-Louis MOREL" <vsi.jlm@free.fr> a écrit dans le message de news:
4404031b$1@news.pcsoft.fr...

Bonjour

"Antoine GIDROL" <agidrol@free.fr> a écrit dans le message de news:
44031e09$1@news.pcsoft.fr...
par exemple, je voudrais les personnes nées entre le 12 décembre (12/12)
et le 15 fevrier (15/02) ou alors entre le 02 mars (02/03) et le 14
aout
(14/08)

Clairement, tu ne peux pas travailler avec la date ou une partie de la
date,
à cause des chevauchements d'années.

J'utiliserai la fonction DateVersEntier avec le paramètre DepuisDébutAnnée
à
Vrai.
Cela te donne un nombre de jour depuis le début de l'année. Tu peux donc
convertir toutes les dates dont tu te sers en un numéro indépendant de
l'année.
Après c'est une affaire de tests, pas bien compliquée...

Jean-Louis MOREL

Posté le 28 février 2006 - 11:01
Mince une grosse bourde dans le code :

Ce n est pas AND mais OR bien sur qu il fallait utiliser !



Dam's.
Posté le 28 février 2006 - 11:06
Re

"Antoine GIDROL" <agidrol@free.fr> a écrit dans le message de news:
440409c6$1@news.pcsoft.fr...
Merci à tous pour votre aide, je vais utiliser la solution de jean louis,
avec quelques "si" imbriqué pour gerer le reste.


testé, ça marche. Il ne reste qu'à formater les date D1 et D2 en fonction de
tes paramètres :

d1 est une Date="20051212"
d2 est une Date="20060123"
dtest est une Date //la date à tester

j1 est un entier=DateVersEntier(d1,Vrai)
j2 est un entier=DateVersEntier(d2,Vrai)
jt est un entier=DateVersEntier(dtest,Vrai)

SI j1>j2 ALORS
SI jt>=j1 OU jt <=j2 ALORS
Info("ok")
SINON
Info("out")
FIN
SINON
SI jt>=j1 ET jt <=j2 ALORS
Info("ok")
SINON
Info("out")
FIN
FIN

Jean-Louis MOREL
Posté le 28 février 2006 - 15:28
Ton algo est plutôt ingénieux mais pose un problème sur les années bissextiles, en effet, si tu demandes par Ex du 12/12 au 31/01, une personne née le 11/12/1948 sera acceptée par ton algorithme.
A moins de tester toutes les années bissextiles, l'utilisation du parametre DepuisDebutAnnée donnera toujours un décalage sur des dates limites.
Je propose un autre algo qui ne posera pas ce problème :

d1 est une chaîne="1212" //du 12 decembre n
d2 est une chaîne="0215" //au 15 Février n+1
nD1 est un entier
nD2 est un entier
nDateNais est un entier
DateNais est une Date="19481211" //exemple date de naissance 11/12/1948
Nbj est un entier
Dif est un entier

nD1=Val(d1)
nD2=Val(d2)
SI nD1 > nD2 ALORS nD2+000 //cas particulier de bornes sur 2 années
Nbj = nD2-nD1 //Intervalle en nbre de jours entre nD1 et nD2

//Pour toute DATENAIS
nDateNais=Val(Milieu(DateNais,5))
SI nDateNais<nD1 ALORS nDateNais+000 //cas particulier de bornes sur 2 années

Dif=nDateNais-nD1 //Intervalle entre DateNais et Borne 1

SI Dif<=Nbj ALORS
Info("Ok")
SINON
Info("pas OK")
FIN
//FIN


Bon Dev.
Posté le 28 février 2006 - 17:25
Antoine GIDROL a écrit :
bonjour à tous,

petit programme à se casser la tête dessus.

J'ai dans une base de donnée, des personnes avec date de naissance.
je dois à un moment de l'année, retrouver toutes les personnes nées
entre 2 dates, mais sans les années.

par exemple, je voudrais les personnes nées entre le 12 décembre (12/12)
et le 15 fevrier (15/02) ou alors entre le 02 mars (02/03) et le 14 aout
(14/08)

J'ai beau chercher, j'arrive à rien.........
surtout quand mes date sont inversées. 12 décembre (12/12) et le 15 fevrier

J'ai besoin de ceci afin d'ajouter à une carte de fidélité, des euros lors
de leur anniversaire.

Merci de votre aide.

Antoine GIDROL


en gros tu teste si ton moi est dans l'ordre ou pas

SI val(MoisDébut)>val(MoisFin) ALORS
// Requete sql
... Where DateN>=DateDébut OU DateN<=DateFin ...
SINON
// Requete sql
... Where DateN>=DateDébut ET DateN<=DateFin ...
FIN

après ta requête devrait se passer sans problèmes.
DateN est la date de naissance du fichier dans l'année au format MMJJ
MoisDébut est juste le mois de début de période
MoisFin est juste le mois de fin de période

si en plus tu risque de rencontré une sélection sur le même mois en
inversé il faudra prendre en compte le jours aussi.
20/02 et 10/02 par exemple (val de 0220 est superieur a val de 0210)


a++
Goof