Поделиться через


Обработка пути источника данных

Модуль M определяет источник данных с помощью сочетания типа и пути. При обнаружении источника данных во время оценки запроса подсистема M пытается найти соответствующие учетные данные. Если учетные данные не найдены, подсистема возвращает специальную ошибку, которая приводит к запросу учетных данных в Power Query.

Значение Kind исходит из определения типа источника данных.

Значение пути является производным от необходимых параметров функции источника данных. Необязательные параметры не учитываются в идентификаторе пути источника данных. В результате все функции источника данных, связанные с типом источника данных, должны иметь одинаковые параметры. Существует специальная обработка функций с одним параметром типа Uri.Type. Дополнительные сведения см. в разделе "Функции" с параметром URI.

Вы можете увидеть пример хранения учетных данных в диалоговом окне параметров источника данных в Power BI Desktop. В этом диалоговом окне тип представлен значком, а значение пути отображается в виде текста.

Снимок экрана: учетные данные для параметров источника данных.

Примечание.

При изменении необходимых параметров функции источника данных во время разработки ранее сохраненные учетные данные больше не работают (так как значения пути больше не соответствуют). При изменении параметров функции источника данных необходимо удалить все сохраненные учетные данные. При обнаружении несовместимых учетных данных может возникнуть ошибка во время выполнения.

Формат пути к источнику данных

Значение пути для источника данных является производным от необходимых параметров функции источника данных. Требуемые параметры можно исключить из пути, добавив DataSource.Path = false в метаданные функции. Дополнительные сведения см. в разделе "Исключение необходимых параметров из пути источника данных".

По умолчанию в диалоговом окне параметров источника данных можно увидеть фактическое строковое значение в Power BI Desktop и в запросе учетных данных. Если определение типа источника данных включало Label значение, вместо этого вы увидите значение метки.

Например, функция источника данных в примере HelloWorldWithDocs имеет следующую подпись:

HelloWorldWithDocs.Contents = (message as text, optional count as number) as table => ...

Функция имеет один обязательный textпараметр типаmessage и используется для вычисления пути к источнику данных. Необязательный параметр (count) игнорируется. Путь будет отображаться следующим образом:

Запрос учетных данных

Снимок экрана: запрос учетных данных с путем.

Пользовательский интерфейс параметров источника данных

Снимок экрана: пользовательский интерфейс параметров источника данных.

При определении значения метки значение пути к источнику данных не отображается:

Снимок экрана: параметры источника данных с определенной меткой.

Примечание.

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

Исключение обязательных параметров из пути к источнику данных

Если требуется, чтобы параметр функции не включался в путь к источнику данных, можно добавить DataSource.Path = false в метаданные документации по функциям. Это свойство можно добавить в один или несколько параметров для функции. Это поле удаляет значение из пути к источнику данных (то есть больше не передается в TestConnection функцию), поэтому его следует использовать только для параметров, которые не требуются для идентификации источника данных или различия учетных данных пользователей.

Например, соединитель в примере HelloWorldWithDocs должен иметь разные учетные данные для разных message значений. Добавление DataSource.Path = false к message параметру удаляет его из вычисления пути источника данных, эффективно делая соединитель "singleton". Все вызовы HelloWorldWithDocs.Contents обрабатываются как один и тот же источник данных, и пользователь предоставляет учетные данные только один раз.

HelloWorldType = type function (
    message as (type text meta [
        DataSource.Path = false,
        Documentation.FieldCaption = "Message",
        Documentation.FieldDescription = "Text to display",
        Documentation.SampleValues = {"Hello world", "Hola mundo"}
    ]),
    optional count as (type number meta [
        Documentation.FieldCaption = "Count",
        Documentation.FieldDescription = "Number of times to repeat the message",
        Documentation.AllowedValues = { 1, 2, 3 }
    ]))
    as table meta [
        Documentation.Name = "Hello - Name",
        Documentation.LongDescription = "Hello - Long Description",
        Documentation.Examples = {[
            Description = "Returns a table with 'Hello world' repeated 2 times",
            Code = "HelloWorldWithDocs.Contents(""Hello world"", 2)",
            Result = "#table({""Column1""}, {{""Hello world""}, {""Hello world""}})"
        ],[
            Description = "Another example, new message, new count!",
            Code = "HelloWorldWithDocs.Contents(""Goodbye"", 1)",
            Result = "#table({""Column1""}, {{""Goodbye""}})"
        ]}
    ];

Функции с параметром URI

Так как источники данных с идентификатором на основе URI настолько распространены, при работе с путями источника данных на основе URI существует специальная обработка в пользовательском интерфейсе Power Query. При обнаружении источника данных на основе URI диалоговое окно учетных данных предоставляет раскрывающийся список, который позволяет пользователю выбрать базовый путь, а не полный путь (и все пути между ними).

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

Как Uri.Type указано, а не примитивный тип языка M, необходимо использовать функцию Value.ReplaceType, чтобы указать, что текстовый параметр должен рассматриваться как универсальный код ресурса (URI).

shared GithubSample.Contents = Value.ReplaceType(Github.Contents, type function (url as Uri.type) as any);