Search code examples
powerquery

in power query, when creating a request at the last step (finalResult), an error occurs: an else token was expected. what could be the problem?


`let
    // Кодирование учетных данных в формате base64
    basic = Binary.ToText(Text.ToBinary("***" & ":" & "***"), BinaryEncoding.Base64),
    
    // Определение функции для выполнения GET-запроса с учетом авторизации
    GetJson = (url as text, authHeader as text) =>
        let
            // Выполнение GET-запроса и получение данных в формате JSON
            response = Web.Contents(url, [Headers=[#"Authorization"=authHeader]]),
            json = Json.Document(response)
        in
            json,

    // Определение функции для получения прогресса выполнения запроса
    GetProgress = (url as text, authHeader as text) =>
        let
            // Получение данных прогресса в формате base64 и последующий парсинг JSON
            response = Web.Contents(url, [Headers=[#"Authorization"=authHeader]]),
            jsonResponse = Text.FromBinary(response, BinaryEncoding.Base64),
            json = Json.Document(jsonResponse)
        in
            json,

    // Определение функции для получения результата запроса
    GetResult = (url as text, authHeader as text) =>
        let
            // Получение результата в формате base64 и последующий парсинг JSON
            response = Web.Contents(url, [Headers=[#"Authorization"=authHeader]]),
            jsonResponse = Text.FromBinary(response, BinaryEncoding.Base64),
            json = Json.Document(jsonResponse)
        in
            json,

    // URL и заголовок авторизации для получения отчета
    url1 = "https://asu.***:7050/rest/Report/Start/Stat?Objs=3157234151&StTime=2023-06-01T00:00:00&EnTime=2023-07-01T00:00:00&Params=ZStopTime,NZStopTime,MoveTime,PathLen,Date,WorkTime_TRASH,WorkTime_STEAM,WorkTime_CRANE,WorkTime_BLADE,WorkTime_PUMP,WorkTime_DIGGER,WorkTime_MIXER,WorkTime_SPREADER,WorkTime_GENERATOR,WorkTime_PUMP_1,WorkTime_CEMENTING,WorkTime_DRILL&format=json",
    authHeader = "Basic " & basic,

    // Получение отчета
    result1 = GetJson(url1, authHeader),
    requestID = result1[RequestID],

    // URL и заголовок авторизации для получения прогресса выполнения отчета
    url2 = "https://asu.***:7050/rest/Report/GetProgress/" & requestID & "?format=json",
    authHeader2 = "Basic " & basic,
    progress = GetProgress(url2, authHeader2),

    // Функция ожидания завершения выполнения запроса
    waitForCompletion = () =>
        let
            // Проверка завершения и ожидание, если запрос еще не завершен
            doneFlag = progress[Done],
            waitPeriod = #duration(0, 0, 0, 10),
            endTime = DateTime.LocalNow() + waitPeriod
        in
            if doneFlag <> 1 then
                let
                    loop = List.Generate(
                        () => [result = GetProgress(url2, authHeader2), currentTime = DateTime.LocalNow()],
                        each [result][Done] <> 1 and [currentTime] < endTime,
                        each [result = GetProgress(url2, authHeader2), currentTime = DateTime.LocalNow()]
                    ),
                    lastResult = List.Last(loop),
                    doneFlag = lastResult[result][Done]
                in
                    doneFlag,

    // Получение окончательного результата
    finalResult = GetResult("https://asu.***:7050/rest/Report/GetResult/" & requestID & "?format=json", authHeader)
in
    finalResult`

There was an attempt to raise finalresult in else, but unfortunately there was no result. I also removed queries step by step from bottom to top. requests are processed until the last step. replaced the login password url with asterisks

I am attaching a screenshot of the error. Please direct me where to dig in search of a solution to this problem? enter image description here


Solution

  • In PowerQuery, if statements need an else and you are missing an else at the bottom, in the waitForCompletion step.

    Try updating it to:

        waitForCompletion = () =>
            let
                doneFlag = progress[Done],
                waitPeriod = #duration(0, 0, 0, 10),
                endTime = DateTime.LocalNow() + waitPeriod
            in
                if doneFlag <> 1 then
                    let
                        loop = List.Generate(
                            () => [result = GetProgress(url2, authHeader2), currentTime = DateTime.LocalNow()],
                            each [result][Done] <> 1 and [currentTime] < endTime,
                            each [result = GetProgress(url2, authHeader2), currentTime = DateTime.LocalNow()]
                        ),
                        lastResult = List.Last(loop),
                        doneFlag = lastResult[result][Done]
                    in
                        doneFlag
                else doneFlag, // <-- SEE HERE