PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → ouverture de fenetre conditionner à recherche multicriteres dans un fichier
ouverture de fenetre conditionner à recherche multicriteres dans un fichier
Iniciado por Franck, ago., 22 2019 2:31 PM - 20 respostas
Membro registado
88 mensagems
Publicado em agosto, 22 2019 - 2:31 PM
Bonjour,

Sur mon appli, j'utilise le groupware utilisateur en automatique.
au lancement, identifiant et mot de passe, et nous arrivons sur une fenêtre "accueil" (beaucoup de recherche pour trouver son nom :D :D )
sur cette fenêtre accueil, j'ai mis un petit libellé qui me récupère le nom de la personne connectée.
Jusque là tout va bien.

Je voudrais en profiter pour ouvrir de force une fenêtre si l'utilisateur concerné n'a pas rempli la veille son journal de bord.

donc je recherche son nom dans le fichier journal de bord (jdb) et si vrai j'ouvre la fenêtre d'enregistrement de journal de bord.

sauf que je voudrais qu'une fois trouvé cela vérifie le dernier (en date) journal de bord de cet utilisateur, et que si la date n'est pas égale à la date de la veille alors à ce moment cela ouvre la fenêtre.

j'en suis la et je bloque :

SI HRecherche(jdb,ENomPrenom,LIB_connect)=Vrai ALORS

et ici je veux vérifier la date de l'enregistrement du dernier journal de bord de cette utilisateur et que ce soit la condition secondaire d'ouverture

Ouvre(FEN_jdb)
FIN

autre chose,

plutot que de lire le fichier est il plus pertinent d'executer une requete journal de bord triée par date pour rechercher ?


merci :)

--
Merci ;) Franck
Membro registado
88 mensagems
Publicado em agosto, 22 2019 - 3:48 PM
bon ca :

SI HLitRechercheDernier(jdb,ENomPrenom,LIB_connect)=Vrai ALORS
SI DateDifférence(jdb.Date, DateDuJour())<-1 ALORS
Ouvre(FEN_jdbaccueil)

FIN

FIN

ca marche pas :D

--
Merci ;) Franck
Membro registado
88 mensagems
Publicado em agosto, 22 2019 - 4:25 PM
avec ca

REQ_jdbdate.ParamDate=Hier()
HExécuteRequête(REQ_jdbdate)
SI HLitRechercheDernier(REQ_jdbdate,ENomPrenom,LIB_connect)=Faux ALORS
Ouvre(FEN_jdbaccueil)
FIN


Ca marche !! :merci: à moi


Donc j'ai construit une requete avec un paramdate, j'execute d'abordla requete avec le critere hier , et ensuite je cherche l'utilisateur. et la jackpot ca marche,


Si qlq un lit cela , peut il me dire si ma solution est judicieuse ou dangereuse .

Merci à celui qui lira

--
Merci ;) Franck
Membro registado
3.846 mensagems
Popularité : +227 (347 votes)
Publicado em agosto, 22 2019 - 5:55 PM
Bonjour,
Il travaillent tous les jours les employés ?

--
Il y a peut être plus simple, mais, ça tourne
Membro registado
88 mensagems
Publicado em agosto, 23 2019 - 7:59 AM
Bonjour,

Ooooh le moqueur ! :D

il ne travaille évidemment pas tous les jours, et même pire ils osent prendre des vacances.

Du coup je me suis dit que j'allais utilisé un autre libellé qui est sur ma fenêtre accueil. dans ce libellé il y a la date en mode "vendredi 23 aout 2019". Et en découpant la chaine je crois, je vais regarder le jour, et si on est lundi d'aller vérifier avec comme paramètre date j-3. Mais bon aucune idée de comment faire :D

j'ai aussi ajouté une fenêtre simple "étiez vous en vacances ?" qui permettra de gérer ce soucis aussi.


merci de ces multiples réponses à mes diverses questions. :merci:

--
Merci ;) Franck
Membro registado
88 mensagems
Publicado em agosto, 23 2019 - 8:51 AM
Re bonjour

il y a surement beaucoup plus simple, mais dans ma fenetre d'accueil j'ai fait ca pour recuperer le jour :

