Как загрузить функцию PQ из текстового файла - PullRequest
3 голосов
/ 30 июня 2019

Так же, как в VBA, где мы можем сохранять макросы функций в файлах .xlam и загружать их в другой файл. В силовом запросе я хотел бы хранить часто используемые функции в одном месте и ссылаться на эти места, когда это необходимо.

Я знаю, что мы можем хранить мощные запросы для последующего использования, следуя этому руководству .

Однако этот совет не работает для функций.

Допустим, у меня есть очень простая функция для получения значения диапазона Excel:

(RangeName as text) =>
let
  RangeValue = Excel.CurrentWorkbook(){[Name=RangeName]}[Content]{0} [Column1]
in
  RangeValue

Я попытался сделать ссылку на этот файл следующим образом:

(RangeName as text) =>
  let
  GetFunction = Text.FromBinary(File.Contents(Excel.CurrentWorkbook(){[Name="PQMacrosFolder"]}[Content]{0}[Column1]&"RangeValue.txt")),
  EvaluateFunction = Expression.Evaluate(GetFunction, #shared)
in
  EvaluateFunction

(вы видите, что я использую синтаксис самой функции для получения пути к папке из именованного диапазона Excel "PQMacrosFolder".)

Показывает, что функция правильно загружена в редактор запросов. enter image description here

Но когда я пытаюсь ввести некоторые тестовые значения и вызвать функцию, она просто снова показывает тот же экран функции. enter image description here

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

Я попытался, и похоже, что если я просто вызову функцию один раз, она просто снова показывает тот же экран функции.Но если я вызову шаг результата еще раз, он будет работать.

  let
Source = RangeValue("PQMacrosFolder"),
Source2 = Source("PQMacrosFolder")
  in
Source2

enter image description here

Или, эквивалентно, дважды вызвать его в запросе, который ссылается натекстовый файл.

(RangeName as text) =>
  let
GetFunction = Text.FromBinary(File.Contents(Excel.CurrentWorkbook(){[Name="PQMacrosFolder"]}[Content]{0}[Column1]&"RangeValue.txt")),
EvaluateFunction = Expression.Evaluate(GetFunction, #shared),
EvaluateFunction2 = EvaluateFunction(RangeName)
  in
EvaluateFunction2

Если кто-то сможет объяснить это, это будет здорово.

0 голосов
/ 30 июня 2019

Вот функция для загрузки функции из текстового файла и выполнения действия над столбцом. Функция загружается из текстового файла, и входные данные задаются в одном запросе. Это предполагает, что входные переменные определены в двух отдельных запросах (также показано ниже).

Обратите внимание: если вы получили ошибку Formula Firewall, вам нужно будет записать значения именованного диапазона в тот же запрос или изменить параметры запроса, чтобы игнорировать настройки конфиденциальности. Я предпочитаю хранить их отдельно для удобства чтения.

let

    //Load M code from text file

    Source = Text.FromBinary(File.Contents(p_myTextFilePath)),

    //Evaluate the code from the file as an M expression
    EvaluatedExpression = Expression.Evaluate(Source, #shared),    

    //Invoke Function
    InvokeFunction = EvaluatedExpression(p_myTableName)

in

    InvokeFunction

Запросы для получения значений для использования в качестве пути текстового файла и имени таблицы (в качестве именованных диапазонов).

p_myTableName Query

let
    Source = Excel.CurrentWorkbook(){[Name="nr_myTableName"]}[Content],
    Column1 = Source{0}[Column1]
in
    Column1

p_myTextFilePath Query

let
    Source = Excel.CurrentWorkbook(){[Name="nr_myTextFilePath"]}[Content],
    Column1 = Source{0}[Column1]
in
    Column1

enter image description here

ПЕРЕСМОТР № 1

Ниже приведен синтаксис функции, которая загружает функцию из текстового файла. Имя таблицы является параметром в функции, которая находится в текстовом файле, поэтому, когда вы вызываете функцию ниже, функция из текстового файла появляется, готовая для спецификации таблицы.

(myTextFilePath) =>

let

    //Load M code from text file

    Source = Text.FromBinary(File.Contents(myTextFilePath)),

    //Evaluate the code from the file as an M expression

    EvaluatedExpression = Expression.Evaluate(Source, #shared)    

in

    EvaluatedExpression

Это снимок экрана с приведенной выше функцией до ее вызова.

enter image description here

А вот еще один снимок экрана после вызова функции, готовый к указанию следующего параметра.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...