[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