sJour est une chaîne = ExtraitChaîne(DateVersChaîne(DateSys(),"JJJJ JJ MMMM AAAA"),1," ")

--
Merci ;) Franck
Membro registado
88 mensagems
Publicado em agosto, 23 2019 - 9:05 AM
et j'ai ajouté cela

dDate est une Date
nbJourASoustraire est un entier=3
dDate=DateSys()
dDate..Jour-=nbJourASoustraire


et ensuite une simple fonction si ajouté qlq sinon

et ca marche

--
Merci ;) Franck
Membro registado
3.846 mensagems
Popularité : +227 (347 votes)
Publicado em agosto, 23 2019 - 9:33 AM
Je suppose que la présence des employés est stockée quelque part, dans une table PRESENCE par exemple. Il suffit de récupérer le dernier jour de présence de l'employé via une requête du style :
SELECT
Employe.PK_Employe AS PK_Employe,
Max(Presence.NDX_DatePresence) AS DerniereDatePresence,
Présence.NDX_DatePresence AS NDX_DatePresence
FROM
Employe,
Presence
WHERE
Employe.PK_Employe = Presence.FK_Employe
AND
(
Left(Presence.NDX_DatePresence,8) < Left(SYSDATE,8)
AND
Employe.PK_Employe = {pEmploye}
)
GROUP by
Employe.PK_Employe,
Presence.NDX_DatePresence

Il suffit de comparer la date obtenue avec la date de MAJ du journal de bord

Si la table PRESENCE n'existe pas, il y a certainement une table ABSENCE., Il est possible de la déduire aisément PRESENCE, via une condition NOT IN ABSENCE

Attention aussi aux HLitRechercheDernier ils ne retournent pas toujours l'enregistrement le plus récent, a moins de spécifier la date dans la condition de recherche
--
Il y a peut être plus simple, mais, ça tourne
Mensagem modificada, agosto, 23 2019 - 9:53 AM
Membro registado
88 mensagems
Publicado em agosto, 23 2019 - 10:08 AM
;( :o :(

cette idée est très intéressante, comme à chaque fois d'ailleurs

Bon par contre je vais bien surchauffer pour maitriser une requête à ce point, mais je vais m'y lancer, car j'ai en effet une table absence qui contient les vacances et les arrêts maladies.

Concernant Hlitrecherchedernier, je le fais sur une requete qui ne contient que les enregistrements d'une date précise via ParamDate ou de simplement hier().


merci

--
Merci ;) Franck
Membro registado
3.846 mensagems
Popularité : +227 (347 votes)
Publicado em agosto, 23 2019 - 10:17 AM
Franck a écrit :
Concernant Hlitrecherchedernier, je le fais sur une requete qui ne contient que les enregistrements d'une date précise via ParamDate ou de simplement hier().


C'était une remarque d'ordre général.

En ce qui concerne la requête, l'éditeur de requête est relativement bien fait, il nécessite peu, voire aucune connaissance en SQL. Il suffit de prendre 1 heure ou deux pour le maitriser.
Il permet de contourner les limites de HFIltre et consort, surtout au niveau du multicritère.

--
Il y a peut être plus simple, mais, ça tourne
Membro registado
88 mensagems
Publicado em agosto, 23 2019 - 12:15 PM
Voroltinquo,

je me permets une question hors de ce sujet

j'ai des fenêtres classiques qui permettent la création d'enregistrement. l'utilisateur saisi, ca enregistre, ca se ferme. rien de special. ca roule

mais je ne sais pas comment faire qu'une fenêtre serve à nouveau sans avoir a la fermer et la réouvrir.
j'utilise le RAZ(vrai) ca vide les champs de saisie mais en fait ca ne cumule pas les enregistrements. ca n'enregistre que le dernier saisi.

et je ne comprends évidement pas pkoi :D

merci

--
Merci ;) Franck
Membro registado
1.623 mensagems
Popularité : +100 (114 votes)
Publicado em agosto, 23 2019 - 12:31 PM
@franck

Si sur ton bouton valider tu fais :
EcranVersFichiers()
Hajoute()
RAZ()

