Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBExpert Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3580
_Vasilisk_
CURRENT_TIMESTAMP, по идее, тоже TIMESTAMP


Чего-то ты не договариваешь... Вот тестовый пример:
EXECUTE IBEBLOCK
AS
BEGIN
  execute statement 'CREATE TABLE TEST_TIMESTAMP (TS  TIMESTAMP)';
  commit;

  insert into test_timestamp (ts) values (current_timestamp);
  commit;

  FOR
    SELECT
      ts as ts1,
      CURRENT_TIMESTAMP AS ts2
    FROM
      test_timestamp
    AS CURSOR
      cur
  DO
  begin
    var_t1 = cur.ts1;
    var_t2 = cur.ts2;
  end;
END;


В отладчике вижу, что все ОК: значения обеих переменных одинаково сформатированы и отображаются - как таймштамп, а не как строка.
9 окт 20, 17:57    [22211635]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13360
IBExpert
В отладчике вижу, что все ОК:
В отладчике да.

Вот тебе мой пример

+ Подготовка
SET SQL DIALECT 3;

CREATE TABLE LOGS (
    ID           BIGINT GENERATED BY DEFAULT AS IDENTITY,
    "TIMESTAMP"  TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    "MESSAGE"    BLOB SUB_TYPE 1 SEGMENT SIZE 128
);

ALTER TABLE LOGS ADD CONSTRAINT PK_LOGS PRIMARY KEY (ID);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE sp_d_log (
  in_msg TYPE OF COLUMN logs."MESSAGE")
AS
BEGIN
  IN AUTONOMOUS TRANSACTION DO
    INSERT INTO logs (
      "MESSAGE"
    ) VALUES (
      :in_msg
    );
END^

SET TERM ; ^
+ Скрипт
EXECUTE IBEBLOCK
AS
BEGIN
  FOR
    SELECT
      CURRENT_TIMESTAMP AS datetime
    FROM
      rdb$database t
    AS CURSOR
      cur
  DO
    EXECUTE PROCEDURE sp_d_log(cur.datetime);

  EXECUTE PROCEDURE sp_d_log(CURRENT_TIMESTAMP);
END;
Результат
IDTIMESTAMPMESSAGE
15412.10.2020 12:57:19.20412-OCT-2020 12:57:19.0000
15512.10.2020 12:57:19.2042020-10-12 12:57:19.2040


К сообщению приложен файл. Размер - 7Kb
12 окт 20, 13:12    [22212659]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
Dimbuch®
Member

Откуда: Москва
Сообщений: 141
В процедуре надо указать тип
CREATE OR ALTER PROCEDURE sp_d_log (
  in_msg TYPE OF COLUMN logs."MESSAGE")
AS
BEGIN
  IN AUTONOMOUS TRANSACTION DO
    INSERT INTO logs (
      "MESSAGE"
    ) VALUES (
      CAST(:in_msg AS TIMESTAMP)
    );
END
12 окт 20, 14:09    [22212729]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3580
_Vasilisk_

Вот тебе мой пример


Хех, так это совсем другое дело, и в нем все правильно:

1. EXECUTE PROCEDURE sp_d_log(cur.datetime) сначала препарируется как EXECUTE PROCEDURE sp_d_log(:Param), затем параметру через AsString присваивается значение cur.datetime. Здесь и происходит конвертация из таймштампа в строку.

2. EXECUTE PROCEDURE sp_d_log(CURRENT_TIMESTAMP) отправляется на сервер как есть, конвертация выполняется сервером.
12 окт 20, 17:02    [22212878]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13360
IBExpert
2. EXECUTE PROCEDURE sp_d_log(CURRENT_TIMESTAMP) отправляется на сервер как есть, конвертация выполняется сервером.
Хорошо. А откуда тогда такое поведение?
_Vasilisk_
CREATE TABLE TEST (
    ID         INTEGER NOT NULL,
    DATETIME   TIMESTAMP
);
_Vasilisk_
EXECUTE IBEBLOCK
AS
BEGIN
  FOR
    SELECT
      t.id,
      t.datetime
    FROM
      test t
    AS CURSOR
      cur
  DO
    EXECUTE PROCEDURE sp_d_log(cur.datetime);
END;

В лог пишется "2020-10-08 17:07:12.1620"


