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
| Campo | Tipo | Descricao |
| B2_FILIAL | C | Filial |
| B2_COD | C | Codigo do produto |
| B2_LOCAL | C | Armazem (01, 02, CD...) |
| B2_QATU | N | Saldo atual (em estoque) |
| B2_QEMP | N | Quantidade empenhada (em OPs/pedidos) |
| B2_RESERVA | N | Quantidade reservada |
| B2_QPEDVEN | N | Pedido de venda em aberto |
| B2_QPOS | N | Em poder de terceiros |
| B2_QNPT | N | Nao posso terceiros (em meu poder) |
| B2_CM1 | N | Custo medio |
| B2_VATU1 | N | Valor unitario atualizado |
| B2_QFIM | N | Saldo 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
| Ordem | Chave |
| 1 | B2_FILIAL+B2_COD+B2_LOCAL |
| 2 | B2_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
- Sistema mantem consistencia via SD3 (movimentos) + recalculo
- Mudar B2_QATU sem SD3 = "saldo fantasma" — bate na hora, quebra depois
- SPED Fiscal compara K200 (escriturado) vs SB2 — divergencia = problema
- Custo medio e recalculado em movimentos — direto, custo fica errado
Como mudar saldo corretamente
- Inventario fisico (MATA240) — ajuste por contagem
- Movimento manual (MATA250) — registra em SD3 + atualiza SB2
- Inclusao via NF — D1/D2 geram SD3 automatico
- OP (apontamento) — MATA340 atualiza saldo de PA + baixa MP
Tabelas relacionadas
| Tabela | Relacao |
| SD3 | Movimentos que afetam B2 |
| SBF | Saldo detalhado por endereco/lote (WMS) |
| SB1 | Produto (cadastro) |
| NNR | Armazem (cadastro de locais) |
Pegadinhas
- B2_QATU pode ser negativo se MV_ESTNEG = "S" — sistema permite saldo negativo. Validar!
- SBF e mais detalhada: em WMS, SB2 e agregado, SBF tem por endereco/lote.
- Saldo virtual vs fisico: B2_QATU - B2_RESERVA - B2_QEMP = "virtual"; B2_QATU = "fisico".
- Custo medio (B2_CM1) tem 6+ casas decimais — exibir com Round em relatorio.
- Multifilial: cada filial tem SB2 propria (B2_FILIAL distingue).
Veja também