Gestão de Estoque usando Fifo

Delphi

15/04/2013

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
Osvaldo Nguli

Osvaldo Nguli

Curtidas 0

Respostas

Osvaldo Nguli

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.


GOSTEI 0
Joel Rodrigues

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.
GOSTEI 0
Osvaldo Nguli

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
GOSTEI 0
Joel Rodrigues

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?

GOSTEI 0
Osvaldo Nguli

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)...


GOSTEI 0
Joel Rodrigues

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:
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

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.

GOSTEI 0
Joel Rodrigues

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.
GOSTEI 0
Joel Rodrigues

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.
GOSTEI 0
Bruno Leandro

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.
GOSTEI 0
Joel Rodrigues

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

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
GOSTEI 0
Francisco Macário

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.
GOSTEI 0
Osvaldo Nguli

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.
GOSTEI 0
João Cruz

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.


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

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
GOSTEI 0
Nelson Santos

Nelson Santos

15/04/2013

Desenvolva softwares 3D em Delphi 7
www.3dsistemas.com.br
GOSTEI 0
POSTAR