Sélectionner une page

Vente Partner – Utiliser la fonction Query

6 Fév, 2020
Christian Desreumaux

1. Introduction

La fonction avancée « Query » du logiciel Vente Partner est disponible depuis la version 5.0 de celui-ci.

Elle a pour objectif de rendre n zones d’une table cible en respectant une requête et un tri, et en récupérant le n ième résultat.

2. Mise en oeuvre

 

Syntaxe générale :

FonctionAvancée(« QUERY »; nom; vue-cible; requête; tri; nième; zones-résultat), où :

  • nom (alpha) : nomme la requête. Lui donner un nom unique permet d’exécuter plusieurs QUERY sans mélanger les résultats.
  • vue-cible (alpha) : nom clé de la vue cible de la requête.
  • requête (alpha) : sous-formule définissant la requête de sélection, de type Zone(…) <opérateur de test> <constante> répété n fois avec des et/ou (utiliser && et ||). Les délimiteurs de chaînes guillemets (« ) à l’intérieur de la sous-formule doivent être remplacés par une mine (¤).
  • tri (alpha) : ordre de tri pour la recherche, pour déterminer le premier, deuxième … Au format Zone(…)+Zone(…) … Si, pour l’une des zones, on souhaite un tri descendant au lieu de ascendant, mettre un « ! » devant la zone. Exemple : « Zone(Vue.X)+!Zone(Vue.Y) » donne un tri ascendant sur X puis descendant sur Y. Le tri descendant est supporté à partir du 12/07/2002.
  • nième (nombre) : détermine quel enregistrement résultat va être traité : 1 = premier, 2 = deuxième …
  • zones-résultat (alpha) : liste des zones résultat qui vont être stockées dans les DefVar() de la requête, séparées par des points-virgules (;) et au format vue.zone;vue.zone;… Pour chaque zone résultat, un DefVar() est créé, le nom de la variable étant nom-requête:vue.zone

La fonction avancée rend toujours la première variable résultat (la première zone). En cas d’échec de la requête (aucun enregistrement correspondant), toutes les variables rendent une chaîne vide. Si la requête fonctionne, chaque variable créée sera du même type (alpha, numérique, date …) que la zone correspondante.

Attention :

  • tous les paramètres sont obligatoires.
  • dans la requête, ne pas insérer une sélection du type Zone(…)=Zone(…) mais bien Zone(…)=constante, ce qui implique d’évaluer la valeur des zones servant de valeurs de recherche, et non pas la zone elle-même. Comme ces valeurs doivent être insérées dans la chaîne requête, il faut convertir leur type en alpha (voir example).
  • veiller à ce que les critères de recherche les plus pertinents (le moins de doublons) soient indexés. Les zones de tri doivent également être indexées, sans quoi le temps de réponse sera médiocre.
  • à l’idéal, la vue cible devrait aussi être ouverte dans le Bureau courant (si c’est un Objet Tableau, il est impératif que sa vue conteneur soit ouverte dans le Bureau courant, sans quoi la fonction ne marchera pas).

3. Exemple

Hypothèses :

  • on dispose d’une vue « Article », avec les zones « Référence article » (alpha), « Désignation » (alpha), « Largeur » (nombre), « Hauteur » (nombre), « Prix Vente » (nombre), « Prix Achat » (nombre). Les références articles ne sont pas uniques, un même article pouvant exister en différentes tailles.
  • on utilise une vue « Test », possédant les champs « CodeArt » (alpha), « Largeur » (nombre), « Hauteur » (nombre).
  • cette vue « Test » possède aussi les champs « RetourCode » (alpha), « RetourDésignation » (alpha), RetourLargeur (nombre), RetourHauteur (nombre), RetourPrixAchat (nombre), RetourPrixVente (nombre).
  • on a placé dans « Test » un bouton « Query » exécutant un scanner « Query » en vue courante, pour résoudre le problème suivant : connaissant « CodeArt », « Largeur » et « Hauteur » dans « Test », on veut récupérer dans les champs « RetourXXX » les informations du premier article ayant pour « Référence article » la valeur de « CodeArt » et dont les deux dimensions sont supérieurs ou égales à celles de « Test » (on peut découper l’article souhaité dans un matériau plus grand, mais pas plus petit). Pour ne pas gaspiller, on voudrait prendre le premier suffisamment grand (et non pas un autre encore plus grand).

Ce type de problème peut se résoudre de la façon suivante :

  • on cherche les articles dont « Référence article » = Test.CodeArt ET Largeur >= Test.Largeur ET Hauteur >= Test.Hauteur.
  • on trie les articles par Largeur+Hauteur croissantes (triés par largeur d’abord, puis par hauteur si largeur identique).
  • on ne s’intéresse qu’au premier résultat : c’est le premier suffisamment grand (requête), et aussi le plus petit parmi ceux assez grands (tri).

Avec la fonction avancée « QUERY » :

