[firebase-br] Erro no Parser - Bug ou não ?
Marcos R. Weimer
marcosweimer em gmail.com
Qui Jul 6 10:04:52 -03 2017
Vejam a seguinte estrutura:
-- Tabela MASTER ----
CREATE TABLE PRODUTOS_COMBO (
ID_COMBO INTEGER NOT NULL,
CODBARRAS VARCHAR(20) NOT NULL,
DESCRICAO VARCHAR(50),
DATA_CADASTRO DATE,
DATA_CRIACAO_ALTERACAO TIMESTAMP,
DATA_BAIXA DATE,
PRECO NUMERIC(14,4)
);
ALTER TABLE PRODUTOS_COMBO ADD CONSTRAINT PK_PRODUTOS_COMBO PRIMARY KEY
(ID_COMBO);
SET TERM ^ ;
CREATE OR ALTER TRIGGER PRODUTOS_COMBO_BIU0 FOR PRODUTOS_COMBO
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
begin
if (inserting) then
new.data_cadastro = current_date;
new.data_criacao_alteracao = current_timestamp;
if (updating) then
new.preco = (select sum(valor) from produtos_combo_itens where id_combo
= new.id_combo);
end
^
SET TERM ; ^
---- Tabela DETAIL -----
CREATE TABLE PRODUTOS_COMBO_ITENS (
ID_COMBO INTEGER NOT NULL,
SEQUENCIA INTEGER NOT NULL,
CODPRODUTO INTEGER,
CODPRODUTO_CLAS INTEGER,
UND_MEDIDA VARCHAR(10),
QUANTIDADE NUMERIC(15,4),
PRECO NUMERIC(12,2),
VALOR NUMERIC(12,2)
);
ALTER TABLE PRODUTOS_COMBO_ITENS ADD CONSTRAINT PK_PRODUTOS_COMBO_ITENS
PRIMARY KEY (ID_COMBO, SEQUENCIA);
ALTER TABLE PRODUTOS_COMBO_ITENS ADD CONSTRAINT
FK_PRODUTOS_COMBO_ITENS_COMBO FOREIGN KEY (ID_COMBO) REFERENCES
PRODUTOS_COMBO (ID_COMBO) ON DELETE CASCADE;
ALTER TABLE PRODUTOS_COMBO_ITENS ADD CONSTRAINT
FK_PRODUTOS_COMBO_ITENS_PRODUTO FOREIGN KEY (CODPRODUTO, CODPRODUTO_CLAS)
REFERENCES PRODUTOS_CLAS (CODPRODUTO, CODPRODUTO_CLAS) ON DELETE CASCADE;
SET TERM ^ ;
CREATE OR ALTER TRIGGER PRODUTOS_COMBO_ITENS_BIU0 FOR PRODUTOS_COMBO_ITENS
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
begin
new.valor = new.quantidade * new.preco;
update produtos_combo
set new.valor = 0
where id_combo = new.id_combo;
end
^
SET TERM ; ^
Certo, agora insiram um registro na tabela master, e 2 na tabela detail,
vejam que se informar QUANTIDADE e PRECO na tabela detail, a trigger
dispara, e o VALOR fica 0 ao invés de calcular corretamente.
Foi uma falta de atenção no momento de criar a trigger, observem o comando:
update produtos_combo
set new.valor = 0
where id_combo = new.id_combo;
Está fazendo update na tabela master (PRODUTOS_COMBO) mas fazem um SET em
um campo da tabela DETAIL, o campo nem sequer existe na tabela MASTER, e o
update é executado na propria tabela DETAIL
Acho que por ser new.valor = 0 o parser entende que é na tabela atual, mas
e o resto da SQL? simplesmente "abandonou" ?
Enfim, o problema foi detectado logo quando a tabela foi criada e feito o
primeiro teste ainda no ibexpert, firebird 3.0.2.32703
eu acho que deveria ocorrer algum erro na hora de compilar a trigger, e ai,
oque acham?
-=Ma®©oS=-
Marcos R. Weimer
Delphi / C# / ASP.NET / PHP / WebServices / Firebird
http://eudoparana.blogspot.com.br/
Mais detalhes sobre a lista de discussão lista