Variable représentant une requête

Accueil – Le CFO masqué Forums Power Query Variable représentant une requête

  • Ce sujet contient 9 réponses, 2 participants et a été mis à jour pour la dernière fois par e.chevron, le il y a 2 semaines.
10 sujets de 1 à 10 (sur un total de 10)
  • Auteur
    Articles
  • #94893
    e.chevron
    Participant

    Bonjour à toutes et tous !

    Je cherche comment passer une requête à une variable pouvant aussi représenter une table Excel :

    let
        fxMaFonction = (NomSource, SourceEstTypeRequete) =>
        let
            Variable1 = if SourceEstTypeRequete then
                            // C'est ici que je voudrais mentionner la requête Power Query nommée NomSource
                        else
                            Excel.CurrentWorkbook(){[Name=NomSource]}[Content], // car si la source n'est pas une requête, c'est une table,
            
            Resultat = bla bla bla
        in
            Resultat
    in
        fxMaFonction

    En vous remerciant par avance de vos réponses 🙂

    #94903
    Stéphane Lorin
    Participant

    Bonjour

    Pour faire référence à votre requête “NomSource” il faut utiliser la fonction Expression.Evaluate(NomSource,#shared).
    C’est un peu l’équivalent de la fonction INDIRECT dans Excel

    Stéphane

    #95227
    e.chevron
    Participant

    Bonjour Stéphane, et un grand merci pour cette réponse qui me permet de résoudre mon problème, et que je n’aurais sans doute pas trouvé seul.

    J’avoue cependant, même après lecture de ce que j’ai pu trouver sur le web, avoir du mal à comprendre le #shared dans l’expression…

    Encore un grand merci pour vos réponses toujours pertinentes.

    #95229
    e.chevron
    Participant

    Re-bonjour Laurent.

    En fin de compte, votre solution fonctionne parfaitement dans le code lui-même, mais j’obtiens du coup l’erreur suivante dans plusieurs requêtes du même projet :
    Formula.Firewall : Requête « Calendrier » (étape « Source ») référence Requête « qrySaisie » (étape « Table Triée »), qui ne fait pas partie du texte de sa formule.

    qrySaisie est une requête important et traitant une table locale tableSaisieFacturation. Elle est la requête principale du projet et sert de source ou est rattachée à plusieurs autres.
    L’étape “Table Triée” est la dernière de cette requête.

    Calendrier est le résultat de l’appel à la fonction fxGenererCalendrier, un générateur de calendrier du même type que celui intégré dans Power Pivot sur lequel je travaille et pour lequel vous venez de m’aider.
    Les bornes de cette requête Calendrier se fondent sur les dates de qrySaisie, via cette fonction fxGenererCalendrier.

    Les requêtes dans lesquelles se produit l’erreur sont toutes celles qui se réfèrent à qrySaisie dans leur étape Source.

    L’erreur ne se produit plus et l’ensemble du projet fonctionne à nouveau lorsqu’au lieu de passer en paramètre de la fonction fxGenererCalendrier la requête qrySaisie, je passe sa source tableSaisieFacturation.

    Voici l’extrait du code (dont vous êtes du coup co-auteur) qui permet de passer en paramètre soit une table soit une requête :

            // Connexion à la table/requête source, ou aux tables/requêtes sources s'il y en a 2
            lstSourceDebut = if optSourceEstTypeRequete then 
    							Expression.Evaluate(strNomSource1, #shared)
    						 else
    							Excel.CurrentWorkbook(){[Name=strNomSource1]}[Content],
            lstSourceFin = if optSourceEstTypeRequete then 
    							Expression.Evaluate(strNomSource2, #shared)
    						 else
    							Excel.CurrentWorkbook(){[Name=strNomSource2]}[Content],

    et voici les premières lignes d’une requête dépendante, jusqu’à l’étape qui provoque l’erreur en question :

    Let
        Aujourdhui = DateTime.Date(DateTime.LocalNow()),
    
        Source = qrySaisie,
        #"Fusion qryTva" = Table.NestedJoin(Source, {"Date"}, qryTva, {"Date"}, "qryTva", JoinKind.LeftOuter),

    Note : la requête fusionnée qryTva fonctionne très bien, sans doute parce qu’elle se fonde sur une table locale et non sur qrySaisie.

    D’avance merci pour votre retour 🙂

    • Cette réponse a été modifiée le il y a 2 semaines et 1 jour par e.chevron.
    #95230
    Stéphane Lorin
    Participant

    Merci du retour
    Dans ce que j’en comprends, #shared c’est un peu la “bibliothèque” de Power Query. Toutes les fonctions, les mots clés y sont stockés ainsi que les requêtes de votre fichier
    Dans votre cas, vous demandez d’évaluer une chaîne de caractère (le nom de votre requête) dans cette bibliothèque.

    Tapez =#shared dans une requête vide et vous pourrez la voir en entier (pas loin de 1000 lignes)

    Stéphane

    #95232
    Stéphane Lorin
    Participant

    Essayez de modifier un paramètre dans Fichier/Option et paramètres/Option de requête/confidentialité

    #95233
    e.chevron
    Participant

    Tapez =#shared dans une requête vide et vous pourrez la voir en entier (pas loin de 1000 lignes)

    Wahoooooo !!!!

    Mais pourquoi on ne trouve pas cette astuce partout ?
    C’est juste énorme, ça semble donner accès à toutes les fonctions et à leur aide locale en Français, plus tout le contenu du projet !
    C’est juste énorme !

    Encore un grand merci !

    #95234
    e.chevron
    Participant

    Essayez de modifier un paramètre dans Fichier/Option et paramètres/Option de requête/confidentialité

    Après avoir suivi ce conseil, et sans résultat apparent, j’ai consulté l’aide sur les paramètres de confidentialité et j’ai lu que ceux liés à la source de données (et non à la requête) pouvaient avoir un impact sur le fonctionnement global des requêtes.

    Ceux de mon classeur étaient sur “Aucun”. Je les ai juste revalidés et tout est rentré dans l’ordre.
    J’ai rétabli les paramètres de confidentialité des requêtes sur l’option “Combiner les données en fonction des paramètres de confidentialité de chaque fichier”, ce qui n’a pas altéré le fonctionnement de mes requêtes.

    Je vais donc profiter de votre piste et creuser cette histoire d’options PowerQuery.

    Encore merci à vous pour votre aide précieuse, en espérant pouvoir vous renvoyer l’ascenseur un de ces quatre (en VBA peut-être ?).

    #95235
    Stéphane Lorin
    Participant

    Concernant ce #shared et la liste des fonctions, on ne trouve pas “partout” cette astuce mais elle est détaillée dans le livre “Power Query et le langage M” aux éditions ENI de Frédéric Le Guen et Cathy Monier qui est déjà intervenue que ce site. C’est avec ce livre et le site de Sophie que j’ai débuté il y a quelques années. Merci 🙂

    Vous la trouverez également dans le blog de Ben Gribaudo qui a écrit une série vraiment très pointue sur Power Query.
    https://bengribaudo.com/blog/2021/07/12/5809/power-query-m-primer-part21-identifier-scope-sections#more-5809

    Stéphane

    #95261
    e.chevron
    Participant

    C’est aussi avec cet ouvrage que j’ai débuté il y a quelques mois.
    Je le trouve extrêmement bien fait, j’y ai appris et compris énormément de choses sur PowerQuery, mais je n’avais pas vu ce point.
    Ca m’incite à le reprendre plus en détails, et ceci dit en passant, je le conseille à tout utilisateur de cet outil, qu’il soit débutant ou confirmé.

    Quant au blog, je le découvre grâce à vous et je sens que je vais y passer quelque temps 😉

    Encore merci, en espérant que notre échange puisse aussi profiter à d’autres.

10 sujets de 1 à 10 (sur un total de 10)
  • Vous devez être connecté pour répondre à ce sujet.