I am creating a function to output inventory, 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 if v_saldo_item_peps
returned some result and go through these lines giving the outputs, until you have reached the total and there is balance in stock in the saldo_atual_individual
column.
Ps. The current code works, but if the Qtd entered in the parameters is greater than the available quantity, it is negative, and if there is no row returned by the function, the QtyTable fields and values are null. What can not happen.
I put it in SQLFiddle to help: link
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'm just testing, it's not my final code, disregarding nomenclature / order and type of parameters / etc.