10 Replies Latest reply: Jul 25, 2016 2:50 AM by Fk Fisher RSS

    Appliquer une boucle For.....next à plusieurs fichiers

    Fk Fisher

      Bonjour,

       

      Je continue la création de mon fichier d'analyse et grâce à la communauté et aux docs en ligne je progresse... Cependant, il me manque quelques bases ce qui ralentit ma progression.

      Mon dernier objectif est reproduire la totalité du scrip (en noir) ci-dessous pour l'ensemble des fichiers mensuels de l'année disponibles. Donc pouvoir disposer de tous les enregistrements ci-dessous pour chaque jour.

      J'ai testé (en rouge) la création d'une boucle For.....next qui agit directement sur la construction de l'adresse des fichiers mais ....ça ne marche pas ! Auriez vous une idée svp ...peut-être plus simple ?

      Le script (en noir) fonctionne très bien pour 1 seul mois et si je remplace le '06' par une * seule les données du dernier mois donc du dernier fichier sont présentes sur mes graphes.

       

      let VAR03='01';

      For a=0 to 11

       

      let VAR04=VAR03+1;

       

      if VAR04<10 then

      VAR05='0'&VAR04

      else

      VAR05=VAR04

      end if

       

      let VAR06='[lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_*_'&VAR05&'_M-1.xls]';

       

      //--------------------------------------------------------------------------------------------------

      //Récupération du Nom du fichier source

      //--------------------------------------------------------------------------------------------------

      FICHIER:

      LOAD distinct

           FileBaseName() as Nom_Fichier

      //FROM [lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_*_06_M-1.xls]

          FROM VAR06

      (biff, embedded labels, header is 3 lines, table is [Disponibilité des ressources$]);

       

      //--------------------------------------------------------------------------------------------------

      //Récupération du Mois analysé directement à partir du nom du fichier source

      //--------------------------------------------------------------------------------------------------

      let MoisFichier =  Left(Subfield(Peek('Nom_Fichier', 0,'FICHIER'),'_',5),2);

      DROP Table FICHIER;

       

      //--------------------------------------------------------------------------------------------------

      //Création des variable de Début et Fin de mois étudié

      //--------------------------------------------------------------------------------------------------

      let VAR01='01/'&(MoisFichier) &'/2016';

      let VAR02=date(VAR011,'DD/MM/YYYY');

      let Date_jour_deb = monthstart(VAR02);

      let Date_jour_fin = monthend(VAR02);

      set  Errormode=0;

       

      //--------------------------------------------------------------------------------------------------

      //Initialisation de la boucle de recherche de Champs par rapport à chacun des jour du mois étudié

      //--------------------------------------------------------------------------------------------------

      For Date_jour= '$(Date_jour_deb)' to '$(Date_jour_fin)'

      let Jour= left(date('$(Date_jour)'),5);   

      let Nom_jour= Capitalize(left(weekday('$(Date_jour)'),2));

      let FieldN= '$(Nom_jour)'&' '&'$(Jour)';

       

      //--------------------------------------------------------------------------------------------------

      //Chargement des données dans la boucle pour un jour précisé ci-dessus

      //--------------------------------------------------------------------------------------------------

      [Disponibilité des ressources$]:

      LOAD

      [ID Activité],

          [Structure Responsable],

          [Libellé Activité],

      ...

          [Spécificité],

          [Ressource affectée],   

          [$(FieldN)] as QteCharge,

          '$(Jour)' as Jour,  

          [Commentaire affectation]

      //   FROM [lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_*_06_M-1.xls]

          FROM VAR06

      (biff, embedded labels, header is 3 lines, table is [Disponibilité des ressources$]);

       

       

      //--------------------------------------------------------------------------------------------------

      //Relance de la Boucle pour le jour suivant

      //--------------------------------------------------------------------------------------------------

      Next

       

      next a

        • Re: Appliquer une boucle For.....next à plusieurs fichiers
          Almamy DIABY

          FOR  MOIS= 1 to 12

              

                if $(MOIS) <10 then

                       let MOIS='0'&$(MOIS);

                endif 

             

                let MoisFichier = '$(MOIS)';

               

                

                  IF( FileSize('lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_*_$(MoisFichier)_M-1.xls')>0) then

           

            //--------------------------------------------------------------------------------------------------

            //Création des variable de Début et Fin de mois étudié

            //--------------------------------------------------------------------------------------------------

            let VAR01='01/'&(MoisFichier) &'/2016';

            let VAR02=date(VAR011,'DD/MM/YYYY');

            let Date_jour_deb = monthstart(VAR02);

            let Date_jour_fin = monthend(VAR02);

            set  Errormode=0;

            

            //--------------------------------------------------------------------------------------------------

            //Initialisation de la boucle de recherche de Champs par rapport à chacun des jour du mois étudié

            //--------------------------------------------------------------------------------------------------

            For Date_jour= '$(Date_jour_deb)' to '$(Date_jour_fin)'

            let Jour= left(date('$(Date_jour)'),5);  

            let Nom_jour= Capitalize(left(weekday('$(Date_jour)'),2));

            let FieldN= '$(Nom_jour)'&' '&'$(Jour)';

            

            //--------------------------------------------------------------------------------------------------

            //Chargement des données dans la boucle pour un jour précisé ci-dessus

            //--------------------------------------------------------------------------------------------------

            [Disponibilité des ressources$]:

            LOAD

            [ID Activité],

               [Structure Responsable],

               [Libellé Activité],

            //...

               [Spécificité],

               [Ressource affectée],  

               [$(FieldN)] as QteCharge,

               '$(Jour)' as Jour, 

               [Commentaire affectation]

              FROM [lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_*_$(MoisFichier)_M-1.xls]

                    (biff, embedded labels, header is 3 lines, table is [Disponibilité des ressources$]);

            

            

            //--------------------------------------------------------------------------------------------------

            //Relance de la Boucle pour le jour suivant

            //--------------------------------------------------------------------------------------------------

           

            Next

           

            ENDIF

            

          Next

            • Re: Appliquer une boucle For.....next à plusieurs fichiers
              Fk Fisher

              Bonjour et Merci,

               

              Ceci ne fonctionne pas !!! Je n'ai pas de message d'erreur mais je ne charge pas de donnée .

              Pour vérifier la fonction IF en amont, j'ai ajouté une variable pour visualiser comment elle se charge. Malheureusement, je constate qu'elle est toujours à valeur NULL malgré la présence des fichiers, de la bonne adresse de répertoire et aussi de la bonne orthographe. Auriez une idée car là je ne trouves vraiment pas ?

               

              FOR  MOIS= 1 to 12 

              if $(MOIS) <10 then

              let MOIS='0'&$(MOIS);

              endif  

              let MoisFichier = '$(MOIS)';

               

              let VAR03 = FileSize('lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_*_$(MoisFichier)_M-1.xls');

               

              IF( FileSize('lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_*_$(MoisFichier)_M-1.xls')>0) then

               

                • Re: Appliquer une boucle For.....next à plusieurs fichiers
                  Almamy DIABY

                  Le code que je t'ai envoyé précédemment ne fonctionne pas parce que il y avait une erreur on niveau du IF:

                          IF( FileSize('lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_*_$(MoisFichier)_M-1.xls')>0) then

                  En effet je devait pas mettre les parenthèses.

                   

                  Le code ci-dessous devrait fonctionner. Je l'ai testé à mon niveautest.PNG

                   

                  FOR  MOIS= 1 to 12

                     

                        if $(MOIS) <10 then

                               let MOIS='0'&$(MOIS);

                        endif

                    

                        let MoisFichier = '$(MOIS)';

                      

                       

                          IF  FileSize('lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_*_$(MoisFichier)_M-1.xls')>0 then

                   

                    //--------------------------------------------------------------------------------------------------

                    //Création des variable de Début et Fin de mois étudié

                    //--------------------------------------------------------------------------------------------------

                    let VAR01='01/'&(MoisFichier) &'/2016';

                    let VAR02=date(VAR01,'DD/MM/YYYY');

                    let Date_jour_deb = monthstart(VAR02);

                    let Date_jour_fin = monthend(VAR02);

                    set  Errormode=0;

                   

                    //--------------------------------------------------------------------------------------------------

                    //Initialisation de la boucle de recherche de Champs par rapport à chacun des jour du mois étudié

                    //--------------------------------------------------------------------------------------------------

                    For Date_jour= '$(Date_jour_deb)' to '$(Date_jour_fin)'

                    let Jour= left(date('$(Date_jour)'),5); 

                    let Nom_jour= Capitalize(left(weekday('$(Date_jour)'),2));

                    let FieldN= '$(Nom_jour)'&' '&'$(Jour)';

                   

                    //--------------------------------------------------------------------------------------------------

                    //Chargement des données dans la boucle pour un jour précisé ci-dessus

                    //--------------------------------------------------------------------------------------------------

                    [Disponibilité des ressources$]:

                    LOAD

                    [ID Activité],

                       [Structure Responsable],

                       [Libellé Activité],

                    //...

                       [Spécificité],

                       [Ressource affectée], 

                       [$(FieldN)] as QteCharge,

                       '$(Jour)' as Jour,

                       [Commentaire affectation]

                      FROM [lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_*_$(MoisFichier)_M-1.xls]

                            (biff, embedded labels, header is 3 lines, table is [Disponibilité des ressources$]);

                   

                   

                    //--------------------------------------------------------------------------------------------------

                    //Relance de la Boucle pour le jour suivant

                    //--------------------------------------------------------------------------------------------------

                   

                    Next

                   

                    ENDIF

                   

                  Next

                    • Re: Appliquer une boucle For.....next à plusieurs fichiers
                      Fk Fisher

                      :-(( ,

                       

                      Je ne comprends pas car j'ai repris l'ensemble du code que vous m'avez donné et j'ai conservé ma variable VAR03 pour vérifier la valeur de la fonction Filesize..... La valeur reste toujours NULL (cf. ci-dessous) et le chargement ne fonctionne toujours pas.

                      Peut-être que cela vient du fait que je travail avec Qlik Sense et non Qlik View ???

                       

                      FOR  MOIS= 1 to 12 

                      if $(MOIS) <10 then

                                   let MOIS='0'&$(MOIS);

                            endif

                            let MoisFichier = '$(MOIS)';

                           

                      let VAR03 = FileSize('lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_*_$(MoisFichier)_M-1.xls');

                       

                      IF FileSize('lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_*_$(MoisFichier)_M-1.xls')>0  then

                       

                       

                        • Re: Appliquer une boucle For.....next à plusieurs fichiers
                          Almamy DIABY

                          MoisFichier=1

                          VAR03= NULL

                           

                          Est ce que le fichier de Janvier Existe?

                           

                          Et regarde  la valeur que doit prendre VAR2  dans ton code initial ( let VAR02=date(VAR011,'DD/MM/YYYY')) .

                           

                          Alors corrige VAR011 en VAR01

                            • Re: Appliquer une boucle For.....next à plusieurs fichiers
                              Fk Fisher

                              Non le fichier de Janvier n'existe pas mais Juin et Juillet oui et VAR03 reste à NUL quand même !!!

                               

                              En effet il y avait une erreur sur VAR02 avec VAR011 mais la boucle ne va pas à cette ligne car la condition IF Filesize n'est pas respectée donc saut direct à Next !!

                               

                              Je cherche aussi de mon côté donc j'ai remplacé le nom du fichier par sa désignation exact :

                              IF FileSize('lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_20160527_06_M-1.xls')<>0  then

                               

                              Et dans ce cas aussi la condition IF Filesize donne est null donc j'en déduis que c'est la fonction Filesize qui n'est pas correct !

                               

                                • Re: Appliquer une boucle For.....next à plusieurs fichiers
                                  Almamy DIABY

                                  Tu as écris IF FileSize('lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_20160527_06_M-1.xls')<>0

                                   

                                  tu as mis <>  alors qu'on doit tester si le fichier donc la taille de celui doit > 0

                                  Essai de revoir le nom du fichier parce que à mon niveau le test a été concluant

                                    • Re: Appliquer une boucle For.....next à plusieurs fichiers
                                      Fk Fisher

                                      Bonjour et encore merci !

                                       

                                      En effet j'avais fait une erreur dans ma formule MAIS ceci ne change pas beaucoup les choses.

                                       

                                      1) Si je mets l'adresse exacte du Fichier sans utiliser '*' comme celà :

                                       

                                      FOR  MOIS= 1 to 12 

                                      if $(MOIS) <10 then

                                                   let MOIS='0'&$(MOIS);

                                            endif

                                            let MoisFichier = '$(MOIS)';     

                                      let VAR03 = 'lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_20160527_06_M-1.xls';

                                      let VAR04 = Filesize ('$(VAR03)');

                                      IF FileSize('lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_20160527_06_M-1.xls')>0  then

                                       

                                      Tout fonctionne très bien pour le mois de JUIN (cf.06) !!

                                       

                                      2) Si je remplace le 06 par la variable (MoisFichier) mais je que laisse la date de création du fichier de Juin juste avant comme celà :

                                       

                                      FOR  MOIS= 1 to 12 

                                      if $(MOIS) <10 then

                                                   let MOIS='0'&$(MOIS);

                                            endif

                                            let MoisFichier = '$(MOIS)';

                                      let VAR03 = 'lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_20160527_$(MoisFichier)_M-1.xls';

                                      let VAR04 = Filesize ('$(VAR03)');

                                      IF FileSize('lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_20160527_$(MoisFichier)_M-1.xls')>0  then

                                       

                                       

                                      Tout fonctionne très bien aussi pour le moi de JUIN !!!

                                       

                                      3) Mais comme chaque fichier source mensuel à une date de création différente et inconnu. Quand je remplace cette date par le symbole ' * ' comme celà :

                                       

                                       

                                      FOR  MOIS= 1 to 12 

                                      if $(MOIS) <10 then

                                                   let MOIS='0'&$(MOIS);

                                            endif

                                            let MoisFichier = '$(MOIS)';

                                      let VAR03 = 'lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_*_$(MoisFichier)_M-1.xls';

                                        let VAR04 = Filesize ('$(VAR03)');

                                      IF FileSize('lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_*_$(MoisFichier)_M-1.xls')>0  then

                                       

                                       

                                      Là ça ne fonctionne pas du tout et pour aucun des mois !!

                                       

                                      Je suis désolé de vous solliciter autant car je cherche aussi de mon côté ...mais mes compétences restent limitées ! J'avais pensé récupérer la date de création du fichier source en début de script mais là je ne sais pas faire et je ne suis pas sûr que ceci fonctionnerait mieux.

                        • Re: Appliquer une boucle For.....next à plusieurs fichiers
                          Mohamed Ahid

                          essais ça:

                           

                          //--------------------------------------------------------------------------------------------------

                          //Récupération du Nom du fichier source

                          //--------------------------------------------------------------------------------------------------

                          for Each File in ('//EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_*.xls ')

                          FICHIER:

                          LOAD distinct

                               FileBaseName() as Nom_Fichier

                          //FROM [lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_*_06_M-1.xls]

                              FROM $(File)

                          (biff, embedded labels, header is 3 lines, table is [Disponibilité des ressources$]);

                          next  File

                           

                          LET Rows1 = NoOfRows('FICHIER'); //nombre de fichier dans ton dossier

                           

                           

                           

                           

                          For i=1 to $(Rows1)

                            let Code_Met = peek('Nom_Fichier',$(i),'FICHIER');

                           

                           

                           

                          //--------------------------------------------------------------------------------------------------

                          //Récupération du Mois analysé directement à partir du nom du fichier source

                          //--------------------------------------------------------------------------------------------------

                          let MoisFichier =  Left(Subfield('$(Code_Met)','_',5),2);

                           

                           

                           

                          //--------------------------------------------------------------------------------------------------

                          //Création des variable de Début et Fin de mois étudié

                          //--------------------------------------------------------------------------------------------------

                          let VAR01='01/'&(MoisFichier) &'/2016';

                          let VAR02=date(VAR011,'DD/MM/YYYY');

                          let Date_jour_deb = monthstart(VAR02);

                          let Date_jour_fin = monthend(VAR02);

                          set  Errormode=0;

                           

                          //--------------------------------------------------------------------------------------------------

                          //Initialisation de la boucle de recherche de Champs par rapport à chacun des jour du mois étudié

                          //--------------------------------------------------------------------------------------------------

                          For Date_jour= '$(Date_jour_deb)' to '$(Date_jour_fin)'

                          let Jour= left(date('$(Date_jour)'),5);  

                          let Nom_jour= Capitalize(left(weekday('$(Date_jour)'),2));

                          let FieldN= '$(Nom_jour)'&' '&'$(Jour)';

                           

                          //--------------------------------------------------------------------------------------------------

                          //Chargement des données dans la boucle pour un jour précisé ci-dessus

                          //--------------------------------------------------------------------------------------------------

                          [Disponibilité des ressources$]:

                          LOAD

                          [ID Activité],

                              [Structure Responsable],

                              [Libellé Activité],

                           

                           

                              [Spécificité],

                              [Ressource affectée],  

                              [$(FieldN)] as QteCharge,

                              '$(Jour)' as Jour, 

                              [Commentaire affectation]

                          //   FROM [lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_*_06_M-1.xls]

                              FROM $(Code_Met)

                          (biff, embedded labels, header is 3 lines, table is [Disponibilité des ressources$]);

                           

                           

                          //--------------------------------------------------------------------------------------------------

                          //Relance de la Boucle pour le jour suivant

                          //--------------------------------------------------------------------------------------------------

                          Next

                            • Re: Appliquer une boucle For.....next à plusieurs fichiers
                              Fk Fisher

                              Bonsoir et merci,

                               

                              J'ai bien le comptage de mes 2 fichiers et après avoir ajouté 'Next i' en bas j'ai aussi une boucle de chargement MAIS ceci ne fonctionne que pour le nom du dernier fichier compté car le Nom_Fichier est chargé avant la boucle FOR i = .... donc lorsque i devient i=2 le Nom_Fichier est NULL !

                              J'ai essayé de monter la boucle FOR i=.... plus en amont mais cela ne marche pas non plus ;-(

                              Avez vous une autre idée ???

                               

                              //--------------------------------------------------------------------------------------------------

                              //Récupération du Nom du fichier source

                              //--------------------------------------------------------------------------------------------------

                              For each File in ('Lib://EXTRACTIONS/LAPLACE_PlanDeCharge_Ressource_*_M-1.xls')

                              FICHIER:

                              LOAD distinct

                                   FileBaseName() as Nom_Fichier

                                  FROM $(File)

                              (biff, embedded labels, header is 3 lines, table is [Disponibilité des ressources$]);

                              next File

                               

                               

                              Let Rows1 = NoOfRows('FICHIER');

                               

                              For i=1 to $(Rows1)

                              let Code_Met = peek('Nom_Fichier',$(i),'FICHIER');

                               

                               

                              // //--------------------------------------------------------------------------------------------------

                              // //Récupération du Mois analysé directement à partir du nom du fichier source

                              // //--------------------------------------------------------------------------------------------------

                              let MoisFichier =  Left(Subfield('$(Code_Met)','_',5),2);

                              //--------------------------------------------------------------------------------------------------

                              //Création des variable de Début et Fin de mois étudié

                              //--------------------------------------------------------------------------------------------------

                              let VAR01='01/'&(MoisFichier) &'/2016';

                               

                              ....

                               

                               

                              [Commentaire affectation]

                                  FROM $(Code_Met)

                              (biff, embedded labels, header is 3 lines, table is [Disponibilité des ressources$]);

                              //--------------------------------------------------------------------------------------------------

                              //Relance de la Boucle pour le jour suivant

                              //--------------------------------------------------------------------------------------------------

                              Next

                              next i