Paramétrage des Requêtes LIF
Table des matières
Les requêtes LIF sont des requêtes du Requêteur qui s’affichent directement sur une fiche de l’application (livret individuel d’un agent, session de stage, poste), au lieu d’être exécutées depuis le Requêteur. Leur résultat porte toujours sur la fiche consultée : la carrière, l’agent, la session ou le poste affiché à l’écran.
Elles sont rattachées à des rôles : seuls les utilisateurs titulaires d’un de ces rôles les voient.
Le paramétrage se fait en deux temps :
- écrire et enregistrer la requête dans le Requêteur, avec le mot clé de l’écran visé ;
- l’associer à un ou plusieurs rôles dans Outils > Droits > Requêtes LIF, en choisissant l’écran sur lequel elle s’affiche.
Les écrans disponibles et leur mot clé
Une requête LIF contient un mot clé, remplacé au moment de l’affichage par l’identifiant de la fiche consultée. Ce mot clé dépend de l’écran sur lequel la requête doit s’afficher :
| Écran (champ « Sur l’écran ») | Mot clé à utiliser | Remplacé par | Affichage |
|---|---|---|---|
| Livret Individuel | %matricule_carriere% | le matricule de la carrière consultée | un bouton portant le nom de la requête dans le Détail des livrets individuels ; le résultat s’affiche sous forme de tableau |
| Livret individuel - Détails carrière | %matricule_carriere% | le matricule de la carrière consultée | des informations complémentaires dans l’en-tête de la carrière : une ligne « libellé : valeur » par colonne, première ligne de résultat uniquement |
| Livret individuel - Détails agent | %id_agent% | le numéro technique de l’agent consulté | des informations complémentaires dans l’en-tête de l’agent : une ligne « libellé : valeur » par colonne, première ligne de résultat uniquement |
| Détails de la session | %id_session_stage% | le numéro technique de la session de stage | un bouton « Requêtes » dans le détail de la session, qui liste les requêtes disponibles |
| Détails du poste (module GPEC) | %id_recalibrage% | le numéro technique de la version du poste | un bouton portant le nom de la requête dans le détail du poste |
Seules les requêtes contenant l’un de ces mots clés sont proposées dans l’écran Outils > Droits > Requêtes LIF. Une requête sans mot clé n’y apparaît pas.
Une requête LIF ne doit pas contenir d’invite de saisie (
@prompt{...}) : il n’y a personne pour y répondre au moment de l’affichage. Une telle requête n’est pas exécutée (message « Aucun résultat ou requête invalide. » dans le livret, ou rien dans les en-têtes « Détails carrière » / « Détails agent »).
Les mots clés généraux du Requêteur restent utilisables dans une requête LIF, notamment %id_user% (l’utilisateur connecté) et %mon_perimetre% (le périmètre de l’utilisateur connecté) : ils permettent par exemple de restreindre le résultat aux agents que l’utilisateur a le droit de voir.
Création de la requête
Le SDIS peut créer ses propres requêtes et solliciter une assistance via un ticket Mantis, le cas échéant.
Dans le Requêteur
Outils > Requêteur > Création de Requête
Si la requête est de type « SQL » :
-
accéder à la création de requête ;
-
dans l’onglet SQL, saisir la requête, en y plaçant le mot clé de l’écran visé (cf. les exemples ci-dessous) :

- dans l’onglet Sauvegarde, définir un nom, une description (optionnelle) et cliquer sur « Sauvegarde » :

La requête est alors disponible dans deux écrans :
- Outils > Requêteur > Requêtes Enregistrées : son exécution depuis le Requêteur échoue (« Requête invalide »), car le mot clé n’y est remplacé par aucune valeur. C’est normal : elle ne doit pas être supprimée ;
- Outils > Droits > Requêtes LIF : c’est depuis cet écran qu’elle est rendue visible sur les fiches.
Pour tester la requête avant de la paramétrer, remplacer provisoirement le mot clé par une valeur réelle (par exemple
'0001234'à la place de%matricule_carriere%), l’exécuter dans le Requêteur, puis remettre le mot clé avant de sauvegarder.
Règles d’écriture
- Le mot clé s’écrit avec ou sans apostrophes :
= %matricule_carriere%et= '%matricule_carriere%'fonctionnent tous les deux, la valeur est protégée automatiquement. - Les en-têtes de colonne sont traduits : l’alias de chaque colonne (
AS NOM_AGENT) est recherché dans les traductions. Utiliser un seul mot par alias — de préférence une clé de traduction existante (NOM_AGENT→ « Nom »,LIB_GRADE→ « Grade »…) ou créée dans Outils > Requêteur > Traductions. Un alias de plusieurs mots est découpé sur les espaces et s’affiche mal. - Pour les écrans « Détails carrière » et « Détails agent », seule la première ligne du résultat est affichée, et les colonnes vides sont masquées. Trier le résultat (
ORDER BY) pour que la ligne utile arrive en premier. -
La requête doit fonctionner sur la base de l’établissement (MySQL/MariaDB ou Oracle). Les fonctions de date et la limitation du nombre de lignes s’écrivent différemment d’un moteur à l’autre :
Besoin MySQL / MariaDB Oracle date du jour (pour comparer à une date de GEEF) CURDATE()TO_CHAR(SYSDATE,'YYYY-MM-DD')afficher une date en JJ/MM/AAAA DATE_FORMAT(X.DATE,'%d/%m/%Y')TO_CHAR(TO_DATE(X.DATE,'YYYY-MM-DD'),'DD/MM/YYYY')âge en années TIMESTAMPDIFF(YEAR,X.DATE,CURDATE())TRUNC(MONTHS_BETWEEN(SYSDATE,TO_DATE(X.DATE,'YYYY-MM-DD'))/12)nombre de jours jusqu’à une date DATEDIFF(X.DATE,CURDATE())TO_DATE(X.DATE,'YYYY-MM-DD')-TRUNC(SYSDATE)une seule valeur dans une sous-requête (la plus récente) ORDER BY X.DATE DESC LIMIT 1MAX(X.VALEUR) KEEP (DENSE_RANK LAST ORDER BY X.DATE)concaténer CONCAT(A,' %')A\|\|' %'Dans les deux cas, les dates de GEEF sont enregistrées au format texte
AAAA-MM-JJ: elles se comparent directement entre elles, mais doivent être converties pour un calcul ou un affichage en JJ/MM/AAAA.
Mise à disposition sur les fiches
Outils > Droits > Requêtes LIF
- Accéder à l’écran Requêtes LIF : il associe chaque requête LIF à un rôle.