Ca devrait fonctionner
Membro registado
88 mensagems
Publicado em agosto, 23 2019 - 12:35 PM
:D:D


merci François,

un drame pour moi de me rendre compte que je ne mettais pas le bon h...

j'apprends seul devant mon écran, des trucs compliqués j'avance pas a pas. et des trucs simples comme ca me plante , c'est à hurler ..... de rire

grand merci

--
Merci ;) Franck
Membro registado
3.846 mensagems
Popularité : +227 (347 votes)
Publicado em agosto, 23 2019 - 12:48 PM
Un classique.
A priori, dans ton bouton valider/enregistrer tu dois avoir un code "Ferme", pire, tu dois une action prédéfinie Code+Fermeture, cela arrive souvent lorsqu'on utilise le mode RAD fenêtre.
Une solution consiste à :
1-Supprimer le code de fermeture et éventuellement l'action prédéfinie
2-Créer 2 nouveaux boutons Nouveau et Quitter, créer un superchamp dans lequel on regroupe tous les champ de saisie,SC_Saisie par exemple (il est aussi possible d'utiliser un groupe, mais on risque un oubli lors d'une maintenance éventuelle)

Le Code de valider devient :
pSauvegarderFiche() //Cette procédure devra comporter le code :SC_Saisie..Modifié=Faux


Nouveau à un code qui ressemble à ça :
SI SC_Saisie..Modifié ALORS
SI OuiNon("L'enregistrement en cours a été modifié"+CRLF+"Voulez vous l'enregistrer") ALORS
pSauvegarderFiche()
FIN
HRAZ(....) //Un Hraz pour chaque table
FichierVersEcran()
RepriseSaisie(PremierChampDeSaisie)
FIN


--
Il y a peut être plus simple, mais, ça tourne
Mensagem modificada, agosto, 23 2019 - 12:51 PM
Membro registado
88 mensagems
Publicado em agosto, 23 2019 - 1:18 PM
Voroltinquo a écrit :
> Un classique.


merci pour "un classique" cela me rend moins idiot :D

--
Merci ;) Franck
Membro registado
3.846 mensagems
Popularité : +227 (347 votes)
Publicado em agosto, 23 2019 - 1:30 PM
Pour éviter d'avoir à tout se retaper à chaque création de fenêtre de saisie, on peut même envisager la création d'un pattern https://doc.pcsoft.fr/?2031020.
Mais ça, c'est une autre histoire

--
Il y a peut être plus simple, mais, ça tourne
Membro registado
88 mensagems
Publicado em agosto, 23 2019 - 3:34 PM
au secours Voroltinquo ! :D

j'ai ecris ca :

sJour est une chaîne = ExtraitChaîne(DateVersChaîne(DateSys(),"JJJJ JJ MMMM AAAA"),1," ")
dDate est une Date
nbJourASoustraire est un entier=3
dDate=DateSys()
dDate..Jour-=nbJourASoustraire

SI sJour="lundi" ALORS
SI HRecherche(Educateurs,ENomPrenom,LIB_connect)=Vrai ALORS
HExécuteRequête(REQ_jdbdate,hRequêteDéfaut,dDate)
SI HLitRechercheDernier(REQ_jdbdate,ENomPrenom,LIB_connect) ALORS
Ouvre(FEN_jdb)
FIN
FIN
SINON
SI HRecherche(Educateurs,ENomPrenom,LIB_connect)=Vrai ALORS
HExécuteRequête(REQ_jdbdate,hRequêteDéfaut,Hier())
SI HLitRechercheDernier(REQ_jdbdate,ENomPrenom,LIB_connect) ALORS
Ouvre(FEN_jdb)
FIN
FIN
FIN



tout à l'heure je lançais j'ai eu l'impression que ca marchait mais en fait plus :(

et j'ai beau ecrire et reecrire, je vois pas ou je loupe

Sachant que j'ai bidouillé en voulant rajouter qlq chose qui n'est même pas là, c'est de consulter le fichier d'absence dont nous parlions tout à l'heure

--
Merci ;) Franck
Membro registado
88 mensagems
Publicado em agosto, 23 2019 - 3:36 PM




--
Merci ;) Franck
Membro registado
3.846 mensagems
Popularité : +227 (347 votes)
Publicado em agosto, 23 2019 - 4:36 PM
Dans un premier temps
dDate..Jour-=nbJourASoustraire

risque de poser un problème cf https://doc.pcsoft.fr/?2512043&name=jour_propriete," gestion des jours et des mois" cas 1
Il faut passer par DateVersEntier/EntierVersDate
dDate=EntierVersDate(DateVersEntier(DateSys())-nNbJourASoustraire)


En ce qui concerne la récupération du jour de la semaine, DateVersJour() fait très bien le boulot https://doc.pcsoft.fr/?3027004&name=dateversjour_fonction

Pour le reste, il faut contrôler si la requête s'est bien exécutée.
SI HExécuteRequête(....) Alors
//Traitement
FIN


HRecherche sur une chaine renvoie souvent des valeurs incongrues, il faut privilégier l'option hIdentique, ou utiliser HLitRecherchePremier qui inclue de facto HIdentique.
Et malgré ça, on a parfois des problèmes (il y en a qui ont essayé ...)
Le code devient :
SI HLitRecherchePremier(Educateurs,ENomPrenom,LIB_connect) ET (EDUCATEURS.ENomPrenom=,LIB_connect) ALORS
//Traitement
FIN


--
Il y a peut être plus simple, mais, ça tourne
Membro registado
88 mensagems
Publicado em agosto, 26 2019 - 10:03 AM
sJour est une chaîne = ExtraitChaîne(DateVersChaîne(DateSys(),"JJJJ JJ MMMM AAAA"),1," ")

dDate est une Date
nbJourASoustraire est un entier=3
dDate=DateSys()
dDate..Jour-=nbJourASoustraire



SI sJour="lundi" ALORS
SI HLitRecherchePremier(Educateurs,ENomPrenom,LIB_connect)=Vrai ALORS
SI HExécuteRequête(REQ_jdbdate,hRequêteDéfaut,dDate) ALORS
HLitRecherchePremier(REQ_jdbdate,ENomPrenom,LIB_connect)
Ouvre(FEN_jdb)
FIN
FIN

SINON
SI HLitRecherchePremier(Educateurs,ENomPrenom,LIB_connect)=Vrai ALORS
SI HExécuteRequête(REQ_jdbdate,hRequêteDéfaut,Hier()) ALORS
HLitRecherchePremier(REQ_jdbdate,ENomPrenom,LIB_connect)
Ouvre(FEN_jdb)
FIN

FIN

FIN



Mon problème c'est que ca marche bizarrement.

avec toutes ces lignes, je suis censé lui dire de faire :

verifier le jour
si lundi de faire un -3
sinon hier
ensuite
de verifier si la personne qui se connecte est bien educateurs
si oui
de verifier si ce dernier à bien realiser un jdb
si oui
rien à faire
si non
cela doit ouvrir la fenetre jdb

et bien ca marche bizarrement.

des fois ca le fait des fois non et sans que je comprenne pkoi

je pense que ca doit etre ma syntaxe qui est fausse

--
Merci ;) Franck
Membro registado
88 mensagems
Publicado em agosto, 26 2019 - 10:16 AM
SI sJour="lundi" ALORS
SI HLitRecherchePremier(Educateurs,ENomPrenom,LIB_connect)=Vrai ALORS
HExécuteRequête(REQ_jdbdate,hRequêteDéfaut,dDate)
SI HLitRechercheDernier(REQ_jdbdate,ENomPrenom,LIB_connect)=Faux ALORS
Ouvre(FEN_jdb)
FIN
FIN



SINON
SI HLitRecherchePremier(Educateurs,ENomPrenom,LIB_connect)=Vrai ALORS
HExécuteRequête(REQ_jdbdate,hRequêteDéfaut,Hier())
SI HLitRechercheDernier(REQ_jdbdate,ENomPrenom,LIB_connect)=Faux ALORS
Ouvre(FEN_jdb)

FIN




FIN

FIN




ca, cela doit etre mieux

--
Merci ;) Franck