SB2 — Saldo em Estoque

Saldo de estoque por produto + armazem. Chave B2_FILIAL+B2_COD+B2_LOCAL. Atualizada por movimentos (SD3). Base de tudo no SIGAEST.

SB2 e o "saldo atual" de cada produto em cada armazem. Cada combinacao produto+armazem tem 1 registro. Nao se atualiza manualmente — e calculada/atualizada por movimentos em SD3. Movimentar SB2 direto e anti-padrao perigoso.

Campos principais

CampoTipoDescricao
B2_FILIALCFilial
B2_CODCCodigo do produto
B2_LOCALCArmazem (01, 02, CD...)
B2_QATUNSaldo atual (em estoque)
B2_QEMPNQuantidade empenhada (em OPs/pedidos)
B2_RESERVANQuantidade reservada
B2_QPEDVENNPedido de venda em aberto
B2_QPOSNEm poder de terceiros
B2_QNPTNNao posso terceiros (em meu poder)
B2_CM1NCusto medio
B2_VATU1NValor unitario atualizado
B2_QFIMNSaldo final periodo

Calculo de saldo disponivel

// Saldo disponivel "real" pra venda
nDisp := SB2->B2_QATU - SB2->B2_RESERVA - SB2->B2_QEMP
// Variantes existem dependendo das regras da empresa

Indices

OrdemChave
1B2_FILIAL+B2_COD+B2_LOCAL
2B2_FILIAL+B2_LOCAL+B2_COD

Codigo tipico

// Consultar saldo de um produto/armazem
SB2->(DBSetOrder(1))
If SB2->(DBSeek(xFilial("SB2") + "100001" + "01"))
    nSaldo := SB2->B2_QATU
EndIf

// Loop todos armazens de um produto
SB2->(DBSetOrder(1))
SB2->(DBSeek(xFilial("SB2") + "100001"))
While !SB2->(Eof()) .And. ;
      SB2->B2_FILIAL == xFilial("SB2") .And. ;
      SB2->B2_COD == "100001"

    ConOut("Armazem " + SB2->B2_LOCAL + ": " + cValToChar(SB2->B2_QATU))
    SB2->(DBSkip())
EndDo

Por que NAO mexer SB2 direto

Como mudar saldo corretamente

Tabelas relacionadas

TabelaRelacao
SD3Movimentos que afetam B2
SBFSaldo detalhado por endereco/lote (WMS)
SB1Produto (cadastro)
NNRArmazem (cadastro de locais)

Pegadinhas

Veja também