Bonjour.
Je remonte ce sujet…
Après avoir scrutté la base, je m’aperçois qu’il y a avait des erreurs de conception et qu’en définitive :
- Les bénéficiaires sont reliés aux agréments.
- Les caisses et les complémentaires sont reliées aux agréments.
- Les agréments sont reliés aux vacations.
- Les salariés sont reliés aux vacations, plus précisément, au sous-formulaire de lignes de vacation puisqu’il arrive qu’un bénéficiaire ait deux salariés durant le même mois (un exemple avec la dernière vacation du jeu de données test, l’ID 120).
- Les affectations relient juste les bénéficiaires et leurs salariés titulaires (affectation à durée indéterminée) et les remplacements (affectation à durée déterminée). Utilisées pour imprimer les feuilles de travail à l’entête du salarié et du bénéficiaire (sans intérêt ici).
Tout à l’air ok du point de vue base de données mais reste deux points du côté du code.
Le formulaire F_VACATIONS frmVacations qui contient deux sous-formulaires :
- frmAgrements
- frmVacationsSub (lui-même contient frmVacationsSubTtl qui totalise les colonnes mais ne pose aucun problème).
-
À la création d’une vacation (qui est en fait une facture), on sélectionne d’abord la personne dans la zdl lstAgrId1.
-
Ensuite, un clic sur le bouton Insérer Agrément déclenche la macro InsererAgrement qui fait le boulot. La seule utilité d’afficher l’agrément correspondant est informatif et on pourrait même s’en passer. Néanmoins, je n’arrive pas à adapter la macro correctement pour que son déclenchement soit affecté à l’événement “Modifié” de lstAgrId1 puisque le bouton utilisé pour les tests est situé dans frmAgrements.
Note : à côté de lstAgrId1 figure une seconde zdl lstAgrId2 qui contient (presque) les mêmes valeurs et qui est désactivée en permanence. La raison est simple. La sélection du bénéficiaire est liée à son agrément. Un bénéficiaire ayant ses agréments renouvelés au fil du temps, j’ai défini cette requête :
SELECT BEN_NOM_1 || ' ' || BEN_PRENOM, MAX(AGR_ID) FROM T_AGREMENTS A INNER JOIN R_BENEFICIAIRES B ON A.BEN_ID = B.BEN_ID GROUP BY BEN_ID, BEN_NOM_1, BEN_PRENOM ORDER BY BEN_NOM_1
Afin que seul le dernier bénéficiaire/agrément soit sélectionnable (sinon au fil du temps on se retrouverait avec un grand nombre d’entrées pointant sur le même bénéficiaire, ce qui ne serait pas agréable, avec en plus le risque de se tromper de ligne). Conséquence : lorsqu’on navigue dans le formulaire d’un enregistrement à l’autre, les vacations qui ont été faites à partir des agréments précédents n’affichent naturellement plus le nom du bénéficiaire dans la zdl. C’est pour cette raison que j’ai placé une zdl “jumelle” avec le SQL suivant afin d’afficher les noms des agréments antérieurs :
SELECT BEN_NOM_1 || ' ' || BEN_PRENOM AS BEN_BENEFICIAIRE, AGR_ID FROM T_AGREMENTS A INNER JOIN R_BENEFICIAIRES B ON A.BEN_ID = B.BEN_ID
Il y a peut-être un moyen de régler ça mais ça n’est pas important.
-
On sélectionne le salarié.
-
Et c’est là où ça ne marche pas. Un clic sur le bouton Insérer Ligne Vacation déclenche la macro InsererLigneVacation qui est censée insérer AGR_THN, AGR_PHC, AGR_PHB et AGR_NHA de la table T_AGREMENTS (avec l’AGR_ID correspondant à celui de la vacation), dans VAC_THN, VAC_PHC, VAC_PHB et VAC_NHA de la table T_VACATIONS_SUB, l’opérateur n’ayant plus qu’ensuite à saisir le nombre d’heures effectuées (VAC_NHE). Mais un message d’erreur indique qu’il y a tentative d’insérer un NULL dans la colonne VAC_ID de T_VACATIONS_SUB alors que l’identifiant est bien affiché dans ladite colonne (et évidemment correspond à celui de T_VACATIONS). Il y a à coup sûr une erreur dans la requête de la macro mais je ne sais pas la résoudre.
Merci…
dbPrimus20240505.odb (83,1 Ko)