2 votes

PowerQuery - Utiliser une cellule dans un tableau comme partie du code dans une requête (de manière dynamique ou non)

Je essaie d'utiliser une cellule comme paramètre dans Excel PowerQuery. La requête fonctionne sans cela, mais je dois entrer manuellement les valeurs, que je dois constamment modifier dans la requête pour obtenir les résultats souhaités.

Requête (Éditeur avancé):

let
    Criteria01 = Excel.CurrentWorkbook(){[Name="Servers"]}[Content][ServerSearch]{0},
    Criteria02 = Excel.CurrentWorkbook(){[Name="Servers"]}[Content][ServerSearch]{1},
    Criteria03 = Excel.CurrentWorkbook(){[Name="Servers"]}[Content][ServerSearch]{2},
    Source = Sql.Database("NOMSERVEURICI", "NOMBASEDEDONNÉESICI", [Query="SELECT DISTINCT [...........] AND (TABLEPREF.COLONNEICI like '%VALEURMANUELLE01%' OR#(lf)TABLEPREF.COLONNEICI like '%VALEURMANUELLE02%' OR#(lf)TABLEPREF.COLONNEICI like '%VALEURMANUELLE03%' OR#(lf)TABLEPREF.COLONNEICI like Criteria01)#(lf)#(lf)#(lf)order by 1 asc"])
in
    Source

"Servers" est le nom de la table et "ServerSearch" est l'en-tête de colonne. Si je vérifie l'étape pour Criteria01/etc, il m'affichera la valeur correcte de cette table que j'ai besoin d'utiliser.

Requête originale réalisée dans Sql-Server. Je n'ai aucun problème lorsque j'exécute la requête avec seulement des lignes LIKE '%VALEURSMANUELLES%'.

Mon objectif principal est de obtenir automatiquement N valeurs de "VALEURSMANUELLE" à partir d'une table dans une feuille, qui seront utilisées en tant qu'entrée pour la comparaison WHERE TABLEPREF.COLONNEICI like '%VALEURICI%'. Je dois utiliser ceci et je ne peux pas obtenir la table/base de données entière car il y a beaucoup trop de résultats autres que ceux que je veux.

Cependant, à des fins de test en ce moment, j'essaie d'utiliser seulement 1 à 3 valeurs, les trois premières de cette table (Criteria{0}{1}{2} dans la requête ci-dessus). Cependant, si j'essaie de faire quelque chose comme TABLEPREF.COLONNEICI like Criteria01, j'obtiens l'erreur suivante :

Erreur de Source de données: Microsoft SQL: Nom de colonne invalide 'Criteria01'.
Détails:
    DataSourceKind=SQL
    DataSourcePath=dalsql390;itdw
    Message=Nom de colonne invalide 'Criteria01'.
    Number=207
    Class=16

Donc mes questions sont :

  1. Je récupère la valeur de la cellule de la table de la bonne manière ? Signifiant : Excel.CurrentWorkbook(){[Name="Servers"]}[Content][ServerSearch]{0}.

  2. Comment référencer cette valeur dans ma requête ? Puisque la manière dont j'ai écrit cette requête m'a donné cette erreur.

    Notez également que si je change TABLEPREF.COLONNEICI like Criteria01 en CHG1.CI_Name like "Criteria01", j'obtiens l'erreur suivante :

    Erreur de Syntaxe d'Expression: Comma attendue.
  3. Après avoir corrigé 1 et 2, comment puis-je l'utiliser de manière dynamique ? Par exemple, au lieu d'obtenir les valeurs des index 1 2 3, que faire si je veux utiliser toute une table ? Je sais qu'en utilisant Excel.CurrentWorkbook(){[Name="Servers"]}[Content] cela m'apportera la table entière des valeurs (1 colonne, nombre de lignes inconnu), mais comment utiliser ce contenu de table 1 par 1 dans ma requête?

1voto

Cela obtiendra la valeur, mais vous ne pouvez pas vous référer aux étapes à l'intérieur des valeurs textuelles en y mettant le nom de l'étape à l'intérieur.

Vous avez quelques options pour le faire de manière dynamique.

  1. Utilisez Value.NativeQuery pour créer une requête paramétrée où vous pouvez passer d'autres valeurs en tant que paramètres. Par exemple, Value.NativeQuery(Sql.Database("NOMSERVEURICI", "NOMBASEDEDONNÉESICI"), "sélectionner @a, @b", [a = 1, b = "x"]) renverra la table [1, x]. Vous pouvez mettre le nom de l'étape dans la valeur de l'enregistrement pour le transmettre (par exemple, remplacer "x" par Criteria01).
  2. Ajoutez les valeurs textuelles directement dans le champ de requête, par exemple [Requête = "sélectionner " & Criteria01 ";"]. Cela est fortement déconseillé car cela peut entraîner des problèmes d'injection SQL.

Quant à la troisième question, cela dépend de ce que vous voulez faire avec la liste de valeurs. À un moment donné, vous aurez probablement besoin de List.Accumulate pour les transformer toutes en une seule valeur textuelle qui peut être placée dans la valeur de la requête, et peut-être pour les transformer en un enregistrement à placer dans la valeur des paramètres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X