On créé un scanner « Modification de zone », sans requête (on utilisera vue courante dans le bouton).

  • La première zone modifiée est « Test.RetourCode » (on vérifie ainsi que le code trouvé est bien identique à « Test.CodeArt », et la formule de calcul est :

FonctionAvancée(« QUERY »; « ART »; « Article »; « Zone(Article.Référence article)=¤ » + Zone(Test.CodeArt)  +  « ¤ && Zone(Article.Largeur)>= »  +  VersAlpha(Zone(Test.Largeur) ;  -1 ;  -1 ;  1 )  +   » && Zone(Article.Hauteur)>= »  +  VersAlpha(Zone(Test.Hauteur) ;  -1 ;  -1 ;  1 ) ;  « Zone(Article.Largeur)+Zone(Article.Hauteur) » ;  1 ;  « Article.Référence article;Article.Désignation;Article.Largeur;Article.Hauteur;Article.Prix Vente;Article.Prix Achat » )

  • La deuxième zone modifié est « Test.RetourDésignation », avec la formule : Var(« ART:Article.Désignation »)
  • La suivante est « Test.RetourLargeur », avec la formule : Var(« ART:Article.Largeur »)
  • La suivante est « Test.RetourHauteur », avec la formule : Var(« ART:Article.Hauteur »)
  • La suivante est « Test.RetourPrixAchat », avec la formule : Var(« ART:Article.Prix Achat »)
  • La suivante est « Test.RetourPrixVente », avec la formule : Var(« ART:Article.Prix Vente »)

La formule « QUERY » de plus près :

  • premier paramètre : « QUERY », c’est le nom de la fonction avancée.
  • deuxième paramètre : « ART », on nomme cette requête « ART », tous les DefVar() effectués seront tels que les noms des variables commenceront par « ART: », ce qui évitera toute collision avec d’autres variables, ou une autre « QUERY », à condition bien sûr que les noms de QUERY soient uniques.
  • troisième paramètre : « Article », c’est le nom clé de la vue cible de la QUERY. Les zones de cette vue et de ses vues soeurs peuvent être utilisées.
  • quatrième paramètre : la formule de sélection, c’est la partie la plus complexe, détaillée plus bas.
  • cinquième paramètre : « Zone(Article.Largeur)+Zone(Article.Hauteur) » les zones de tri, simplement déclarées dans l’ordre souhaité, séparées par un plus (+).
  • sixième paramètre : 1, puisque l’on veut sélectionner le premier enregistrement validant la sélection, dans l’ordre du tri.
  • septième paramètre : « Article.Référence article;Article.Désignation;Article.Largeur;Article.Hauteur;Article.Prix Vente;Article.Prix Achat », la liste des zones que l’on souhaite récupérer dans l’enregistrement résultat, au format nom clé vue.zone, séparées par des points-virgules (;). Pour chaque zone, une variable (DefVar) sera créée avec le nom nom-requête:vue.zone, soit dans notre exemple « ART:Article.Référence article », « ART:Article.Désignation », …

Le paramètre de sélection en détail :

« Zone(Article.Référence article)=¤ » + Zone(Test.CodeArt)

+  « ¤ && Zone(Article.Largeur)>= » +  VersAlpha(Zone(Test.Largeur) ;  -1 ;  -1 ;  1 )

+   » && Zone(Article.Hauteur)>= »  +  VersAlpha(Zone(Test.Hauteur) ;  -1 ;  -1 ;  1 )

Après évaluation, cette formule donnera une chaîne de caractères égale à ceci (avec un code article « 103502 », une largeur 320 et une hauteur 205) :

Zone(Article.Référence article)=¤103502¤ && Zone(Article.Largeur)>=320 && Zone(Article.Hauteur)>=205

(les mines ¤ sont utilisées pour éviter d’avoir des guillemets dans des guillemets, mais dans ce cas, Vente Partner les traitera finalement comme des guillemets).

Il faut bien comprendre que ceci est obtenu AVANT que la fonction avancée « QUERY » ne soit appelée, parce que l’évaluateur de formule de Vente Partner a d’abord évalué tous les paramètres de la fonction et donc le quatrième paramètre, qui est lui même une formule qui peut se « réduire » :

  • la constante (entre guillemets) « Zone(Article.Référence article)=¤ » est conservée telle quelle, ce qui donne une chaîne de caractères valant Zone(Article.Référence article)=¤
  • + Zone(Test.CodeArt) ajoute au résultat la valeur de la zone Test.CodeArt, soit 103502. Notre nouveau résultat intermédiaire est donc maintenant Zone(Article.Référence article)=¤103502
  • + « ¤ && Zone(Article.Largeur)>= » ajoute à nouveau au résultat la constante entre guillemets sans la modifier, le nouveau résultat intermédiaire est donc Zone(Article.Référence article)=¤103502¤ && Zone(Article.Largeur)>=
  • + VersAlpha(Zone(Test.Largeur) ; -1 ;  -1 ;  1 ) ajoute au résultat la valeur de Test.Largeur. Mais comme notre résultat est une chaîne de caractères, on ne peut insérer un nombre dedans qu’en le convertissant en texte, et on utilise ici le format scientifique. Notre nouveau résultat intermédiaire est : Zone(Article.Référence article)=¤103502¤ && Zone(Article.Largeur)>=320
  • +  » && Zone(Article.Hauteur)>= » ajoute une nouvelle constante (entre guillemets), le nouveau résultat intermédiaire est donc maintenant : Zone(Article.Référence article)=¤103502¤ && Zone(Article.Largeur)>=320 && Zone(Article.Hauteur)>=
  • + VersAlpha(Zone(Test.Hauteur) ; -1 ;  -1 ;  1 ) ajoute maintenant la valeur de Test.Hauteur au résultat intermédiaire, qui devient maintenant notre résultat final : Zone(Article.Référence article)=¤103502¤ && Zone(Article.Largeur)>=320 && Zone(Article.Hauteur)>=205

Vous aimerez lire aussi 

0 commentaires

Soumettre un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *