Запрос мощности — Как получить запись.Значение поля по имени вместо значения индекса?

#excel #powerquery #m

Вопрос:

Я новичок в Power Query и прочитал достаточно материала, чтобы запустить параметризованный запрос и запустить его.

В Excel на вкладке с именем Параметры у меня есть диапазон с именем «myParams», который охватывает A1:B4. Он состоит из 2 столбцов, где A1 = «Имя параметра» и B1 = «Значение».

     A                 B
1   Parameter Name    Value
2   User ID           12345
3   Other Thing       foo
4   More Things       bar
 

Мой запрос выглядит примерно так, что отлично работает:

 let
    myParamTable = Excel.CurrentWorkbook(){[Name="myParams"]}[Content],
    pUserID = Record.Field(myParamTable{0}, "Value"),

    Source = Sql.Database("myservername", "mydatabase"),

    GoQuery = Value.NativeQuery(Source,
    "
    SELECT * FROM myTable WHERE UserIdField = @UserID",
    [UserID = pUserID]
    )
in
    GoQuery
 

Если я понимаю, как это работает, pUserID присваивается значение в позиции 0 в столбце с именем «Значение», поскольку подсчет индексов начинается с 0.

Как я могу получить значение по имени «Идентификатор пользователя» в столбце А? Я представляю, что это что-то близкое к

 pUserID = Record.Field(myParamTable{"User ID"}, "Value"),
 

Я хотел бы использовать имена параметров вместо значения индекса, так как значение индекса может измениться в будущем, если в диапазон «myParams» будет добавлено новое поле.

Спасибо!

Ответ №1:

Есть много способов. Вот один из них, использующий Lists

 let
    myParamTable = Excel.CurrentWorkbook(){[Name="myParams"]}[Content],
    fieldList = myParamTable[#"Parameter Name"],
    valueList = myParamTable[Value],
    pUserID = valueList{List.PositionOf(fieldList,"User ID")}  
in
    pUserID
 

Ответ №2:

Вы можете ссылаться на строки по имени параметра, а не по номеру индекса, как это.

 let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"User ID" = Source{[#"Parameter Name"="User ID"]}[Value]
in
    #"User ID"
 

В блоге Криса Уэбба есть хороший пост на эту тему