0
I am creating a function to exit the stock, where v_saldo_item_peps
is a function that returns a table, with the items that have balance, in their respective entries.
I need to check whether v_saldo_item_peps
returned some result and go through these lines giving the outputs, while it has not reached the total and there is stock balance in the column saldo_atual_individual
.
ps. The current code works, but if the Qtd reported in the parameters is greater than the available amount, it is negative, and if there is no line returned by the function, the Qtdatual fields and values are null. What must not happen.
I put in Sqlfiddle to help: http://sqlfiddle.com/#! 17/87a17/2
Function code:
CREATE OR REPLACE FUNCTION public.saida_estoque ( produto varchar, estoque
varchar, lote varchar, qtd numeric)
RETURNS INTEGER AS
$body$
with xAtual as (
SELECT
codigo,
custo_medio,
data,
estoque,
lote,
produto,
qtd,
valor,
saldo_atual,
saldo_atual_individual
FROM
v_saldo_item_peps($1,$2,$3))
--Aqui verificar se xAtual tem registros, caso contrário cancelar tudo.
--Percorrer cada linha, executando as saídas (`INSERTS`).
--Ex. qtd = 10, na primeira linha saldo_atual_individual = 5.
--Dá saída em 5 unidades, pela primeira linha, vai para a próxima.
--Na segunda linha, saldo_atual_individual = 6.
--Dá saída em 5, e fica 1 de saldo naquela entrada.
--Se possível, ao final, retornar um INTEGER[] com todos os códigos gerados nas sáidas `(INSERT)`.
--Se chegar na última linha e ainda não tiver saldo para completar, cancelar tudo.
INSERT INTO
public.estoque
(
produto,
lote,
estoque,
data,
qtd,
valor,
saldo_anterior,
saldo_atual,
custo_medio,
id_peps,
saldo_ant_peps,
saldo_atual_peps
)
VALUES (
$1,
$3,
$2,
now(),
$4,
(SELECT x.valor from xAtual x),--valor saida
(COALESCE((SELECT x.saldo_atual from estoque x where x.produto = $1 and x.lote = $3 and x.estoque = $2 order by x.codigo desc limit 1),0)),
(coalesce((SELECT x.saldo_atual from estoque x where x.produto = $1 and x.lote = $3 and x.estoque = $2 order by x.codigo desc limit 1),0) + $4),
(SELECT x.custo_medio from xAtual x),--preco medio
(SELECT x.codigo from xAtual x) ,--Codigo da entrada q deu saída
(SELECT x.saldo_atual_individual from xAtual x),--saldo anterior
(SELECT x.saldo_atual_individual from xAtual x) + $4 --Saldo Atual
) returning codigo;
$body$
LANGUAGE 'sql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
Note: I am only doing tests, it is not my final code, disregard nomenclature / order and type of parameters / etc.