SD3 — Movimentos de Estoque
Cada movimento de estoque (entrada, saida, transferencia, ajuste, requisicao, producao) gera 1 SD3. Base de todo controle de estoque do SIGAEST.
SD3 e o "diario" do estoque — toda alteracao em SB2/SBF passa por aqui. Tipo de movimento determinado por D3_TM. SD3 e tabela imensa em base operacional.
Campos principais
| Campo | Tipo | Descricao |
|---|
| D3_FILIAL | C | Filial |
| D3_TM | C | Tipo Movimento: 010=Entrada NF, 510=Saida NF, 999=Transferencia, etc |
| D3_COD | C | Produto |
| D3_LOCAL | C | Armazem origem/destino |
| D3_LOCALIZ | C | Endereco WMS |
| D3_QUANT | N | Quantidade |
| D3_CUSTO1 | N | Custo unitario |
| D3_EMISSAO | D | Data movimento |
| D3_DOC | C | Documento origem |
| D3_NUMSERI | C | Serie |
| D3_CF | C | CFOP |
| D3_LOTECTL | C | Lote |
| D3_OP | C | OP (se vinculado) |
| D3_ESTORNO | C | S=Estornado |
Indices
| Ordem | Chave |
|---|
| 1 | D3_FILIAL+D3_DOC+D3_NUMSERI+D3_CLIFOR+D3_LOJA+D3_TM+D3_EMISSAO |
| 2 | D3_FILIAL+D3_COD+D3_LOCAL+D3_EMISSAO |
| 3 | D3_FILIAL+D3_OP+D3_TM |
Codigo tipico
// Movimentos do dia
SD3->(DBSetOrder(2))
SD3->(DBSeek(xFilial("SD3") + cProd + cArmazem + DToS(dDataBase)))
While !SD3->(Eof()) .And. SD3->D3_EMISSAO == dDataBase
If SD3->D3_TM < "500" // entrada
nEnt += SD3->D3_QUANT
Else // saida
nSai += SD3->D3_QUANT
EndIf
SD3->(DBSkip())
EndDo
Tabelas relacionadas
| Tabela | Relacao |
|---|
| SB2 | Saldo agregado (atualizado por SD3) |
| SBF | Saldo por endereco WMS |
| SD1/SD2 | NF que originou |
| SC2 | OP que originou |
Pegadinhas
- D3_TM e a chave do que e o movimento — 010 ate 499 = entrada; 500+ = saida. Excecoes existem.
- Estorno nao apaga registro original — D3_ESTORNO = "S".
- Performance critica em base com 50M+ registros — particionamento e indexes adequados sao essenciais.
- Bloco K do SPED Fiscal le SD3 pra montar registros K — divergencias entre SD3 e K200 sao comuns.
Veja também