Страницы: 1 2 След.
RSS
PQ Вывести сообщение об отправке данных после вызова процедуры
 
Добрый вечер!

В запросах книги есть запрос, который так и называется "Запрос", в котором вызывается процедура, хранимая на сервере бд. В нее (процедуру) передаются данные из таблицы на листе3 через параметризированный запрос. Запрос отработал, данные в бд вставились, только как дать ответ пользователю при этом? Например можно ли выдать сообщение что "Данные отправлены на сервер" или макросом выдавать оповещение об отправке данных. Подскажите как это сделать? Всем спасибо!
 
Цитата
Дмитрий Осипов написал:
Например можно ли выдать сообщение что "Данные отправлены на сервер"
нет
Цитата
Дмитрий Осипов написал:
или макросом выдавать оповещение об отправке данных
можно, но это уже не по теме
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
Дмитрий Осипов написал:
"Данные отправлены на сервер"
Можно это сообщение + текущее время выводить в ячейку тем же запросом последним шагом
Изменено: Михаил Л - 10.09.2020 00:00:48
 
а еще можно так, только если осторожно
 
Михаил Л, самый подходящий вариант! Подскажите пожалуйста как это сделать?
 
Дмитрий Осипов, сделать еще запрос B, который и будет выгружать запись и время, а макросом обновлять два запроса. Сначала ваш, потом B.
А ваш запрос что выгружает на Лист 6? Можно без макроса в выгрузку вашего запроса добавить одну строку с записью со временем  
 
Цитата
Михаил Л написал:
Можно без макроса в выгрузку вашего запроса добавить одну строку с записью со временем
это же можно сделать в моем запросе без создания нового? мне как раз это и нужно
 
Цитата
Дмитрий Осипов написал:
сделать в моем запросе без создания нового
Так?
Код
let
    
    a1= Регион("Регион"),
    a2= Бренд("Бренд"), 
    
    a3 = Teradata.Database(
        "база_данных", 
        [Query="
                CALL PROCEDURE имя_процедуры('"&a1&"', '"&a2&"')
    "]),
    Custom1 = "Данные отправлены на сервер в "& Text.From(Time.From(DateTime.LocalNow()))
in
    Custom1
Так с секундами
Код
    Custom1 = "Данные отправлены на сервер в "& DateTime.ToText(DateTime.LocalNow(),"hh:mm:ss")
А не покажете текст процедуры?
Узнаю для себя новое :)  
Изменено: Михаил Л - 10.09.2020 06:40:34
 
Михаил Л, спасибо :D !
Цитата
Михаил Л написал: А не покажете текст процедуры?
Код
CREATE PROCEDURE Shop.proc_product  (
   IN ProductID INTEGER,
   IN Value FLOAT)
BEGIN
   CREATE MULTISET VOLATILE TABLE vt_proc_product
            (
       ProductID INTEGER,
            Value FLOAT
       )
       PRIMARY INDEX (ProductID)
       ON COMMIT PRESERVE ROWS;
      
   INSERT INTO vt_proc_product VALUES (:ProductID, :Value);
END;

CALL proc_product  (105, 200.5);

Не подскажете еще, можно теперь макросом обновить этот запрос который выдает сообщение со временем?
 
Цитата
Дмитрий Осипов написал:
можно теперь макросом обновить этот запрос
Можно. А нужен ли макрос? Можно нажатием Ctrl+Alt+F5 обновить все подключения.
Можно макрорекордером записать макрос нажатия этого сочетания клавиш. Будет готовый макрос обновления. Попробуйте
У меня тоже вопрос. Вы этой процедурой пополняете базу, передавая два значения - ('"&a1&"', '"&a2&"'). Правильно?  
Изменено: Михаил Л - 10.09.2020 10:11:38
 
Михаил Л,да все правильно
не знаете, можно ли сохранять это сообщение "данные отправлены и время ", чтобы например когда вызываешь запрос второй раз, результаты первого вызова этого же запроса сохранялись?
 
Цитата
Дмитрий Осипов написал:
результаты первого вызова этого же запроса сохранялись
Можно макросом. Но в новой теме с названием типа - Сохранять значение ячейки в колонке последовательно. То есть макрос сохранит значение ячейки, например, в i1 и обновит макрос. При следующем запуске макроса опять сохранит значение ячейки в  i2 и обновит макрос. И т.д. i3, i4, i5, ...  
 
Цитата
Дмитрий Осипов написал:
да все правильно
Вы уверены? После выполнения данного кода, проверьте вставились ли данные в БД. Ибо с точки зрения спецификации языка М в коде от Михаила для вывода на лист даты/времени выполнять все шаги кроме последнего совсем не обязательно и транслятор их по идее должен проигнорировать.  ;) Не утверждаю что так и произойдет, но с моей колокольни понимания должно быть так.
Цитата
Дмитрий Осипов написал:
результаты первого вызова этого же запроса сохранялись?
Можно воспользоваться например поиском по теме self+referencing+tables.
Изменено: PooHkrd - 11.09.2020 01:26:26
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
для вывода на лист даты/времени выполнять все шаги кроме последнего совсем не обязательно и транслятор их по идее должен проигнорировать.
Не понимаю что будет транслятор игнорировать? Вернее почему будет игнорировать?
 
