Stored Procedure - SP_AtualizaEstoque

Delphi

Firebird

17/12/2020

Boa tarde;
gostaria da ajuda de vocês para transformar essa stored procedure a baixo que vim neste artigo da davmedia "Implementando controle de estoque no MySQL com triggers e procedure" ; so que ja tentei e não estou conseguindo transformar para firebird.
Agradeço a todos que puderem me ajudar.


DELIMITER //
CREATE PROCEDURE `SP_AtualizaEstoque`( `id_prod` int, `qtde_comprada` int, valor_unit decimal(9,2))
BEGIN
declare contador int(11);

SELECT count(*) into contador FROM estoque WHERE id_produto = id_prod;

IF contador > 0 THEN
UPDATE estoque SET qtde=qtde + qtde_comprada, valor_unitario= valor_unit
WHERE id_produto = id_prod;
ELSE
INSERT INTO estoque (id_produto, qtde, valor_unitario) values (id_prod, qtde_comprada, valor_unit);
END IF;
END //
DELIMITER ;
Joaci Queiroz

Joaci Queiroz

Curtidas 0

Respostas

Alex William

Alex William

17/12/2020

Olá amigo, tudo bem?

Veja se este material te ajuda:

https://firebirdsql.org/refdocs/langrefupd21-ddl-procedure.html

Espero ter ajudado. :D
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

17/12/2020

deve ser algo assim:
CREATE PROCEDURE SP_AtualizaEstoque( id_prod int, qtde_mov int, tipo_mov char(1), valor_unit decimal(9,2))
AS
BEGIN
	-- garante que o produdo sempre existirá na tabela
	-- só precisa tomar cuidado com saídas de produtos que
	-- ainda não estejam na tabela, pra evitar saldo negativo
	if not exists(SELECT id_produto FROM estoque WHERE id_produto = :id_prod)
		INSERT INTO estoque (id_produto, qtde, valor_unitario) values (:id_prod, 0, 0);

	-- agora efetua a movimentação solicitada
	if (upper(:tipo_mov) = 'E') -- entrada
		UPDATE estoque SET qtde = qtde + :qtde_mov, valor_unitario = :valor_unit WHERE id_produto = :id_prod;
	else
		UPDATE estoque SET qtde = qtde - :qtde_mov, valor_unitario = :valor_unit WHERE id_produto = :id_prod;

END
GOSTEI 0
Joaci Queiroz

Joaci Queiroz

17/12/2020

deve ser algo assim:
CREATE PROCEDURE SP_AtualizaEstoque( id_prod int, qtde_mov int, tipo_mov char(1), valor_unit decimal(9,2))
AS
BEGIN
	-- garante que o produdo sempre existirá na tabela
	-- só precisa tomar cuidado com saídas de produtos que
	-- ainda não estejam na tabela, pra evitar saldo negativo
	if not exists(SELECT id_produto FROM estoque WHERE id_produto = :id_prod)
		INSERT INTO estoque (id_produto, qtde, valor_unitario) values (:id_prod, 0, 0);

	-- agora efetua a movimentação solicitada
	if (upper(:tipo_mov) = 'E') -- entrada
		UPDATE estoque SET qtde = qtde + :qtde_mov, valor_unitario = :valor_unit WHERE id_produto = :id_prod;
	else
		UPDATE estoque SET qtde = qtde - :qtde_mov, valor_unitario = :valor_unit WHERE id_produto = :id_prod;

END


obrigado, valeu
GOSTEI 0
POSTAR