M Language Несколько запросов json для получения общих результатов

У меня есть запрос api rest, который возвращает мне максимальное количество записей 500. Я также могу получить с помощью API общее количество записей.

Из-за этого мне нужно объединить несколько запросов, чтобы получить все мои записи. Также мне нужно, чтобы этот запрос был динамическим и всегда обновлялся с учетом всех записей.

Это пример кода максимум для 1000 записей:

let
    Source = Json.Document(Web.Contents("https://example.pipedrive.com/v1/deal:(id,title,value,currency)?api_token=12345&limit=500&start=0")),
    Source2 = Json.Document(Web.Contents("https://example.pipedrive.com/v1/deal:(id,title,value,currency)?api_token=12345&limit=500&start=500")),
    data = Source[data],
    data2 = Source2[data],
    #"Converted to Table" = Table.FromList(data, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Converted to Table 2" = Table.FromList(data2, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"id", "title", "value", "currency"}, {"Column1.id", "Column1.title", "Column1.value", "Column1.currency"}),
    #"Expanded Column2" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"id", "title", "value", "currency"}, {"Column1.id", "Column1.title", "Column1.value", "Column1.currency"}),
    #"Appended Query" = Table.Combine({#"Expanded Column1", #"Expanded Column2"})
in
    #"Expanded Column1"

Всего у меня 11000 записей, и они меняются каждую неделю.

Я могу получить общее количество записей, используя data.additional_data.total_records.

Могу ли я использовать это значение для переменной и какое-то время, чтобы выполнить в общей сложности запросы (всего записей / 500)?

Любые идеи?


person davser    schedule 19.11.2017    source источник


Ответы (1)


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

Предположим, ваш исходный запрос выглядит следующим образом:

let
    Source = Json.Document(Web.Contents("https://example.pipedrive.com/v1/deal:(id,title,value,currency)?api_token=12345&limit=500&start=0")),
    data = Source[data],
    #"Converted to Table" = Table.FromList(data, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"id", "title", "value", "currency"}, {"Column1.id", "Column1.title", "Column1.value", "Column1.currency"})
in
    #"Expanded Column1"

Вы можете параметризовать параметр start и изменить запрос на функцию GetDeal как таковую:

(start as text) =>
let
    Source = Json.Document(Web.Contents("https://example.pipedrive.com/v1/deal:(id,title,value,currency)?api_token=12345&limit=500&start=" & start)),
    data = Source[data],
    #"Converted to Table" = Table.FromList(data, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"id", "title", "value", "currency"}, {"Column1.id", "Column1.title", "Column1.value", "Column1.currency"})
in
    #"Expanded Column1"

GetDeal

Допустим, у вас есть total_records, сохраненный как значение из другого запроса, перейдя к data.additional_data.total_records:

total_records

Теперь вы можете создать новый запрос и сгенерировать список от 0 до total_records с шагом 500:

let
    Source = List.Generate(() => 0, each _ <= (total_records), each _ + 500)
in
    Source

список

Преобразуйте его в таблицу и измените столбец на text:

let
    Source = List.Generate(() => 0, each _ <= (total_records), each _ + 500),
    #"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Renamed Columns" = Table.RenameColumns(#"Converted to Table",{{"Column1", "start"}}),
    #"Changed Type" = Table.TransformColumnTypes(#"Renamed Columns",{{"start", type text}})
in
    #"Changed Type"

начальный текст

Теперь мы можем вызвать пользовательскую функцию GetDeal со столбцом start как:

пользовательская функция

У вас будет список таблиц в виде нового столбца, и вы сможете работать оттуда. Столбец start можно удалить, так как он больше не нужен.

person Foxan Ng    schedule 20.11.2017
comment
Большое спасибо за это решение. В конце, когда я вызываю настраиваемую функцию: Formula.Firewall: Query 'query_number' (шаг 'Вызванная настраиваемая функция') ссылается на другие запросы или шаги, поэтому он не может напрямую обращаться к источнику данных. Пожалуйста, восстановите эту комбинацию данных. Какие-либо предложения? - person davser; 20.11.2017
comment
Я не знаю, совпадает ли это в Powerbi с Excel, но эта ошибка обычно возникает, когда у вас есть нестатическая ссылка на внешний источник данных. Я всегда исправляю это, перейдя в Параметры запроса ›Конфиденциальность и установив для него значение Всегда игнорировать настройки уровня конфиденциальности. Если вы не пытаетесь активно использовать настройки уровня конфиденциальности, они могут вызвать проблемы. - person Wedge; 20.11.2017
comment
@davser Да, я знаю, что это может быть потенциальной проблемой, но я намеренно опускаю ее, потому что обходной путь затруднит понимание приведенного выше ответа. Сначала вы можете попробовать то, что предлагает @wedge. Если это не работает, то обходной путь - вы должны поместить все три запроса (GetDeal, total_records, Deal в один и тот же запрос. (Т. Е. Обернуть их операторами let и соответствующим образом изменить код). Таким образом вы можете исключить ссылку на этот Power BI жалуется, потому что теперь они в одном запросе. - person Foxan Ng; 21.11.2017
comment
@Wedge, ваш вариант Всегда игнорировать настройки уровня конфиденциальности исправил ошибку, спасибо. - person davser; 24.11.2017
comment
@ Foxan-Ng Я использовал ваше решение, чтобы объединить все три запроса, и это тоже сработало, и мне кажется, что это лучшее решение, спасибо - person davser; 24.11.2017
comment
@FoxanNg: вау, еще один хорошо задокументированный (со скриншотами) ответ. Вы звезда! - person S Meaden; 12.01.2018
comment
@ s-meaden Рад помочь! Я обычно объясняю это более ясно, чтобы позже это могло принести пользу более широкой аудитории :) - person Foxan Ng; 13.01.2018