GARANTIR DESCONTO

Fórum multiple rows in a singleton selection #57851

09/02/2007

0

Pessoal, estou tendo esse erro (citado no título) quando minha trigger é disparada. Vejam o SQL:

CREATE TRIGGER VOLTAR_ESTOQUE_VENDA FOR ITENSMOVIMENTO
ACTIVE BEFORE DELETE POSITION 0
AS
declare cod integer = 0;
begin

    SELECT OLD.COD FROM ITENSMOVIMENTO INTO :COD;

end


A intençao nesse caso, é saber o código (PK) do registro deletado.

O que está errado nesta trigger?


Kopcheski

Kopcheski

Responder

Posts

09/02/2007

Sremulador

Amigo vc deve especificar com um where apenas um registro, pois desta formar estar[a fazendo um select na tabela toda.

CREATE TRIGGER VOLTAR_ESTOQUE_VENDA FOR ITENSMOVIMENTO 
ACTIVE BEFORE DELETE POSITION 0 
AS 
declare cod integer = 0; 
begin 

    SELECT OLD.COD FROM ITENSMOVIMENTO WHERE NEW.COD=???   INTO :COD DO SUEPEND;

end 



Responder

Gostei + 0

09/02/2007

Emerson Nascimento

uma coisa está redundante: se você está excluindo os registros da tabela ITENSMOVIMENTO, porque você está tentando executar o select nessa mesma tabela?
não é necessário, visto que OLD é uma tabela temporária com os registros da tabela ITENSMOVIMENTO que estão sendo excluídos.

explique melhor o que você deseja fazer que talvez possamos dar alguma dica que te ajude na solução do seu problema.


Responder

Gostei + 0

09/02/2007

Kopcheski

Ok, explicarei melhor. :)

Quando eu excluo um item da tabela ITENSMOVIMENTO, eu gostaria de saber qual registro foi deletado. Por isso eu usei old.cod. Sabendo qual item foi deletado, eu faço algumas outras operaçoes. Mas em resumo, eu preciso saber qual registro da tabela ITENSMOVIMENTO foi excluído. E de preferencia, através de triggers, já que o uso de procedures com hibernate é bem complicado. Muito complicado.


Responder

Gostei + 0

09/02/2007

Emerson Nascimento

certo... old.cod é uma PK na tabela ITENSMOVIMENTO?

publique a estrutura dessa tabela


Responder

Gostei + 0

09/02/2007

Kopcheski

CREATE TABLE ITENSMOVIMENTO (
    COD               INTEGER NOT NULL,
    QUANT             FLOAT,
    PRC               DOUBLE PRECISION,
    OPERACAO          VARCHAR(1),
    ORCAMENTO_CODORC  INTEGER,
    SERVICO_COD       INTEGER
);

ALTER TABLE ITENSMOVIMENTO ADD PRIMARY KEY (COD);
ALTER TABLE ITENSMOVIMENTO ADD CONSTRAINT FKFAA9E71D155A10C2 FOREIGN KEY (ORCAMENTO_CODORC) REFERENCES ORCAMENTO (CODORC);
ALTER TABLE ITENSMOVIMENTO ADD CONSTRAINT FKFAA9E71D3C3160B2 FOREIGN KEY (SERVICO_COD) REFERENCES SERVICO (COD);



Responder

Gostei + 0

09/02/2007

Emerson Nascimento

certo. então trabalhe diretamente com OLD.COD
supondo que sua tabela de itens comportasse produtos de uma nota fiscal de saida/venda, o saldo em estoque poderia ser realimentado assim:
CREATE TRIGGER VOLTAR_ESTOQUE_VENDA FOR ITENSMOVIMENTO
ACTIVE BEFORE DELETE POSITION 0
AS
begin
    update ProdutoSaldo set
        Saldo = Saldo + OLD.Quant
    where
        Produto = OLD.COD
end
você não precisa selecionar os dados. você já está com eles no registro temporário OLD. basta trabalhar com os campos que você deseja.


Responder

Gostei + 0

11/02/2007

Kopcheski

vlw emerson..

enquanto postava aqui, estive tentanto dar um jeito nisso..
Muito obrigado pela ajuda! :)


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar