Gestão de Estoque usando Fifo
Bom Dia Pessoal
preciso fazer um programa de Gestão de
Estoque em delphi 2010 com base de dado SQL server 2013
usando a avaliação de estoque FIFO
Desculpem o encomodo mais sou novo aqui
preciso fazer um programa de Gestão de
Estoque em delphi 2010 com base de dado SQL server 2013
usando a avaliação de estoque FIFO
Desculpem o encomodo mais sou novo aqui
Osvaldo Nguli
Curtidas 0
Respostas
Osvaldo Nguli
15/04/2013
Desculpa não detalhei
se tiver um algoritimo em delphi para fazer manda
se tiver um geito em sql para fazer e depois ligar no delphi manda
fiz as tabelas em sql interliguei com o delphi 2010
mais o que quero é que quando definir o tipo de movimento
ex: Fifo o sistema deve descontar o mercadoria do primeiro registo feito ou da data
mais antiga.
se tiver um algoritimo em delphi para fazer manda
se tiver um geito em sql para fazer e depois ligar no delphi manda
fiz as tabelas em sql interliguei com o delphi 2010
mais o que quero é que quando definir o tipo de movimento
ex: Fifo o sistema deve descontar o mercadoria do primeiro registo feito ou da data
mais antiga.
GOSTEI 0
Joel Rodrigues
15/04/2013
Cara, o que é exatamente FIFO neste caso? First In, First Out?
Se for, como isso se aplica ao controle de estoque? Explique melhor que talvez possamos te ajudar.
Abraço.
Se for, como isso se aplica ao controle de estoque? Explique melhor que talvez possamos te ajudar.
Abraço.
GOSTEI 0
Osvaldo Nguli
15/04/2013
tenho uma tabela em sql server chamada Estoque
TABELA: Estoque
CHAVE CAMPO DESCRIÇÃO TIPO DE DADOS
C.P ID_Estoque Identidade do Estoque Integer
C.E ID_Produto Identidade do produto Integer
Estoque_min Estoque minimo do produto Integer
Estoque_max Estoque maximo do produto Integer
Ponto_reposi Ponto de Reposição do produto Integer
Estoque_act Estoque actual do produto Integer
Quero que nesta tabela seje dininuda ou soma sempre que eu der entrada ou saida de um produto
mais seguindo a avaliação de estoque FIFO (First in First out.
Ex: Cadastrei no dia
20/3/2013 50 sacos de arroz com preço 10 usd
23/3/2013 10 sacos de arroz com preço de 5 usd
no dia 25/03/2013 o cliente comprou 25 sacos
o sitema deve verificar o produto mais antigo
e diminui-lo até que chegue a estoque "0" Zero so depois continua a vender o produto
cadastrado no dia 23/3/2013.
Por favor ser paciente pois sou leigo em questóes de Fórum
TABELA: Estoque
CHAVE CAMPO DESCRIÇÃO TIPO DE DADOS
C.P ID_Estoque Identidade do Estoque Integer
C.E ID_Produto Identidade do produto Integer
Estoque_min Estoque minimo do produto Integer
Estoque_max Estoque maximo do produto Integer
Ponto_reposi Ponto de Reposição do produto Integer
Estoque_act Estoque actual do produto Integer
Quero que nesta tabela seje dininuda ou soma sempre que eu der entrada ou saida de um produto
mais seguindo a avaliação de estoque FIFO (First in First out.
Ex: Cadastrei no dia
20/3/2013 50 sacos de arroz com preço 10 usd
23/3/2013 10 sacos de arroz com preço de 5 usd
no dia 25/03/2013 o cliente comprou 25 sacos
o sitema deve verificar o produto mais antigo
e diminui-lo até que chegue a estoque "0" Zero so depois continua a vender o produto
cadastrado no dia 23/3/2013.
Por favor ser paciente pois sou leigo em questóes de Fórum
GOSTEI 0
Joel Rodrigues
15/04/2013
Rapaz, mas como isso fica organizado no BD? Por exemplo, você deu entrada no mesmo produto em duas datas. Nesse caso, cada entrada deve ter algo que diferencie o produto, como uma data de vencimento.
Se não, veja só o cenário:
- Estoque inicial do produto ARROZ: 10
- Entrada de 10 unidades de ARROZ com preço X
- Entrada de 5 unidades de ARROZ com preço Y
- Estoque atual do produto ARROZ: 25
Beleza, temos 25 unidades em estoque. Mas como eu diferencio o que foi da primeira entrada e o que foi da segunda?
Se não, veja só o cenário:
- Estoque inicial do produto ARROZ: 10
- Entrada de 10 unidades de ARROZ com preço X
- Entrada de 5 unidades de ARROZ com preço Y
- Estoque atual do produto ARROZ: 25
Beleza, temos 25 unidades em estoque. Mas como eu diferencio o que foi da primeira entrada e o que foi da segunda?
GOSTEI 0
Osvaldo Nguli
15/04/2013
a minha pegunta é extamente está ai que fizentes.
Como eu diferencio na BD o produto mais antigo para eu diminuir?
EX:
se a data for mais antiga então
Estoque_act = estoque-quntidade vendida (da tabela vendas)...
Como eu diferencio na BD o produto mais antigo para eu diminuir?
EX:
se a data for mais antiga então
Estoque_act = estoque-quntidade vendida (da tabela vendas)...
GOSTEI 0
Joel Rodrigues
15/04/2013
Aí você precisaria ter alguma referência à data da entrada, por exemplo, na tabela de estoque. Nesse caso, haveria mais de um registro para o mesmo produto, mudando apenas a data. Por exemplo:
Seria algo assim que você precisa?
COD | DESCRICAO | PRECO | DATA | ESTOQUE --------------------------------------------- 001 | ARROZ | 1,5 | 01/01/2001 | 10 001 | ARROZ | 2,0 | 02/02/2002 | 5 001 | ARROZ | 3,2 | 03/03/2003 | 13
Seria algo assim que você precisa?
GOSTEI 0
Osvaldo Nguli
15/04/2013
é isso estamos a chegar lá.
COD | DESCRICAO | PRECO | DATA | ESTOQUE
---------------------------------------------
001 | ARROZ | 1,5 | 01/01/2001 | 10
001 | ARROZ | 2,0 | 02/02/2002 | 5
001 | ARROZ | 3,2 | 03/03/2003 | 13
nesta tabela o sistema devera primero verificar a primeira data (01/01/2001) e vender
os 10 sacos de arroz ao preço 1.5 quando tiver zerado
começa a vender os 5 sacos arroz da segunda (02/02/2002) data ao preço 2....
resumindo quero em SQl ou delphi 2010 uma maneira de verificar a data mais antiga
e depois diminuir o estoque desta data.
COD | DESCRICAO | PRECO | DATA | ESTOQUE
---------------------------------------------
001 | ARROZ | 1,5 | 01/01/2001 | 10
001 | ARROZ | 2,0 | 02/02/2002 | 5
001 | ARROZ | 3,2 | 03/03/2003 | 13
nesta tabela o sistema devera primero verificar a primeira data (01/01/2001) e vender
os 10 sacos de arroz ao preço 1.5 quando tiver zerado
começa a vender os 5 sacos arroz da segunda (02/02/2002) data ao preço 2....
resumindo quero em SQl ou delphi 2010 uma maneira de verificar a data mais antiga
e depois diminuir o estoque desta data.
GOSTEI 0
Joel Rodrigues
15/04/2013
Rapaz, aqui só de cabeça mesmo eu pensei o seguinte: pra dar baixa no estoque você faz um select ordenando pela data de forma ascendente. Só manda fazer o update no registro mais antigo, independente de quanto tem em estoque e quanto precisa baixar.
Porém, você cria um trigger nessa tabela para não permitir dar baixa em quantidades superiores ao que tem no estoque. Se a quantidade baixada for maior, repassa a diferença para o próximo registro. Como isso vai estar em um trigger, se tornará recursivo e irá repassando as quantidades adiante, caso não tenha estoque suficiente na data em questão.
Porém, você cria um trigger nessa tabela para não permitir dar baixa em quantidades superiores ao que tem no estoque. Se a quantidade baixada for maior, repassa a diferença para o próximo registro. Como isso vai estar em um trigger, se tornará recursivo e irá repassando as quantidades adiante, caso não tenha estoque suficiente na data em questão.
GOSTEI 0
Joel Rodrigues
15/04/2013
Daqui a pouco eu tento fazer algo aqui nesse sentido e te aviso sobre os resultados, mas aconselho a você ir tentando implementar, pois não sei de que horas vou dar um retorno.
Abraço.
Abraço.
GOSTEI 0
Bruno Leandro
15/04/2013
voce pode conseguir dar baixar no sistema no produto com vencimento menor ou compra mais antiga, mas o codigo de barras de um mesmo produto normalmente nao muda, entao quando voce ler o codigo de barras voce nao tem como identificar a qual data ele pertence.
essa responsabilidade tem que ficar a cargo dos repositores, que tem que colocar os produtos mais antigos na frente ou na prateleira.
a nao ser que voce gere um codigo de barras a cada entrada do produto, ai toda compra voce tem o lote, data entrada, data vencimento e o codigo de barras que voce gerou, ai sim. se for o codigo de barras do produto nao da pra fazer o que voce esta pensando.
essa responsabilidade tem que ficar a cargo dos repositores, que tem que colocar os produtos mais antigos na frente ou na prateleira.
a nao ser que voce gere um codigo de barras a cada entrada do produto, ai toda compra voce tem o lote, data entrada, data vencimento e o codigo de barras que voce gerou, ai sim. se for o codigo de barras do produto nao da pra fazer o que voce esta pensando.
GOSTEI 0
Joel Rodrigues
15/04/2013
Pois é, Bruno. Eu também concordo. Até por que, o sistema pode dar baixar em uma mercadoria mais antiga e o operador vender uma mais recente por algum motivo. Aí a bagunça estaria feita.
GOSTEI 0
Osvaldo Nguli
15/04/2013
Em gestão de estoque existe varias maneiras de se avaliar o estoque
que São Fifo Lifo media ponderada movel entre outras.
no youtube se pesquisar por gestão de estoque usando Fifo ou lifo
vão ver feito numa tabela em excel é mais ou menos dá quela meneira que quero
usar.
sei que existe um software "SAGE Gestão comercial" que tem tal função
vem o video no youtube e me dão um toque
que São Fifo Lifo media ponderada movel entre outras.
no youtube se pesquisar por gestão de estoque usando Fifo ou lifo
vão ver feito numa tabela em excel é mais ou menos dá quela meneira que quero
usar.
sei que existe um software "SAGE Gestão comercial" que tem tal função
vem o video no youtube e me dão um toque
GOSTEI 0
Francisco Macário
15/04/2013
Olá.
Qual a atividade comercial que pretende atender com esse controle?
FIFO geralmente é para industria com manufatura. Onde há necessidade de rastreabilidade por meio de LOTE+Data IN. Para sistemas de PCP.
Onde na tabela de movimentação do estoque você lança o LOTE que será debitado a quantidade.
Espero que ajude.
Qual a atividade comercial que pretende atender com esse controle?
FIFO geralmente é para industria com manufatura. Onde há necessidade de rastreabilidade por meio de LOTE+Data IN. Para sistemas de PCP.
Onde na tabela de movimentação do estoque você lança o LOTE que será debitado a quantidade.
Espero que ajude.
GOSTEI 0
Osvaldo Nguli
15/04/2013
é um tema proposto na minha escola
criar o software de gestão de estoque
que use 3 modalidade de estoque (Fifo; Lifo; e média movel Ponderada)...
se for diminuir na tabela estoque sem pensar nisto
eu dava um jeito mas com este criterios não vejo
como.
criar o software de gestão de estoque
que use 3 modalidade de estoque (Fifo; Lifo; e média movel Ponderada)...
se for diminuir na tabela estoque sem pensar nisto
eu dava um jeito mas com este criterios não vejo
como.
GOSTEI 0
João Cruz
15/04/2013
voce pode conseguir dar baixar no sistema no produto com vencimento menor ou compra mais antiga, mas o codigo de barras de um mesmo produto normalmente nao muda, entao quando voce ler o codigo de barras voce nao tem como identificar a qual data ele pertence.
essa responsabilidade tem que ficar a cargo dos repositores, que tem que colocar os produtos mais antigos na frente ou na prateleira.
a nao ser que voce gere um codigo de barras a cada entrada do produto, ai toda compra voce tem o lote, data entrada, data vencimento e o codigo de barras que voce gerou, ai sim. se for o codigo de barras do produto nao da pra fazer o que voce esta pensando.
essa responsabilidade tem que ficar a cargo dos repositores, que tem que colocar os produtos mais antigos na frente ou na prateleira.
a nao ser que voce gere um codigo de barras a cada entrada do produto, ai toda compra voce tem o lote, data entrada, data vencimento e o codigo de barras que voce gerou, ai sim. se for o codigo de barras do produto nao da pra fazer o que voce esta pensando.
Esta situação vai acontecer certamente: Imaginando em um supermercado, se o repositor colocar mercadorias de datas diferentes, o que se pode fazer é baixar pelos mais antigos filtrando pelo no.do lote, que passaria ser campo obrigatorio na digitação desde a entrada, e em todas as movimentacoes (venda, transferencia, devolucoes, cancelamentos, refugo, inventario etc).
Obs.: FIFO pode conflitar com data de validade de lote, que é a prioridade de saída. Veja sobre FEFO (primeiro a expirar é o primeiro a sair) e sua legalidade contábil
Abs
João Batista
GOSTEI 0
Francisco Costa
15/04/2013
vou te passar uma procedure e uma chamada de preço médio ponderado que vai calculando o preço do estoque por movimento. ( dia a dia )
1o. a procedure:
CREATE OR ALTER PROCEDURE CMPM_PERMANENTE (
loj_codigo integer,
fim date)
returns (
pro_codigo varchar(14),
pro_prcmedio numeric(15,2),
pro_qtdatual numeric(15,2),
pro_cont integer)
as
declare variable pro_cod varchar(14);
declare variable pro_total numeric(15,2);
declare variable pro_qtd numeric(15,2);
declare variable pro_opr integer;
declare variable pro_totalacu numeric(15,2);
declare variable pro_pm numeric(15,2);
declare variable pro_qtdacu numeric(15,2);
declare variable iii integer;
declare variable pro_cd varchar(14);
begin
pro_totalacu = 0;
pro_qtdacu = 0;
pro_pm = 0;
pro_cd = '-1';
iii = 0;
for
/* entradas ( compras ) */
select
r.pro_codigo,
r.op,
r.qt,
r.vl
from (
select
ita.pro_codigo,
1 op,
eta.eta_data dt,
sum(ita.ita_qtde) qt,
sum(ita.ita_liquido + coalesce(ita.ita_vlrfrete,0) +coalesce(ita.ita_vlripi,0) +coalesce(ita.ita_vlroutras,0) +
coalesce(ita.ita_vlrseguro,0) + coalesce(ita.ita_vlrii,0) + coalesce(ita.ita_vlrpis,0) + coalesce(ita.ita_vlrcofins,0) -
ita.ita_vlricms) vl
from
itens_eta ita
inner join entradas_apoio eta on eta.eta_numero=ita.eta_numero
where eta.sit_codigo<=2 and
eta.loj_codigo=:loj_codigo and
eta.eta_data<=:fim
group by 1,2,3
union all
/* entradas ( devolucao de vendas ) */
select
inf.pro_codigo,
3 op,
ntf.ntf_data dt,
sum(inf.inf_qtde) qt,
sum(0.00) vl
from
itensntf inf
inner join notasfiscais ntf on ntf.ntf_numero=inf.ntf_numero
where ntf.sit_codigo <= 2 and
ntf.loj_codigo=:loj_codigo and
ntf.ntf_data<=:fim and
ntf.ntf_tipo='E'
group by 1,2,3
union all
/* saídas ( vendas ) */
select
inf.pro_codigo,
2 op,
ntf.ntf_data dt,
sum(inf.inf_qtde) qt,
sum(0.00) vl
from
itensntf inf
inner join notasfiscais ntf on ntf.ntf_numero=inf.ntf_numero
where ntf.sit_codigo <= 2 and
ntf.loj_codigo=:loj_codigo and
ntf.ntf_data<=:fim and
ntf.ntf_tipo='S'
group by 1,2,3 ) r order by r.pro_codigo, r.dt, r.op
into :pro_cod, :pro_opr, :pro_qtd, :pro_total
do
begin
if ((:iii>=0) and (:pro_cod<>:pro_cd)) then
begin
pro_totalacu = 0;
pro_qtdacu = 0;
pro_pm = 0;
pro_cd=:pro_cod;
end
else
pro_cd=:pro_cod;
if ((:pro_totalacu=0) and (:pro_opr=1)) then
pro_totalacu = pro_total;
else
pro_totalacu = pro_totalacu + pro_total;
if (:pro_opr=1) then
begin
pro_qtdacu = pro_qtdacu + pro_qtd;
end
else
if (:pro_opr=2) then
begin
pro_totalacu = pro_totalacu - (pro_qtd * pro_pm);
pro_qtdacu = pro_qtdacu - pro_qtd;
end
else
if (:pro_opr=3) then
begin
pro_totalacu = pro_totalacu + (pro_qtd * pro_pm);
pro_qtdacu = pro_qtdacu + pro_qtd;
end
if ((:pro_totalacu>0) and (:pro_qtdacu>0)) then
pro_pm = pro_totalacu / pro_qtdacu;
iii = iii + 1;
pro_codigo =:pro_cod;
pro_prcmedio =:pro_pm;
pro_qtdatual =:pro_qtdacu;
pro_cont = :iii;
suspend;
end
end
2o. a chamada
select
r.pro_codigo,
p.pro_descricao,
r.pro_prcmedio,
r.pro_qtdatual
from
cmpm_permanente( 1, current_date) r
inner join produtos p on p.pro_codigo=r.pro_codigo
inner join ( select pro_codigo, max(pro_cont) pro_ult
from
cmpm_permanente(1, current_date)
group by 1 order by 1 ) rr on (r.pro_codigo=rr.pro_codigo and r.pro_cont=rr.pro_ult)
order by 2
1o. a procedure:
CREATE OR ALTER PROCEDURE CMPM_PERMANENTE (
loj_codigo integer,
fim date)
returns (
pro_codigo varchar(14),
pro_prcmedio numeric(15,2),
pro_qtdatual numeric(15,2),
pro_cont integer)
as
declare variable pro_cod varchar(14);
declare variable pro_total numeric(15,2);
declare variable pro_qtd numeric(15,2);
declare variable pro_opr integer;
declare variable pro_totalacu numeric(15,2);
declare variable pro_pm numeric(15,2);
declare variable pro_qtdacu numeric(15,2);
declare variable iii integer;
declare variable pro_cd varchar(14);
begin
pro_totalacu = 0;
pro_qtdacu = 0;
pro_pm = 0;
pro_cd = '-1';
iii = 0;
for
/* entradas ( compras ) */
select
r.pro_codigo,
r.op,
r.qt,
r.vl
from (
select
ita.pro_codigo,
1 op,
eta.eta_data dt,
sum(ita.ita_qtde) qt,
sum(ita.ita_liquido + coalesce(ita.ita_vlrfrete,0) +coalesce(ita.ita_vlripi,0) +coalesce(ita.ita_vlroutras,0) +
coalesce(ita.ita_vlrseguro,0) + coalesce(ita.ita_vlrii,0) + coalesce(ita.ita_vlrpis,0) + coalesce(ita.ita_vlrcofins,0) -
ita.ita_vlricms) vl
from
itens_eta ita
inner join entradas_apoio eta on eta.eta_numero=ita.eta_numero
where eta.sit_codigo<=2 and
eta.loj_codigo=:loj_codigo and
eta.eta_data<=:fim
group by 1,2,3
union all
/* entradas ( devolucao de vendas ) */
select
inf.pro_codigo,
3 op,
ntf.ntf_data dt,
sum(inf.inf_qtde) qt,
sum(0.00) vl
from
itensntf inf
inner join notasfiscais ntf on ntf.ntf_numero=inf.ntf_numero
where ntf.sit_codigo <= 2 and
ntf.loj_codigo=:loj_codigo and
ntf.ntf_data<=:fim and
ntf.ntf_tipo='E'
group by 1,2,3
union all
/* saídas ( vendas ) */
select
inf.pro_codigo,
2 op,
ntf.ntf_data dt,
sum(inf.inf_qtde) qt,
sum(0.00) vl
from
itensntf inf
inner join notasfiscais ntf on ntf.ntf_numero=inf.ntf_numero
where ntf.sit_codigo <= 2 and
ntf.loj_codigo=:loj_codigo and
ntf.ntf_data<=:fim and
ntf.ntf_tipo='S'
group by 1,2,3 ) r order by r.pro_codigo, r.dt, r.op
into :pro_cod, :pro_opr, :pro_qtd, :pro_total
do
begin
if ((:iii>=0) and (:pro_cod<>:pro_cd)) then
begin
pro_totalacu = 0;
pro_qtdacu = 0;
pro_pm = 0;
pro_cd=:pro_cod;
end
else
pro_cd=:pro_cod;
if ((:pro_totalacu=0) and (:pro_opr=1)) then
pro_totalacu = pro_total;
else
pro_totalacu = pro_totalacu + pro_total;
if (:pro_opr=1) then
begin
pro_qtdacu = pro_qtdacu + pro_qtd;
end
else
if (:pro_opr=2) then
begin
pro_totalacu = pro_totalacu - (pro_qtd * pro_pm);
pro_qtdacu = pro_qtdacu - pro_qtd;
end
else
if (:pro_opr=3) then
begin
pro_totalacu = pro_totalacu + (pro_qtd * pro_pm);
pro_qtdacu = pro_qtdacu + pro_qtd;
end
if ((:pro_totalacu>0) and (:pro_qtdacu>0)) then
pro_pm = pro_totalacu / pro_qtdacu;
iii = iii + 1;
pro_codigo =:pro_cod;
pro_prcmedio =:pro_pm;
pro_qtdatual =:pro_qtdacu;
pro_cont = :iii;
suspend;
end
end
2o. a chamada
select
r.pro_codigo,
p.pro_descricao,
r.pro_prcmedio,
r.pro_qtdatual
from
cmpm_permanente( 1, current_date) r
inner join produtos p on p.pro_codigo=r.pro_codigo
inner join ( select pro_codigo, max(pro_cont) pro_ult
from
cmpm_permanente(1, current_date)
group by 1 order by 1 ) rr on (r.pro_codigo=rr.pro_codigo and r.pro_cont=rr.pro_ult)
order by 2
GOSTEI 0
Nelson Santos
15/04/2013
Desenvolva softwares 3D em Delphi 7
www.3dsistemas.com.br
www.3dsistemas.com.br
GOSTEI 0