Михаил Л, т.к. М это функциональный язык, а так же он работает по схеме "ленивых вычислений, то транслятор начинает разматывать выполнение программы "с конца". В конце он увидит, что результатом работы запроса должно быть выведение в ячейку даты, далее он смотрит, что ему нужно для этого, и видит, что кроме как последний шаг, для расчетов остальные шаги не нужны, а значит и рассчитывать их не нужно. Это в процедурных языках выполняется весь код сверху вниз. В PQ - не так.
Вот горшок пустой, он предмет простой...
 
Дмитрий Осипов,
Возможно это будет вашим решением

https://blog.crossjoin.co.uk/2014/11/17/timing-power-query-queries/
 
Цитата
PooHkrd написал:
транслятор начинает разматывать выполнение программы "с конца".
Интересно получается. Если надо, то можно, наверное, через Meta сделать
 
Через meta должно сработать.
F1 творит чудеса
 
Цитата
Максим Зеленский написал:
Через meta должно сработать
То есть PooHkrd(я извиняюсь) прав? Все, что не нужно для последнего шага, не будет отработано?  
 
Цитата
Михаил Л написал:
То есть  PooHkrd (я извиняюсь) прав?
а в чём сюрприз?
Соблюдение правил форума не освобождает от модераторского произвола
 
buchlotnik, новость в том что
Цитата
Михаил Л написал:
Все, что не нужно для последнего шага, не будет отработано
 
del
Изменено: buchlotnik - 23.08.2021 18:11:18
Соблюдение правил форума не освобождает от модераторского произвола
 
Михаил Л, да, все верно, об этом очень четко и ясно сказано в документации языка.

М частично lazy evaluation - не вычисляем до тех пор, пока не потребуется, или - вычисляем только то, что требуется.
Например, имеем в Excel в ячейке A1 = 1, в ячейке B1 = A1/0 (деление на 0), в ячейке C1 = A1+1. Цепочка вычисления C1 не включает в себя B1, то есть для вычисления C1 нам надо знать только A1.
Теперь берем запрос
Код
let 
    A1 = 1, 
    B1 = = error "еггог", 
    C1 = A1 +1 
in 
    C1
Это абсолютно равнозначно
Код
[
    A1 = 1,
    B1 = = error "еггог", 
    C1 = A1 +1
][C1]
let variable-list in expression это просто syntax sugar для обращения к отдельному полю записи.

