IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Suivi évolution RH : comparer chronologiquement sur plusieurs lignes [AC-2016]


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2019
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Suivi évolution RH : comparer chronologiquement sur plusieurs lignes
    Bonjour à tous,

    Voici 3 heures que je tourne en rond sur un problème, j'espère que l'un d'entre vous pourra m'aider !
    On m'a chargé de prendre des fichiers excel de suivi RH existants, et de pouvoir sortir un paquet de statistiques en mettant tout cela dans une BDD Access (donc je n'ai pas le choix sur le format des données d'entrée...).

    Voici en gros comment c'est foutu :

    Matricule Nom Poste Emploi_reference Prise de poste
    00001 BOB A001 E001 01/01/18
    00001 BOB A001 E002 01/01/18
    00001 BOB A002 E003 15/02/19

    Donc pour un utilisateur j'ai un matricule unique, il ne peut avoir qu'un poste (unique) en même temps, et un poste est composé de 1 à 3 emplois de référence (non uniques). L'info la plus importante pour moi est cet emploi de référence, qui tire toutes les données sur lesquelles je dois faire mes statistiques.
    Par exemple : un emploi de référence est relié à un métier. Je veux pouvoir calculer entre Date1 et Date2 tous les utilisateurs qui sont passés d'un métier à un autre, et donc pouvoir sortir tous les changements d'emploi_reference qui ont eu lieu pendant cet intervalle.

    A ce stade j'arrive à lister tous mes matricules qui ont été concernés par un changement dans ma plage de temps souhaitée, mais je n'arrive pas à trouver la logique qui me permette d'identifier "Ce matricule est passé du Poste A001 avec les ER E001 et E002, au Poste A002 avec l'ER E003".

    A vot'bon coeur, toute aide sera fortement appréciée

  2. #2
    Invité
    Invité(e)
    Par défaut
    bonsoir,

    une solution qui mixe sql et vba, si trop lent, passer par une solution vba.

    la fonction vba qui transpose les lignes de ER en colonne. Attention, sur la ligne sSQL modifier le nom de la table (2 fois) et si besoin le nom des colonnes
    Référencer DAO via VBE.
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    Public Function getListeER(ByVal Matricule As String, ByVal MinDate As Date, ByVal CurDate As Date) As String
        On Error GoTo fin
        Dim oDb As dao.Database, oRs As dao.Recordset, sSql As String
        sSql = "SELECT Poste, Emploi_Reference & "","" As ER FROM suivi_rh As T1 " & _
               "INNER JOIN (SELECT MAX(Prise_De_Poste) As PP FROM suivi_rh WHERE " & _
               "Matricule ='" & Matricule & "' AND Prise_De_Poste BETWEEN " & _
               Format(MinDate, "\#m/d/yyyy\#") & " AND " & Format(CurDate, "\#m/d/yyyy\#") & ") As T2 " & _
               "ON T1.Prise_De_Poste=T2.PP WHERE Matricule='" & Matricule & "' " & _
               "ORDER BY Emploi_Reference"
        Set oDb = CurrentDb: Set oRs = oDb.OpenRecordset(sSql, dbOpenSnapshot)
        If Not oRs.EOF Then
            getListeER = oRs!poste & " ("
            Do
                getListeER = getListeER & oRs(1): oRs.MoveNext
            Loop Until oRs.EOF
            getListeER = Left$(getListeER, Len(getListeER) - 1) & ")"
        End If
        oRs.Close
    fin:
        Set oDb = Nothing: Set oRs = Nothing
    End Function

    La requete exemple (changer aussi le nom de la table et colonnes si besoin).
    Les paramètres mindate et maxdate permettent de cerner la période étudiée
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PARAMETERS MinDate DateTime, MaxDate DateTime;
    SELECT Suivi_RH.Matricule, Suivi_RH.Prise_de_Poste, getListeER([Matricule],[MinDate],[prise_de_poste]-1) AS [Du poste et ER], getListeER([Matricule],[MinDate],[prise_de_poste]) AS [Au poste et ER]
    FROM Suivi_RH
    GROUP BY Suivi_RH.Matricule, Suivi_RH.Prise_de_Poste
    HAVING Suivi_RH.Prise_de_Poste<=[MaxDate];

  3. #3
    Candidat au Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2019
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Merci, je teste ça !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. AWK Comparer un champ sur plusieurs lignes
    Par drac08 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 21/08/2012, 18h03
  2. Response.Write sur plusieurs lignes
    Par simoryl dans le forum ASP
    Réponses: 2
    Dernier message: 31/08/2004, 22h49
  3. Réponses: 2
    Dernier message: 10/05/2004, 07h55
  4. TDBGrid - Un enregistrement sur plusieurs lignes
    Par BRODU dans le forum Bases de données
    Réponses: 2
    Dernier message: 09/05/2004, 07h53
  5. Define sur plusieurs lignes
    Par Gogoye dans le forum C
    Réponses: 6
    Dernier message: 06/10/2003, 11h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo