Начало » Использование СУБД » Firebird, HQbird, InterBase » Глюки Firebird4 ? (Firebird 2 и 4 работают по разному)
Глюки Firebird4 ? [сообщение #611] |
Tue, 20 September 2022 16:47 |
anbsoft
Сообщений: 4 Зарегистрирован: September 2022
|
Junior Member |
|
|
Давно работал с Firebird 2.0
Решил попробовать перейти на новую версию (4).
Некоторые триггеры стали работать некорректно.
Примерно понимаю почему так, но пока не знаю что с этим делать.
Привожу код тестовой базы:
В таблице клиентов ведется долг клиента.
В таблице затрат проходят затраты по нему.
Некоторые затраты могут проходить пакетом (При проведении родительской затраты, автоматически проводятся дочернии).
Вставляем список затрат и подтверждаем их переводом State в 1
Поля Info и Test1 добавлены для понимания того, что происходит.
CREATE DATABASE 'Base2.fdb' USER 'SYSDBA' PASSWORD 'masterkey';
CREATE TABLE Klient
(
ID Integer NOT NULL,
Name VarChar(50),
Dolg NUMERIC(15,2) DEFAULT 0,
PRIMARY KEY (ID)
);
CREATE GENERATOR GEN_Klient;
SET TERM ^ ;
CREATE TRIGGER SET_Klient FOR Klient
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable IDTemp Integer;
BEGIN
IF ((NEW.ID=0) OR (NEW.ID IS NULL)) THEN BEGIN
NEW.ID=GEN_ID(GEN_Klient,1);
END
END^
SET TERM ; ^
INSERT INTO Klient (ID, Name, Dolg) VALUES (0,'Test', 0);
CREATE TABLE Zatrat
(
ID Integer NOT NULL,
Parent Integer default 0,
IDKlient Integer,
State Integer default 0,
Suma NUMERIC(15,2) DEFAULT 0,
Info VarChar(100),
Test1 Integer,
PRIMARY KEY (ID)
);
CREATE GENERATOR GEN_Zatrat;
CREATE GENERATOR GEN_Test;
SET TERM ^ ;
CREATE TRIGGER SET_Zatrat FOR Zatrat
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF ((NEW.ID=0) OR (NEW.ID IS NULL)) THEN BEGIN
NEW.ID=GEN_ID(GEN_Klient,1);
END
END^
CREATE TRIGGER Edit_Zatrat FOR Zatrat
ACTIVE BEFORE UPDATE POSITION 0
AS
declare variable S1 VarChar(20);
declare variable S2 VarChar(20);
BEGIN
IF ((OLD.State<>1) AND (NEW.State=1)) THEN BEGIN
select Dolg from klient where (ID=NEW.IDKlient) into :S1;
UPDATE Klient SET Dolg=Dolg-OLD.Suma WHERE (ID=NEW.IDKlient);
select Dolg from klient where (ID=NEW.IDKlient) into :S2;
NEW.Info=' - ' || coalesce(OLD.Info, '') || ' ' || S1 || ' ' || S2;
NEW.Test1=GEN_ID(GEN_Test,1);
END
IF ((OLD.State=1) AND (NEW.State<>1)) THEN BEGIN
UPDATE Klient SET Dolg=Dolg+OLD.Suma WHERE (ID=NEW.IDKlient);
END
END^
CREATE TRIGGER Edit_Doc FOR Zatrat
ACTIVE AFTER UPDATE POSITION 0
AS
BEGIN
IF ((NEW.Parent<>0) AND (NEW.State<>OLD.State)) THEN BEGIN
UPDATE Zatrat SET State=NEW.State WHERE (Parent=NEW.Parent) AND (State<>NEW.State) AND (ID<>NEW.ID);
END
END^
SET TERM ; ^
INSERT INTO Zatrat (ID, Parent, IDKlient, State, Suma) VALUES (1,1,1,0,10);
INSERT INTO Zatrat (ID, Parent, IDKlient, State, Suma) VALUES (2,1,1,0,30);
INSERT INTO Zatrat (ID, Parent, IDKlient, State, Suma) VALUES (3,1,1,0,50);
INSERT INTO Zatrat (ID, Parent, IDKlient, State, Suma) VALUES (4,1,1,0,200);
UPDATE Zatrat SET State=1 where (ID=1);
SELECT * FROM Klient;
ID NAME DOLG
== ======== ========
1 Test -290.00
Select * FROM Zatrat ORDER BY ID;
ID PARENT IDKLIENT STATE SUMA INFO TEST1
== ====== ======== ===== ====== =================== =====
1 1 1 1 10.00 - 0.00 -10.00 1
2 1 1 1 30.00 - -10.00 -40.00 2
3 1 1 1 50.00 - -40.00 -90.00 3
4 1 1 1 200.00 - -90.00 -290.00 4
COMMIT WORK;
В Firebird 4 результаты совсем друние:
SELECT * FROM Klient;
ID NAME DOLG
== ======== ========
1 Test -740.00
Select * FROM Zatrat ORDER BY ID;
ID PARENT IDKLIENT STATE SUMA INFO TEST1
== ====== ======== ===== ====== =================== =====
1 1 1 1 10.00 - 0.00 -10.00 1
2 1 1 1 30.00 - -10.00 -40.00 2
3 1 1 1 50.00 - -490.00 -540.00 6
4 1 1 1 200.00 - -540.00 -740.00 7
Видно, что между обновлением 2 и 3 строки еще трижды проходит обновление, но никаких следов не оставляет.
Как побороть эту напасть?
|
|
|
|
|
Глюки Firebird4 ?
От: anbsoft - Tue, 20 September 2022 16:47
|
|
|
Re: Глюки Firebird4 ?
От: SD - Wed, 21 September 2022 00:37
|
|
|
Re: Глюки Firebird4 ?
От: fraks - Wed, 21 September 2022 04:56
|
|
|
Re: Глюки Firebird4 ?
От: SD - Wed, 21 September 2022 15:13
|
|
|
Re: Глюки Firebird4 ?
От: sim_84 - Thu, 22 September 2022 11:21
|
|
|
Re: Глюки Firebird4 ?
От: fraks - Fri, 23 September 2022 10:57
|
|
|
Re: Глюки Firebird4 ?
От: basid - Fri, 23 September 2022 11:12
|
|
|
Re: Глюки Firebird4 ?
От: fraks - Mon, 26 September 2022 09:08
|
|
|
Re: Глюки Firebird4 ?
От: sim_84 - Mon, 26 September 2022 09:39
|
|
|
Re: Глюки Firebird4 ?
От: hvlad - Mon, 26 September 2022 10:26
|
|
|
Re: Глюки Firebird4 ?
От: anbsoft - Tue, 27 September 2022 12:37
|
|
|
Re: Глюки Firebird4 ?
От: hvlad - Tue, 27 September 2022 13:10
|
|
|
Re: Глюки Firebird4 ?
От: МП - Tue, 27 September 2022 13:12
|
|
|
Re: Глюки Firebird4 ?
От: sim_84 - Tue, 27 September 2022 15:06
|
|
|
Re: Глюки Firebird4 ?
От: anbsoft - Tue, 27 September 2022 15:49
|
|
|
Re: Глюки Firebird4 ?
От: fraks - Wed, 21 September 2022 05:23
|
|
|
Re: Глюки Firebird4 ?
От: fraks - Wed, 21 September 2022 05:30
|
|
|
Re: Глюки Firebird4 ?
От: fraks - Wed, 21 September 2022 05:43
|
|
|
Re: Глюки Firebird4 ?
От: fraks - Wed, 21 September 2022 06:16
|
|
|
Re: Глюки Firebird4 ?
От: fraks - Wed, 21 September 2022 07:08
|
|
|
Re: Глюки Firebird4 ?
От: fraks - Wed, 21 September 2022 07:10
|
|
|
Re: Глюки Firebird4 ?
От: anbsoft - Wed, 21 September 2022 12:04
|
|
|
Re: Глюки Firebird4 ?
От: kdv - Thu, 22 September 2022 00:46
|
Переход к форуму:
Текущее время: Thu Dec 19 13:26:16 GMT+3 2024
Общее время, затраченное на создание страницы: 0.01146 секунд
|