для получения C1 нам не надо знать B1, соответственно он не будет рассчитываться, и запрос не вернет ошибку, потому что:
Цитата
Выражения элементов списка и записи (а также выражения let, представленные ниже) оцениваются с помощью отложенных вычислений, что означает, что они оцениваются только по мере необходимости.
Так как let-in это получение значения поля некоей записи, то в этой записи будут вычисляться только те значения, которые необходимы для получения итогового значения (идущего после in).
Поэтому любой запрос, который мы пишем в Power Query в Excel и Power BI и в SSAS, работает именно так. Разве что при написании кастомных коннекторов есть исключения, но это не точно :)

И тут еще:
Цитата
Unless the expressions in the variable-list are accessed, they must not be evaluated.
Если нет обращения к выражениям в variable-list, они не должны вычисляться.

Вот такой запрос тоже спокойно выполнится без ошибки, так как нет необходимости рассчитывать результат false:
Код
let
    A = "some text",
    B = error "еггог",
    C = if A <> "" then A else B
in
    C
Цитата
  • The true-expression is only evaluated if the if-condition evaluates to the value true.

  • The false-expression is only evaluated if the if-condition evaluates to the value false.

В общем, палка о двух концах, нужно знать и учитывать, и чтить спецификацию языка, как уголовный кодекс :)
F1 творит чудеса
 
Цитата
Максим Зеленский написал:
Выражения элементов списка
откуда, кстати, следует, что в этом выражении будет рассчитано только одно значение списка - первое.
Код
let
    A = List.Generate(()=>[i=0, z = 1], each [i]<1000000000, each [i=[i]+1, z = Number.Power(2, i)], each [z])
    B = List.First(A)
in
    B
что будет, если запросить последнее - предлагаю проверить :)
F1 творит чудеса
 
OFF: Максим, откуда такая нелюбовь к j?
Соблюдение правил форума не освобождает от модераторского произвола
 
Максим Зеленский, спасибо
 
Михаил Л,да действительно, данные не вставились в бд, можете пожалуйста показать как сделать через meta?


возможно просто после выполнения запроса, где только вставка данных, просто выводить оповещение что данные отправлены?
Изменено: Дмитрий Осипов - 14.09.2020 12:20:30
 
Цитата
Дмитрий Осипов написал:
показать как сделать через meta?
попробуйте так
Код
in
    Custom1 meta [insert = a3]
хотя я всё же посоветовал бы по такому типу:
Код
let
     
    a1= Регион("Регион"),
    a2= Бренд("Бренд"), 
     
    a3 = Teradata.Database(
        "база_данных", 
        [Query="
                CALL PROCEDURE имя_процедуры('"&a1&"', '"&a2&"')
    "]),
    Custom1 = if (try a3)[HasError] then "Ошибка отправки данных" else "Данные отправлены на сервер в "& Text.From(Time.From(DateTime.LocalNow()))
in
    Custom1
(try a3)[HasError] здесь только как пример, не знаю, какие дает ответы Teradata если вставка не удалась, но можно было бы их отлавливать и выводить сообщения по результату.

Можно и макросом -  запишите макрорекордером обновление запроса, а в конец получившегося кода перед End Sub добавьте строку
Код
MsgBox "Данные отправлены"

но это будет значить только, что запрос обновлен, а отправлены данные или нет - макросу не видно.
F1 творит чудеса
 
По хорошему, после вставки данных, нужно бы их у БД запросить, и после получения положительного ответа уже выводить про то что данные вставлены. Ну, это я так вижу.
Вот горшок пустой, он предмет простой...
 
Раз сделал, еще вариант. И сайт  :)
Код
let 
    a1= Регион("Регион"),
    a2= Бренд("Бренд"), 
    ValueX = Teradata.Database(
        "база_данных", 
        [Query="CALL PROCEDURE имя_процедуры('"&a1&"', '"&a2&"')"]),
    Custom1 = "Данные отправлены на сервер "& DateTime.ToText(DateTime.LocalNow(),"dd MMMM в hh:mm:ss"),
    ResultTable = #table(1, {{Custom1}}),
    FinalResult = ResultTable meta [MidStep = ValueX]
in  FinalResult
Страницы: 1 2 След.
Наверх