1 Отредактировано hzl (2024-06-12 19:57:08)

Тема: Update таблицы

Подскажите, в мастере свойств документа после коррекции стоит выполнение макроса и из-за этого прямой update через spformbuilder приводит к некорректному статусу транзакции. Через какой механизм можно сделать update ?
Речь идет  о справочнике и он не связан с проводками

2

Re: Update таблицы

Є два варіанти
1. Якщо потрібно щоб відпрацювала стандартна тригерна логіка то так:
select common.doprvdsql('Ваш SQL запит') from system.ioya;

2. Якщо просто змінити дані в фізичній таблиці:
EXECUTE PROCEDURE Sp_DisableTriggers(NULL,NULL,false,0);
Ваш  SQL запит;
EXECUTE PROCEDURE Sp_EnableTriggers(NULL,NULL,false,0);

3

Re: Update таблицы

Добрий день.
Дякую що надали відповідь. Невеличке уточнення.
Має бути select common.doprvdsql('Ваш SQL запит') from system.ioTa

Ще є 3 варіант.
Вручну відкрити транзакцію.
Ось приклад.
IF PRVD.StartPrvd() = TRUE
    THEN
        BEGIN TRAN;
        TRY
            /* ВАШ ЗАПИТ на Insert/Update/Delete */
               
            IF PRVD.FinishPrvd() = TRUE
                THEN
                    COMMIT WORK;       
                ELSE
                    ROLLBACK WORK;
            ENDIF;
        CATCH ALL
            ROLLBACK WORK;
            RAISE;
        END TRY;
ENDIF;

4

Re: Update таблицы

Є два варіанти
1. Якщо потрібно щоб відпрацювала стандартна тригерна логіка то так:
select common.doprvdsql('Ваш SQL запит') from system.iota;
- пробовал но возвращает ошибку, не понимаю, что не так с синтаксисом
Expected lexical element not found: identifier or expression -- Location of error in the SQL statement is: 32 [Parsing Expression (column 1 in the
SELECT clause)]
Query text :
select common.doprvdsql(update d/*!*/c000089 set art_post = REPLACE (art_post, '-','')
where brand = 192944 and kodkli = 195733)
from system.iota;



2. Якщо просто змінити дані в фізичній таблиці:
- не подходит , нужно что бы макрос отработал, поэтому отключение триггеров не вариант.

5

Re: Update таблицы

Lastrong пишет:

Добрий день.
Дякую що надали відповідь. Невеличке уточнення.
Має бути select common.doprvdsql('Ваш SQL запит') from system.ioTa

Ще є 3 варіант.
Вручну відкрити транзакцію.
Ось приклад.
IF PRVD.StartPrvd() = TRUE
    THEN
        BEGIN TRAN;
        TRY
            /* ВАШ ЗАПИТ на Insert/Update/Delete */
               
            IF PRVD.FinishPrvd() = TRUE
                THEN
                    COMMIT WORK;       
                ELSE
                    ROLLBACK WORK;
            ENDIF;
        CATCH ALL
            ROLLBACK WORK;
            RAISE;
        END TRY;
ENDIF;

    /* ВАШ ЗАПИТ на Insert/Update/Delete */ - после этого точка с запятой правильно ?
Да  спасибо, вариант в справке не подходил, там чуть больше скрипт был

6

Re: Update таблицы

hzl пишет:

- пробовал но возвращает ошибку, не понимаю, что не так с синтаксисом
Expected lexical element not found: identifier or expression -- Location of error in the SQL statement is: 32 [Parsing Expression (column 1 in the
SELECT clause)]
Query text :
select common.doprvdsql(update d/*!*/c000089 set art_post = REPLACE (art_post, '-','')
where brand = 192944 and kodkli = 195733)
from system.iota;

може потрібно передавати як строку тексту, тобто в лапках?
ну так, функція чекає memo

7

Re: Update таблицы

Lastrong пишет:

Добрий день.
Дякую що надали відповідь. Невеличке уточнення.
Має бути select common.doprvdsql('Ваш SQL запит') from system.ioTa

Ще є 3 варіант.
Вручну відкрити транзакцію.
Ось приклад.
IF PRVD.StartPrvd() = TRUE
    THEN
        BEGIN TRAN;
        TRY
            /* ВАШ ЗАПИТ на Insert/Update/Delete */
               
            IF PRVD.FinishPrvd() = TRUE
                THEN
                    COMMIT WORK;       
                ELSE
                    ROLLBACK WORK;
            ENDIF;
        CATCH ALL
            ROLLBACK WORK;
            RAISE;
        END TRY;
ENDIF;

власне, COMMON.DoPrvdSql() робить те саме (+ обробка помилок), тобто економить ваші літери і час на написання 100500 додаткових літер:)

8

Re: Update таблицы

Dr.Sydorenko пишет:
hzl пишет:

- пробовал но возвращает ошибку, не понимаю, что не так с синтаксисом
Expected lexical element not found: identifier or expression -- Location of error in the SQL statement is: 32 [Parsing Expression (column 1 in the
SELECT clause)]
Query text :
select common.doprvdsql(update d/*!*/c000089 set art_post = REPLACE (art_post, '-','')
where brand = 192944 and kodkli = 195733)
from system.iota;

може потрібно передавати як строку тексту, тобто в лапках?
ну так, функція чекає memo

Error 7200:  AQE Error:  State = S0000;
   NativeError = 2124;
  [iAny
where Solutions]
[Advantage SQL Engine]
Invalid operand for operator: - -- Location of error in the SQL statement is: 25
Query text :

select common.doprvdsql('/*!*/update dc000089 set art_post = REPLACE (art_post, '-','')
where brand = 192944 and kodkli = 195733')
from system.iota;

Точно так же ошибка пока не сделал экранирование внутри.