-
Cliquer sur « Ajouter » et renseigner :
Champ Rôle Rôle le rôle qui verra la requête Requête la requête enregistrée (seules les requêtes contenant un mot clé LIF sont proposées) A afficher (facultatif) le libellé affiché sur la fiche (bouton, titre) ; à défaut, le nom de la requête est repris Sur l’écran l’écran sur lequel la requête s’affiche (cf. tableau) Export PDF pour l’écran Livret Individuel : inclure ou non le résultat dans l’export PDF du livret (activé par défaut)

-
Pour que plusieurs rôles accèdent à la requête, réitérer l’ajout pour chacun d’eux. Un utilisateur titulaire de plusieurs de ces rôles ne voit la requête qu’une seule fois.
-
La requête apparaît désormais sur l’écran choisi, pour les utilisateurs titulaires du rôle. Par exemple, sur l’écran Livret Individuel, sous la forme d’un bouton dans le Détail des livrets individuels de l’agent :

Depuis le livret, le résultat peut être exporté vers le tableur ou en PDF. Si des documents générés sont rattachés à la requête, ils sont également proposés.
L’association à un rôle ne contrôle que la visibilité de la requête. La requête elle-même ne filtre pas les agents : pour restreindre les données au périmètre de l’utilisateur, utiliser le mot clé
%mon_perimetre%dans la requête.
Exemples de requêtes
Les exemples ci-dessous peuvent être téléchargés, puis importés dans l’onglet Sauvegarde du Requêteur, puis adaptés.
Importer un exemple
Outils > Requêteur > Création de Requête, onglet Sauvegarde
- Télécharger le fichier
.requestde l’exemple voulu (cf. liste ci-dessous). - Dans le bloc Fichiers, sélectionner le fichier dans Fichier à importer, puis cliquer sur « Importation ».

