8 Replies Latest reply: Sep 3, 2013 5:19 AM by Almamy DIABY RSS

    Quel opérateur logique est mieux approprié ?

      Bonjour,

      Dans le script ci-dessous se trouve le champ GLOBJ  qui contient des nombres (Les nombres représentent en fait des comptes comptable).

      F0911:
      LOAD num(GLKCO) as KCO,
      GLDCT,
      GLDOC,
      GLDGJ,
      GLMCU,
      GLOBJ,
      GLSBL,
      GLSBLT,
      GLLT,
      GLPN,
      GLFY,
      GLAA,
      GLEXR,
      GLODOC,
      GLPDCT,
      GLAN8,
      GLPO,
      GLLNID,
      GLPN&'_'&GLFY&'_'&GLSBL&'_'&GLMCU as Key2

      FROM
      [..\F0911.QVD]
      (
      qvd) where ((GLOBJ<280000 or GLOBJ>289999) and (GLOBJ<680000 or GLOBJ>689999));

      Je voudrais charger les données  des intervalles suivant [280000,289999] et [680000,689999].

      Mon soucis c'est comment intégrer cela dans la condition where . Pensez-vous que la clause where suivante est correcte avec les opérateurs logiques utilisés et peut répondre à mon besoin :

      FROM
      [..\F0911.QVD]
      (
      qvd) where ((GLOBJ<280000 or GLOBJ>289999) and (GLOBJ<680000 or GLOBJ>689999));

        • Re: Quel opérateur logique est mieux approprié ?
          Richard Pressanti

          Vous pouvez isoler le début de l'intervalle avec l'expression:

           

          Subfield( PurgeString( GLOBJ , '[]' ) , ',' , 1 )

           

          et la fin avec:

           

          Subfield( PurgeString( GLOBJ , '[]' ) , ',' , -1 )

            • Re: Quel opérateur logique est mieux approprié ?

              Bonjour Richard,

              il ne s'agit pas d'exclure uniquement les valeurs qui sont aux extrémités de l'intervalle mais d'exclure totalement les éléments de l'intervalle qui vont de 280000 à 289999 et de 680000 à 689999. Toutes mes excuses pour le besoin mal exprimé si c'est le cas. j'aurais dû écrire [280000;289999] ---> [280000...289999] et [680000,689999] ---> [680000...689999].

               

              cordialement.

                • Re: Quel opérateur logique est mieux approprié ?
                  Richard Pressanti

                  J'avais bien compris : lorsque je parlais d' "isoler le début et la fin", je parlais d'expressions à insérer dans votre clause WHERE qui devrait être:

                   

                  WHERE

                       // Est dans le premier intervalle

                       (

                                 Subfield( PurgeString( GLOBJ , '[]' ) , ',' , 1 ) < 280000

                       OR

                                 Subfield( PurgeString( GLOBJ , '[]' ) , ',' , -1 ) < 28999

                       )

                  AND

                       // Dans le second intervalle

                  (

                                 Subfield( PurgeString( GLOBJ , '[]' ) , ',' , 1 ) < 680000

                       OR

                                 Subfield( PurgeString( GLOBJ , '[]' ) , ',' , -1 ) < 68999

                       )

              • Re: Quel opérateur logique est mieux approprié ?
                Christophe Brault

                ET si vous utilisez le début de la valeur du champs :

                 

                WHERE left(GLOBJ,2)<>28 or left(GLOBJ,2)<>68;

                 

                Ceci répond à votre besoin ?

                  • Re: Quel opérateur logique est mieux approprié ?

                    Bonjour Christophe,

                    Votre réponse est utile dans la mesure où elle m'apprend d'autres aspects de mon problème.

                    Mais j'ai fini par me rendre compte à partir d'une vérification profonde des données chargées que ma clause initiale (... where ((GLOBJ<280000 or GLOBJ>289999) and (GLOBJ<680000 or GLOBJ>689999));)

                    répondait déjà à mon besoin car elle exclut les données indésirables du chargement.Merci donc pour votre intervention.

                     

                    Cordialement

                     

                  • Re: Quel opérateur logique est mieux approprié ?
                    Philippe Grenier

                    Bonjour Raymond,

                     

                    Les tables de JDE étant très grosses, appliquer des transformations ou des filtres lors du chargement de données peut sensiblement ralentir la vitesse de chargement d'un fichier, même si ce dernier est de format QVD. De fait, afin de permettre à QlikView d'utiliser le chargement optimal (mention Optimized dans le log) de son contenu, aucune transformation ni opération ne doit être effectuée.

                     

                    Peut-être pourriez-vous d'abord tout charger le contenu dans une table temporaire, puis basculer les informations désirées dans la table finale, tout en applicant les transformations désirées, en utilisant la suggestion de Christophe Brault.

                     

                    Ainsi, vous auriez le script suivant:

                    F0911_tmp:

                    LOAD GLKCO, GLDCT, GLDOC, GLDGJ, GLMCU, GLOBJ, GLSBL, GLSBLT, GLLT, GLPN,
                    GLFY, GLAA, GLEXR, GLODOC, GLPDCT, GLAN8,GLPO, GLLNID
                    From [..\F0911.QVD] (qvd);


                    F0911:

                    LOAD Num(GLKCO) as KCO, GLDCT, GLDOC, GLDGJ, GLMCU, GLOBJ, GLSBL, GLSBLT, GLLT, GLPN

                       , GLFY, GLAA, GLEXR, GLODOC, GLPDCT, GLAN8,GLPO, GLLNID

                       , GLPN&'_'&GLFY&'_'&GLSBL&'_'&GLMCU as Key2
                    Resident F0911_tmp

                    Where Left(GLOBJ,2)<>28 or Left(GLOBJ,2)<>68;


                    DROP Table F0911_tmp;


                    Cordialement,


                    Philippe

                      • Re: Quel opérateur logique est mieux approprié ?

                        Bonjour Philippe,

                        je remarque qu'en plus de votre intervention utile vous connaissez le système à partir duquel les données sont extraites, en l’occurrence JDE . Merci pour votre intervention, mais la clause where (... where ((GLOBJ<280000 or GLOBJ>289999) and (GLOBJ<680000 orGLOBJ>689999));) de mon script répondait déjà à ma préoccupation sans que je m'en rendre compte.

                        Par ailleurs je prendrai le temps de faire des tests avant de tirer des conclusions concernant vos dires qui suivent : <<Les tables de JDE étant très grosses, appliquer des transformations ou des filtres lors du chargement de données peut sensiblement ralentir la vitesse de chargement d'un fichier, même si ce dernier est de format QVD. De fait, afin de permettre à QlikView d'utiliser le chargement optimal (mention Optimized dans le log) de son contenu, aucune transformation ni opération ne doit être effectuée.>>

                         

                        Cordialement.

                      • Re: Quel opérateur logique est mieux approprié ?
                        Almamy DIABY

                        where ((GLOBJ<=280000 and GLOBJ>=289999) or(GLOBJ=<680000 and GLOBJ>=689999));