Jump to content
Fórum Script Brasil
  • 0

(Resolvido) Atualização em 2 tabelas com uma trigger.


Jordano Cherobim

Question

Estou com o seguinte problema: Conforme a trigger abaixo, quando atualizo o valor do status na tabela fardo, é inserido uma nova saída na tabela saída. Agora quero pegar o ID dessa saída e colocar no idSaida dentro da tabela fardo com essa mesma trigger.

Se alguém puder ajudar, agradeço.

DELIMITER $$
CREATE TRIGGER atualizaSaida AFTER UPDATE on fardo
FOR EACH ROW
BEGIN
IF (NEW.status <> '') THEN
INSERT INTO saida (dataHora) VALUES(current_timestamp);
UPDATE fardo SET idSaida = ????? WHERE idFardoLamina = NEW.idFardoLamina;
END IF;
END $$
DELIMITER ;

Link to comment
Share on other sites

7 answers to this question

Recommended Posts

  • 0

Faça assim:

CREATE TRIGGER `test`.`atualizaSaida` BEFORE UPDATE on `test`.`fardo`
FOR EACH ROW BEGIN
   DECLARE ppidSaida INT UNSIGNED;
   IF (NEW.status <> '') THEN
      INSERT INTO saida (dataHora) VALUES(current_timestamp);
      SELECT LAST_INSERT_ID() INTO ppidSaida FROM saida;
      SET NEW.idSaida = ppidSaida;
   END IF;
END$$
O exemplo acima está usando meu banco de teste. Por favor troque para seu banco de dados.
Link to comment
Share on other sites

  • 0

Está dando um erro na alteração do status.

"ERROR 1452: 1452: Cannot add or update a child row: a foreign key constraint fails (`timber`.`fardo`, CONSTRAINT `fardo_ibfk_3` FOREIGN KEY (`idSaida`) REFERENCES `saida` (`idSaida`))"

Quando eu insiro com status = NULL, ele grava certo, porém ao tentar alterar o status para qualquer valor, ele aparece a mensagem acima.

Link to comment
Share on other sites

  • 0

Analisei a esturura de dados que você me passou em mp.

Inseri dados e atualizei conforme abaixo e não obtive erro.

insert into fardo(idFardo,`status`) values(1,"S");
update fardo set status = "N" where idfardo = 1;
A mensagem apresentada por você mostra um erro de constraint

"ERROR 1452: 1452: Cannot add or update a child row: a foreign key constraint fails (`timber`.`fardo`, CONSTRAINT `fardo_ibfk_3` FOREIGN KEY (`idSaida`) REFERENCES `saida` (`idSaida`))"
Você está tentando inserir em fardo algum valor em fardo.idsaída que não corresponde a um valor já existente em saida.idsaida?

Se sim, então este é seu erro. Não pode haver em fardo valores diferentes de nulo que não correspondam a um id válido nas tabelas com constraints.

No seu caso, fardo possui constraints com as tabelas lote, localestoque, maq, saida e op;

Link to comment
Share on other sites

  • 0

DELIMITER $$

CREATE TRIGGER insereSaidaFard BEFORE INSERT on fardo
FOR EACH ROW
BEGIN
DECLARE ultimoIdSaida INT(11);
DECLARE qtd INT(11);
SELECT quantidade INTO qtd FROM lote WHERE idLote = NEW.idLote;
IF(qtd >= NEW.consumoTora) THEN
UPDATE lote SET quantidade = quantidade - NEW.consumo WHERE idLote = NEW.idLote;
IF (NEW.status <> '') THEN
INSERT INTO saida (idSaida, dataHora) VALUES(1, current_timestamp);
SELECT LAST_INSERT_ID() INTO ultimoIdSaida FROM saida;
SET NEW.idSaida = ultimoIdSaida;
END IF;
END IF;
END $$
DELIMITER ;

Criei a trigger acima, e dá esse erro quando o status é diferente de NULL.

O erro segue abaixo:

ERROR 1452: 1452: Cannot add or update a child row: a foreign key constraint fails (`timber`.`fardo`, CONSTRAINT `fardo_ibfk_3` FOREIGN KEY (`idSaida`) REFERENCES `saida` (`idSaida`))
SQL Statement:
INSERT INTO `timber`.`fardo` (`idFardo`, `quantidade`, `altura`, `largura`, `comprimento`, `espessura`, `m3`, `consumo`, `status`, `idMaq`, `idOP`, `idLocal`, `idLote`) VALUES ('2705152', '12', '1.2', '1.2', '1.2', '1.2', '1.2', '20', 'v', '1', '5151', '1', '5151')

Meu objetivo é o seguinte:

- Quando adicionar um fardo onde o status é diferente de NULL, isso identificará que o fardo está vendido. Sendo assim, automaticamente ele adicionará uma nova saída na tabela de saídas. Após adicionar a saída, o id da ultima saída é capturado e inserido na tabela de fardos.

Link to comment
Share on other sites

  • 0

Faça estas alterações na trigger e na tabela saida

DELIMITER $$;

DROP TRIGGER `jordano`.`insereSaidaFard`$$

create trigger `insereSaidaFard` BEFORE INSERT on `fardo` 
for each row BEGIN
-- alterar estrutura de saida para que idSaida seja auto_increment;
   DECLARE ultimoIdSaida INT(11);
   DECLARE qtd INT(11);
   DECLARE ppidCliente INT(11);
   SELECT quantidade INTO qtd FROM lote WHERE idLote = NEW.idLote;
   SELECT idCliente INTO ppidCliente FROM op WHERE idOp = NEW.idOp;
   IF (qtd >= NEW.consumoTora) THEN
      UPDATE lote SET quantidade = quantidade - NEW.consumoTora WHERE idLote = NEW.idLote;
      IF LENGTH(NEW.status) <> 0 THEN
         INSERT INTO saida (dataHora, idCliente) VALUES(NOW(), ppidCliente);
         SELECT LAST_INSERT_ID() INTO ultimoIdSaida FROM saida;
         SET NEW.idSaida = ultimoIdSaida;
      END IF;
    END IF;
END;
$$

DELIMITER ;$$
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.


  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...