12 Replies Latest reply: Dec 29, 2017 4:00 AM by jean-marc lessi RSS

    Optimisation des intervalles de dates

    Chadlia Gabsi

      Bonjour,

      je veux transformer le premier tableau au deuxième. C'est à dire si temps_travail et  du deuxième ligne = temps_travail et motif du 3eme ligne alors je les mets dans une seule ligne avec debut_occupation = min(debut_occupat) et fin_occupation.

      Merci.

      test.png

        • Re: Optimisation des intervalles de dates
          Kevin Chevrier

          Il faut passer par un tableau simple.

           

          Clic droit / Nouvelle objet de feuille / Zone table.

           

          Ça t'enlèvera tous les doublons.

            • Re: Optimisation des intervalles de dates
              Chadlia Gabsi

              Il y a pas des doublons, je dois rajouter une condition pour chaque matricule.  les motifs changent d'une période à autre si par exemple un agent a refait un contrat CDD et travaille toujours temps_t=100 alors dans la base il aura deux lignes une pour son premier cdd et autre pour son deuxième. Tant qu'il n'a pas changé son motif et temps travail je ne  veux pas qu'il aura deux lignes je veux avoir une seule ligne qui contient :

              MOTIF     TEMPS_TRAVAIL     DEBUT_ OCCUPATION                              FIN OCCUPATION

              CDD           100                           date debut occup de la 1ere ligne              date fin occupation de la deuxième ligne

                • Re: Optimisation des intervalles de dates
                  Kevin Chevrier

                  avec un tableau croisé dynamique dans ce cas, ça gère les regroupements.

                    • Re: Optimisation des intervalles de dates
                      Chadlia Gabsi

                      Je pense que ma question n'est plus claire. Je n'ai pas besoin d'un affichage. Ce que je demande comment peut on fusionner deux lignes et calculer mon expression une seule fois tant que les dates sont successives.

                      voila exemple :

                      test.png

                      Donc pour Renouvellement TP Valeur de début occ : 01/12/2013 et fin occ 02/05/2015.

                        • Re: Optimisation des intervalles de dates
                          Kevin Chevrier

                          OK, j'y étais pas du tout

                           

                          tu peux avoir plus de 2 lignes successives ?

                            • Re: Optimisation des intervalles de dates
                              Chadlia Gabsi

                              oui justement.

                                • Re: Optimisation des intervalles de dates
                                  Kevin Chevrier

                                  Dans un premier, je pense qu'il faut que tu identifies les renouvellements dans ton script avec un nouveau champ.

                                   

                                  Je vais pas avoir le temps de t'expliquer plus ce soir. Je pense qu'il faut que tu créés 2 tables temporaires pour calculer les dates de fin d'occupation précédente et date de début d'occupation suivante. Voici un exemple simplifié :

                                   

                                  // CALCUL DE LA DATE DE FIN D'OCCUPATION PRECEDENTE

                                  DATE_FIN_OCCUPATION_PRECEDENTE :

                                  NoConcatenate

                                  LOAD *,

                                  previous(DATE_FIN_OCC) as DATE_FIN_OCCUPATION

                                  RESIDENT TA_TABLE

                                  order by MATRICULE asc, DATE_DEBUT_OCC asc ;

                                   

                                  // CALCUL DE LA DATE DE DEBUT D'OCCUPATION SUIVANTE

                                  DATE_DEBUT_OCCUPATION_SUIVANTE:

                                  NoConcatenate

                                  LOAD

                                  *,

                                  previous(DATE_DEBUT_OCC) as DAT_DEB_OCCUPATION_SUIVANTE,

                                  previous(MATRICULE) as MATRICULE_SUIVANT

                                  RESIDENT TA_TABLE

                                  order by MATRICULE desc, DATE_DEBUT_OCC desc ;



                                  Ensuite je ferais un left join de ces 2 tables en un seule. Je droperais ces 2 tables pour ne conserver que la nouvelle table.


                                  A partir de cette table je calculerais avec des IF() pour voir si il y a une succession d'occupation selon le motif. Si oui alors je mets une valeur à 0. Sinon 1.


                                  Ensuite je ferais en sorte de ne garder que les dates que je veux par rapport à ce nouveau champ.


                                  Il y a peut-être plus simple que cette méthode...


                                  Je ne sais pas si l'intervalmatch pourrait t'aider dans ton cas...

                                • Re: Optimisation des intervalles de dates
                                  Chadlia Gabsi

                                  Je dois aussi jouer sur le facteur  année mois et jour parce que parfois tu trouves des lignes qui répondent aux conditions (meme motif, même temps travail) mais les jours mois et  années de début_occ ne sont ni égaux ni successifs.

                                  Par exemple

                                  Matricule agent           Motif                                 Debut_occ

                                  518                          Renouvelement CDI            12/12/2005                      13/08/2006

                                  518                          Renouvelement CDI            12/08/2007                      13/08/2008

                                  Il faut  pas prendre l'année ou la période qui n’était pas en poste.


                                    • Re: Optimisation des intervalles de dates
                                      Allu Allu

                                      try like this :

                                       

                                      Not tested

                                       

                                       

                                       

                                       

                                       

                                      source:

                                      LOAD *,MATRIX&MOTIF as unique iNLINE

                                      [

                                      MATRIX,MOTIF,DEBUT_OCCUPATION ,FIN_OCCUPATION,TEMPS_TRAV

                                      00876,partiel,03/05/2007,30/11/2007

                                      00876,partiel,03/05/2007,30/11/2008

                                      ];

                                       

                                      output:

                                      load MATRIX,MOTIF,DEBUT_OCCUPATION,TEMPS_TRAV,if(Previous(unique)=unique,Previous(FIN_OCCUPATION)=FIN_OCCUPATION) as NEWFIN_OCCUPATION


                                      resident source;

                                      drop table source;

                                      • Re: Optimisation des intervalles de dates
                                        jean-marc lessi

                                        Concernant ce second point voici mon code  pour passer de ce tableau

                                        1.JPG

                                        a ce tableau

                                        2.JPG

                                         

                                         

                                         

                                         

                                        INIT:

                                        LOAD * INLINE [

                                            Matricule, Motif, Debut, Fin, Duree

                                            876, Avancement minimum, 03/05/2007, 30/11/2007, 100

                                            876, Renouvellement, 01/11/2007, 30/11/2007, 100

                                            876, Renouvellement, 01/12/2007, 30/11/2008, 100

                                            876, Renouvellement, 01/12/2008, 30/11/2009, 100   

                                            518, CDD, 12/12/2005, 13/08/2006

                                            518, CDD, 12/08/2007, 13/08/2008

                                        ];



                                        QUALIFY *;

                                        BASE:

                                        LOAD * Resident INIT;


                                        ////////////////

                                        Set boucle = 1;


                                        do WHILE (boucle<>0)

                                        QUALIFY *;

                                        T1:

                                        LOAD *,Date(Debut)+0 as JourDebut, Date(Fin)+0 as JourFin, Date(Fin)+1 as JourSuivant Resident INIT;

                                         

                                        UNQUALIFY *;

                                        T2:

                                        NoConcatenate

                                        LOAD *,Date(Debut)+0 as JourDebut, Date(Fin)+0 as JourFin, Date(Fin)+1 as JourSuivant Resident INIT;

                                         

                                        RESULTAT:

                                        Left Join (T2) LOAD T1.Debut,T1.Fin,T1.Matricule as Matricule,T1.Motif as Motif,T1.Duree as Duree, T1.JourSuivant as JourDebut Resident T1;

                                         

                                        DROP Table T1;

                                        DROP Table INIT;

                                         

                                        INIT:

                                        NoConcatenate

                                        LOAD Matricule

                                        ,Motif

                                        ,if(Isnull(T1.Debut),Debut,T1.Debut) as Debut

                                        ,Fin

                                        ,Duree

                                        ,if(IsNull(T1.Debut),0,1) as Indicateur

                                        ,T1.Debut

                                        Resident T2;

                                        DROP table T2;


                                        TMP:

                                        NoConcatenate

                                        LOAD max(Indicateur) as aRefaire Resident INIT;

                                         

                                        LET a = FieldValue('aRefaire', 1);

                                        LET boucle = a;

                                         

                                        Drop table TMP;

                                        drop Fields Indicateur,T1.Debut;


                                        Loop 


                                        // On regroupe

                                        ///////////////////////

                                        UNQUALIFY *;

                                         

                                        RESULTAT:

                                        NoConcatenate

                                        LOAD Matricule,Motif,Debut,max(Date(Fin)) as Fin ,Duree Resident INIT Group by Matricule,Motif,Debut,Duree;



                                        DROP Table INIT;

                                        RENAME Table RESULTAT to INIT;

                            • Re: Optimisation des intervalles de dates
                              jean-marc lessi

                              Bonjour,

                               

                              Pour le cas précédent, voici comment je procéderais :

                               

                              INIT:

                              LOAD * INLINE [

                                  Matricule, Motif, Debut, Fin, Duree

                                  876, Avancement minimum, 03/05/2007, 30/11/2007, 100

                                  876, Renouvellement, 01/12/2007, 30/11/2007, 100

                                  876, Renouvellement, 01/12/2007, 30/11/2008, 100

                                  876, Renouvellement, 01/12/2007, 30/11/2009, 100   

                                  518, CDD, 12/12/2005, 13/08/2006

                                  518, CDD, 12/08/2007, 13/08/2008

                              ];



                              RESULTAT:

                              NoConcatenate

                              LOAD Matricule,Motif,Debut,max(Date(Fin)) as Fin ,Duree Resident INIT Group by Matricule,Motif,Debut,Duree;


                              On obitent bien dans la table résultat 4 lignes sur les 6 initiales.

                               

                              Cdlt,