[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