Страницы: 1
RSS
Power Query M подставление динамического результата запроса в другой запрос
 
Пожалуйста подскажите с синтаксисом.
Есть определенный метод подключения к базе. Суть в том, что сначала формируется запрос с параметрами, получается ответ в виде id результата, который подставляется в параметр нового запроса, и получается уже тело ответа с данными.

Как мне подставить в код второго запроса результат первого?
Код
let
    url = "http://..../GetTrips",
    body  = "{ ""from"": ""2024-05-01"",  ""to"": ""2024-05-31""}",
    
    Source = Json.Document(Web.Contents(url,[Headers = [#"Content-Type"="application/json"], Content = Text.ToBinary(body) ] )),
    resultId = Source[resultId],  //ТУТ ПОЛУЧАЕМ id РЕЗУЛЬТАТА

    //ЗАПРОС НА РЕЗУЛЬТАТ
    urlres = "http://.../GetResult",

    bodyRes  = "{""resultid"": "".......""}", // ВОТ ТУТ НЕОБХОДИМО ВСТАВИТЬ  resultId

    
    Sourceres = Json.Document(Web.Contents(urlres,[Headers = [#"Content-Type"="application/json"], Content = Text.ToBinary(bodyRes) ] )),
    result = Sourceres[result],
    
in
result

bodyRes  = "{""resultid"": "".......""}" нужно поменять на динамический результат предыдущего запроса.
Прописываю [resultid = resultId]
получаю ответ:

Expression.Error: Не удается преобразовать значение типа Record в тип Text.
Сведения:
   Value=
       resultid=...тут верный резалт айди...
   Type=[Type]
 
zrbite, в кавычках любое выражение будет воспринимать как текст. Возможно, поможет Expression.Evaluate. Или собирать текстовыми функциями в строку из результата запроса, преобразованного в текст: 1. resultId -> в текст    2. "{""resultid"": "" &  запрос или переменная resultId с типом текст   &  ""}"    если правильно понял.
Изменено: voler83 - 17.06.2024 16:45:58
 
voler83, добавил
Код
resultId = Text.From(Source[resultId]),
Код
и вот такое нагромождение

bodyRes  = "{""resultid"" :"& """" & resultId &""""& "}",

Сработало.

Но вот по итогу выдает очень странное сообщение:
Код
Expression.Error: Не удается применить доступ к полям в типе Null.
Сведения:
    Value=
    Key=tripsInfo
 
Цитата
zrbite написал:
Сработало.

сработало на каком шаге?     bodyRes  = "{""resultid"" :"& """" & resultId &""""& "}"    выдает текстовое значение? это сработало?

на каком шаге возникает ошибка? после подстановки  bodyRes  в  Sourceres = Json.Document(................... )  ?
Изменено: voler83 - 19.06.2024 09:44:03
 
voler83,
Прошелся по шагам, да, запрос на итог не завершается, выдает результат Null, поэтому весь дальнейший код и вызывает ошибку.
А запрос имеет статус finished: FALSE

Очевидно запрос не успевает обработаться. Это значит, нужно прописать цикл для повторного запроса с тем же resultid пока не будет результата.

Тут мои полномочия всё пока, для меня это то было проблемой.

Можете подсказать, на каком этапе и как прописать цикл?
 
zrbite, я не знаю, как работает вся конструкция Json.Document(), и зачем цикл мне не ясно (периодический запрос в web и получение результата? что не успевает обрабатываться?). Приложите или поясните исходники и какой результат должен быть, может кто подскажет.
 
Суть работы метода: 1) Запрашиваем генерацию(!) отчета по заданным в body параметрам, 2) Получаем ID сгенерированного отчета, 3) Запрашиваем по другой ссылке этот отчет, передавая в body полученный ID

Итого код такой на данный момент:
Код
let
    //запрос ID результата
    url = "http://...../GetTrips",
    body  = "{ ""from"": ""2024-05-01"",  ""to"": ""2024-05-31""}",
    
    Source = Json.Document(Web.Contents(url,[Headers = [#"Content-Type"="application/json"], Content = Text.ToBinary(body) ] )),
    resultId = Text.From(Source[resultId]),
   
    //запрос с резалтайди
    urlRes = "http://...../GetResult",
    
    bodyRes  = "{""resultid"":"& """" & resultId &""""& "}",

    SourceRes = Json.Document(Web.Contents(urlRes,[Headers = [#"Content-Type"="application/json"], Content = Text.ToBinary(bodyRes) ] )),
    result = SourceRes[result],
    ...преобразования полученных списков в таблицы.....
in
    #"Развернутый элемент Column1"

Проблема в том, что сервер не сгенерировал еще отчет на момент запроса.
Поэтому ID результата получаю, но самого результата еще нет.

Необходимо:
в моем понимании либо цикл While, либо банально таймаут какой то перед выполнением второго запроса GetResult.
Изменено: zrbite - 19.06.2024 10:37:36
 
Цитата
zrbite написал:
либо банально таймаут какой то перед выполнением
может тут что поможет, натолкнулся и сохранил без чтения как-то: https://needfordata.ru/blog/function-invokeafter--power-query?ysclid=lvxi5kindg467263268

п.с.: и можно добавить try...otherwise чтобы все совсем не ломалось пока нет данных от сервера...
Изменено: voler83 - 19.06.2024 10:50:15
 
Цитата
zrbite написал:
цикл While
делайте рекурсию в совокупности с Function.InvokeAfter. Выход или по факту получения данных либо когда счетчик цикла превысил установленное вами значение. Посмотрите канал Ильи Назарова в Youtube.
Изменено: AlienSx - 19.06.2024 11:05:46
Пришелец-прораб.
 
Господа, пока я не пошел копать в другую сторону, подскажите, где я не прав, почему не работает:

Добавил в середину после получения resultid, перед обращением к GetResults функцию по типу ID=ID с отсрочкой исполнения (до 10 минут).
Все равно результат такой же, запрос не исполняется.
Код
Func = ()=>    
            let bodyResult =  bodyRes1
            in bodyResult,
    bodyRes = Function.InvokeAfter( ()=> Func(), #duration(0,0,10,0) ),
Страницы: 1
Наверх