P.S. Завтра соберу полный пример

Сообщение было отредактировано: 12 окт 20, 21:16
12 окт 20, 21:19    [22212997]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3580
_Vasilisk_
Хорошо. А откуда тогда такое поведение?


Я ж только что объяснил, п.1. Это равносильно выполнению запроса в SQL редакторе:
EXECUTE PROCEDURE sp_d_log(cast(:param as timestamp))

В лог попадет клиентский вариант конвертации таймштампа в строку, а не серверный.

Сообщение было отредактировано: 13 окт 20, 04:16
13 окт 20, 04:15    [22213123]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13360
А нельзя ли сделать так, чтобы
ibec_Cast(TRUE, __typeString);
ibec_Cast(FALSE, __typeString);
возвращало TRUE и FALSE, а не -1 и 0?
28 окт 20, 10:29    [22221964]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3580
_Vasilisk_
А нельзя ли сделать так, чтобы
ibec_Cast(TRUE, __typeString);
ibec_Cast(FALSE, __typeString);
возвращало TRUE и FALSE, а не -1 и 0?


А если у кого-то это уже используется в коде, то и фиг с ним, да?
29 окт 20, 08:29    [22222748]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13360
Для функции ibec_CreateConnection ConnectionType __ctMySQL поддерживается? Если да, то в каком формате нужно задавать параметры подключения?
29 окт 20, 14:14    [22222916]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3580
_Vasilisk_
Для функции ibec_CreateConnection ConnectionType __ctMySQL поддерживается?


Никогда не поддерживался. И в принципе MySQL давно не поддерживается.
29 окт 20, 14:31    [22222938]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13360
Почему для этого кода
EXECUTE IBEBLOCK
AS
BEGIN
  IF (
    FALSE AND
    ibec_MessageDlg('Test', __mtWarning, __mbOK) = __mrYes
  ) THEN
    ibec_ShowMessage('Nothing');
END; 
появляется сообщение Test? Или сокращенные булевские вычисления не реализованы?
3 ноя 20, 20:42    [22225983]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3580
_Vasilisk_
Или сокращенные булевские вычисления не реализованы?


Именно так. Оптимизированы только некоторые функции типа ibec_coalesce.
4 ноя 20, 04:51    [22226097]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
Viktor_bs
Member

Откуда:
Сообщений: 176
IBExpert зависает SQL редакторе на конструкции:

EXECUTE IBEBLOCK
AS
  DECLARE PERIOD_ID INTEGER = null;
BEGIN
  merge into PS_PROPOSE_SOURCE as dest
      using TMP_RAD_PS_SELLERS_ALL as src
      on dest.PERIOD_ID = src.PERIOD_ID and dest.ORGANIZATION_ID = src.ORGANIZATION_ID and dest.PERIOD_ID = :PERIOD_ID
    when matched then delete;

END;

Коннект на базу необязательный.
Загрузка процесса 100%
IBExpert 2021.1.7.1
15 янв 21, 20:37    [22264166]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3580
Viktor_bs
IBExpert зависает SQL редакторе на конструкции:


Исправил.
16 янв 21, 14:43    [22264317]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
Viktor_bs
Member

Откуда:
Сообщений: 176
IBExpert
Viktor_bs
IBExpert зависает SQL редакторе на конструкции:


Исправил.

Спасибо!
Немного не до конца...ошибка без коннекта на базу )

К сообщению приложен файл. Размер - 32Kb


Сообщение было отредактировано: 17 янв 21, 00:15
17 янв 21, 00:17    [22264546]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3580
Viktor_bs

Немного не до конца...ошибка без коннекта на базу )


Исправил.
19 янв 21, 09:46    [22265635]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
Viktor_bs
Member

Откуда:
Сообщений: 176
IBExpert
Viktor_bs

Немного не до конца...ошибка без коннекта на базу )


Исправил.

Опять не до конца :)
Происходит выход из цикла при первой итерации без каких-либо ошибок...
EXECUTE IBEBLOCK
AS
  DECLARE PERIOD_ID INTEGER = NULL;