L’importation remplace la requête en cours de création : les modifications non sauvegardées sont perdues (un message de confirmation le rappelle).
- La requête importée devient la requête en cours : la vérifier et, si besoin, l’adapter dans l’onglet SQL.
- Dans le bloc Base de données, contrôler son nom (le modifier si une requête du même nom existe déjà), puis cliquer sur « Sauvegarde ».
- L’associer ensuite à un ou plusieurs rôles, en choisissant l’écran indiqué pour l’exemple (cf. Mise à disposition sur les fiches).
À l’inverse, le bouton « Exportation » du même bloc enregistre la requête en cours dans un fichier
.request: c’est ainsi qu’une requête se partage d’une base à l’autre (par exemple de la base de test vers la base de production).
Requêtes disponibles
Toutes ces requêtes sont à associer à l’écran Livret individuel - Détails carrière : elles affichent des informations complémentaires dans l’en-tête de la carrière consultée, sous la forme d’une ligne « libellé : valeur » par information.
Chaque requête existe en deux versions, selon la base de données de l’établissement : MySQL / MariaDB ou Oracle. Télécharger celle qui correspond à votre base ; en cas de doute, la version qui ne correspond pas affiche « Requête invalide. » à l’essai.
| Requête | Informations affichées | Téléchargement |
|---|---|---|
| LIF carrière - Âge et grade | âge, grade actuel | MySQL / MariaDB · Oracle |
| LIF carrière - Âge, grade et titularisation | âge, grade actuel, titulaire (oui / non), date de titularisation | MySQL / MariaDB · Oracle |
| LIF carrière - Synthèse agent | âge, grade actuel, affectation courante, code du statut, titulaire (oui / non), date de titularisation | MySQL / MariaDB · Oracle |
| LIF carrière - Statut, contrat et affectation | statut, type de contrat, affectation courante, modalité de travail, date d’entrée dans la collectivité | MySQL / MariaDB · Oracle |
| LIF carrière - Situation administrative complète | statut, type de contrat, grade actuel, affectation courante, modalité de travail, date d’entrée dans la collectivité | MySQL / MariaDB · Oracle |
| LIF carrière - Fin de contrat | type de contrat, date de début, date de fin prévue, nombre de jours restants, fin de la période probatoire si elle est à venir ; rien ne s’affiche si la situation en cours n’a pas d’échéance | MySQL / MariaDB · Oracle |
| LIF carrière - Prochain échelon | échelon et indice majoré actuels, prochain échelon et date théorique de passage (module Gestion Administrative) | MySQL / MariaDB · Oracle |
| LIF carrière - Quotité de travail | modalité de travail, quotité, taux de rémunération, date d’effet et date de fin éventuelle | MySQL / MariaDB · Oracle |
| LIF carrière - Aptitude médicale | date de la dernière visite, aptitude, motif, date de la prochaine visite, état (à jour, visite échue, inapte…) | MySQL / MariaDB · Oracle |
L’écran d’affichage n’est pas enregistré dans le fichier : il se choisit dans Outils > Droits > Requêtes LIF. Pour ces requêtes, choisir Livret individuel - Détails carrière.
La date de passage au prochain échelon est une date théorique : elle tient compte du reliquat d’ancienneté, mais pas des interruptions de carrière (disponibilité, congé parental…). La date qui fait foi est celle de l’écran Avancements d’échelons du module Gestion Administrative.
Contenu SQL des exemples
À titre d’information, ou pour saisir la requête directement dans l’onglet SQL sans passer par l’import.
LIF carrière - Âge et grade
MySQL / MariaDB
SELECT TIMESTAMPDIFF(YEAR,A.DATE_NAISSANCE_AGENT,CURDATE()) AS AGE_AGENT,
G.LIB_GRADE
FROM CARRIERES C
INNER JOIN AGENTS A ON A.ID_AGENT=C.ID_AGENT_CARRIERE
INNER JOIN HISTORIQUE_GRADES HG ON C.MATRICULE_CARRIERE=HG.MATRICULE_CARRIERE
AND HG.DATE_OBTENTION_GRADE<=CURDATE()
AND NOT EXISTS(SELECT 1 FROM HISTORIQUE_GRADES HG2
WHERE HG.MATRICULE_CARRIERE=HG2.MATRICULE_CARRIERE
AND HG2.DATE_OBTENTION_GRADE<=CURDATE()
AND HG2.DATE_OBTENTION_GRADE>HG.DATE_OBTENTION_GRADE)
INNER JOIN GRADES G ON G.ID_GRADE=HG.ID_GRADE
WHERE C.MATRICULE_CARRIERE=%matricule_carriere%
Oracle
SELECT TRUNC(MONTHS_BETWEEN(SYSDATE,TO_DATE(A.DATE_NAISSANCE_AGENT,'YYYY-MM-DD'))/12) AS AGE_AGENT,
G.LIB_GRADE
FROM CARRIERES C
INNER JOIN AGENTS A ON A.ID_AGENT=C.ID_AGENT_CARRIERE
INNER JOIN HISTORIQUE_GRADES HG ON C.MATRICULE_CARRIERE=HG.MATRICULE_CARRIERE
AND HG.DATE_OBTENTION_GRADE<=TO_CHAR(SYSDATE,'YYYY-MM-DD')
AND NOT EXISTS(SELECT 1 FROM HISTORIQUE_GRADES HG2
WHERE HG.MATRICULE_CARRIERE=HG2.MATRICULE_CARRIERE
AND HG2.DATE_OBTENTION_GRADE<=TO_CHAR(SYSDATE,'YYYY-MM-DD')
AND HG2.DATE_OBTENTION_GRADE>HG.DATE_OBTENTION_GRADE)
INNER JOIN GRADES G ON G.ID_GRADE=HG.ID_GRADE
WHERE C.MATRICULE_CARRIERE=%matricule_carriere%
LIF carrière - Âge, grade et titularisation
MySQL / MariaDB
SELECT TIMESTAMPDIFF(YEAR,A.DATE_NAISSANCE_AGENT,CURDATE()) AS AGE_AGENT,
G.LIB_GRADE,
CASE WHEN C.TITULAIRE=1 THEN 'Oui' ELSE 'Non' END AS TITULAIRE,
DATE_FORMAT(C.DATE_TITU,'%d/%m/%Y') AS DATE_TITU
FROM CARRIERES C
INNER JOIN AGENTS A ON A.ID_AGENT=C.ID_AGENT_CARRIERE
LEFT OUTER JOIN GRADES_COURANTS GC ON GC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
LEFT OUTER JOIN GRADES G ON G.ID_GRADE=GC.ID_GRADE
WHERE C.MATRICULE_CARRIERE=%matricule_carriere%
Oracle
SELECT TRUNC(MONTHS_BETWEEN(SYSDATE,TO_DATE(A.DATE_NAISSANCE_AGENT,'YYYY-MM-DD'))/12) AS AGE_AGENT,
G.LIB_GRADE,
CASE WHEN C.TITULAIRE=1 THEN 'Oui' ELSE 'Non' END AS TITULAIRE,
TO_CHAR(TO_DATE(C.DATE_TITU,'YYYY-MM-DD'),'DD/MM/YYYY') AS DATE_TITU
FROM CARRIERES C
INNER JOIN AGENTS A ON A.ID_AGENT=C.ID_AGENT_CARRIERE
LEFT OUTER JOIN GRADES_COURANTS GC ON GC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
LEFT OUTER JOIN GRADES G ON G.ID_GRADE=GC.ID_GRADE
WHERE C.MATRICULE_CARRIERE=%matricule_carriere%
LIF carrière - Synthèse agent
MySQL / MariaDB
SELECT TIMESTAMPDIFF(YEAR,A.DATE_NAISSANCE_AGENT,CURDATE()) AS AGE_AGENT,
G.LIB_GRADE,
(SELECT SV.NOM_SERVICE_DEFAUT
FROM AFFECTATIONS_COURANTES AC
INNER JOIN SERVICES SV ON SV.ID_SERVICE_ORG=AC.ID_SERVICE_ORG
WHERE AC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
ORDER BY AC.ORDRE LIMIT 1) AS TXT_SERVICE,
S.CODE_STATUT,
CASE WHEN C.TITULAIRE=1 THEN 'Oui' ELSE 'Non' END AS TITULAIRE,
DATE_FORMAT(C.DATE_TITU,'%d/%m/%Y') AS DATE_TITU
FROM CARRIERES C
INNER JOIN AGENTS A ON A.ID_AGENT=C.ID_AGENT_CARRIERE
INNER JOIN STATUT S ON S.ID_STATUT=C.STATUT_CARRIERE
LEFT OUTER JOIN GRADES_COURANTS GC ON GC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
LEFT OUTER JOIN GRADES G ON G.ID_GRADE=GC.ID_GRADE
WHERE C.MATRICULE_CARRIERE=%matricule_carriere%
Oracle
SELECT TRUNC(MONTHS_BETWEEN(SYSDATE,TO_DATE(A.DATE_NAISSANCE_AGENT,'YYYY-MM-DD'))/12) AS AGE_AGENT,
G.LIB_GRADE,
(SELECT MAX(SV.NOM_SERVICE_DEFAUT) KEEP (DENSE_RANK FIRST ORDER BY AC.ORDRE)
FROM AFFECTATIONS_COURANTES AC
INNER JOIN SERVICES SV ON SV.ID_SERVICE_ORG=AC.ID_SERVICE_ORG
WHERE AC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE) AS TXT_SERVICE,
S.CODE_STATUT,
CASE WHEN C.TITULAIRE=1 THEN 'Oui' ELSE 'Non' END AS TITULAIRE,
TO_CHAR(TO_DATE(C.DATE_TITU,'YYYY-MM-DD'),'DD/MM/YYYY') AS DATE_TITU
FROM CARRIERES C
INNER JOIN AGENTS A ON A.ID_AGENT=C.ID_AGENT_CARRIERE
INNER JOIN STATUT S ON S.ID_STATUT=C.STATUT_CARRIERE
LEFT OUTER JOIN GRADES_COURANTS GC ON GC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
LEFT OUTER JOIN GRADES G ON G.ID_GRADE=GC.ID_GRADE
WHERE C.MATRICULE_CARRIERE=%matricule_carriere%
LIF carrière - Statut, contrat et affectation
MySQL / MariaDB
SELECT (SELECT SS.NOM_STATUT_STAT
FROM STATUTS_CARR SC
INNER JOIN STATUTS_STAT SS ON SS.ID_STATUT_STAT=SC.ID_STATUT_STAT
WHERE SC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
AND SC.DATE_DEBUT<=CURDATE() AND (SC.DATE_FIN IS NULL OR SC.DATE_FIN>=CURDATE())
ORDER BY SC.DATE_DEBUT DESC LIMIT 1) AS NOM_STATUT_STAT,
(SELECT TC.NOM_TYPE_CONTRAT
FROM STATUTS_CARR SC
INNER JOIN TYPES_CONTRATS TC ON TC.ID_TYPE_CONTRAT=SC.ID_TYPE_CONTRAT
WHERE SC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
AND SC.DATE_DEBUT<=CURDATE() AND (SC.DATE_FIN IS NULL OR SC.DATE_FIN>=CURDATE())
ORDER BY SC.DATE_DEBUT DESC LIMIT 1) AS NOM_TYPE_CONTRAT,
(SELECT S.NOM_SERVICE_DEFAUT
FROM AFFECTATIONS_COURANTES AC
INNER JOIN SERVICES S ON S.ID_SERVICE_ORG=AC.ID_SERVICE_ORG
WHERE AC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
ORDER BY AC.ORDRE LIMIT 1) AS TXT_SERVICE,
(SELECT PM.NOM_POS_MODAL
FROM TPS_TRAVAIL T
INNER JOIN POSITIONS_MODS PM ON PM.ID_POS_MODAL=T.ID_POS_MODAL
WHERE T.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
AND T.DATE_EFFET<=CURDATE() AND (T.DATE_FIN IS NULL OR T.DATE_FIN>=CURDATE())
ORDER BY T.DATE_EFFET DESC LIMIT 1) AS NOM_POS_MODAL,
DATE_FORMAT(COALESCE(A.DATE_ENGAGEMENT_SPV,
(SELECT MIN(PC.DATE_DEBUT_POS)
FROM POSITIONS_CARR PC
INNER JOIN CARRIERES C2 ON C2.MATRICULE_CARRIERE=PC.MATRICULE_CARRIERE
WHERE C2.ID_AGENT_CARRIERE=C.ID_AGENT_CARRIERE)),'%d/%m/%Y') AS DATE_ENGAGEMENT_SPV
FROM CARRIERES C
INNER JOIN AGENTS A ON A.ID_AGENT=C.ID_AGENT_CARRIERE
WHERE C.MATRICULE_CARRIERE=%matricule_carriere%
Oracle
SELECT (SELECT MAX(SS.NOM_STATUT_STAT) KEEP (DENSE_RANK LAST ORDER BY SC.DATE_DEBUT)
FROM STATUTS_CARR SC
INNER JOIN STATUTS_STAT SS ON SS.ID_STATUT_STAT=SC.ID_STATUT_STAT
WHERE SC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
AND SC.DATE_DEBUT<=TO_CHAR(SYSDATE,'YYYY-MM-DD')
AND (SC.DATE_FIN IS NULL OR SC.DATE_FIN>=TO_CHAR(SYSDATE,'YYYY-MM-DD'))) AS NOM_STATUT_STAT,
(SELECT MAX(TC.NOM_TYPE_CONTRAT) KEEP (DENSE_RANK LAST ORDER BY SC.DATE_DEBUT)
FROM STATUTS_CARR SC
INNER JOIN TYPES_CONTRATS TC ON TC.ID_TYPE_CONTRAT=SC.ID_TYPE_CONTRAT
WHERE SC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
AND SC.DATE_DEBUT<=TO_CHAR(SYSDATE,'YYYY-MM-DD')
AND (SC.DATE_FIN IS NULL OR SC.DATE_FIN>=TO_CHAR(SYSDATE,'YYYY-MM-DD'))) AS NOM_TYPE_CONTRAT,
(SELECT MAX(S.NOM_SERVICE_DEFAUT) KEEP (DENSE_RANK FIRST ORDER BY AC.ORDRE)
FROM AFFECTATIONS_COURANTES AC
INNER JOIN SERVICES S ON S.ID_SERVICE_ORG=AC.ID_SERVICE_ORG
WHERE AC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE) AS TXT_SERVICE,
(SELECT MAX(PM.NOM_POS_MODAL) KEEP (DENSE_RANK LAST ORDER BY T.DATE_EFFET)
FROM TPS_TRAVAIL T
INNER JOIN POSITIONS_MODS PM ON PM.ID_POS_MODAL=T.ID_POS_MODAL
WHERE T.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
AND T.DATE_EFFET<=TO_CHAR(SYSDATE,'YYYY-MM-DD')
AND (T.DATE_FIN IS NULL OR T.DATE_FIN>=TO_CHAR(SYSDATE,'YYYY-MM-DD'))) AS NOM_POS_MODAL,
TO_CHAR(TO_DATE(COALESCE(A.DATE_ENGAGEMENT_SPV,
(SELECT MIN(PC.DATE_DEBUT_POS)
FROM POSITIONS_CARR PC
INNER JOIN CARRIERES C2 ON C2.MATRICULE_CARRIERE=PC.MATRICULE_CARRIERE
WHERE C2.ID_AGENT_CARRIERE=C.ID_AGENT_CARRIERE)),'YYYY-MM-DD'),'DD/MM/YYYY') AS DATE_ENGAGEMENT_SPV
FROM CARRIERES C
INNER JOIN AGENTS A ON A.ID_AGENT=C.ID_AGENT_CARRIERE
WHERE C.MATRICULE_CARRIERE=%matricule_carriere%
LIF carrière - Situation administrative complète
MySQL / MariaDB
SELECT (SELECT SS.NOM_STATUT_STAT
FROM STATUTS_CARR SC
INNER JOIN STATUTS_STAT SS ON SS.ID_STATUT_STAT=SC.ID_STATUT_STAT
WHERE SC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
AND SC.DATE_DEBUT<=CURDATE() AND (SC.DATE_FIN IS NULL OR SC.DATE_FIN>=CURDATE())
ORDER BY SC.DATE_DEBUT DESC LIMIT 1) AS NOM_STATUT_STAT,
(SELECT TC.NOM_TYPE_CONTRAT
FROM STATUTS_CARR SC
INNER JOIN TYPES_CONTRATS TC ON TC.ID_TYPE_CONTRAT=SC.ID_TYPE_CONTRAT
WHERE SC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
AND SC.DATE_DEBUT<=CURDATE() AND (SC.DATE_FIN IS NULL OR SC.DATE_FIN>=CURDATE())
ORDER BY SC.DATE_DEBUT DESC LIMIT 1) AS NOM_TYPE_CONTRAT,
G.LIB_GRADE,
(SELECT S.NOM_SERVICE_DEFAUT
FROM AFFECTATIONS_COURANTES AC
INNER JOIN SERVICES S ON S.ID_SERVICE_ORG=AC.ID_SERVICE_ORG
WHERE AC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
ORDER BY AC.ORDRE LIMIT 1) AS TXT_SERVICE,
(SELECT PM.NOM_POS_MODAL
FROM TPS_TRAVAIL T
INNER JOIN POSITIONS_MODS PM ON PM.ID_POS_MODAL=T.ID_POS_MODAL
WHERE T.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
AND T.DATE_EFFET<=CURDATE() AND (T.DATE_FIN IS NULL OR T.DATE_FIN>=CURDATE())
ORDER BY T.DATE_EFFET DESC LIMIT 1) AS NOM_POS_MODAL,
DATE_FORMAT(COALESCE(A.DATE_ENGAGEMENT_SPV,
(SELECT MIN(PC.DATE_DEBUT_POS)
FROM POSITIONS_CARR PC
INNER JOIN CARRIERES C2 ON C2.MATRICULE_CARRIERE=PC.MATRICULE_CARRIERE
WHERE C2.ID_AGENT_CARRIERE=C.ID_AGENT_CARRIERE)),'%d/%m/%Y') AS DATE_ENGAGEMENT_SPV
FROM CARRIERES C
INNER JOIN AGENTS A ON A.ID_AGENT=C.ID_AGENT_CARRIERE
LEFT OUTER JOIN GRADES_COURANTS GC ON GC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
LEFT OUTER JOIN GRADES G ON G.ID_GRADE=GC.ID_GRADE
WHERE C.MATRICULE_CARRIERE=%matricule_carriere%
Oracle
SELECT (SELECT MAX(SS.NOM_STATUT_STAT) KEEP (DENSE_RANK LAST ORDER BY SC.DATE_DEBUT)
FROM STATUTS_CARR SC
INNER JOIN STATUTS_STAT SS ON SS.ID_STATUT_STAT=SC.ID_STATUT_STAT
WHERE SC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
AND SC.DATE_DEBUT<=TO_CHAR(SYSDATE,'YYYY-MM-DD')
AND (SC.DATE_FIN IS NULL OR SC.DATE_FIN>=TO_CHAR(SYSDATE,'YYYY-MM-DD'))) AS NOM_STATUT_STAT,
(SELECT MAX(TC.NOM_TYPE_CONTRAT) KEEP (DENSE_RANK LAST ORDER BY SC.DATE_DEBUT)
FROM STATUTS_CARR SC
INNER JOIN TYPES_CONTRATS TC ON TC.ID_TYPE_CONTRAT=SC.ID_TYPE_CONTRAT
WHERE SC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
AND SC.DATE_DEBUT<=TO_CHAR(SYSDATE,'YYYY-MM-DD')
AND (SC.DATE_FIN IS NULL OR SC.DATE_FIN>=TO_CHAR(SYSDATE,'YYYY-MM-DD'))) AS NOM_TYPE_CONTRAT,
G.LIB_GRADE,
(SELECT MAX(S.NOM_SERVICE_DEFAUT) KEEP (DENSE_RANK FIRST ORDER BY AC.ORDRE)
FROM AFFECTATIONS_COURANTES AC
INNER JOIN SERVICES S ON S.ID_SERVICE_ORG=AC.ID_SERVICE_ORG
WHERE AC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE) AS TXT_SERVICE,
(SELECT MAX(PM.NOM_POS_MODAL) KEEP (DENSE_RANK LAST ORDER BY T.DATE_EFFET)
FROM TPS_TRAVAIL T
INNER JOIN POSITIONS_MODS PM ON PM.ID_POS_MODAL=T.ID_POS_MODAL
WHERE T.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
AND T.DATE_EFFET<=TO_CHAR(SYSDATE,'YYYY-MM-DD')
AND (T.DATE_FIN IS NULL OR T.DATE_FIN>=TO_CHAR(SYSDATE,'YYYY-MM-DD'))) AS NOM_POS_MODAL,
TO_CHAR(TO_DATE(COALESCE(A.DATE_ENGAGEMENT_SPV,
(SELECT MIN(PC.DATE_DEBUT_POS)
FROM POSITIONS_CARR PC
INNER JOIN CARRIERES C2 ON C2.MATRICULE_CARRIERE=PC.MATRICULE_CARRIERE
WHERE C2.ID_AGENT_CARRIERE=C.ID_AGENT_CARRIERE)),'YYYY-MM-DD'),'DD/MM/YYYY') AS DATE_ENGAGEMENT_SPV
FROM CARRIERES C
INNER JOIN AGENTS A ON A.ID_AGENT=C.ID_AGENT_CARRIERE
LEFT OUTER JOIN GRADES_COURANTS GC ON GC.MATRICULE_CARRIERE=C.MATRICULE_CARRIERE
LEFT OUTER JOIN GRADES G ON G.ID_GRADE=GC.ID_GRADE
WHERE C.MATRICULE_CARRIERE=%matricule_carriere%
LIF carrière - Fin de contrat
Situation statutaire en cours de la carrière. La requête ne renvoie rien (donc rien ne s’affiche) si cette situation n’a ni date de fin, ni période probatoire à venir.
MySQL / MariaDB
SELECT TC.NOM_TYPE_CONTRAT,
DATE_FORMAT(SC.DATE_DEBUT,'%d/%m/%Y') AS DATE_DEBUT,
DATE_FORMAT(COALESCE(SC.DATE_FIN,SC.DATE_FIN_PREV),'%d/%m/%Y') AS DATE_FIN_PREV,
CASE WHEN COALESCE(SC.DATE_FIN,SC.DATE_FIN_PREV)<CURDATE() THEN 'Échéance dépassée'
WHEN COALESCE(SC.DATE_FIN,SC.DATE_FIN_PREV) IS NOT NULL THEN CONCAT(DATEDIFF(COALESCE(SC.DATE_FIN,SC.DATE_FIN_PREV),CURDATE()),' jours')
END AS TXT_RESTANT,
CASE WHEN SC.DATE_FIN_PROB>=CURDATE() THEN DATE_FORMAT(SC.DATE_FIN_PROB,'%d/%m/%Y') END AS DATE_FIN_PROB
FROM STATUTS_CARR SC
LEFT OUTER JOIN TYPES_CONTRATS TC ON TC.ID_TYPE_CONTRAT=SC.ID_TYPE_CONTRAT
WHERE SC.MATRICULE_CARRIERE=%matricule_carriere%
AND SC.DATE_DEBUT<=CURDATE()
AND (SC.DATE_FIN IS NULL OR SC.DATE_FIN>=CURDATE())
AND (COALESCE(SC.DATE_FIN,SC.DATE_FIN_PREV) IS NOT NULL OR SC.DATE_FIN_PROB>=CURDATE())
ORDER BY SC.DATE_DEBUT DESC
Oracle
SELECT TC.NOM_TYPE_CONTRAT,
TO_CHAR(TO_DATE(SC.DATE_DEBUT,'YYYY-MM-DD'),'DD/MM/YYYY') AS DATE_DEBUT,
TO_CHAR(TO_DATE(COALESCE(SC.DATE_FIN,SC.DATE_FIN_PREV),'YYYY-MM-DD'),'DD/MM/YYYY') AS DATE_FIN_PREV,
CASE WHEN COALESCE(SC.DATE_FIN,SC.DATE_FIN_PREV)<TO_CHAR(SYSDATE,'YYYY-MM-DD') THEN 'Échéance dépassée'
WHEN COALESCE(SC.DATE_FIN,SC.DATE_FIN_PREV) IS NOT NULL
THEN (TO_DATE(COALESCE(SC.DATE_FIN,SC.DATE_FIN_PREV),'YYYY-MM-DD')-TRUNC(SYSDATE))||' jours'
END AS TXT_RESTANT,
CASE WHEN SC.DATE_FIN_PROB>=TO_CHAR(SYSDATE,'YYYY-MM-DD')
THEN TO_CHAR(TO_DATE(SC.DATE_FIN_PROB,'YYYY-MM-DD'),'DD/MM/YYYY')
END AS DATE_FIN_PROB
FROM STATUTS_CARR SC
LEFT OUTER JOIN TYPES_CONTRATS TC ON TC.ID_TYPE_CONTRAT=SC.ID_TYPE_CONTRAT
WHERE SC.MATRICULE_CARRIERE=%matricule_carriere%
AND SC.DATE_DEBUT<=TO_CHAR(SYSDATE,'YYYY-MM-DD')
AND (SC.DATE_FIN IS NULL OR SC.DATE_FIN>=TO_CHAR(SYSDATE,'YYYY-MM-DD'))
AND (COALESCE(SC.DATE_FIN,SC.DATE_FIN_PREV) IS NOT NULL OR SC.DATE_FIN_PROB>=TO_CHAR(SYSDATE,'YYYY-MM-DD'))
ORDER BY SC.DATE_DEBUT DESC
LIF carrière - Prochain échelon
Date théorique = date d’ancienneté dans l’échelon (à défaut, date d’obtention du grade) − reliquat d’ancienneté + durée de l’échelon paramétrée dans la grille indiciaire. Rien n’est calculé pour le dernier échelon du grade, ni quand la durée de l’échelon n’est pas renseignée.
MySQL / MariaDB
SELECT E.LIB_ECHELON,
IG.INDICE_MAJORE,
EN.LIB_ECHELON AS PROCHAIN_ECHELON,
CASE WHEN IGN.ID_INDICE_GRADE IS NOT NULL
AND COALESCE(IG.ANCIEN_CHG_AN,0)+COALESCE(IG.ANCIEN_CHG_MOIS,0)+COALESCE(IG.ANCIEN_CHG_JOURS,0)>0
THEN DATE_FORMAT(
DATE_ADD(DATE_ADD(DATE_ADD(
DATE_SUB(DATE_SUB(DATE_SUB(COALESCE(HG.DATE_ANC_ECHEL,HG.DATE_OBTENTION_GRADE),
INTERVAL COALESCE(HG.REL_ANC_AN,0) YEAR),
INTERVAL COALESCE(HG.REL_ANC_MOIS,0) MONTH),
INTERVAL COALESCE(HG.REL_ANC_JOURS,0) DAY),
INTERVAL COALESCE(IG.ANCIEN_CHG_AN,0) YEAR),
INTERVAL COALESCE(IG.ANCIEN_CHG_MOIS,0) MONTH),
INTERVAL COALESCE(IG.ANCIEN_CHG_JOURS,0) DAY),
'%d/%m/%Y')
END AS DATE_EFFET
FROM GRADES_COURANTS GC
INNER JOIN HISTORIQUE_GRADES HG ON HG.ID_HISTO_GRADE=GC.ID_HISTO_GRADE
INNER JOIN ECHELONS E ON E.ID_ECHELON=HG.ID_ECHELON
INNER JOIN INDICES_GRADES IG ON IG.ID_GRADE=HG.ID_GRADE AND IG.ID_ECHELON=HG.ID_ECHELON
AND IG.DATE_EFFET<=CURDATE()
AND NOT EXISTS(SELECT 1 FROM INDICES_GRADES IGG
WHERE IGG.ID_GRADE=IG.ID_GRADE
AND IGG.ID_ECHELON=IG.ID_ECHELON
AND IGG.DATE_EFFET>IG.DATE_EFFET
AND IGG.DATE_EFFET<=CURDATE())
LEFT OUTER JOIN INDICES_GRADES IGN ON IGN.ID_GRADE=IG.ID_GRADE
AND IGN.DATE_EFFET=IG.DATE_EFFET
AND IGN.ORDRE>IG.ORDRE
AND NOT EXISTS(SELECT 1 FROM INDICES_GRADES IGG
WHERE IGG.ID_GRADE=IGN.ID_GRADE
AND IGG.DATE_EFFET=IGN.DATE_EFFET
AND IGG.ORDRE>IG.ORDRE
AND IGG.ORDRE<IGN.ORDRE)
LEFT OUTER JOIN ECHELONS EN ON EN.ID_ECHELON=IGN.ID_ECHELON
WHERE GC.MATRICULE_CARRIERE=%matricule_carriere%
Oracle
SELECT E.LIB_ECHELON,
IG.INDICE_MAJORE,
EN.LIB_ECHELON AS PROCHAIN_ECHELON,
CASE WHEN IGN.ID_INDICE_GRADE IS NOT NULL
AND COALESCE(IG.ANCIEN_CHG_AN,0)+COALESCE(IG.ANCIEN_CHG_MOIS,0)+COALESCE(IG.ANCIEN_CHG_JOURS,0)>0
THEN TO_CHAR(
ADD_MONTHS(
ADD_MONTHS(TO_DATE(COALESCE(HG.DATE_ANC_ECHEL,HG.DATE_OBTENTION_GRADE),'YYYY-MM-DD'),
-(12*COALESCE(HG.REL_ANC_AN,0)+COALESCE(HG.REL_ANC_MOIS,0)))
-COALESCE(HG.REL_ANC_JOURS,0),
12*COALESCE(IG.ANCIEN_CHG_AN,0)+COALESCE(IG.ANCIEN_CHG_MOIS,0))
+COALESCE(IG.ANCIEN_CHG_JOURS,0),
'DD/MM/YYYY')
END AS DATE_EFFET
FROM GRADES_COURANTS GC
INNER JOIN HISTORIQUE_GRADES HG ON HG.ID_HISTO_GRADE=GC.ID_HISTO_GRADE
INNER JOIN ECHELONS E ON E.ID_ECHELON=HG.ID_ECHELON
INNER JOIN INDICES_GRADES IG ON IG.ID_GRADE=HG.ID_GRADE AND IG.ID_ECHELON=HG.ID_ECHELON
AND IG.DATE_EFFET<=TO_CHAR(SYSDATE,'YYYY-MM-DD')
AND NOT EXISTS(SELECT 1 FROM INDICES_GRADES IGG
WHERE IGG.ID_GRADE=IG.ID_GRADE
AND IGG.ID_ECHELON=IG.ID_ECHELON
AND IGG.DATE_EFFET>IG.DATE_EFFET
AND IGG.DATE_EFFET<=TO_CHAR(SYSDATE,'YYYY-MM-DD'))
LEFT OUTER JOIN INDICES_GRADES IGN ON IGN.ID_GRADE=IG.ID_GRADE
AND IGN.DATE_EFFET=IG.DATE_EFFET
AND IGN.ORDRE>IG.ORDRE
AND NOT EXISTS(SELECT 1 FROM INDICES_GRADES IGG
WHERE IGG.ID_GRADE=IGN.ID_GRADE
AND IGG.DATE_EFFET=IGN.DATE_EFFET
AND IGG.ORDRE>IG.ORDRE
AND IGG.ORDRE<IGN.ORDRE)
LEFT OUTER JOIN ECHELONS EN ON EN.ID_ECHELON=IGN.ID_ECHELON
WHERE GC.MATRICULE_CARRIERE=%matricule_carriere%
LIF carrière - Quotité de travail
Quotité saisie sur la période de temps de travail en cours ; à défaut, taux d’activité de la modalité.
MySQL / MariaDB
SELECT PM.NOM_POS_MODAL,
CONCAT(COALESCE(T.VOLUME,PM.TAUX_ACTIVITE),' %') AS QUOTITE_TRAVAIL,
CONCAT(PM.TAUX_REMU,' %') AS TAUX_REMU,
DATE_FORMAT(T.DATE_EFFET,'%d/%m/%Y') AS DATE_EFFET,
DATE_FORMAT(T.DATE_FIN,'%d/%m/%Y') AS DATE_FIN
FROM TPS_TRAVAIL T
LEFT OUTER JOIN POSITIONS_MODS PM ON PM.ID_POS_MODAL=T.ID_POS_MODAL
WHERE T.MATRICULE_CARRIERE=%matricule_carriere%
AND T.DATE_EFFET<=CURDATE()
AND (T.DATE_FIN IS NULL OR T.DATE_FIN>=CURDATE())
ORDER BY T.DATE_EFFET DESC
Oracle
SELECT PM.NOM_POS_MODAL,
CASE WHEN COALESCE(T.VOLUME,PM.TAUX_ACTIVITE) IS NOT NULL
THEN COALESCE(T.VOLUME,PM.TAUX_ACTIVITE)||' %' END AS QUOTITE_TRAVAIL,
CASE WHEN PM.TAUX_REMU IS NOT NULL THEN PM.TAUX_REMU||' %' END AS TAUX_REMU,
TO_CHAR(TO_DATE(T.DATE_EFFET,'YYYY-MM-DD'),'DD/MM/YYYY') AS DATE_EFFET,
TO_CHAR(TO_DATE(T.DATE_FIN,'YYYY-MM-DD'),'DD/MM/YYYY') AS DATE_FIN
FROM TPS_TRAVAIL T
LEFT OUTER JOIN POSITIONS_MODS PM ON PM.ID_POS_MODAL=T.ID_POS_MODAL
WHERE T.MATRICULE_CARRIERE=%matricule_carriere%
AND T.DATE_EFFET<=TO_CHAR(SYSDATE,'YYYY-MM-DD')
AND (T.DATE_FIN IS NULL OR T.DATE_FIN>=TO_CHAR(SYSDATE,'YYYY-MM-DD'))
ORDER BY T.DATE_EFFET DESC
LIF carrière - Aptitude médicale
Dernière aptitude médicale saisie pour l’agent. L’état reprend la règle du feu affiché à l’écran des aptitudes : inapte ou visite échue (rouge), prochaine visite non planifiée (jaune), à jour (vert).
MySQL / MariaDB
SELECT DATE_FORMAT(AM.DATE_VISITE,'%d/%m/%Y') AS DATE_VISITE,
CASE WHEN AM.APTE=1 THEN 'Oui' WHEN AM.APTE=0 THEN 'Non' END AS APTE,
AM.MOTIF,
DATE_FORMAT(AM.PROCHAINE_VISITE,'%d/%m/%Y') AS PROCHAINE_VISITE,
CASE WHEN AM.APTE=0 THEN 'Inapte'
WHEN AM.PROCHAINE_VISITE IS NULL THEN 'Prochaine visite non planifiée'
WHEN AM.PROCHAINE_VISITE<=CURDATE() THEN 'Visite échue'
ELSE 'À jour'
END AS ETAT
FROM CARRIERES C
INNER JOIN APTITUDE_MEDICALE AM ON AM.ID_AGENT=C.ID_AGENT_CARRIERE
WHERE C.MATRICULE_CARRIERE=%matricule_carriere%
ORDER BY AM.DATE_VISITE DESC
Oracle
SELECT TO_CHAR(TO_DATE(AM.DATE_VISITE,'YYYY-MM-DD'),'DD/MM/YYYY') AS DATE_VISITE,
CASE WHEN AM.APTE=1 THEN 'Oui' WHEN AM.APTE=0 THEN 'Non' END AS APTE,
AM.MOTIF,
TO_CHAR(TO_DATE(AM.PROCHAINE_VISITE,'YYYY-MM-DD'),'DD/MM/YYYY') AS PROCHAINE_VISITE,
CASE WHEN AM.APTE=0 THEN 'Inapte'
WHEN AM.PROCHAINE_VISITE IS NULL THEN 'Prochaine visite non planifiée'
WHEN AM.PROCHAINE_VISITE<=TO_CHAR(SYSDATE,'YYYY-MM-DD') THEN 'Visite échue'
ELSE 'À jour'
END AS ETAT
FROM CARRIERES C
INNER JOIN APTITUDE_MEDICALE AM ON AM.ID_AGENT=C.ID_AGENT_CARRIERE
WHERE C.MATRICULE_CARRIERE=%matricule_carriere%
ORDER BY AM.DATE_VISITE DESC
En cas de problème
| Constat | Cause probable | Solution |
|---|---|---|
| La requête n’est pas proposée dans Outils > Droits > Requêtes LIF | elle ne contient aucun mot clé LIF | ajouter le mot clé de l’écran visé, puis sauvegarder |
| La requête n’apparaît pas sur la fiche | l’utilisateur n’a pas le rôle associé, ou le champ « Sur l’écran » ne correspond pas | vérifier l’association rôle / écran |
| « Aucun résultat ou requête invalide. » dans le livret | la requête contient une invite @prompt{...}, une erreur SQL, ou ne renvoie aucune ligne pour cet agent | tester la requête dans le Requêteur en remplaçant le mot clé par une valeur réelle |
| « Requête invalide. » dans l’en-tête Détails carrière / Détails agent | erreur SQL dans la requête | idem |
| « Requête invalide. » avec une requête d’exemple importée | version MySQL importée sur une base Oracle, ou l’inverse | importer l’autre version de l’exemple |
| Rien ne s’affiche dans l’en-tête Détails carrière / Détails agent | aucune ligne de résultat, ou toutes les colonnes de la première ligne sont vides | vérifier le tri et les conditions de la requête |
| Un en-tête de colonne s’affiche mal | alias composé de plusieurs mots | utiliser un alias d’un seul mot, idéalement une clé de traduction |
| La requête n’apparaît pas dans l’export PDF du livret | option « Export PDF » désactivée, ou requête associée à un autre écran que Livret Individuel | activer l’option sur la ligne de l’écran Livret Individuel |