Trigger Para Baixar Estoque De Kits
Bom dia Pessoal,
Estou com o seguinte problema.
Tenho uma tabela de produtos, nesta tabela esta os produtos finais e tambem as materias primas (que podem ser vendidas avulso).
Por exemplo:
Produto Caminhão dentro deste produto esta vinculado varios outros produtos Peneu, Mangueira, so que dentre estes vinculos podem ocorrer outros vinculos, ex, Mangueira pode ter Terminal, Rosca e assim sucessivamente, ou seja, podem ter sei la 10 20 cadeias de vinculo.
Voltando a base de dados, eu tenho essa tabela de produtos contendo tudo, e tenho outra tabela de vinculo, que faço a relação entre os produtos, e tenho outra tabela de estoque, que é onde eu faço as baixas de estoque.
O que acontece é o seguinte, preciso que no momento que um produto seja debitado do estoque, no caso o Caminhão automaticamente TODOS os vinculos sejam debitados tambem, fiz uma trigger para isso, so que o mysql entende que é um loop infinito.
Segue tabelas e triggers.
TABELA DE PRODUTOS
CREATE TABLE `produtos` (
`id_produto` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`cod_produto` VARCHAR(255) NULL DEFAULT NULL,
`desc_produto` VARCHAR(120) NULL DEFAULT NULL,
`valor_produto` DECIMAL(10,2) UNSIGNED NULL DEFAULT NULL,
PRIMARY KEY (`id_produto`),
UNIQUE INDEX `id_produto` (`id_produto`)
)
TABELA DE VINCULOS
CREATE TABLE `estrutura` (
`id_estrutura` BIGINT(20) NOT NULL AUTO_INCREMENT,
`id_produto` BIGINT(20) NOT NULL DEFAULT 0,
`id_produto_vinculado` BIGINT(20) NOT NULL DEFAULT 0,
`nome_produto` VARCHAR(120) NOT NULL,
`qtde_estrutura` DECIMAL(10,2) NOT NULL DEFAULT 0.00,
PRIMARY KEY (`id_estrutura`)
)
TABELA DE ESTOQUE
CREATE TABLE `estoque` (
`id_estoque` BIGINT(20) NOT NULL AUTO_INCREMENT,
`id_venda` BIGINT(20) NULL DEFAULT 0,
`id_produto` BIGINT(20) NULL DEFAULT 0,
`tipo_estoque` CHAR(7) NULL DEFAULT Entrada,
`qtde_estoque` DECIMAL(10,2) NULL DEFAULT 0.00,
`obs_estoque` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id_estoque`)
)
TRIGGER NA TABELA DE ESTOQUE
DROP TRIGGER IF EXISTS `estoque_trigger`;
SET SESSION SQL_MODE=;
DELIMITER //
CREATE TRIGGER `estoque_trigger` AFTER INSERT ON `estoque` FOR EACH ROW BEGIN
INSERT INTO estoque(id_venda,id_produto,tipo_estoque,qtde_estoque,obs_estoque) SELECT NEW.id_venda,id_produto_vinculado,NEW.tipo_estoque,(NEW.qtde_estoque * qtde_estrutura),NEW.obs_estoque FROM estrutura WHERE id_produto = NEW.id_produto;
END//
DELIMITER ;
me ajudem galera heheheh..
Abraço
Estou com o seguinte problema.
Tenho uma tabela de produtos, nesta tabela esta os produtos finais e tambem as materias primas (que podem ser vendidas avulso).
Por exemplo:
Produto Caminhão dentro deste produto esta vinculado varios outros produtos Peneu, Mangueira, so que dentre estes vinculos podem ocorrer outros vinculos, ex, Mangueira pode ter Terminal, Rosca e assim sucessivamente, ou seja, podem ter sei la 10 20 cadeias de vinculo.
Voltando a base de dados, eu tenho essa tabela de produtos contendo tudo, e tenho outra tabela de vinculo, que faço a relação entre os produtos, e tenho outra tabela de estoque, que é onde eu faço as baixas de estoque.
O que acontece é o seguinte, preciso que no momento que um produto seja debitado do estoque, no caso o Caminhão automaticamente TODOS os vinculos sejam debitados tambem, fiz uma trigger para isso, so que o mysql entende que é um loop infinito.
Segue tabelas e triggers.
TABELA DE PRODUTOS
CREATE TABLE `produtos` (
`id_produto` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`cod_produto` VARCHAR(255) NULL DEFAULT NULL,
`desc_produto` VARCHAR(120) NULL DEFAULT NULL,
`valor_produto` DECIMAL(10,2) UNSIGNED NULL DEFAULT NULL,
PRIMARY KEY (`id_produto`),
UNIQUE INDEX `id_produto` (`id_produto`)
)
TABELA DE VINCULOS
CREATE TABLE `estrutura` (
`id_estrutura` BIGINT(20) NOT NULL AUTO_INCREMENT,
`id_produto` BIGINT(20) NOT NULL DEFAULT 0,
`id_produto_vinculado` BIGINT(20) NOT NULL DEFAULT 0,
`nome_produto` VARCHAR(120) NOT NULL,
`qtde_estrutura` DECIMAL(10,2) NOT NULL DEFAULT 0.00,
PRIMARY KEY (`id_estrutura`)
)
TABELA DE ESTOQUE
CREATE TABLE `estoque` (
`id_estoque` BIGINT(20) NOT NULL AUTO_INCREMENT,
`id_venda` BIGINT(20) NULL DEFAULT 0,
`id_produto` BIGINT(20) NULL DEFAULT 0,
`tipo_estoque` CHAR(7) NULL DEFAULT Entrada,
`qtde_estoque` DECIMAL(10,2) NULL DEFAULT 0.00,
`obs_estoque` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id_estoque`)
)
TRIGGER NA TABELA DE ESTOQUE
DROP TRIGGER IF EXISTS `estoque_trigger`;
SET SESSION SQL_MODE=;
DELIMITER //
CREATE TRIGGER `estoque_trigger` AFTER INSERT ON `estoque` FOR EACH ROW BEGIN
INSERT INTO estoque(id_venda,id_produto,tipo_estoque,qtde_estoque,obs_estoque) SELECT NEW.id_venda,id_produto_vinculado,NEW.tipo_estoque,(NEW.qtde_estoque * qtde_estrutura),NEW.obs_estoque FROM estrutura WHERE id_produto = NEW.id_produto;
END//
DELIMITER ;
me ajudem galera heheheh..
Abraço
Luan Stocco
Curtidas 0
Respostas
Erackson Brito
24/01/2012
Ao invés de usar recursão de TRIGGERs faça com que o TRIGGER que você criou chame uma PROCEDURE.
Essa PROCEDURE sim fará chamadas recursivas. Dessa forma você terá mais controle sobre a criação de registros na tabela de estoque em cada vínculo e sub-vínculo.
[]´s
Essa PROCEDURE sim fará chamadas recursivas. Dessa forma você terá mais controle sobre a criação de registros na tabela de estoque em cada vínculo e sub-vínculo.
[]´s
GOSTEI 0
Marcelo Augusto
24/01/2012
Amigo, desculpe a intromissão mas não seria mais interessante criar tabelas
Grupo de produtos sub_grupo_produtos categoria sub grupos e assim por diante?
Grupo de produtos sub_grupo_produtos categoria sub grupos e assim por diante?
GOSTEI 0