BEGIN
  I = 0;

  -- Инициализация и расчет опорного периода
  HIGHDIM = 3;
  FOR I = 0 TO HIGHDIM DO
  BEGIN
    --PERIOD_ID = MY_PERIODS[I];
    IBEC_PROGRESS(I);


    merge into PS_PROPOSE_SOURCE as dest
        using TMP_RAD_PS_SELLERS_ALL as src
        on dest.PERIOD_ID = src.PERIOD_ID and dest.ORGANIZATION_ID = src.ORGANIZATION_ID and dest.PERIOD_ID = :PERIOD_ID
      when matched then delete;

    ibec_Sleep(100);

    commit;

  end

  ibec_MessageDlg(I, 0, 0);
END;
19 янв 21, 12:17    [22265751]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3580
Viktor_bs

Опять не до конца :)


Я не буду сам придумывать MERGE, который должен работать.
19 янв 21, 12:42    [22265770]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
Viktor_bs
Member

Откуда:
Сообщений: 176
IBExpert
Viktor_bs

Опять не до конца :)


Я не буду сам придумывать MERGE, который должен работать.

И не нужно ничего придумывать. Выполнение MERGE при первой итерации приводит к завершению цикла и выходу из IBEBlock, такого ведь быть не должно, либо следующая итерация либо ошибка.
Даже ibec_MessageDlg не вызывается.
19 янв 21, 12:49    [22265775]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3580
Viktor_bs
Выполнение MERGE при первой итерации приводит к завершению цикла и выходу из IBEBlock, такого ведь быть не должно, либо следующая итерация либо ошибка.


У меня твой MERGE по очевидным причинам не заработает. А если он не заработает, то возникнет эксепшен и на выход. Здесь все правильно.
А работающий MERGE мне придумывать лень, чтобы проверить.
19 янв 21, 16:36    [22265948]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
Viktor_bs
Member

Откуда:
Сообщений: 176
IBExpert
Viktor_bs
Выполнение MERGE при первой итерации приводит к завершению цикла и выходу из IBEBlock, такого ведь быть не должно, либо следующая итерация либо ошибка.


У меня твой MERGE по очевидным причинам не заработает. А если он не заработает, то возникнет эксепшен и на выход. Здесь все правильно.
А работающий MERGE мне придумывать лень, чтобы проверить.

А так?
CREATE table PS_PROPOSE_SOURCE (PERIOD_ID integer, ORGANIZATION_ID integer);
CREATE table TMP_RAD_PS_SELLERS_ALL  (PERIOD_ID integer, ORGANIZATION_ID integer);

p.s. Firebird3
19 янв 21, 17:09    [22265978]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3580
Viktor_bs

А так?


Другое дело. Исправил.
20 янв 21, 03:26    [22266174]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
Spz
Member

Откуда: Москва
Сообщений: 18
Добрый день!
У меня 1 ошибка и 1 пожелание.

Ошибка или баг: (IBExpert 2021.8.31.1)
при редактировании вьюшки появляется вкладка "Скрипт пересоздания",
в которой генерится что-то совершенно другое, чем редактируемая вьюшка.

И еще пожелание очень облегчающее жизнь рядовому программеру:
Сделать чтобы IBExpert умел запускать запросы в тексте окна SQL editor,
отделенные ; (подобно PL SQL Developer) и исполнять запрос где находится
курсор без необходимости точного выделения того, что надо исполнить.

Например
Select * from employees;
Select * from lamers;
Select * from firms;
если курсор находится во второй строке, то
по F9 выполнится второй запрос.

Алгоритм простой:
1. От курсора идем назад до первого знака ; или до начала полного текста, запоминаем как х1 (начало блока)
2. От курсора идем вперед до первого знака ; или до конца полного текста, запоминаем как x2 (конец блока)
3. Исполняем запрос, скопированный от x1 до x2.

Заранее спасибо.

К сообщению приложен файл. Размер - 10Kb
31 авг 21, 11:19    [22365721]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3580
Spz
Добрый день!
У меня 1 ошибка и 1 пожелание.


Какое отношение они имеют к этой теме?

1. Это именно он - скрипт пересоздания представления.

2. Разделить запросы пустой строкой и использовать Ctrl+Shift+F9.
31 авг 21, 12:09    [22365768]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
Spz
Member

Откуда: Москва
Сообщений: 18
Прошу прощения, невнимательно прочитал название темы.
Мне пересоздать сообщение или можно перенести его в корень?
31 авг 21, 15:42    [22365877]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / IBExpert Ответить